Добавил в программу энкодеры и управление с помощью ик-пульта. Как понял по урокам
EdGull'a энкодеры подключаются на ноги ШИМа левого и правого движка. Короче, если в программе всё правильно написал, то работать будет. Я всё скомпилировал и зашил в мк. Кнопки перехода на rc и направления движений работают. Стоп тоже.
Кстати вопрос, а можно сделать перезагрузку мк при нажатии кнопки стоп? А точнее не перезагрузка, а сброс программы.
Код:
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Программа произвольного движения для робота "RoBi"
' RoBi.bas - главный файл проекта , в котором реализована программа
' робота;
' Автор Space:
' -программа для мк ATmega16
' -используется кварц на 16мГц
' -компилятор Bascom AVR
' -присутствует ограничение по скорости с помощью энкодеров
' -есть управление с помощью ик-пульта
' -при роботе программы выбора направления, число и направление выводится на ЖКИ
' Программа 2008 для робота "RoBi" - www.robptsspace.ucoz.ru
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$regfile = "m16def.dat" 'используем мк ATmega16
$crystal = 16000000 'частота кварцевого резонатора 16mHz
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' COM-порт
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$baud = 19200 'Скорость COM-порта
Print "Start RoBi" ' выводим стартовую надпись в терминали через COM-порт.
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' указываем переменные
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Dim Rand As Byte ' для выбора направления;
Dim Speed As Byte ' для скорости;
Speed = 70
Dim Address As Byte ' для приёма сигнала с ик-пульта;
Dim Command As Byte ' для приёма сигнала с ик-пульта.
Enable Interrupts ' Разрешаем прерывания.
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Дополнительные кнопки
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Config Pinc.2 = Input : Кнопка_старт Alias Pinc.2 'PC 2 устанавливаем на вход и присваиваем имя Кнопка_старт;
Config Pinc.3 = Input : Кнопка_стоп Alias Pinc.3 'PC 3 устанавливаем на вход и присваиваем имя Кнопка_стоп;
Config Pinc.4 = Input : Кнопка_rc5 Alias Pinc.4 'PC 4 устанавливаем на вход и присваиваем имя Кнопка_3;
Config Pinc.5 = Input : Кнопка_4 Alias Pinc.5 'PC 5 устанавливаем на вход и присваиваем имя Кнопка_4.
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Работа ЖКИ
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$lib "lcd4.lbx" 'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
' указываем конфигурацию подключения дисплея к портам МК
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 знакомест в каждой
'Начало подпрограммы
Основная_программа:
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 'Если нажата кнопка старт , то переходим в подпрограмму "Выбор_направления".
If Кнопка_rc5 = 0 Then : Gosub Rc5 : End If
Loop
Останавливаемся: ' остановка
Reset Porta.0 : Reset Porta.1 : Reset Porta.2 : Reset Porta.3
Goto Основная_программа
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Управление с ИК-пульта
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Config Pina.6 = Input : Tsop Alias Pina.6 'PA 6 устанавливаем на вход и присваиваем имя Tsop.
Rc5:
Cls 'команда очистки дисплея.
Cursor Off ' отключаем корсор на LCD.
Locate 1 , 4 ' перемещение курсора в указанную позицию.
Lcd "RC5_Signal" 'выводим надпись.
Do
Gosub Прием_rc5
If Command = 255 Then : Gosub Стоп : Locate 2 , 7 : Lcd "Stop"
Elseif Command = 32 Then : Gosub Вперёд : Locate 2 , 6 : Lcd "Forvard" : Wait 1
Elseif Command = 33 Then : Gosub Назад : Locate 2 , 6 : Lcd "Back" : Wait 1
Elseif Command = 17 Then : Gosub Влево : Locate 2 , 6 : Lcd "In left" : Wait 1
Elseif Command = 16 Then : Gosub Вправо : Locate 2 , 7 : Lcd "In right" : Wait 1
End If
Loop
Прием_rc5:
Getrc5(address , Command)
If Address <> 255 And Command <> 255 Then
Command = Command And &B01111111
Print Chr(12); ' выводим в терминал символ
Print "Address - " ; Address; ' выводим в терминал адрес
Print "Command - " ; Command; ' выводим в терминал номер команды
End If
Return
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Датчики
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' временный код
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 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 Pina.4 = Output 'ногу ШИМа левого движка сконфигурировали как выход;
Config Pina.5 = Output 'ногу ШИМа правого движка сконфигурировали как выход.
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
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 : Pwm1b = 0 : Pwm1a = 0:
Return
Вперёд: ' едим вперёд
Fr = 1 : Br = 0 : Bl = 0 : Fl = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return
Вперёд_вправо: ' поварачиваем вправо
Fr = 0 : Br = 0 : Bl = 0 : Fl = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return
Вперёд_влево: ' поворачиваем влево
Fr = 1 : Br = 0 : Bl = 0 : Fl = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return
Назад: ' назад
Fr = 0 : Br = 1 : Bl = 1 : Fl = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return
Назад_вправо: ' поворачиваем назад-вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return
Назад_влево: ' поворачиваем назад-влево
Fr = 0 : Br = 0 : Bl = 1 : Fl = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return
Вправо: ' разворот на метсе вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return
Влево: ' разворот на месте влево
Fr = 1 : Br = 0 : Bl = 1 : Fl = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return
R: ' выполнять после срабатывания правого датчика
Gosub Назад ' переходим в подпрограмму "Назад"
Wait 1 ' выполняем её в течение 2,5 секунд
Gosub Назад_влево
Wait 1
Gosub Стоп
Goto Выбор_направления ' переходим к началу основного цикла после выполнения команд
L:
Gosub Назад
Wait 1
Gosub Назад_вправо
Wait 1
Gosub Стоп
Goto Выбор_направления
_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света