Сделай Сам Свою Работу на 5

Практическое занятие 3. Простое движение по линии на двух фоторезисторах





Практическое занятие 1. Установка датчиков линии на робота

Установите датчики линии на робота. Для креплений держателей датчиков можно использовать выступающие части винтов, которыми привинчен драйвер двигателей. Варианты датчиков:

1. аналоговый на модуле

2. цифровой на модуле (для него потребуется изменить коды программ в занятии в области опроса)

3. аналоговый в виде фоторезистора и светодиода на макетной плате. Предположительно, последний вариант обеспечит бОльшую точность, чем первый вариант

Схема для третьего варианта (с двумя датчиками):

Схема собирается не на стенде, а на отдельной макетной плате. Два отверстия в краях макетной платы используйте для крепления ее на корпус робота датчиками вниз

Примечание: для обеспечения наилучшего результата можно попробовать иначе расположить элементы на макетной плате или попробовать использовать светодиоды другого цвета (на схеме белые)

Практическое занятие 2. Простое движение по линии на одном фоторезисторе

1. Напишем программу для движения робота по черной линии на белом фоне. Программа использует код из примера AnalogInOutSerial для опроса аналогового датчика линии и вывода результата в Монитор порта и код из примера Button для управления моторами



int In1 = 6; // когда на контакт подано HIGH, левое колесо крутится вперед int In3 = 10; // когда на контакт подана HIGH, правое колесо крутится вперед // при необходимости исправить номера пинов // нужно снять показания датчика на темном и светлом и найти среднее, пример: // снятые показания датчика линии над темной полосой = 400 // снятые показания датчика линии над светлым местом = 800, среднее между ними равно (400+800) / 2 = 600 int porog = 600; // найденный порог, выше которого - под датчиком светло, ниже - под датчиком темно int analogInPin = A3; // пин, к которому подключен датчик линии (при необходимости исправить) int sensorValue = 0; // значение, считанное с аналогового датчика void setup() { pinMode(In1, OUTPUT); // подключаем пины моторов pinMode(In3, OUTPUT); Serial.begin(9600); // подключаем Монитор порта для вывода значений с датчика } void loop() { sensorValue = analogRead(analogInPin); // читаем значение с датчика Serial.print("sensor = " ); // выводим значение с датчика в Монитор порта Serial.println(sensorValue); if (sensorValue > porog) {// проверка написана на основе примера Button digitalWrite(In1, HIGH); // если светло - едем вправо digitalWrite(In3, LOW); } else { // иначе - едем влево digitalWrite(In3, HIGH); digitalWrite(In1, LOW); } }

 



2. Возможно, скорость робота получилась слишком большой и с линии он съезжает. Для снижения скорости нужно провести следующую замену:

digitalWrite(In1, HIGH); → analogWrite(In1, 150); digitalWrite(In3, HIGH); → analogWrite(In3, 150); digitalWrite(In1, LOW); → analogWrite(In1, 0); digitalWrite(In3, LOW); → analogWrite(In3, 0);

В данному случае число в analogWrite – скорость вращения мотора робота, от 0 (мотор стоит) до 255 (максимальная скорость, такая же выдается при команде digitalWrite HIGH). Скорость 150 дана для примера, подбирается оптимум между скоростью и точностью, чтобы с одной стороны, робот не съезжал с линии, с другой стороны, проходил ее как можно быстрее

3. Доработайте программу, постаравшись найти оптимум и замерьте время проезда робота от старта до финиша на поле для соревнований по траектории секундомером

Примечание: для повышения скорости и точности используют различные программные приемы (например, включение двух моторов с разной скоростью, торможение на поворотах) и увеличение количества датчиков для более точного слежения за линией (2-4 датчика)

Практическое занятие 3. Простое движение по линии на двух фоторезисторах

1. Опробуйте и при необходимости доработайте приведенную программу, замерьте время прохождения роботом траектории и сообщите преподавателю результаты для занятия 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.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.