Модель робота, следующего по линии.

ГБОУ города Москвы гимназия 1272

Автор: Вешкин Артём, 7 класс

  Руководитель:

Оглавление

1.Введение        2

Часть 1. Сборка.        3

2. С чего начать?        3

3.Arduino UNO        4

4.Подключение компонентов к портам.        4

Часть 2. Программирование.        7

Заключение        13

Источники информации:        13

1.Введение

Я увлекаюсь робототехникой и занимаюсь ей уже полтора года. Робототехника, это прикладная наука, занимающаяся разработкой автоматизированных технических систем. Она опирается на такие дисциплины, как электроника, механика, информатика, а также радиотехника и электротехника. Обычно все новички в этой интересной науке начинают с наборов LEGO Mindstorms. В этих наборах уже даны готовые основные элементы, не требующие спайки и легкие в использовании, удобная среда программирования, позволяющая быстро собрать и запрограммировать робота, используя визуальную среду программирования Lego Mindstorm NXT, в которой запрограммировать робота, может даже человек, незнакомый с  языками программирования. Я начинал именно с такого. Это отличный набор, позволяющий изучить основы робототехники, программирования. Несмотря на простоту использования, с помощью этих наборов можно собрать очень сложных роботов, решающих сложные математические задачи. Например, из данного набора собран самый быстрый в мире робот собирающий кубик Рубика 3 X 3 за 4 секунды (Cubestormer II), в котором программа, взаимодействующая с датчиками и двигателями, вращающими кубик, выполняется на телефоне Samsung Galaxy S.

НЕ нашли? Не то? Что вы ищете?

При работе с наборами Lego, содержимое модулей скрыто от нас пластиковой оболочкой. Для того чтобы лучше понять  как устроены элементы робота, можно использовать платформу Arduino, при работе с которой нужно глубже понимать как работает робот на уровне “железа”, дает больше гибкости при использовании составных элементов робота. Также, в настоящей робототехнике используются более сложные языки программирования, чем в LEGO Mindstorms, которые дают больше гибкости при программировании роботов и более высокую скорость выполнения программ, что дает большую скорость реакции робота на данные, получаемые с датчиков. Именно поэтому я решил выяснить, возможно ли самому в домашних условиях собрать настоящего действующего робота, не используя LEGO Mindstorms.

Часть 1. Сборка.

2. С чего начать?


Я начал сборку робота с планировки месторасположения его составляющих на платформе. Робот получился двухэтажный. На нижнем ярусе я расположил мотор-редукторы и отсеки с батареями (общее напряжение 9 вольт). Я использовал пластиковые трубочки-стойки для крепления второго яруса. На нем располагались микроконтроллер Arduino UNO и жидкокристаллический дисплей. На микроконтроллер Arduino я установил драйвер управления моторами. Я воспользовался им, так, как моторы потребляют ток, с которым мой микроконтроллер не смог бы обрабатывать, и просто-напросто бы сгорел. В нижней части робота, со стороны колес установлен цифровой датчик линии Pololu QTR-8RC состоящий из 6 отдельных датчиков.

План месторасположения компонентов на моём роботе

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 выходах единовременно, когда все данные переданы.

Принципиальная схема подключения сдвигового регистра:

Для решения данной задачи потребовалось самому сделать печатную плату для крепления элементов схемы. Этим я и занялся. До этого я и не представлял, насколько это увлекательный процесс. Для начала надо выпилить основу из фольгированного стеклотекстолита. На основе нарисовать дорожки маркером. На будущих местах расположения радиоэлементов просверлить отверстия. Окунуть получившуюся заготовку в раствор хлорного железа на 15-20 минут. За это время фольга растворится на открытых участках и останется только на тех местах, где мы провели маркером. Оставшуюся фольгу надо залудить и в просверленные отверстия впаять радиоэлементы. Эти полоски фольги выполняют роль проводников электричества при соединении элементов схемы.  Ну, вот и готова наша плата. Вот её фотография в готовом виде:

Теперь благодаря этой микросхеме для дисплея требуется всего лишь 3 порта. Подсоединяем провода к плате Arduino. Вот что получилось:

Вид снизу робота на датчик линии. Этот датчик имеет 6 пар инфракрасный светодиод/фототранзистор.

Теперь осталось собрать второй ярус робота. Он будет держаться на специальных стойках. Вот и все. Робот собран.

Часть 2. Программирование.


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

    Алгоритм работы робота.


    Текст программы, управляющей движением робота, представлен ниже:

#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  // number of sensors used

#define TIMEOUT  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=-");

if (DEBUG) {

delay(1000);

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)

{

  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;

}

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);

  }

  }

  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);

}

    Калибровка датчиков.

Датчики линии перед началом работы необходимо откалибровать. Для этого  программу переключаем в режим отладки (#define DEBUG 1) , помещаем робота на линию, включаем. Робот будет вращаться, датчики будут перемещаться над черно - белой поверхностью  и через окно монитора порта (Ctrl+Shift+M в среде разработки) после завершения калибровки мы сможем посмотреть максимальные и минимальные значения, которые означают, как датчик воспринимает черный и белый цвет поверхности, над которой он расположен. Эти значения прописываем в программе.

Заключение


Своим проектом я доказал, что любой при наличии желания и терпения может создать своего собственного робота, причём необязательно, такого как у меня. Это может быть любой робот. Платформа ардуино не ограничивает творчество. В интернете много материалов о использовании этой платформы в робототехнике.

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

Роботы, следующие по линии, используются в производстве. Они заменяют людей, перевозя тележки с грузами по намеченной траектории из одного цеха в другой. Также подобных роботов можно использовать, как проводников для слепых. Более совершенные методы распознавания используются в современном автомобилестроении для контроля, движения автомобиля с использованием дорожной разметки.

Источники информации:


Русскоязычный сайт о платформе Ардуино. http://arduino. ru Англоязычный сайт о платформе Ардуино.  http://arduino. cc/ Виды плат Ардуино.

http://ru. wikipedia. org/wiki/Arduino

http://robocraft. ru/blog/arduino/1035.html


Управление LCD дисплеем с использованием сдвигового регистра по 3 проводам.

http://cjparish. blogspot. ru/2010/01/controlling-lcd-display-with-shift. html

http:///article. php/lcd-hookup-in-seconds


Пропорционально интегральное  (PI) управление.

http://www. /jps/PID_Controller_For_Lego_Mindstorms_Robots. html

Бесплатная среда разработки для Ардуино (Arduino IDE):

http://arduino. cc/en/Main/Software#toc1

Описание работы с программной библиотекой для цифрового датчика линии Pololu QTR-8RC

http://www. /docs/0J19/3


Библиотека для работы с жидкокристаллическим дисплеем используя сдвиговый регистр 74HC595 (по 3-м проводам вместо 6-и)

https:///cjameshuff/shiftlcd

Мой робот на YouTube

http://youtu. be/OPJ-95czLM8