RoBi
|
|
Space | Дата: Воскресенье, 10.08.2008, 18:54 | Сообщение # 1 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| RoBi Платформа моя готова и сегодня сел за программу . Не много помудрил и получилось следующие. По идеи робот теперь может объезжать препятствия (контактные датчики. Ставить я их не буду, просто код для ик-локатора ещё не добавлял), выбирать любое направление движения самостоятельно . Выводит надпись на ЖКИ и в терминале компилятора BASCOM-AVR(используя COM-порт). Когда поставлю энкодеры, то будет ехать с заранее заданной скоростью. Вообщем оцените, то что получилось. 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) --------------------------------------------- Правда я её ещё не проверял , но думаю, что она должна работать Добавлено (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) --------------------------------------------- Я сделал это. Поздравьте меня Пускай прога выглядит громостка и коряво, но она мною написана и отлично работает. 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 |
| Во блин ..., а чегоето ты перешёл на бейсик вдруг? Вроде на си писал
|
|
| |
Space | Дата: Четверг, 14.08.2008, 23:20 | Сообщение # 5 |
Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
| Понравился своей простотой. Но и си я не забросил. параллельно буду его изучать
|
|
| |
Les | Дата: Пятница, 15.08.2008, 11:39 | Сообщение # 6 |
| а... тогда понятно
|
|
| |
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 Выбор_направления
|
|
| |
|