- •Курс «Основы робототехники. Продвинутый уровень» Занятие 6. Робот, следующий по линии Практическое занятие 1. Установка датчиков линии на робота
- •Практическое занятие 2. Простое движение по линии на одном фоторезисторе
- •Практическое занятие 3. Простое движение по линии на двух фоторезисторах
- •Практическое занятие 4
- •Практическое занятие 5. Адаптивное поведение
Практическое занятие 3. Простое движение по линии на двух фоторезисторах
-
Опробуйте и при необходимости доработайте приведенную программу, замерьте время прохождения роботом траектории и сообщите преподавателю результаты для занятия 2 и 3
int In1 = 6; // когда на контакт подано HIGH, левое колесо крутится вперед int In3 = 10; // когда на контакт подана HIGH, правое колесо крутится вперед int photoPin1 = A0; // первый фоторезистор подключен к аналоговому входу A0 int photoPin2 = A1; // второй фоторезистор подключен к аналоговому входу A1 int val1 = 0; // значение с фоторезистора 1 int val2 = 0; // значение с фоторезистора 2
void setup() { Serial.begin(9600); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); }
void loop() { val1 = analogRead(photoPin1); // считываем значение с фоторезистора 1 val2 = analogRead(photoPin2); // считываем значение с фоторезистора 2 Serial.print("values: "); // выводим значения в COM-порт Serial.print(val1); Serial.print("\t"); Serial.println(val2); if(val1 == val2) // если значения равны – едем вперед { digitalWrite(In1, HIGH); digitalWrite(In3, HIGH);} Serial.println("forward"); if(val1 > val2) // если освещённость первого больше – едем влево { digitalWrite(In1, HIGH); digitalWrite(In3, LOW); Serial.println("left"); } else // если освещённость первого больше – едем вправо { digitalWrite(In1, HIGH); digitalWrite(In3, LOW); Serial.println("right"); // едем вправо } delay(50); } |
Примечание 1: в случае, если значения с фоторезисторов при одном и том же уровне освещения немного разные, необходимо скорректировать их для сравнения, пример: if(val1 == val2+50), если на одном и том же месте первый фоторезистор показывает 650, а второй 600
Примечание 2: в связи с тем, что использование функций на прошлом занятии привело к «перегрузке» и непониманию кода, решено временно их не использовать. Если есть желание и возможность – исправьте движения в коде с использованием функций, но особой необходимости в данном случае в этом нет
Практическое занятие 4
Более сложные программы для езды робота, в т.ч. с использованием ПИД-регулирования – в процессе разработки
Рекомендуется почитать статью «Робот, ездящий по линии под управлением Arduino» на сайте http://amperka.ru, а также скачать ее и принести на занятие
Скачайте статью «Робот, ездящий по линии под управлением Arduino» (если нет интернета, откройте принесенную на занятие). Скопируйте оттуда код «LineRobot_v1.ino»
Так как используемые в роботах драйверы двигателей (управляются аналогично роботам на Zelectro, если у Вас такой, то вносить изменения, относящиеся к двигателям, не надо) и датчики (цифровые, а не аналоговые, опять же если Вы принесли цифровые датчики, вносить изменения, относящиеся к датчикам, не надо) отличаются, внесем следующие изменения:
Исходный код |
Что нужно изменить |
|
добавить в код: int porog = 600; // найденный порог, см. Практическое занятие 2 |
#define SPEED_LEFT 6 |
вместо 6 номер пина, при сигнале на котором левый мотор едет вперед |
#define SPEED_RIGHT 5 |
вместо 5 номер пина, при сигнале на котором правый мотор едет вперед |
#define LEFT_SENSOR_PIN 8 |
номер пина левого датчика линии |
#define RIGHT_SENSOR_PIN 8 |
номер пина правого датчика линии |
digitalWrite(DIR_LEFT, HIGH); digitalWrite(DIR_RIGHT, HIGH) |
Убрать этот код во всех функциях, с используемым драйвером в нем нет необходимости |
boolean left = !digitalRead(LEFT_SENSOR_PIN); |
int LEFT_SENSOR_Value = analogRead(LEFT_SENSOR_PIN); if (LEFT_SENSOR_Value > porog) { boolean left = HIGH ; } else { boolean left = LOW ; } |
boolean right = !digitalRead(RIGHT_SENSOR_PIN); |
аналогично |
Код получится очень похожий на используемый в Практическом занятии 3 и результат будет похожий, за исключением того, что можно попробовать подобраться поближе к оптимуму, изменяя значения SPEED и BRAKE_K.