S_chego_nachinayutsya_roboty
.pdfГлава 10. С чего начинаются роботы?
int photoState = HIGH;
void setup() {
pinMode(ledPinGreen, OUTPUT); pinMode(ledPinRed, OUTPUT); pinMode(ledPinDebug1, OUTPUT); pinMode(ledPinDebug2, OUTPUT); pinMode(photoPin, INPUT);
}
void loop(){
digitalWrite(ledPinRed, HIGH); digitalWrite(ledPinDebug1, LOW); digitalWrite(ledPinDebug2, LOW);
photoState = digitalRead(photoPin);
if (photoState == LOW) { delayMicroseconds(4500);
digitalWrite(ledPinDebug1, HIGH); // test 1t delay(3000);
photoState = digitalRead(photoPin); if (photoState == HIGH){
delay(1);
digitalWrite(ledPinDebug1, LOW); // test 2d delay(3000);
photoState = digitalRead(photoPin); if (photoState == LOW){
delay(1);
digitalWrite(ledPinDebug2, HIGH); // test 3d delay(3000);
photoState = digitalRead(photoPin); if (photoState == HIGH){
delay(1);
digitalWrite(ledPinDebug2, LOW); // test 4h delay(3000);
photoState = digitalRead(photoPin); if (photoState == LOW){
delayMicroseconds(3500); digitalWrite(ledPinDebug1, HIGH);// 5h digitalWrite(ledPinDebug2, HIGH); delay(3000);
photoState = digitalRead(photoPin); if (photoState == HIGH){
digitalWrite(ledPinRed, LOW); digitalWrite(ledPinGreen, HIGH); delay(5000); digitalWrite(ledPinGreen, LOW);
}
}
}
}
}
}
}
}
Места проверки я выделил, чтобы было понятно, как должны вести себя отладочные светодиоды.
Что ж, всё, что можно было проверить за компьютером, я проверил, и настал момент, когда пора проверить совместную работу устройств на «живых» макетных платах. Тем более, что были сомнения относительно времён посылок кода.
111
Глава 10. С чего начинаются роботы?
Загрузив программу в модуль Arduino, я включаю оба устройства и… и… и ничего интересного не вижу. Что-то, где-то не так.
Рис. 10.5. Загрузка программы в модуль Arduino
Как проверить, где ошибка или неточность?
Попробуем сделать что-то похожее на отладку в программе VirtualBreadBoard. Но, чтобы не делать лишних паек, не добавлять отладочные светодиоды, используем тот светодиод, что уже стоит на плате модуля Arduino. Он на 13 цифровом выводе, который я использую для включения зеленого света. Поскольку программа не работает должным образом, это светодиод не загорается. Для начала я добавлю строку отладки в исходный текст при начале расшифровки кода:
if (photoState == LOW) |
{ |
|
// начинаем читать |
код и переключать светодиоды, если код «свой» |
|
delayMicroseconds(4500); |
// ждѐм 4.5 мС |
digitalWrite(ledPinGreen, HIGH); photoState = digitalRead(photoPin);
Загружаем программу и, поднося излучатель ИК-кода к фотоприёмнику, убеждаемся, что светодиод «зелёный свет» загорается. Скопируем эту строку, закомментируем её в этом месте и вставим в следующую проверку.
Так, перемещаясь по программе вниз, доходим до того места, где появилась ошибка.
if (photoState == LOW){ |
|
delayMicroseconds(3500); |
// ждѐм 3.5 мС |
Место ошибки!!!! Нужно добавить: photoState = digitalRead(photoPin); if (photoState == HIGH){
digitalWrite(ledPinRed, LOW); // выключаем красный digitalWrite(ledPinGreen, HIGH);//включаем зелѐный delay(2000); // зелѐный 2 секунды digitalWrite(ledPinGreen, LOW);//выключаем зелѐный
}
}
Перед последней проверкой не было команды проверки состояния входа! И, следовательно, последняя проверка if (photoState == HIGH) не подтвердила код.
112
Глава 10. С чего начинаются роботы?
Рис. 10.6. Отладка (выделена пропущенная команда) в программе Arduino
Добавляем утерянную строку и проверяем, загрузив правильный текст программы в модуль, окончательную работу программы. Зелёный светодиод загорается, когда к фотоприёмнику подносится излучатель ИК-кода, и гаснет через 5 секунд, что я выбрал в качестве паузы между переключениями семафора. Вот полный и правильный текст программы.
// установка выводов
const int photoPin = 2; // номер вывода, к которому подключѐн фотоприѐмник const int ledPinGreen = 13; // номер вывода зелѐного светодиода
const int ledPinRed = 12; // номер вывода красного светодиода
int photoState = HIGH; // переменная для чтения состояния фотоприѐмника
void setup() {
//инициализируем выходы для светодиодов pinMode(ledPinGreen, OUTPUT); pinMode(ledPinRed, OUTPUT);
//инициализируем вход для фотоприѐмника pinMode(photoPin, INPUT);
}
void loop(){
// включаем красный свет digitalWrite(ledPinRed, HIGH);
//читаем состояние входа photoState = digitalRead(photoPin);
//проверяем есть ли пачка импульсов
//если есть, то photoState становится LOW if (photoState == LOW) {
// начинаем читать код и переключать светодиоды, если код «свой» delayMicroseconds(4500); // ждѐм 4.5 мС
photoState = digitalRead(photoPin);
113
Глава 10. С чего начинаются роботы?
if (photoState == HIGH){ |
|
delay(1); // ждѐм 1 мС |
|
photoState = digitalRead(photoPin); |
|
if (photoState == LOW){ |
|
delay(1); // ждѐм 1 мС |
|
photoState = digitalRead(photoPin); |
|
if (photoState == HIGH){ |
|
delay(1); // ждѐм 1 мС |
|
photoState = digitalRead(photoPin); |
|
if (photoState == LOW){ |
|
delayMicroseconds(3500); |
// ждѐм 3.5 мС |
photoState = digitalRead(photoPin); if (photoState == HIGH){
// выключаем красный digitalWrite(ledPinRed, LOW);
//включаем зелѐный digitalWrite(ledPinGreen, HIGH); delay(2000); // зелѐный 2 секунды
//выключаем зелѐный digitalWrite(ledPinGreen, LOW);
}
}
}
}
}
}// иначе ничего не делаем
}
И глава, и книга должны были быть о роботах. А мы всё о программах, о паровозиках да семафорах, когда же про роботов?
Прежде, чем робот сделает первое движение, вы должны сделать первые шаги в освоении этой техники. Вот вы и сделали эти шаги, если прочитали все предыдущие главы, повторили всё, о чём в них написано. Если ваши устройства для паровозика и семафора заработали, то вы можете модифицировать описанные ранее программы так, чтобы паровозик «видел» семафор — добавьте к модулю фотоприёмник TSOP — а семафор, отправлял сигнал паровозику, что горит красный свет. Паровозик, принимая сигнал, отправлял бы сигнал «я свой», а семафор, получив его, включал зелёный свет. Вы можете добавить реле (включив его через транзистор к устройству в паровозике), которое будет отключать двигатель паровозика, получив сигнал от семафора, что горит красный свет, а «увидев» зелёный, включало бы двигатель. И вы получили первый роботпаровозик.
Впрочем, оставим «Паровозик из Ромашкова». Что нам мешает собранные и проверенные модули применить иначе. Например, если у вас есть тележка с электрическим моторчиком, умеющая поворачивать, то... Установим на эту тележку модуль семафора. Он будет принимать тот ИК-код, который мы проверили. А модуль излучения ИК-кода мы модифицируем следующим образом: вместо одного светодиода (АЛ307А) включим две гирлянды из светодиодов. Если использовать напряжение 12 В, то можно включить в гирлянду 8-9 светодиодов. И ничто не мешает сделать не две, а скажем четыре гирлянды, подключив все транзисторы к одному выходу микроконтроллера.
Зачем нам эта новогодняя ёлка? Выложим этими гирляндами периметр в виде прямоугольника. Внутрь поместим тележку-робота, которую запрограммируем так, чтобы, получив сигнал от излучателя, она останавливалась, отъезжала назад, поворачивала и вновь пыталась проехать к «ограде». Если мы оставим в ограде ворота, то получим робота, который должен найти выход из «загона».
114
Глава 10. С чего начинаются роботы?
Экспериментируя с «дальнобойностью» излучателей, скоростью движения робота-тележки, вы наработаете некоторый материал, который поможет создавать более сложные устройства. Сегодня и в Интернете, и в магазинах можно поискать и найти многое, что позволит собирать роботы. Есть много таких полезных датчиков, как ультразвуковой датчик расстояния, исполнительных механизмов, таких как сервомоторы и т.д.
Рис. 10.7. Компоненты для создания роботов в Интернет-магазине
Есть достаточно много заготовок, которые можно использовать в роботостроении. Вот, например, что можно найти в магазине:
115
Глава 10. С чего начинаются роботы?
Рис. 10.8. Готовые модули и блоки в радиомагазине
Но самое главное, чем вам следует обзавестись, это желанием научиться всему, терпением и умением придумывать что-то своё и реализовывать эти задумки. Возможно, обретя эти навыки, вы выберете себе профессию, увлекательную и современную, создателя роботов. Успехов вам!
116
Приложение А. О языке программирования Arduino
Приложение А. О языке программирования Arduino
117
Приложение А. О языке программирования Arduino
Arduino
блокнот
программиста
Brian W. Evans
118
Приложение А. О языке программирования Arduino
119
Приложение А. О языке программирования Arduino
120