Модель робота, следующего по линии. ГБОУ города Москвы гимназия 1272 Автор: Вешкин Артём, 7 класс Руководитель: Иванушкина Н.П. 1 Оглавление 1.Введение .............................................................................................................................................................2 Часть 1. Сборка. ......................................................................................................................................................3 2. С чего начать? .....................................................................................................................................................3 3.Arduino UNO ........................................................................................................................................................4 4.Подключение компонентов к портам. ..............................................................................................................4 Часть 2. Программирование. ................................................................................................................................6 Заключение ..........................................................................................................................................................11 Источники информации: .....................................................................................................................................12 2 1.Введение Я увлекаюсь робототехникой и занимаюсь ей уже полтора года. Робототехника, это прикладная наука, занимающаяся разработкой автоматизированных технических систем. Она опирается на такие дисциплины, как электроника, механика, информатика, а также радиотехника и электротехника. Обычно все новички в этой интересной науке начинают с наборов LEGO Mindstorms. В этих наборах уже даны готовые основные элементы, не требующие спайки и легкие в использовании, удобная среда программирования, позволяющая быстро собрать и запрограммировать робота, используя визуальную среду программирования Lego Mindstorm NXT, в которой запрограммировать робота, может даже человек, незнакомый с языками программирования. Я начинал именно с такого. Это отличный набор, позволяющий изучить основы робототехники, программирования. Несмотря на простоту использования, с помощью этих наборов можно собрать очень сложных роботов, решающих сложные математические задачи. Например, из данного набора собран самый быстрый в мире робот собирающий кубик Рубика 3 X 3 за 4 секунды (Cubestormer II), в котором программа, взаимодействующая с датчиками и двигателями, вращающими кубик, выполняется на телефоне Samsung Galaxy S. При работе с наборами Lego, содержимое модулей скрыто от нас пластиковой оболочкой. Для того чтобы лучше понять как устроены элементы робота, можно использовать платформу Arduino, при работе с которой нужно глубже понимать как работает робот на уровне “железа”, дает больше гибкости при использовании составных элементов робота. Также, в настоящей робототехнике используются более сложные языки программирования, чем в LEGO Mindstorms, которые дают больше гибкости при программировании роботов и более высокую скорость выполнения программ, что дает большую скорость реакции робота на данные, получаемые с датчиков. Именно поэтому я решил выяснить, возможно ли самому в домашних условиях собрать настоящего действующего робота, не используя LEGO Mindstorms. 3 Часть 1. Сборка. 2. С чего начать? Я начал сборку робота с планировки месторасположения его составляющих на платформе. Робот получился двухэтажный. На нижнем ярусе я расположил мотор-редукторы и отсеки с батареями (общее напряжение 9 вольт). Я использовал пластиковые трубочки-стойки для крепления второго яруса. На нем располагались микроконтроллер Arduino UNO и жидкокристаллический дисплей. На микроконтроллер Arduino я установил драйвер управления моторами. Я воспользовался им, так, как моторы потребляют ток, с которым мой микроконтроллер не смог бы обрабатывать, и просто-напросто бы сгорел. В нижней части робота, со стороны колес установлен цифровой датчик линии Pololu QTR-8RC состоящий из 6 отдельных датчиков. План месторасположения компонентов на моём роботе 4 3.Arduino UNO Теперь несколько слов о самой платформе Arduino Uno. Arduino — это открытая платформа, которая позволяет собирать всевозможные электронные устройства. Платформа состоит из аппаратной и программной частей; обе чрезвычайно гибки и просты в использовании. Для программирования используется упрощенная версия языка С++. Разработку можно вести как с использованием бесплатной среды Arduino IDE, так и с помощью другого инструментария. “Мозгом” аппаратной части является микропроцессор ATmega328 работающий на частоте 16 MГц. Платформа имеет 14 цифровых входов/выходов (6 из которых могут использоваться как выходы широтноимпульсной модуляции), 6 аналоговых входов (в моем проекте не используются). На плате установлен разъем USB, через который платформу можно подключить к компьютеру и осуществлять программирование платформы, разъем для подключения питания (7 – 12 Вольт), разъёмы выхода стабилизированного напряжения 5В, 3,3В и кнопку перезагрузки. Также имеется 2 кб оперативной памяти, которые используются для хранения временных данных вроде переменных программы. Эта память очищается при обесточивании. Ещё имеется 1 кб памяти для долговременного хранения данных. По своему назначению это аналог жёсткого диска для Arduino. 4.Подключение компонентов к портам. После распланировки места для «внутренностей» робота требовалось подключить их к плате Arduino. На плате 14 входов. Датчики требуют 6 портов, моторы 4, а дисплей 6. В сумме 16. 14<16. А вот и первая проблема. Но на просторах интернет нашлось решение. Для уменьшения количества выводов при управлении цифровыми устройствами можно использовать сдвиговый регистр на микросхеме 74HC595. Чип преобразовывает входящий последовательный сигнал на 1 пине (Ds) в выходной параллельный на 8 пинах (Qx). Последовательная передача синхронна: для такта используется дополнительный пин (SHcp). Также отдельным пином управляется регистр данных (STcp), что позволяет изменять сигнал на 8 выходах единовременно, когда все данные переданы. 5 Принципиальная схема подключения сдвигового регистра: Для решения данной задачи потребовалось самому сделать печатную плату для крепления элементов схемы. Этим я и занялся. До этого я и не представлял, насколько это увлекательный процесс. Для начала надо выпилить основу из фольгированного стеклотекстолита. На основе нарисовать дорожки маркером. На будущих местах расположения радиоэлементов просверлить отверстия. Окунуть получившуюся заготовку в раствор хлорного железа на 15-20 минут. За это время фольга растворится на открытых участках и останется только на тех местах, где мы провели маркером. Оставшуюся фольгу надо залудить и в просверленные отверстия впаять радиоэлементы. Эти полоски фольги выполняют роль проводников электричества при соединении элементов схемы. Ну, вот и готова наша плата. Вот её фотография в готовом виде: 6 Теперь благодаря этой микросхеме для дисплея требуется всего лишь 3 порта. Подсоединяем провода к плате Arduino. Вот что получилось: Теперь осталось собрать второй ярус робота. Он будет держаться на специальных стойках. Вот и все. Робот собран. Часть 2. Программирование. В программе используется пропорционально дифференциальный алгоритм управления скоростью моторов, при котором скорость вращения одного из моторов увеличивается и другого уменьшается в зависимости от величины смещения линии относительно центра датчика. Этим поддерживается плавное движение робота по трассе. 7 Текст программы, управляющая движением робота представлен ниже: #include <ShiftLCD.h> // подключение библиотеки для работы с дисплеем при помощи сдвигового регистра #include <QTRSensors.h> // подключение библиотеки для работы с световыми сенсорами // Коэффициенты KP и KD подбираются опытным путем, т.о. что бы обеспечить стабильность и плавность движения робота. #define KP .2 #define KD 50 #define M1_DEFAULT_SPEED 255 #define M2_DEFAULT_SPEED 255 #define M1_MAX_SPEED 255 #define M2_MAX_SPEED 255 #define MIDDLE_SENSOR QTR_NO_MIDDLE_SENSOR #define NUM_SENSORS 6 #define TIMEOUT // number of sensors used 2500 // waits for 2500 us for sensor outputs to go low #define EMITTER_PIN QTR_NO_EMITTER_PIN // emitter is controlled by digital pin 2 #define DEBUG 0 // set to 1 if serial debug output needed ShiftLCD lcd(2, 0, 1); QTRSensorsRC qtrrc((unsigned char[]) {8,9,10,11,12,13} ,NUM_SENSORS, TIMEOUT, EMITTER_PIN); unsigned int sensorValues[NUM_SENSORS]; void setup() { lcd.begin(16, 2); lcd.setCursor(0,0); lcd.clear(); lcd.print("Artem's"); lcd.setCursor(0,1); lcd.print("-=RoBoT=-"); // delay(1000); 8 // manual_calibration(); load_calibration(); } int lastError = 0; int last_proportional = 0; int integral = 0; // Порты для подключения двигателей int E1 = 5; int M1 = 4; int E2 = 6; int M2 = 7; void loop() { unsigned int sensors[6]; // Управление моторами c использованием пропорционально интегрального (PI) способа управления. int position = qtrrc.readLine(sensors); int error = position - 2500; int motorSpeed = KP * error + KD * (error - lastError); lastError = error; int leftMotorSpeed = M1_DEFAULT_SPEED + motorSpeed; int rightMotorSpeed = M2_DEFAULT_SPEED - motorSpeed; // установить новую скорость левого и правтого мотора set_motors(leftMotorSpeed, rightMotorSpeed); } void set_motors(int motor1speed, int motor2speed) { 9 if (motor1speed > M1_MAX_SPEED ) motor1speed = M1_MAX_SPEED; // Ораничение максимальной скорости if (motor2speed > M2_MAX_SPEED ) motor2speed = M2_MAX_SPEED; // Ораничение максимальной скорости if (motor1speed < 0) motor1speed = 0; // Проверка скорости на отрицательное значение if (motor2speed < 0) motor2speed = 0; // Проверка скорости на отрицательное значение digitalWrite(M1,HIGH); digitalWrite(M2, HIGH); analogWrite(E1, motor1speed); //Управление скоростью моторов с помощью широтно импульсной модуляции analogWrite(E2, motor2speed); //Управление скоростью моторов с помощью широтно импульсной модуляции } void load_calibration() { qtrrc.calibrate(QTR_EMITTERS_ON); // Присваиваем данные по датчикам, полученные при калибровке qtrrc.calibratedMinimumOn[0] = 172; qtrrc.calibratedMinimumOn[1] = 128; qtrrc.calibratedMinimumOn[2] = 208; qtrrc.calibratedMinimumOn[3] = 292; qtrrc.calibratedMinimumOn[4] = 288; qtrrc.calibratedMinimumOn[5] = 336; qtrrc.calibratedMaximumOn[0] = 1200; qtrrc.calibratedMaximumOn[1] = 872; qtrrc.calibratedMaximumOn[2] = 1150; qtrrc.calibratedMaximumOn[3] = 1520; qtrrc.calibratedMaximumOn[4] = 1460; qtrrc.calibratedMaximumOn[5] = 1760; } 10 void manual_calibration() { // Калибровка датчиков. Робот вращается в разные стороны, // в это время происходит считывание максимальных и минимальных значений для калибровки. digitalWrite(M1,LOW); digitalWrite(M2, HIGH); //Управление скоростью моторов с помощью широтно импульсной модуляции analogWrite(E1, 255); analogWrite(E2, 255); int i; for (i = 0; i < 250; i++) { qtrrc.calibrate(QTR_EMITTERS_ON); delay(20); if (i == 100){ digitalWrite(M1,HIGH); digitalWrite(M2, LOW); //Управление скоростью моторов с помощью широтно импульсной модуляции analogWrite(E1, 0); analogWrite(E2, 0); } if (i == 125){ digitalWrite(M1,HIGH); digitalWrite(M2, LOW); //Управление скоростью моторов с помощью широтно импульсной модуляции analogWrite(E1, 255); analogWrite(E2, 255); } 11 } if (DEBUG) { // В режиме отладки данные можно посмотреть в среде разработки Serial.begin(9600); for (int i = 0; i < NUM_SENSORS; i++) { Serial.print(qtrrc.calibratedMinimumOn[i]); Serial.print(' '); } Serial.println(); for (int i = 0; i < NUM_SENSORS; i++) { Serial.print(qtrrc.calibratedMaximumOn[i]); Serial.print(' '); } Serial.println(); Serial.println(); } //Управление скоростью моторов с помощью широтно импульсной модуляции analogWrite(E1, 0); analogWrite(E2, 0); } Заключение Своим проектом я доказал, что любой при наличии желания и терпения может создать своего собственного робота, причём необязательно, такого как у меня. Это может быть любой робот, например робот для изготовления различных деталей (промышленный). Практическая значимость моей работы заключается в возможности использования данной работы, как наглядное 12 пособие на уроках технологии и информатики. Я считаю, что это могло бы помочь в обучении. Роботы, следующие по линии, используются в производстве. Они заменяют людей, перевозя тележки с грузами по намеченной траектории из одного цеха в другой. Также подобных роботов можно использовать, как проводников для слепых. Более совершенные методы распознавания используются в современном автомобилестроении для контроля, движения автомобиля с использованием дорожной разметки. Источники информации: 1) Русскоязычный сайт о платформе Ардуино. http://arduino.ru 2) Англоязычный сайт о платформе Ардуино. http://arduino.cc/ 3) Виды плат Ардуино. http://ru.wikipedia.org/wiki/Arduino http://robocraft.ru/blog/arduino/1035.html 4) Управление LCD дисплеем с использованием сдвигового регистра по 3 проводам. http://cjparish.blogspot.ru/2010/01/controlling-lcd-display-with-shift.html http://rowansimms.com/article.php/lcd-hookup-in-seconds 5) Пропорционально интегральное (PI) управление. http://www.inpharmix.com/jps/PID_Controller_For_Lego_Mindstorms_Robots.html 6) Бесплатная среда разработки для Ардуино (Arduino IDE): http://arduino.cc/en/Main/Software#toc1 7) Описание работы с программной библиотекой для цифрового датчика линии Pololu QTR-8RC http://www.pololu.com/docs/0J19/3