Создаем робота-андроида своими руками
Шрифт:
• Шина ввода/вывода 1 отображает состояние CdS датчика 1. Если сила света, попадающего на CdS 1 больше, чем на CdS 2, то на шине появляется сигнал низкого уровня. Если сила света на обоих датчиках равна, то на выходе присутствует сигнал высокого уровня.
• Шина ввода/вывода 2 отображает состояние CdS датчика 2. Если сила света, попадающего на CdS 2, больше, чем на CdS 1, то на шине появляется сигнал низкого уровня. Если сила света на обоих датчиках равна, то на выходе присутствует сигнал высокого уровня.
• Шина ввода/вывода 3 отображает
Микроконтроллер 2. Микроконтроллер 2 проверяет состояние трех шин ввода/вывода и на основании полученной информации управляет движением и поворотом согласно таблице:
Соответственно шины 1 и 2 отражают состояние датчиков CdS, а шина 3 – состояние датчика столкновений.
Я добавил состояние «спячки», соответствующее общему низкому уровню освещенности. Если оба CdS датчика освещены примерно одинаково, то робот движется вперед. Если датчики освещены в разной степени, то робот поворачивается соответственно направо или налево. Если поступает слишком много света или срабатывает датчик столкновений, то робот переходит в режим избегания.
Батарейный отсек робота содержит четыре элемента АА, обеспечивая напряжение питания 6 В. При проверке функционирования робота есть основания предполагать, что истощение батарей происходит достаточно быстро.
Программа
Блок-схема программы изображена на рис. 8.17. После включения питания ходовой двигатель отключен, и микроконтроллер начинает искать наиболее яркий источник света, поворачивая сервомотор. Если источник света имеет слишком большую яркость, то включается режим избегания. В режиме избегания ходовой двигатель включается в режим реверса; при этом ведущее колесо поворачивает направо или налево. Если освещенность не достигает уровня режима избегания, то робот поворачивается в направлении источника света и движется вперед. При замыкании датчика столкновений робот предполагает наличие препятствия и переходит в режим избегания. При выключении датчика столкновения (препятствия нет) программа переходит на начало, и процесс поиска и движения к наиболее яркому источнику света продолжается.
Рис. 8.17. Блок-схема программы
Программа написана для компилятора PICBASIC и введена непосредственно в PIC16F84. Без особых изменений программа может быть написана на версии PICBASIC Pro.
Программа 1
‘Микроконтроллер 1
start:
High 4: low 4 ‘Мигание светодиода
b7 = 0
button 5,0,255,0,b7,1,avoid ‘Проверка препятствия
pot 7, 255, b0 ‘Считывание датчика CdS 1
pot 6, 255, b1 ‘Считывание датчика CdS 2
if b0 <= 250 then skip ‘Достаточно темно?
If b1 >= 250 then slp ‘Да
skip: ‘Нет
if bo > 25 then skip 2 ‘Слишком много света
if b1 < 25 then avoid ‘Да
skip2: ‘Нет
if bo = b1 then straight ‘Освещенность одинакова, вперед
if bo > b1 then greater ‘Проверить освещенность
if bo < b1 then lesser ‘Проверить освещенность
straight:
high 0: high 1: low 2 ‘Сообщение микроконтроллеру 2
goto start ‘Движение прямо
greater:
b2 = b0 – b1 ‘Проверка разности освещенности
if b2 > 10 then rt ‘Если больше 10, поворот направо
goto straight ‘Если нет, движение прямо
lesser:
b2 = b1 – b0 ‘Проверка разности освещенности
if b2 > 10 then lt ‘Если больше 10, поворот налево
goto straight ‘Если нет, движение прямо
rt: ‘Поворот направо, посылка
high 0: low 1: low 2 ‘Сообщение микроконтроллеру 2
goto start
lt: ‘Поворот налево, посылка
low 0: high 1: low 2 ‘Сообщение микроконтроллеру 2
goto start
slp: ‘Режим спячки, посылка
low 0: low 1: low 2 ‘Сообщение микроконтроллеру 2
goto start
avoid: ‘Режим избегания, посылка
low 0: low 1: high 2 ‘Сообщение микроконтроллеру 2
goto start
Программа 2
‘Микроконтроллер 2
b4 = 150 ‘Установка среднего положения сервомотора
start:
peek 6, b1 ‘Чтение данных микроконтроллера 1
let b0 = b1 & 7 ‘Маскирование кроме первых трех битов
if b0 = 0 then slp ‘Время спячки
if b0 = 1 then rt ‘Поворот направо
if b0 = 2 then lt ‘Поворот налево
if b0 = 3 then fw ‘Движение прямо
if b0 = 4 then avoid ‘Режим избегания
goto start
slp:
low 4: low 5 ‘Выключить двигатель
pulsout 3, b4 ‘Запустить сервомотор
pause 18 ‘Задержка включения сервомотора
goto start ‘Чтение данных микроконтроллера 1
rt: ‘Поворот направо
high 4: low 5 ‘Движение вперед
if b4 > 200 then rt1: ‘Поворот направо максимален
b4 = b4 + 1 ‘Нет
rt1: ‘Да
pulsout 3, b4 ‘Поворот сервомотора
pause 18 ‘Задержка ( 55 Гц)
goto start ‘Чтение данных микроконтроллера 1
lt: ‘Поворот налево
high 4: low 5 ‘Движение вперед
if b4 < 100 then lt1: ‘Поворот налево максимален
b4 = b4 – 1 ‘Нет
lt1: ‘Да