Воскресенье, 28.04.2024, 02:19
| RSS
[SEARCH_TITLE]
[SEARCH_FORM]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Архив - только для чтения
Форум » Программирование » Программирование на языке С, Бейсик и Асемблер » RoBi
RoBi
SpaceДата: Воскресенье, 10.08.2008, 18:54 | Сообщение # 1








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
RoBi

Платформа моя готова smile3 и сегодня сел за программу happy . Не много помудрил wacko и получилось следующие. По идеи робот теперь может объезжать препятствия smile3 (контактные датчики. Ставить я их не буду, просто код для ик-локатора ещё не добавлял), выбирать любое направление движения самостоятельно senile . Выводит надпись на ЖКИ и в терминале компилятора BASCOM-AVR(используя COM-порт). Когда поставлю энкодеры, то будет ехать с заранее заданной скоростью. Вообщем оцените, то что получилось. smile3

Code
' Программа произвольного движения для робота "RoBi"
' RoBi.bas - главный файл проекта , в котором реализована программа
' мобильного робота;
' Автор Space:
' -программа для мк ATmega16
' -используется кварц на 16мГц
' -компилятор Bascom AVR
' Программа 2008 для робота "RoBi" - www.robptsspace.ucoz.ru
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$regfile = "m16def.dat"                    'используем мк ATmega16
$crystal = 16000000                    'частота кварцевого резонатора 16mHz
$lib "lcd4.lbx"                    'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
$baud = 19200                    'Скорость COM-порта
' указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2                    'используем дисплей на 2 строчки по 16 знакомест в каждой

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pina.0 = Output : Fr Alias Porta.0                   'PA 0 устанавливаем на выход и присваиваем имя Fr(вперёд-вправо);
Config Pina.1 = Output : Br Alias Porta.1                   'PA 1 устанавливаем на выход и присваиваем имя Br(назад-вправо);
Config Pina.2 = Output : Bl Alias Porta.2                   'PA 2 устанавливаем на выход и присваиваем имя Bl(назад-влево);
Config Pina.3 = Output : Fl Alias Porta.3                   'PA 3 устанавливаем на выход и присваиваем имя Fl(вперёд-влево).
Config Pind.4 = Output                    'ногу ШИМа левого движка сконфигурировали как выход
Config Pind.5 = Output                    'ногу ШИМа правого движка  сконфигурировали как выход

Config Pind.0 = Input : Bumper_r Alias Portd.0              'PD 0 устанавливаем на вход и присваиваем имя Bumper_r(правый бампер);
Config Pind.1 = Input : Bumper_l Alias Portd.1              'PD 1 устанавливаем на вход и присваиваем имя Bumper_l(левый бампер).

Config Pinc.2 = Input : Кнопка_старт Alias Pinc.2           'PC 2 устанавливаем на вход и присваиваем имя Кнопка_старт;
Config Pinc.3 = Input : Кнопка_стоп Alias Pinc.3            'PC 3 устанавливаем на вход и присваиваем имя Кнопка_стоп;
Config Pinc.4 = Input : Кнопка_3 Alias Pinc.4               'PC 4 устанавливаем на вход и присваиваем имя Кнопка_3;
Config Pinc.5 = Input : Кнопка_4 Alias Pinc.5               'PC 5 устанавливаем на вход и присваиваем имя Кнопка_4.

Config Pinb.0 = Output : Red_0 Alias Portb.0                'PB 0 устанавливаем на выход и присваиваем имя Red_0;
Config Pinb.1 = Output : Red_1 Alias Portb.1                'PB 1 устанавливаем на выход и присваиваем имя Red_1;
Config Pinb.2 = Output : Red_2 Alias Portb.2                'PB 2 устанавливаем на выход и присваиваем имя Red_2.

Dim Rand As Byte
Dim Speed As Byte
Speed = 70                    ' указываем скорость RoBi

Print "Start RoBi"                    ' выводим стартовую надпись в терминали через COM-порт

Cls                    'команда очистки дисплея
Lcd "Start RoBi"                    'выводим надпись
Lowerline                    ' переходим на нижнюю строчку
Lcd "Hello!!!"                    'выводим надпись
End

Основная_программа:
Do                    'Основной цикл программы
Rand = Rnd(10)                    ' Выбираем направление движения (0-9)

If Rand = 1 Then : Gosub Стоп : End If
If Rand = 2 Then : Gosub Вперёд : End If
If Rand = 3 Then : Gosub Вперёд_вправо : End If
If Rand = 4 Then : Gosub Вперёд_влево : End If
If Rand = 5 Then : Gosub Назад : End If
If Rand = 6 Then : Gosub Назад_вправо : End If
If Rand = 7 Then : Gosub Назад_влево : End If
If Rand = 8 Then : Gosub Вправо : End If
If Rand = 9 Then : Gosub Влево : End If

Debounce Bumper_r , 0 , L                    'сработал правый датчик, переходим на выполнение команды Bl
Debounce Bumper_l , 0 , R                    'сработал левый датчик, переходим на выполнение команды Br
Loop

'' -----------------------------------------------------------------------------
'' Включение комбинации моторов для движения в заданном направлении
'' -----------------------------------------------------------------------------
Стоп:                    ' стоим на месте
Fr = 0 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Вперёд:                    ' едим вперёд
Fr = 1 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_вправо:                    ' поварачиваем вправо
Fr = 0 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_влево:                    ' поворачиваем влево
Fr = 1 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Назад:                    ' назад
Fr = 0 : Br = 1 : Bl = 1 : Fl = 0 :
Return
Назад_вправо:                    ' поворачиваем назад-вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 0 :
Return
Назад_влево:                    ' поворачиваем назад-влево
Fr = 0 : Br = 0 : Bl = 1 : Fl = 0 :
Return
Вправо:                    ' разворот на метсе вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 1 :
Return
Влево:                    ' разворот на месте влево
Fr = 1 : Br = 0 : Bl = 1 : Fl = 0 :
Return

R:                    ' выполнять после срабатывания правого датчика
Gosub Назад                    ' переходим в подпрограмму "Назад"
Waitms 25                    ' выполняем её в течение 2,5 секунд
Gosub Назад_влево
Waitms 25
Goto Основная_программа                    ' переходим к началу основного цикла после выполнения команд
L:
Gosub Назад
Waitms 25
Gosub Назад_вправо
Waitms 25
Goto Основная_программа

Добавлено (09.08.2008, 22:46)
---------------------------------------------
Правда я её ещё не проверял senile , но думаю, что она должна работать

Добавлено (10.08.2008, 12:51)
---------------------------------------------

протестил прогу. Сначало не работала.Потом исправил ошибку и всё стало ок. Код после выложу. Вероятность движений сократил до езды вперёд и остановки. Оставил просто кусок проги для бамперов чтоб проверить их.

Добавлено (10.08.2008, 18:54)
---------------------------------------------
Прогу почти дописал. Теперь это почти такая же программа мобильного робота как и на си. Только не стал делать движение на свет. А во стольном всё тоже самое. Вообщем любуйтесь. Щас пока думаю как сделать старт по нажатию кнопки (Кнопка старт) и остановка по нажатию кнопки(Кнопка стоп)
Пробовал так:

Code
If Кнопка_старт = 1 Then : Gosub Выбор_направления
Else
Gosub Основная_программа : End if

Но не получилось. Если есть у кого идеи по реализации иакого момента, то предлагайте. Буду рад любой помощи.
А вот и сама прога:
Code
' Программа произвольного движения для робота "RoBi"
' RoBi.bas - главный файл проекта , в котором реализована программа
' мобильного робота;
' Автор Space:
' -программа для мк ATmega16
' -используется кварц на 16мГц
' -компилятор Bascom AVR
' Программа 2008 для робота "RoBi" - www.robptsspace.ucoz.ru
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$regfile = "m16def.dat"                    'используем мк ATmega16
$crystal = 16000000                    'частота кварцевого резонатора 16mHz
$lib "lcd4.lbx"                    'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
$baud = 19200                    'Скорость COM-порта
' указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2                    'используем дисплей на 2 строчки по 16 знакомест в каждой

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pina.0 = Output : Fr Alias Porta.0                   'PA 0 устанавливаем на выход и присваиваем имя Fr(вперёд-вправо);
Config Pina.1 = Output : Br Alias Porta.1                   'PA 1 устанавливаем на выход и присваиваем имя Br(назад-вправо);
Config Pina.2 = Output : Bl Alias Porta.2                   'PA 2 устанавливаем на выход и присваиваем имя Bl(назад-влево);
Config Pina.3 = Output : Fl Alias Porta.3                   'PA 3 устанавливаем на выход и присваиваем имя Fl(вперёд-влево).
Config Pind.4 = Output                    'ногу ШИМа левого движка сконфигурировали как выход
Config Pind.5 = Output                    'ногу ШИМа правого движка  сконфигурировали как выход

Config Pind.2 = Input : Bumper_r Alias Pind.2               'PD 0 устанавливаем на вход и присваиваем имя Bumper_r(правый бампер);
Config Pind.3 = Input : Bumper_l Alias Pind.3               'PD 1 устанавливаем на вход и присваиваем имя Bumper_l(левый бампер).

Config Pinc.2 = Input : Кнопка_старт Alias Pinc.2           'PC 2 устанавливаем на вход и присваиваем имя Кнопка_старт;
Config Pinc.3 = Input : Кнопка_стоп Alias Pinc.3            'PC 3 устанавливаем на вход и присваиваем имя Кнопка_стоп;
Config Pinc.4 = Input : Кнопка_3 Alias Pinc.4               'PC 4 устанавливаем на вход и присваиваем имя Кнопка_3;
Config Pinc.5 = Input : Кнопка_4 Alias Pinc.5               'PC 5 устанавливаем на вход и присваиваем имя Кнопка_4.

Config Pinb.0 = Output : Red_0 Alias Portb.0                'PB 0 устанавливаем на выход и присваиваем имя Red_0;
Config Pinb.1 = Output : Red_1 Alias Portb.1                'PB 1 устанавливаем на выход и присваиваем имя Red_1;
Config Pinb.2 = Output : Red_2 Alias Portb.2                'PB 2 устанавливаем на выход и присваиваем имя Red_2.

Enable Interrupts                    ' разрешаем прерывания

Dim Rand As Byte

Print "Start RoBi"                    ' выводим стартовую надпись в терминали через COM-порт

Cls                    'команда очистки дисплея
Cursor Off                    ' отключаем корсор на LCD
Lcd "I am RoBi!"                    'выводим надпись
Lowerline                    ' переходим на нижнюю строчку
Lcd "Gotov k rabote."                    'выводим надпись

Основная_программа:
Do                    'Основной цикл программы
Rand = Rnd(50)

If Rand = 48 Then : Gosub Стоп : Waitus 10 : End If
If Rand = 1 Then : Gosub Стоп : Waitus 10 : End If
If Rand = 49 Then : Gosub Вперёд : Wait 2 : End If
If Rand = 17 Then : Gosub Вперёд : Wait 1 : End If
If Rand = 27 Then : Gosub Вперёд : Wait 2 : End If
If Rand = 32 Then : Gosub Вперёд : Wait 1 : End If
If Rand = 44 Then : Gosub Назад : Wait 1 : End If
If Rand = 4 Then : Gosub Назад : Wait 1 : End If
If Rand = 45 Then : Gosub Вправо : Wait 1 : End If
If Rand = 2 Then : Gosub Вправо : Wait 1 : End If
If Rand = 22 Then : Gosub Влево : Wait 1 : End If
If Rand = 3 Then : Gosub Влево : Wait 1 : End If

Debounce Bumper_r , 0 , L                    'сработал правый датчик, переходим на выполнение команды Bl
Debounce Bumper_l , 0 , R                    'сработал левый датчик, переходим на выполнение команды Br

Loop

'' -----------------------------------------------------------------------------
'' Включение комбинации моторов для движения в заданном направлении
'' -----------------------------------------------------------------------------
Стоп:                    ' стоим на месте
Fr = 0 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Вперёд:                    ' едим вперёд
Fr = 1 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_вправо:                    ' поварачиваем вправо
Fr = 0 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_влево:                    ' поворачиваем влево
Fr = 1 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Назад:                    ' назад
Fr = 0 : Br = 1 : Bl = 1 : Fl = 0 :
Return
Назад_вправо:                    ' поворачиваем назад-вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 0 :
Return
Назад_влево:                    ' поворачиваем назад-влево
Fr = 0 : Br = 0 : Bl = 1 : Fl = 0 :
Return
Вправо:                    ' разворот на метсе вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 1 :
Return
Влево:                    ' разворот на месте влево
Fr = 1 : Br = 0 : Bl = 1 : Fl = 0 :
Return

R:                    ' выполнять после срабатывания правого датчика
Gosub Назад                    ' переходим в подпрограмму "Назад"
Wait 1                    ' выполняем её в течение 2,5 секунд
Gosub Назад_влево
Wait 1
Gosub Стоп
Goto Основная_программа                    ' переходим к началу основного цикла после выполнения команд
L:
Gosub Назад
Wait 1
Gosub Назад_вправо
Wait 1
Gosub  Стоп
Goto Основная_программа
 
FireFlyДата: Понедельник, 11.08.2008, 00:17 | Сообщение # 2








Зарегистрирован 04.04.2008
Группа: Модераторы
Сообщений: 196
Город: Kamyshin
Статус: Offline
в личку кинул

Robozone
 
SpaceДата: Четверг, 14.08.2008, 18:32 | Сообщение # 3








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
решил разобраться на простом кусочки. по нажатию одной кнопки светик загорается, а по нажатию другой гаснит. Всё работает отлично. Вот:
Code
$regfile = "m16def.dat"
$crystal = 16000000

Config Pinb.0 = Output : Red_0 Alias Portb.0
Config Pinc.2 = Input : Кнопка_старт Alias Pinc.2
Config Pinc.3 = Input : Кнопка_стоп Alias Pinc.3

Основная:
Do

If Кнопка_старт = 0 Then : Gosub Горит : End If
If Кнопка_стоп = 0 Then : Gosub Не_горит : End If

Loop

Горит:
Red_0 = 1
Goto Основная

Не_горит:
Red_0 = 0
Goto Основная
End

Добавлено (14.08.2008, 18:32)
---------------------------------------------
dance4 dance4 dance4
Я сделал это. Поздравьте меня dance4
Пускай прога выглядит громостка и коряво, но она мною написана и отлично работает.

Code
' Программа произвольного движения для робота "RoBi"
' RoBi.bas - главный файл проекта , в котором реализована программа
' мобильного робота;
' Автор Space:
' -программа для мк ATmega16
' -используется кварц на 16мГц
' -компилятор Bascom AVR
' Программа 2008 для робота "RoBi" - www.robptsspace.ucoz.ru
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$regfile = "m16def.dat"                    'используем мк ATmega16
$crystal = 16000000                    'частота кварцевого резонатора 16mHz
$lib "lcd4.lbx"                    'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
$baud = 19200                    'Скорость COM-порта
' указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2                    'используем дисплей на 2 строчки по 16 знакомест в каждой

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pina.0 = Output : Fr Alias Porta.0                   'PA 0 устанавливаем на выход и присваиваем имя Fr(вперёд-вправо);
Config Pina.1 = Output : Br Alias Porta.1                   'PA 1 устанавливаем на выход и присваиваем имя Br(назад-вправо);
Config Pina.2 = Output : Bl Alias Porta.2                   'PA 2 устанавливаем на выход и присваиваем имя Bl(назад-влево);
Config Pina.3 = Output : Fl Alias Porta.3                   'PA 3 устанавливаем на выход и присваиваем имя Fl(вперёд-влево).

Config Pind.2 = Input : Bumper_r Alias Pind.2               'PD 0 устанавливаем на вход и присваиваем имя Bumper_r(правый бампер);
Config Pind.3 = Input : Bumper_l Alias Pind.3               'PD 1 устанавливаем на вход и присваиваем имя Bumper_l(левый бампер).

Config Pinc.2 = Input : Кнопка_старт Alias Pinc.2           'PC 2 устанавливаем на вход и присваиваем имя Кнопка_старт;
Config Pinc.3 = Input : Кнопка_стоп Alias Pinc.3            'PC 3 устанавливаем на вход и присваиваем имя Кнопка_стоп;
Config Pinc.4 = Input : Кнопка_3 Alias Pinc.4               'PC 4 устанавливаем на вход и присваиваем имя Кнопка_3;
Config Pinc.5 = Input : Кнопка_4 Alias Pinc.5               'PC 5 устанавливаем на вход и присваиваем имя Кнопка_4.

Config Pinb.0 = Output : Red_0 Alias Portb.0                'PB 0 устанавливаем на выход и присваиваем имя Red_0;
Config Pinb.1 = Output : Red_1 Alias Portb.1                'PB 1 устанавливаем на выход и присваиваем имя Red_1;
Config Pinb.2 = Output : Red_2 Alias Portb.2                'PB 2 устанавливаем на выход и присваиваем имя Red_2.

Enable Interrupts                    ' разрешаем прерывания

Dim Rand As Byte

Print "Start RoBi"                    ' выводим стартовую надпись в терминали через COM-порт

Cls                    'команда очистки дисплея
Cursor Off                    ' отключаем корсор на LCD
Lcd "I am RoBi!"                    'выводим надпись
Lowerline                    ' переходим на нижнюю строчку
Lcd "Gotov k rabote."                    'выводим надпись

Do                    'Основной цикл программы
Основная_программа:
If Кнопка_старт = 0 Then : Gosub Выбор_направления : End If
Loop
End

Do
Выбор_направления:
Rand = Rnd(50)
If Rand = 48 Then : Gosub Стоп : Waitus 10 : End If
If Rand = 1 Then : Gosub Стоп : Waitus 10 : End If
If Rand = 49 Then : Gosub Вперёд : Wait 2 : End If
If Rand = 17 Then : Gosub Вперёд : Wait 1 : End If
If Rand = 27 Then : Gosub Вперёд : Wait 2 : End If
If Rand = 32 Then : Gosub Вперёд : Wait 1 : End If
If Rand = 44 Then : Gosub Назад : Wait 1 : End If
If Rand = 4 Then : Gosub Назад : Wait 1 : End If
If Rand = 45 Then : Gosub Вправо : Wait 1 : End If
If Rand = 2 Then : Gosub Вправо : Wait 1 : End If
If Rand = 22 Then : Gosub Влево : Wait 1 : End If
If Rand = 3 Then : Gosub Влево : Wait 1 : End If
If Кнопка_стоп = 0 Then : Gosub Останавливаемся : End If

Debounce Bumper_r , 0 , L                    'сработал правый датчик, переходим на выполнение команды Bl
Debounce Bumper_l , 0 , R                    'сработал левый датчик, переходим на выполнение команды Br
Loop

Останавливаемся:                    ' стоим на месте
Fr = 0 : Br = 0 : Bl = 0 : Fl = 0 :
Goto Основная_программа

'' -----------------------------------------------------------------------------
'' Включение комбинации моторов для движения в заданном направлении
'' -----------------------------------------------------------------------------

Стоп:                    ' стоим на месте
Fr = 0 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Вперёд:                    ' едим вперёд
Fr = 1 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_вправо:                    ' поварачиваем вправо
Fr = 0 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_влево:                    ' поворачиваем влево
Fr = 1 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Назад:                    ' назад
Fr = 0 : Br = 1 : Bl = 1 : Fl = 0 :
Return
Назад_вправо:                    ' поворачиваем назад-вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 0 :
Return
Назад_влево:                    ' поворачиваем назад-влево
Fr = 0 : Br = 0 : Bl = 1 : Fl = 0 :
Return
Вправо:                    ' разворот на метсе вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 1 :
Return
Влево:                    ' разворот на месте влево
Fr = 1 : Br = 0 : Bl = 1 : Fl = 0 :
Return

R:                    ' выполнять после срабатывания правого датчика
Gosub Назад                    ' переходим в подпрограмму "Назад"
Wait 1                    ' выполняем её в течение 2,5 секунд
Gosub Назад_влево
Wait 1
Gosub Стоп
Goto Выбор_направления                    ' переходим к началу основного цикла после выполнения команд

L:
Gosub Назад
Wait 1
Gosub Назад_вправо
Wait 1
Gosub Стоп
Goto Выбор_направления
 
LesДата: Четверг, 14.08.2008, 21:04 | Сообщение # 4








Группа: Удаленные
Во блин wacko ..., а чегоето ты перешёл на бейсик вдруг? Вроде на си писал cry
 
SpaceДата: Четверг, 14.08.2008, 23:20 | Сообщение # 5








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Понравился своей простотой. Но и си я не забросил. параллельно буду его изучать smile3
 
LesДата: Пятница, 15.08.2008, 11:39 | Сообщение # 6








Группа: Удаленные
а... тогда понятно dirol
 
SpaceДата: Пятница, 15.08.2008, 23:23 | Сообщение # 7








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Подправил прогу и теперь все направления выводятся на дисплее.
Чтобы "Robi" остановился нужно удерживать кнопку в течение 1 секунды
Code
' Программа произвольного движения для робота "RoBi"
' RoBi.bas - главный файл проекта , в котором реализована программа
' мобильного робота;
' Автор Space:
' -программа для мк ATmega16
' -используется кварц на 16мГц
' -компилятор Bascom AVR
' Программа 2008 для робота "RoBi" - www.robptsspace.ucoz.ru
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$regfile = "m16def.dat"                    'используем мк ATmega16
$crystal = 16000000                    'частота кварцевого резонатора 16mHz
$lib "lcd4.lbx"                    'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
$baud = 19200                    'Скорость COM-порта
' указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2                    'используем дисплей на 2 строчки по 16 знакомест в каждой

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pina.0 = Output : Fr Alias Porta.0                   'PA 0 устанавливаем на выход и присваиваем имя Fr(вперёд-вправо);
Config Pina.1 = Output : Br Alias Porta.1                   'PA 1 устанавливаем на выход и присваиваем имя Br(назад-вправо);
Config Pina.2 = Output : Bl Alias Porta.2                   'PA 2 устанавливаем на выход и присваиваем имя Bl(назад-влево);
Config Pina.3 = Output : Fl Alias Porta.3                   'PA 3 устанавливаем на выход и присваиваем имя Fl(вперёд-влево).

Config Pind.2 = Input : Bumper_r Alias Pind.2               'PD 0 устанавливаем на вход и присваиваем имя Bumper_r(правый бампер);
Config Pind.3 = Input : Bumper_l Alias Pind.3               'PD 1 устанавливаем на вход и присваиваем имя Bumper_l(левый бампер).

Config Pinc.2 = Input : Кнопка_старт Alias Pinc.2           'PC 2 устанавливаем на вход и присваиваем имя Кнопка_старт;
Config Pinc.3 = Input : Кнопка_стоп Alias Pinc.3            'PC 3 устанавливаем на вход и присваиваем имя Кнопка_стоп;
Config Pinc.4 = Input : Кнопка_3 Alias Pinc.4               'PC 4 устанавливаем на вход и присваиваем имя Кнопка_3;
Config Pinc.5 = Input : Кнопка_4 Alias Pinc.5               'PC 5 устанавливаем на вход и присваиваем имя Кнопка_4.

Config Pinb.0 = Output : Red_0 Alias Portb.0                'PB 0 устанавливаем на выход и присваиваем имя Red_0;
Config Pinb.1 = Output : Red_1 Alias Portb.1                'PB 1 устанавливаем на выход и присваиваем имя Red_1;
Config Pinb.2 = Output : Red_2 Alias Portb.2                'PB 2 устанавливаем на выход и присваиваем имя Red_2.

Enable Interrupts                    ' разрешаем прерывания

Dim Rand As Byte                    ' указываем переменную для выбора направления

Print "Start RoBi"                    ' выводим стартовую надпись в терминали через COM-порт
Основная_программа:
Cls                    'команда очистки дисплея
Cursor Off                    ' отключаем корсор на LCD
Locate 1 , 4                    ' перемещение курсора в указанную позицию
Lcd "I am RoBi!"                    'выводим надпись
Locate 2 , 2                    ' перемещение курсора в указанную позицию
Lcd "Gotov k rabote"                    'выводим надпись

Do                    'Основной цикл программы
If Кнопка_старт = 0 Then : Gosub Выбор_направления : End If 'Если нажата кнопка старт , то переходим в подпрограмму "Выбор_направления"
Loop

Do
Выбор_направления:
Rand = Rnd(20)                    ' Выбирает любое число (от 0 до 19)
Cls                    ' Очищаем дисплей
Cursor Off                    ' Отключаем курсор
Lcd "Rand=" ; Rand                    ' Выводим на дисплее направление (Н-р: на дисплее: Rand=0)
' например If Rand = 17 Then : Gosub Стоп : Locate 1 , 8 : Lcd ", Stop" : Wait 2 : End If
' если выбрали 17, тогда переходим в подпрограмму "стоп", выводим на дисплее: , Stop и выполняем всё это 2 секунды и т.д.
If Rand = 17 Then : Gosub Стоп : Locate 1 , 8 : Lcd ", Stop" : Wait 1 : End If
If Rand = 18 Then : Gosub Стоп : Locate 1 , 8 : Lcd ", Stop" : Wait 1 : End If
If Rand = 9 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 5 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 1 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 4 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 0 Then : Gosub Назад : Locate 1 , 7 : Lcd ", Back" : Wait 1 : End If
If Rand = 14 Then : Gosub Назад : Locate 1 , 8 : Lcd ", Back" : Wait 1 : End If
If Rand = 12 Then : Gosub Вправо : Locate 1 , 8 : Lcd ", In right" : Wait 1 : End If
If Rand = 16 Then : Gosub Вправо : Locate 1 , 8 : Lcd ", In right" : Wait 1 : End If
If Rand = 3 Then : Gosub Влево : Locate 1 , 7 : Lcd ", In left" : Wait 1 : End If
If Rand = 8 Then : Gosub Влево : Locate 1 , 7 : Lcd ", In left" : Wait 1 : End If
If Кнопка_стоп = 0 Then : Gosub Основная_программа : End If 'Если нажата кнопка стоп , то переходим в подпрограмму "Основная_программа"

Debounce Bumper_r , 0 , L                    'сработал правый датчик, переходим на выполнение команды Bl
Debounce Bumper_l , 0 , R                    'сработал левый датчик, переходим на выполнение команды Br
Loop

'' -----------------------------------------------------------------------------
'' Включение комбинации моторов для движения в заданном направлении
'' -----------------------------------------------------------------------------

Стоп:                    ' стоим на месте
Fr = 0 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Вперёд:                    ' едим вперёд
Fr = 1 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_вправо:                    ' поварачиваем вправо
Fr = 0 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_влево:                    ' поворачиваем влево
Fr = 1 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Назад:                    ' назад
Fr = 0 : Br = 1 : Bl = 1 : Fl = 0 :
Return
Назад_вправо:                    ' поворачиваем назад-вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 0 :
Return
Назад_влево:                    ' поворачиваем назад-влево
Fr = 0 : Br = 0 : Bl = 1 : Fl = 0 :
Return
Вправо:                    ' разворот на метсе вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 1 :
Return
Влево:                    ' разворот на месте влево
Fr = 1 : Br = 0 : Bl = 1 : Fl = 0 :
Return

R:                    ' выполнять после срабатывания правого датчика
Gosub Назад                    ' переходим в подпрограмму "Назад"
Wait 1                    ' выполняем её в течение 2,5 секунд
Gosub Назад_влево
Wait 1
Gosub Стоп
Goto Выбор_направления                    ' переходим к началу основного цикла после выполнения команд
L:
Gosub Назад
Wait 1
Gosub Назад_вправо
Wait 1
Gosub Стоп
Goto Выбор_направления
 
Форум » Программирование » Программирование на языке С, Бейсик и Асемблер » RoBi
  • Страница 1 из 1
  • 1
Поиск: