Бейктал Дж. Конструируем роботов на Arduino. Первые шаги. Готовые Arduino роботы Роботы на arduino uno


Робот – машинка на Ардуино становятся одним из самым популярных инженерных проектов в школьной робототехнике. Именно с таких устройств, автономных или управляемых со смартфона и bluetooth, начинается путь в робототехнику “после Lego”. К счастью, сегодня можно без труда купить все необходимые компоненты и достаточно быстро создать своего первого робота для езды по линии или объезда препятствий. В этой статье вы найдете подробную видео инструкцию как сделать продвинутый автомобиль Arduino Car своими руками, с питанием, датчиками линии, расстояния и управлении через bluetooth.

В отличие от других проектов, создание робота – автомобиля (Arduino Car) требует понимания и навыков работы сразу с несколькими важными компонентами, поэтому не стоит приступать к созданию машинок без получения базовых навыков работы с платформой Arduino. В любом случае, вам нужно будет но только подключить готовые модули, но и собрать конструкцию, шасси с двигателями, обеспечить правильное питание и управление. Все это потребует определенного терпения.

Вот список ключевых компонентов, которые обязательно встретятся в проекте.

Контроллер Ардуино

Куда уж без него, если мы говорим о проектах на этой платформе. Как правило, роботы машины делают на базе плат Arduino Uno и Nano. Mega будут слишком большие, Pro Mini сложнее подключать к компьютеру и соединять с остальными компонентами, а Leonardo требуют дополнительных навыков в программировании, они дороже и их основное преимущество (тесная интеграция с компьютером в качестве периферийного устройства) в данном случае не слишком востребована.

Есть еще вариант использования плат ESP8266 или ESP32, тогда в проекте появляется возможность управления машиной через WiFi. Но и сами платы и их программирование требует определенных навыков, в этой статье мы будем говорить преимущественно об Uno или Nano.

Конструкция, шасси и двигатели робота на Ардуино

Для того, чтобы что-то поехало или стало перемещаться, надо снабдить “это” колесами, гусеницами или манипуляторами-ногами. Вот тут выбор совершенно не ограничен, можно использовать совершенно любые комбинации и сочетания платформ. Как правило, в качестве начального варианта берутся уже готовые наборы платформ с Алиэкспресс.


Двигатель, шасси и колеса машинки на ардуино

Если работать со стандартными наборами вам не интересно, можно создать платформу своими руками. Например, разобрать игрушечные радиоуправляемые машинки или любые двигатели на 5-12 вольт, с редукторами или без. Колеса можно создать и самим, что тоже является интересной задачей.

Драйвер двигателей


Ардуино – достаточно ранимое устройство, не терпящее больших нагрузок по току. Соединяя его с “брутальными” мощными двигателями, не избежать беды. Поэтому для нормальной совместной работы нам нужно будет включить в схему робота компонент, отвечающий за управление двигателями – подающий и отключающий ток на их обмотки. Речь идет о микросхеме или готовом модуле, которые называют драйвером двигателя. На нашем сайте есть статьи, посвященные . Если вы покупаете готовые шасси, то обязательно предусмотрите возможность размещения на них подходящего драйвера.

Красивый корпус

Как правило, вся конструкция автомобиля строится вокруг его шасси. Если посмотреть примеры готовых проектов, то они часто выглядят как “провода на колесиках” – внешний вид их изобилует пучками соединительных проводов, ведущих от восседающего на троне контроллера Ардуино к драйверам, моторам и датчикам. Между тем, красивый и функциональный корпус не только вызывает правильные эстетические чувства и помогает выделить вашу модель от остальных. Хороший корпус может превратить игрушку в реальное устройство, помогает привить навыки конструирования и промышленного дизайна, что важно для инженеров любого возраста.

Обеспечение правильной схемы питания – это то, что очень часто оказывается на последнем месте в списке приоритетов начинающих ардуинщиков. Между тем, именно ошибки в схеме электропитания становятся основными причинами проблем, возникающих в процессе работы умных устройств на Ардуино. Создавая ардуино-машинку нужно предусмотреть питание контроллера, двигателей, драйвера и датчиков. У всех них есть свои ограничения и особенности работы, требуется создать оптимальное по весу и сложности решение, позволяющее учесть все эти ограничения.


Питание робота на Ардуино

Создавая по-настоящему автономное устройство робота, нужно побеспокоиться и о времени его работы, и о возможности быстрой подзарядки или смены батареек. Как правило, выбираются решения из следующих вариантов:

  • Обычные батарейки AA. Тут нужно понимать, что платы Arduino Uno, Nano и большинство двигателей, используемых в Ардуино-робототехнике, требуют напряжения в диапазоне 6-9 вольт. Поэтому придется собрать вместе последовательно не менее 4 батареек на 1,5 В, причем сами батарейки должны быть хорошего качества и обеспечивать работу с достаточно большим током. Например, большинство солевых батареек этим критериям не удовлетворяют. Батарейки AAA при создании ардуино-машинок практически не используются из-за своей пониженной емкости (хотя могут использоваться в миниатюрных моделях, где размер имеет первостепенное значение).
  • Аккумулятор AA. Здесь возникает еще большее ограничение по напряжению и току. Большинство аккумуляторов выдают напряжение 1,2 вольт, поэтому их требуется больше для “собирания” нужных нам 6-9 вольт. Несомненным плюсом является возможность перезарядки.
  • Литиевые аккумуляторы 18650. Это уже “серьезная артиллерия”, позволяющая получить большое время автономной работы, возможность подзарядки и приемлемые характеристики по току и напряжению. Рабочее напряжение для таких элементов питания – 3,7 В, что позволяет собирать готовую схему питания всего из двух элементов.
  • Другие источники питания. Сюда можно включить как более мощные и габаритные никель-металлгидридные, кадмиевые аккумуляторы, так и многочисленные литий-ионные “плоские” варианты, используемые в дронах, смартфонах или другой портативной цифровой технике.

Каким бы ни был источник питания, нужно обеспечить его надежное крепление, удобное расположение, защиту от воздействия недружелюбной окружающей среды. Если вы подключаете к одному источнику и контролер, и двигатели, и датчики, то нужно позаботиться о правильной схеме, включающей, например, надежную связь “по земле” всех устройств.

Где купить платформу и запчасти

Все, о чем говорится в этой статье, можно без проблем купить на всем известном сайте. К сожалению, подавляющее большинство предложений основываются на стандартной платформе 4WD автомобиля с двумя несущими планками, не очень надежными двигателями и колесами, любящими ездить в “развалочку”. Но эти варианты относительно не дороги и вполне подойдут для начала работы.

Инструкция по сборке робота-автомобиля

В этой статье расскажем вам о том, как по шагам собрать универсального робота на колесной или гусеничной платформе. Управлять им будет микроконтроллер Ардуино нано. Если вам не нравится долго читать, посмотрите в конце статьи на видео, подготовленное нашими партнерами – каналом ArduMast Club.

Пример платформы робота-машины на Ардуино

Предлагаем инструкцию по созданию универсальной платформы, которая потом пригодится для создания самых разных проектов, независимо от выбранного контролера или типа шасси. Вы можете использовать стандартные варианты из Алиэкспресса, как на видео, можете снабдить машину гусеницами и создать вездеход, можете придумать вообще ни на что не похожий вариант. Главное, чтобы число двигателей не превышало 4 и сами ни не были слишком мощными (тогда придется менять тип управления моторами – другой драйвер двигателя).


Для реализации проекта нам понадобится:

  • Контроллер Ардуино (в нашем случае, Arduino Nano).
  • Двигатели с редукторами.
  • Корпус и шасси для крепления колес и оборудования
  • Корпус для аккумуляторов 18650 с выключателем.
  • Коммутационные провода.

Дополнительное оборудование, которое потребуется для создания полноценного проекта:

  • Датчик расстояния и серво-мотор, на который он установлен.
  • Инфракрасные датчики линии.
  • Светодиоды для индикации и “красоты”.
  • Пьезодинамик – пищалка.
  • Bluetooth модуль (если собираетесь управлять машинкой дистанционно).
  • Sensor shield (упрощает коммутацию).
  • Модуль контроля заряда и подзарядки аккумуляторов.
  • Сами аккумуляторы.

Общая схема машинки на Ардуино

Схема электропитания робота автомобиля

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

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


Схема питания и подключения двигателей в ардуино автомобиле

Все достаточно стандартно и вы найдете в интернете десятки подобных примеров. Но в этой схеме есть большой минус – в случае полного разряда аккумуляторы придут в негодность.


Для добавления контроллера разряда придется внести следующие изменения в схему:


Схема питания с контролем разряда аккумулятора

Теперь аккумуляторы будут защищены, но здесь нет возможности заряжать их.


Для зарядки можно использовать модуль повышения напряжения с 5v до необходимого уровня зарядки, который зависит от количества серий используемых аккумуляторов. Он имеет гнездо типа микро USB и при частом использовании оно может сломаться, поэтому мы рекомендуем установить дополнительное гнездо для последующей подзарядки пяти вольтовым блоком питания. Для зарядки двух литий-ионных аккумуляторов необходимо настроить выходное напряжение на 8,4 Вольта.


Схема питания с модулем зарядки для ардуино робота машинки

Подключаем двигатели и плату

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

Монтируем драйвер двигателей на платформу так, чтобы его радиатор был спереди. ЭТО ВАЖНО! В противном случае, вам придется переписывать программу для микроконтроллера.


Драйвер двигателя для Ардуино робота

Затем размещаем холдер и плату БМС. Не забываем оставлять место спереди для последующего монтажа каких-либо сенсоров. Ардуиио нужно разместить так, чтобы была в дальнейшем возможность подключить его к ПК для прошивки. Это же правило относится и к модулю для зарядки аккумуляторов.

Питание для ардуино и других электронных компонентов мы возьмем от драйвера двигателей.

Подключаем Bluetooth к машинке

Мы собираемся использовать модуль Bluetooth через SoftwareSerial (библиотеку SoftwareSerial.h), поэтому подключаем модуль блютуз к 3 и 4 цифровым пинам ардуино. RX к D3, TX к D4


Схема подключения Bluetooth к ардуино машинке
Схема подключения драйвера двигателя к роботу
Схема подключения компонентов к Arduino
Датчик расстояния машины

Программирование робота на Ардуино

Так как мы делаем инструкцию по сборке универсального робота, то неплохо бы предусмотреть все необходимое для разных вариантов ее использования. Весь код вы можете найти в архиве: https://yadi.sk/d/jIYZQDI-GuytMw

Для езды по черной линии мы задействовали 3 пина под датчики линии и три пина для подключения светодиодов, чтобы иметь возможность визуального контроля наличия линии. Другими словами, если под левым сенсором есть черная линия, то загорится левый светодиод и так далее. Кроме того, мы разработали и протестировали схему, в которой будут одновременно использоваться и управление скоростью моторов по ШИМ, и серводвигатель.

Видео инструкция по сборке робота на Ардуино

Предлагаем вашему вниманию подробную видео-инструкцию по сборке робота автомобиля на Ардуино от нашего партнера – канала ArduMast Club .

Надеемся, статья была полезна для вас. В комментариях под видео вы сможете найти код, схемы робота, соединения деталей, скетч и ссылки на интернет-магазины, в которых вы можете купить все необходимые компоненты.

В сегодняшней статье я расскажу вам, как сделать робота, обходящего препятствия, на базе микроконтроллера Ардуино своими руками.



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

Codebender – это браузерный IDE, это самый простой способ программировать вашего робота из браузера. Нужно кликнуть на кнопку «Run on Arduino» и все, проще некуда.

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

/* Arduino Obstacle Avoiding Robot with a servo motor and an ultrasonic sensor HC-SR04 LED and buzzer */ //Библиотеки #include #include "Ultrasonic.h" //Константы const int button = 2; //Пин кнопки на пин 2 const int led = 3; //Пин светодиода (через резистор) на пин 3 const int buzzer = 4; //Пин пищалки на пин 4 const int motorA1= 6; //позитивный (+) пин мотора A на пин 6 (PWM) (от модуля L298!) const int motorA2= 9; //негативный пин (-) мотора A на пин 9 (PWM) const int motorB1=10; // позитивный (+) пин мотора B на пин 10 (PWM) const int motorB2=11; // негативный пин (-) мотора B на пин 11 (PWM) Ultrasonic ultrasonic(A4 ,A5); //Создаем объект ultrasonic(trig pin,echo pin) Servo myservo; //Создаём объект Servo, чтобы контролировать сервоприводы //Переменные int distance; //Переменная для хранения дистанции до объекта int checkRight; int checkLeft; int function=0; //Переменная для хранения функции робота: "1" – движение или "0" - остановлен. По умолчанию остановлен int buttonState=0; //Переменная для хранения состояния кнопки. По умолчанию "0" int pos=90; //переменная для хранения позиции серво. По умолчанию 90 градусов- датчик будет смотреть вперёд int flag=0; //полезный флаг для хранения состояния кнопки, когда кнопка отпущена void setup() { myservo.attach(5); //Серво-пин соединён с пином 5 myservo.write(pos); // говорит сервоприводу идти на позицию в переменной "pos" pinMode(button, INPUT_PULLUP); pinMode(led, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(motorA1,OUTPUT); pinMode(motorA2,OUTPUT); pinMode(motorB1,OUTPUT); pinMode(motorB2,OUTPUT); } void loop() { //Проверка состояния кнопки buttonState = digitalRead(button); unsigned long currentMillis = millis(); //считаем... //Меняет главную функцию (остановлен/двигается) когда кнопка нажата if (buttonState == LOW) {//Если кнопка нажата единожды... delay(500); if (flag == 0){ function = 1; flag=1; //меняем переменную флага } else if (flag == 1){ //Если кнопка нажата дважды function = 0; flag=0; //меняем переменную флага снова } } if (function == 0){ //Если кнопка отжата или нажата дважды, то: myservo.write(90); //установить для серво 90 градусов – датчик будет смотреть вперёд stop(); //робот остаётся неподвижным noTone(buzzer); //пищалка выключена digitalWrite(led, HIGH);// и диод горит } else if (function == 1){//Если кнопка нажата, то: //Считываем дистанцию... distance = ultrasonic.Ranging(CM); //Совет: Используйте "CM" для сантиметров и "INC" для дюймов //Проверяем на наличие объектов... if (distance > 10){ forward(); //Всё чисто, двигаемся вперёд! noTone(buzzer); digitalWrite(led,LOW); } else if (distance <=10){ stop(); //Обнаружен объект! Останавливаемся и проверяем слева и справа лучший способ обхода! tone(buzzer,500); // издаём звук digitalWrite(led,HIGH); // включаем светодиод //Начинаем сканировать... for(pos = 0; pos =0; pos-=1){ //идём от 180 градусов к 0 myservo.write(pos); // говорим серво пройти на позицию в переменной "pos" delay(10); // ждём 10 мс, пока сервопривод достигнет нужной позиции } checkRight= ultrasonic.Ranging(CM); myservo.write(90); // Датчик снова смотрит вперёд //Принимаем решение – двигаться влево или вправо? if (checkLeft checkRight){ right(); delay(400); // задержка, меняем значение при необходимости, чтобы заставить робота повернуться. } else if (checkLeft <=10 && checkRight <=10){ backward(); //Дорога перекрыта... возвращаемся и идём налево;) left(); } } } } void forward(){ digitalWrite(motorA1, HIGH); digitalWrite(motorA2, LOW); digitalWrite(motorB1, HIGH); digitalWrite(motorB2, LOW); } void backward(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, HIGH); digitalWrite(motorB1, LOW); digitalWrite(motorB2, HIGH); } void left(){ digitalWrite(motorA1, HIGH); digitalWrite(motorA2, LOW); digitalWrite(motorB1, LOW); digitalWrite(motorB2, HIGH); } void right(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, HIGH); digitalWrite(motorB1, HIGH); digitalWrite(motorB2, LOW); } void stop(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, LOW); digitalWrite(motorB1, LOW); digitalWrite(motorB2, LOW); }

Нажав кнопку «Edit», вы можете редактировать скетч для своих нужд.

Например, изменив значение «10» измеряемого расстояния до препятствия в см, вы уменьшите или увеличите дистанцию, которую будет сканировать robot Arduino в поисках препятствия.

Если робот не двигается, может изменить контакты электромоторов (motorA1 и motorA2 или motorB1 и motorB2).

Шаг 7: Завершенный робот

Ваш самодельный робот, обходящий препятствия, на базе микроконтроллера Arduino готов.

После того, как стали популярными самобалансирующие скутеры Segway, я
всегда хотел создать нечто подобное. Вдохновившись ими, я решил построить Self Balancing Robot ,
используя Arduino. Таким образом, я захотел понять основный принцип работы всех этих скутеров,
а также узнать, как работает алгоритм ПИД-регулирования.

Как только я начал работу над ним, я понял, что этот робот — немного сложнее нежели я думал.
Существует так много подводных камней, которые
следует учитывать — тип батареи, положение батареи, сцепление с колесом, тип драйвера двигателя,
поддержание CoG (центр тяжести) и многое другое.

Но как только вы его сделаете, вы согласитесь, что это не так сложно,
как кажется. Итак, давайте посмотрим правде в глаза, в этом уроке я опишу свой опыт по созданию
робота для самостоятельной балансировки. Вы можете быть абсолютным новичком, который только
начинает работать или, возможно, приземлился здесь после долгого разочарования, когда питались заставить вашего робота балансировать.
Итак, давайте начнем …

Выбор електроники для вашего бота

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

  • Arduino UNO
  • Двигатели постоянного тока с редуктором – 2Nos
  • L298N Motor Driver Module
  • MPU6050
  • Пара колес
  • 7.4V Li-ion Battery
  • Купа проводов
  • Каркас напечатанный на 3D принтере

Контроллер: Контроллер, который я использовал здесь, это Arduino UNO, почему, потому что он просто прост в использовании. Вы также можете использовать Arduino Nano или Arduino mini, но я бы рекомендовал вам придерживаться UNO, так как мы можем запрограммировать его напрямую без какого-либо внешнего оборудования.

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

Драйвер двигателя: если вы выбрали двигатели постоянного тока, такие как мои, тогда вы можете использовать модуль драйвера L298N, как я, или даже L293D должен работать нормально.

Колеса: не недооценивайте этих парней; Мне было трудно понять, что проблема была в моих колесах. Поэтому убедитесь, что ваши колеса хорошо сцеплены с полом, который вы используете.

Акселерометр и гироскоп: лучшим выбором акселерометра и гироскопа для вашего робота будет MPU6050 . Поэтому не пытайтесь построить его с обычным акселерометром, например ADXL345 , или что-то в этом роде, он просто не сработает. Вы узнаете, почему в конце этой статьи. Вы также можете использовать эту статью для изучения MPU6050 и его подключения к Arduino.

Battery: Нам нужна батарея как можно более легкая, а рабочее напряжение должно быть больше 5 В, чтобы мы могли напрямую управлять нашим Arduino без модуля повышения. Таким образом, идеальным выбором будет литий-полимерный аккумулятор 7.4V. Поскольку у меня была литий-ионная аккумуляторная батарея 7,4 В, я ее использовал. Но помните, что Li-po лучше, чем Li-ion.

Chassis: Еще одно место, где вы не должны идти на компромисс, — это шасси вашего робота. Вы можете использовать картон, дерево, пластик, с которым вы хорошо справляетесь. Но только убедитесь, что шасси прочное и оно не должно люфтить, когда робот пытается балансировать. Я разработал собственное шасси в программе Solidworks . Если у вас есть принтер, вы также можете распечатать проект, его файлы будут прикреплены внизу статьи.

3D-печать и сборка робота

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

Детали не имеют нависающих частей, поэтому вы можете легко распечатать их без каких-либо опор, а заполнение на 25% будет вполне достаточно. Конструкция довольно простая, и любой базовый принтер должен легко справиться с ее частями. Я использовал программное обеспечение Cura , чтобы подготовить модель и напечатать ее с помощью Tevo Tarantula , настройка показана ниже.

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



Фактическая конструкция была запланирована с использованием приводного модуля L298N в нижней стойке, Arduino в средней и батареи сверху, как показано выше. Если вы делаете все как я, вы можете напрямую завинтить плату с помощью предусмотренных отверстий и использовать проводную бирку для аккумулятора Li-po. Эта компоновка также должна работать, за исключением сверхпрочных колес, которые мне пришлось изменить позже.

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

Принципиальная электрическая схема

Соединение частей этого робота между собой задача не сложная. Нам просто нужно подключить MPU6050 к Arduino и подключить двигатели, через модуль драйвера двигателя. Вся конструкция рассчитана на питание от литиево-ионного аккумулятора 7.4V. Схема показана ниже….

Модуль управления двигателем Arduino и L298N напрямую питается через вывод Vin и 12-вольтовый вход соответственно. Встроенный регулятор на плате Arduino преобразует входное напряжение 7.4V в 5V, и ATmega IC и MPU6050 будут питаться от него.

MPU6050 взаимодействует с интерфейсом Arduino через интерфейс I2C, поэтому мы используем штыри SPI A4 и A5 от Arduino. Двигатели постоянного тока подключаются к штырям PWM D6, D9 D10 и D11 соответственно. Нам нужно подключить их к контактам PWM, потому что мы будем контролировать скорость двигателя постоянного тока, изменяя рабочий цикл сигналов ШИМ. Если вы не знакомы с этими двумя компонентами, рекомендуется прочитать руководство по интерфейсу MPU6050 Interfacing и L298N Motor.

Программирование самобалансирующегося робота

Теперь нам нужно запрограммировать нашу Arduino UNO, чтобы сбалансировать робота. Здесь происходит вся магия; концепция, стоящая за ней, проста. Мы должны проверить, наклоняется ли бот к передней или к задней части с помощью MPU6050, а затем, если он наклоняется к передней части, мы должны вращать колеса в прямом направлении, и если он наклоняется к задней части, мы должны вращать колеса в обратном направлении.

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

Чтобы узнать текущее положение бота, мы используем MPU6050, который представляет собой 6-осевой акселерометр и датчик гироскопа. Чтобы получить достоверное значение положения от датчика, нам нужно использовать значение как акселерометра, так и гироскопа, поскольку значения от акселерометра имеют проблемы с шумом, а значения из гироскопа со временем дрейфуют. Таким образом, мы должны объединить оба и получить значение шага рыскания и крена нашего робота, из которого мы будем использовать только значение рыскания.

Теперь у нас есть библиотеки, добавленные в нашу среду разработки Arduino. Давайте начнем программирование для нашего Self-балансирующего робота. Как и всегда, полный код для проекта приведен в конце этой страницы, здесь я просто объясняю наиболее важные фрагменты кода. Ранее сообщалось, что код построен поверх примера кода MPU6050, мы просто собираемся оптимизировать код для нашей цели и добавить PID и технологию управления для нашего самобалансирующегося робота.

Сначала мы включаем библиотеки, которые необходимы для работы этой программы. Они включают встроенную библиотеку I2C, библиотеку PID и библиотеку MPU6050, которые мы только что загрузили.

Затем мы объявляем переменные, которые необходимы для получения данных от датчика MPU6050. Мы читаем как значения гравитационного вектора, так и значения кватерниона, а затем вычисляем значение угла и угла поворота бота. Конечный результат будет иметь массив float ypr .

Далее идет очень важный сегмент кода, и именно здесь вы будете тратить много времени на настройку нужного набора значений. Если ваш робот построен с очень хорошим центром тяжести, а компоненты симметрично расположены (что в большинстве случаев нет), тогда значение вашего уставки будет равно 180. Просто подключите ваш бот к серийному монитору Arduino и наклоните его до положения балансировки, прочитайте значение, отображаемое на последовательном мониторе, и это ваше заданное значение. Значение Kp, Kd и Ki должно быть настроено в соответствии с вашим ботом. Никакие два одинаковых бота не будут иметь одинаковых значений Kp, Kd и Ki, поэтому от него не уйти.

В следующей строке мы инициализируем алгоритм PID, передавая входные переменные input, output, set point, Kp, Ki и Kd. Из них мы уже установили значения заданного значения Kp, Ki и Kd в приведенном выше фрагменте кода. Значение входа будет текущим значением рыскания, которое считывается с датчика MPU6050, а значением выхода будет значение, которое рассчитывается по алгоритму PID. Таким образом, в основном алгоритм PID даст нам выходное значение, которое должно использоваться для коррекции значения Input, чтобы оно было близко к заданной точке.

Внутри функции void setup мы инициализируем MPU6050, настроив DMP (Digital Motion Processor). Это поможет нам объединить данные акселерометра с данными гироскопа и обеспечить надежное значение Yaw, Pitch and Roll. Мы не будем углубляться в это, так как это будет далеко за пределами темы. Во всяком случае, один сегмент кода, который вы должны искать в функции настройки, представляет собой значения смещения гироскопа. Каждый датчик MPU6050 имеет собственные значения смещений, вы можете использовать этот эскиз Arduino для расчета значения смещения вашего датчика и соответственно обновить следующие строки в вашей программе.

Мы также должны инициализировать контакты PWM Digital, которые мы используем для подключения наших двигателей. В нашем случае это D6, D9, D10 и D11. Таким образом, мы инициализируем эти контакты, поскольку выходные выводы делают их LOW по умолчанию.

Внутри основной функции цикла мы проверяем, готовы ли данные из MPU6050 для чтения. Если да, то мы используем его для вычисления значения PID, а затем отображаем входное и выходное значение PID на последовательном мониторе, чтобы проверить, как реагирует PID. Затем, основываясь на значении вывода, мы решаем, должен ли бот двигаться вперед или назад или стоять на месте.

Поскольку мы предполагаем, что MPU6050 вернет 180, когда бот будет вертикально. Мы получим положительные значения коррекции, когда бот падает вперед, и мы получим значения отрицательными, если бот падает назад. Поэтому мы проверяем это условие и вызываем соответствующие функции для перемещения бота вперед или назад.

Выходная переменная PID также определяет, как быстро двигатель должен вращаться. Если бот вот-вот упадет, мы сделаем небольшую коррекцию, медленно вращая колесо. Если эти незначительные корректировки работают, и все еще, если бот падает, мы увеличиваем скорость двигателя. Значение того, как быстро вращаются колеса, будет определяться алгоритмом PI. Заметим, что для функции Reverse мы умножили значение вывода с -1, чтобы мы могли преобразовать отрицательное значение в положительное.

Работа робота Self Balancing Arduino

После того как вы будете готовы с оборудованием, вы можете загрузить этот код на свою плату Arduino. Убедитесь, что соединения правильные, поскольку мы используем литий-ионную батарею. Поэтому дважды проверьте наличие коротких замыканий и убедитесь, что клеммы не соприкасаются, даже если ваш бот испытывает небольшие удары. Включите ваш модуль и откройте свой последовательный монитор, если ваш Arduino может связаться с MPU6050 успешно, и если все работает должным образом, вы увидите следующий экран.

Здесь мы видим входные и выходные значения ПИД-алгоритма в формате input => output. Если бот отлично сбалансирован, значение выхода будет равно 0. Входное значение — это текущее значение от датчика MPU6050. Символ «F» означает, что бот движется вперед, а «R» означает, что бот обратно.

Надеюсь, это поможет создать собственный робот-балансировщик =).

Начинают изучение ардуино с создания простеньких роботов. Сегодня я расскажу о простейшем роботе на ардуино уно, который как собачка будет следовать за вашей рукой или за любым другим объектом, отражающим инфракрасный свет. Также этот робот позабавит детишек. Мой 3-х летний племянник охотно игрался с роботом:)

Начну с перечисления деталей, которые будут необходимы при построении - Arduino UNO;

Инфракрасные дальномеры;

-двигатели 3-х вольтовые с редукторами и колесами;

-коннекторы для батареек 3А;

-аккумулятор (если не хватит батареек);

-Реле, чтобы управлять двигателями;

Ну, и прочие материалы, которые понадобятся в процессе создания.
Сначала делаем основание. Я решил сделать его из дерева. Деревянную дощечку и пропилил таким образом, что моторы в прорезях сидят идеально


Потом планочкой из дерева я зажимаю моторы, прикручивая эту планку

Далее на корпусе я разместил ардуино, реле, бредбоард, дальномеры, а под основание шасси поворачивающееся

Теперь все соединяем по схеме

В конце загружаем следующий скетч в ардуино:

Const int R = 13; //пины к которым подключены ИК-дальномеры const int L = 12; int motorL = 9; //пины к которым подключено реле int motorR = 11; int buttonState = 0; void setup() { pinMode(R,INPUT); pinMode(L,INPUT); pinMode(motorR,OUTPUT); pinMode(motorL,OUTPUT); } void loop() { { buttonState = digitalRead(L); if (buttonState == HIGH){ digitalWrite(motorR,HIGH); } else { digitalWrite(motorR,LOW); } } {{ buttonState = digitalRead(R); if (buttonState == HIGH){ digitalWrite(motorL,HIGH); } else { digitalWrite(motorL,LOW); } } } }

Принцип действия очень прост. Левый дальномер отвечает за правое колесо, а правый за левое

Чтобы было понятнее, можете посмотреть видео в котором показан процесс создания и действие робота

Этот робот очень простой и его может сделать каждый. Он поможет вам понять принципы действия таких модулей, как реле и ИК дальномеры и как их лучше использовать.

Надеюсь, что вам понравилась такая самоделка, помните, что самоделки - это круто!

В этой статье мы займемся постройкой своего робота с нуля. То, что у нас получится, смотрите на фото ниже. Робот будет ездить как самостоятельно, так и под управлением смартфона. А еще мы рассмотрим постройку своего мобильного робота с нуля.

3 D принтер

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

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

3D принтер? Всем, наверное, знаком обычный офисный принтер, который может распечатать на А4 нужный нам текст. Так вот, 3D принтер – это принтер, который может распечатать нужную деталь. Есть разные 3d принтеры. У меня принтер с технологией FDM (послойное наплавление). Какие еще есть технологии 3d печати, можно узнать в интернете.

Многие 3D принтеры работают на Arduino. При желании, можно собрать свой 3D принтер. Главная идея 3D принтера в том, что можно печатать абсолютно любую вещь, мы же напечатаем корпус для робота.

Для начала определимся с описанием платформы. Я хочу, чтобы платформа была двухколесной и в нее должны помещаться Arduino, питание, моторы и несколько датчиков.

Теперь нужно нарисовать макет платформы на бумаге и разместить на ней нужные компоненты. Например, вот так.

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

Вот такая платформа получилась у меня.

После этого нужно преобразовать 3D модель в G-код, понятный 3d принтеру. Для этого существуют специальные программы - слайсеры. Я использую программу Repetier-Host со слайсером Sli3er. Вот как выглядит деталь, готовая к распечатке.

А вот распечатанная модель.

Только недавно у нас была идея, а готовая деталь уже перед нами. С помощью 3D принтера можно создавать уникальные вещи в единичных экземплярах. 3D принтер – классная штука. Советую всем!

Моторы

Теперь нужно подумать о том, как наш мобильный робот будет двигаться. Первое, что приходит на ум – колеса. Так и поступим.

Если кто помнит, мы уже пробовали подключать мотор к Arduino. Кто не помнит, не знает или не читал – смотрим . В подключении мотора с помощью MOSFET есть существенные недостатки – невозможно оперативно менять скорость и направление вращения. Пришло время научить Arduino управлять моторчиками по-настоящему!

Для этого можно использовать микросхему L293D. L293D позволяет управлять сразу двумя моторами, с током 600 мА на канал и пиковым до 1000 мА, а если объединить каналы – то до 1200 мА и 2000 мА пикового тока. Про объединение расскажу ниже.

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

Приступим. Соберем простенькую схему с одним мотором и порулим им. Внимание на схему сборки.

Если не знаете английский или просто не разобрались в Datasheet, то вот описание подключения. Нумерацию микросхем, надеюсь, все знают или узнали из статьи про микросхемы.

  • Пин 1 – Отвечает за скорость вращения мотора. Аналогичный - на пине 9. Принимает значения от 0 до 255, что без проблем можно организовать с помощью PWM.Я подсоединил EN к пятому пину Arduino, который поддерживает PWM.
  • Пины 2 и 7 – Отвечают за направление движения мотора. Аналогичные - на пинах 10 и 15. Подача логической единицы на один из этих пинов заставит мотор крутиться в одну сторону (зависит от подключения мотора), подача логической единицы на другой – заставит мотор крутиться в обратную сторону.
  • Пины 3 и 6 – К ним нужно подключать мотор. Полярность не важна, от подключения будет зависеть только направление вращения. Аналогичные - на пинах 11 и 14.
  • Пины 4 и 5 – Это земля. Думаю, не нуждается в пояснении. Аналогичные – 12 и 13.
  • Пин 8 – Питание для моторов. На него нужно подать питание в диапазоне от 4.5 до 36 Вольт
  • Пин 16 – на него подается логическая единица с Arduino. 5 Вольт, если что.

Отлично! Мотор подключили. Теперь можно и покодить.

#define FRW_BUT 7 //Кнопка "вперед" #define BCW_BUT 6 //Кнопка "назад" #define SPD 5 //Управление скоростью вращения... #define FRW 4 //...направлением вращения(вперед)... #define BCW 3 //...направлением вращения(назад) #define SPD_POT A5 int xspeed = 0; //Переменная для определения скорости вращения мотора int frw_move = 0; //Переменная для команды "вперед" int bcw_move = 0; //Переменная для команды "назад" void setup() { //Обозначаем пины pinMode(SPD, OUTPUT); pinMode(FRW, OUTPUT); pinMode(BCW, OUTPUT); pinMode(SPD_POT, INPUT); pinMode(FRW_BUT, INPUT_PULLUP); pinMode(BCW_BUT, INPUT_PULLUP); } void loop() { //Считываем показания с потенциометра //и приводим их в нужный диапазон - от 0 до 255 //После - передаем на пин регулировки скорости xspeed = analogRead(SPD_POT); constrain(xspeed, 0, 1023); xspeed = map(xspeed, 0, 1023, 0, 255); //Определяем нажатие кнопки "вперед" if(!digitalRead(FRW_BUT)) { frw_move = 1; } else { frw_move = 0; } //Определяем нажатие кнопки "назад" if(!digitalRead(BCW_BUT)) { bcw_move = 1; } else { bcw_move = 0; } //Вызываем функцию по отправке данных на L293D motor(); } void motor() { //Отправляем данные на L293D analogWrite(SPD, xspeed); digitalWrite(FRW, frw_move); digitalWrite(BCW,bcw_move); }

Как работает? Работает просто. При нажатии на левую кнопку колесо крутится в одну сторону, а при нажатии на правую – в другую. Поворотом ручки потенциометра можно регулировать скорость вращения моторчика. Действие нашей испытательной установки для моторчиков показано на видео.

З.Ы. Да, знаю, что качество видео не супер, но постараюсь найти нормальную камеру и организовать место для съемки как можно скорее.

Теперь про соединение каналов L293. Если хочется подключить более мощный моторчик, то можно объединить каналы.

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

Второй способ – сверху на L293 напаять другую L293. Берем и напаиваем пин 1 к пину 1, пин 2 к пину 2 и так далее. Этот способ так же дает прибавку к силе тока в два раза, но, в отличие от первого – оставляет возможность управлять сразу двумя моторчиками. У вас может возникнуть идея – а не напаять ли мне еще парочку L293? К сожалению, последующая напайка микросхем не приведет к увеличению силы тока еще на 600 мА. Прибавка будет незначительна.

“Э-эх, придется убирать мой 12-Вольтовый мотор… “ Не спешите расстраиваться. Для более мощных моторов подойдет старший брат L293 - L298, но сейчас мы не будем его рассматривать. Это мы сделаем чуть позже.

Motor Shield

Согласитесь, что с таким пучком проводов выглядит это все не очень. Чтобы избавиться от него можно спаять схему с L293 на печатной или макетной плате для пайки, но что делать, если паять не хочется или не умеется? Для этого существуют готовые решения в виде шилдов для Arduino, например. Я расскажу про один из них – Motor Shield V1 от DK Electronics.

Вот, собственно, фото шилд.

На этом шилде установлены две L293D, что позволяет управлять сразу четырьмя моторами. Еще там есть два контакта для сервомоторов. Питание подается либо на клемник, либо, при установленной перемычке, с питания Arduino. Перемычка так же позволяет брать питание для Arduino с шилда. Для работы с этим шилдом существует специальная библиотека. Скачать ее можно .

К минусам платы. Для работы с шилдом используются почти все цифровые пины, кроме 0, 1, 2, 13. Как мы знаем, пины 0 и 1 используются Arduino для прошивки, поэтому их лучше не использовать.

Есть тут и хорошая сторона. Если не подключать сервы, например, освобождаются пины 9 и 10, а если не использовать какой-либо из моторов, то освободятся пины 3, 5, 6, 11, в зависимости от неиспользуемого мотора. И еще. Нам остаются доступны шесть аналоговых выходов, которые при желании можно использовать как цифровые.

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

Нам понадобятся

  • Arduino UNO – Можно использовать любую другую форм фактора Arduino UNO. Leonardo или Iskra, например.
  • Motor Shield – Подойдут и другие версии этого шилда.
  • Моторчики на 6В – Можно взять любые, подходящие по характеристикам к Motor Shield.
  • Колеса диаметром 42мм – Колеса подходящие к моторчикам и платформе
  • Крепления для моторчиков – Моторчики нужно прикрепить к платформе. Возьмите подходящие к вашей.
  • Питание – Я взял блок аккумуляторов и получил на выходе около 5 Вольт, что недостаточно для питания моторов и Arduino, поэтому я подключил DC/DC преобразователь и поднял напряжение до 9В. Если нет преобразователя, то можно воспользоваться обычной кроной, подключив ее к питанию Arduino.

Пришло время собрать нашего робота.

Шаг 1

Соединяем Arduino и Motor Shield.

Шаг 2

Собираем моторы и прикручиваем их на платформу.

Шаг 3

Собираем питание через повышающий преобразователь.

Для тех, у кого Крона. Не забудьте перемычку!

Шаг 4

Прикручиваем моторы к Motor шилду с Arduino.

Шаг 5

Добавляем питание.

Шаг 6 (Опционально)

Прикрепим крышку – для эстетики.

У нас есть готовый робот. Теперь пришло время его запрограммировать. Смотрим на код.

//Подключаем библиотеку для работы с Motor Shield #include //Определяем левый мотор на клеммник номер 2 AF_DCMotor l_motor(2); //Определяем правый мотор на клеммник номер 3 AF_DCMotor r_motor(3); //Переменные для определения скорости //и времени движения int spd = 50; int time(1000); void setup() { //Задаем начальную скорость и выключаем моторы l_motor.setSpeed(spd); l_motor.run(RELEASE); r_motor.setSpeed(100); r_motor. run(RELEASE); } void loop() { // Едем вперед l_motor.run(FORWARD); r_motor.run(FORWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); delay(time); // Едем назад l_motor.run(BACKWARD); r_motor.run(BACKWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); delay(time); // Крутимся против часовой стрелки l_motor.run(FORWARD); r_motor.run(BACKWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); delay(time); // Крутимся по часовой стрелке r_motor.run(FORWARD); l_motor.run(BACKWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); delay(time); }

Отлично! Время проверять. Вот видео с моей проверки. А у вас как?

“Ты что-то говорил про робототехнические платы?” – могут сказать те, кто читал вводный урок 2 части курcа. Да, такие платы есть. Рассмотрим робототехническую платформу Strela.

Мечта робототехника. (Почти). Преимущества платы я описывал . Сразу к делу.

На ней- то и установлен старший брат L293 – L298. А еще пины выведены тройками, что как раз подходит для подключения многих датчиков.

Эту плату можно подключить вместо Arduino UNO и Motor Shield. Кроме того, ребята из Амперки написали библиотеку для работы со Стрелой, что делает управление моторами достаточно тривиальной задачей.

Для тех, кто не знал, рассказываю. К каждой нормальной библиотеке существуют примеры по ее использованию и библиотека для Стрелы не исключение. Для того чтобы их найти, заходим во вкладку Файл -> Примеры -> Strela. Там выбираем пример StrelaMotors, где выполняется скетч, похожий на скетч с использованием Motor Shield. Кстати, к Motor Shield тоже есть примеры. Если интересно – смотрите.

Что еще можно сделать со Стрелой – смотрите ниже.А мы переходим к беспроводной связи по Bluetooth.

Bluetooth

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

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

Это модуль HC-06. Я не буду особо вдаваться в подробности, но кому интересно, переходим . Наша цель – порулить роботом со смартфона. Начнем, пожалуй.

Для начала нужно подключить HC-06 к Arduino. Подключение будем осуществлять при помощи Software Serial. Эта библиотека позволяет эмулировать Serial Port на нужных нам пинах. Ради эксперимента попробуем сделать это на пинах A0(RX) и A1(TX). Зачем? Помним, что я рассказывал про Motor Shield.

Подключаем так:

  • Vcc – к 5V
  • GND – к GND
  • RX – к TX
  • TX – к RX

Я подключу HC-06 к роботу, которого мы собирали выше. Для этого воспользуемся тремя полосами на Motor Shield.

Робот готов. Осталось его запрограммировать.

Прежде чем читать код, вы должны кое-что узнать. Моторы не идеальны, как и все в этом мире. Даже два мотора из одной партии, идущие друг за другом, будут немного отличаться, что скажется на разнице в количестве оборотов при одном и том же напряжении. Если моторы просто подключить к motor Shield и подать на них одинаковую скорость, а это и есть одинаковое напряжение, то робот поедет не прямо, а немного, или много, в сторону. Это можно увидеть в видео выше.

Для того чтобы этого избежать, мы будем применять корректировочные коэффициенты. У меня левое колесо крутится намного быстрее, чем правое, поэтому я поставил коэффициент 0.62 для компенсации. Значение коэффициента подбирается экспериментальным путем.

// Подключаем библиотеки для работы с Motor Shield и Software Serial #include #include //Определяем пины для эмуляции SoftwareSerial mySerial(A0, A1); // RX, TX //Определяем левый мотор на клеммник номер 2 AF_DCMotor l_motor(2); //Определяем правый мотор на клеммник номер 3 AF_DCMotor r_motor(3); //Переменные для определения скорости //и корректировки вращения float spd = 70.0; float corr_l = 0.62; float corr_r = 1; float rot = 50.0; void setup() { //Задаем начальную скорость и выключаем моторы l_motor.setSpeed(spd); l_motor.run(RELEASE); r_motor.setSpeed(spd); r_motor. run(RELEASE); //Устанавливаем соединение с HC-06 mySerial.begin(9600); } void loop() { //Если появились данные, //вызываем функцию управления if (mySerial.available()) { drive(); } } void drive() { //Переменная для пришедших данных char control = mySerial.read(); //Для начала установим скорость if (((control - "0") >= 0) && ((control - "0") <= 9)) { spd = (control - "0") * 25.0; //сохраняем новое значение скорости } else if (control == "q") { spd = 255.0; } //Сравниваем команды, пришедшие со смартфона else if (control == "S") //Если пришла команда "S", стоим { l_motor.run(RELEASE); r_motor. run(RELEASE); } else if (control == "F") //Если пришла команда "F", едем вперед { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "B") //Если пришла команда "B", едем назад { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "I") //Если пришла команда "I", едем вперёд и направо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r + rot); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "J")//Если пришла команда "J", едем назад и направо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r + rot); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "G") //Если пришла команда "G", едем вперёд и налево { l_motor.setSpeed(spd * corr_l + rot); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "H") //Если пришла команда "H", едем назад и налево { l_motor.setSpeed(spd * corr_l + rot); r_motor.setSpeed(spd * corr_r); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "R") //Если пришла команда "R", крутимся вправо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(BACKWARD); } else if (control = "L") //Если пришла команда "L", крутимся влево { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); l_motor.run(FORWARD); r_motor.run(BACKWARD); } }

Робота прошили. Теперь займемся смартфоном.

RC controller

Для связи Arduino и смартфона через Bluetooth есть множество различных приложений. В поиске ключевыми словами будут: Arduino, Bluetooth, RC.

Я выбрал приложение под названием Bluetooth RC Controller. Оно идеально подойдет для нашей цели. При нажатии на кнопку приложение отправляет значение типа char на HC-06, который, в свою очередь, передает пришедшее значение Arduino. Значение, отправляемое при нажатии кнопки, устанавливается самостоятельно.

Чтобы установить соединение с роботом, нужно нажать на шестерню и выбрать пункт “Settings” В “Settings” нужно убедиться, что кнопки соответствуют этим отсылаемым символам, либо изменяем код Arduino.

После настройки символов можно устанавливать соединение с HC-06. Жмем на шестерню и заходим в “Connect to car” Открывается окно с сопряженными устройствами. В нем выбираем HC-06. Если его нет, то ищем с помощью “Scan for devices”. Если устройство найдено, но не хочет сопрягаться, то заходим в Bluetooth на смартфоне и сопрягаем, как обычно. Пароль стандартный – 1234. После этого заходим в “Scan for devices” и соединяемся.

Когда соединение установится, загорится зеленый огонек сверху, а HC-06 перестанет моргать. Можно начинать рулить. Полоска сверху отвечает за скорость движения.

Вернемся к Стреле. Еще одним преимуществом Стрелы является возможность установить Bluetooth XBee формата, а хорошо это тем, что другие пины остаются свободными. А так как для Стрелы есть готовая библиотека, которая помогает сократить код для управления моторами, то использовать Стрелу для управления роботом по Bluetooth очень даже стоит.

Для этого нужно подключить XBee к Стреле, прошить ее скетчем из примеров под названием “ArduinoBluetoothRCCarOnStrela” и подключиться к XBee через RC controller.

Советы

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

Колеса крутятся не в те стороны, в какие хотелось бы – эта проблема легко устраняется путем перестановки проводов в клемниках или программно.

Bluetooth модуль не работает – нужно проверить наличие горящего красного светодиода на модуле. Если он не горит, то проверить правильность подключения Bluetooth модуля. Если светодиод горит, но соединение ну устанавливается, нужно убедиться в том, что RX модуля соединен с TX платы и наоборот, а так же попробовать способ с сопряжением модуля с Arduino через стандартный Bluetooth интерфейс.

Робот не едет прямо – я описывал эту проблему чуть выше, когда рассказывал про Bluetooth и Motor Shield.

При езде робот неожиданно останавливается и теряется соединение с HC-06 – проблема в источнике питания. Мы знаем, что Arduino нужно не менее 7В для стабильной работы, а еще мы знаем, что моторчики очень хорошо кушают. Если поднести щупы мультиметра к клеммникам подачи напряжения и измерить напряжение при выключенных моторах, а потом их включить, то можно увидеть, что напряжение на мультиметре упадет. Причем упасть напряжение может по-разному.

Если подключен источник питания, который не может обеспечить достаточный ток для моторов, то напряжение может упасть сильно, с 9 до 5 Вольт, например, а 5В уже не будет хватать для Arduino и она перезапустится. Решение – подключить более мощное питание. Как рассчитать, я расскажу ниже.

Если подключить источник питания мощнее, то просадка напряжения может быть только в течение нескольких миллисекунд, но и их может оказаться достаточно для перезапуска контроллера. Решение – параллельно проводам питания установить конденсатор не менее чем на 1000мкФ, емкость можно определить экспериментально. Я ставил конденсатор на 3300 мкФ и на 16В. Не забываем смотреть на максимальное напряжение конденсатора.

Когда источник питания достаточно мощный, просадки напряжения не более 0.2В.

Несколько советов для начинающих робототехников

Начиная планировку робота, первым делом желательно позаботиться о расчёте мощности силовой части и подборе соответствующего источника питания. Будет обидно, если 4 батарейки ААА не потянут твои 4 6-вольтовых мотора, а места для более источника питания не останется.

Для расчета мощности ищем характеристики моторов, плат, датчиков. Из курса физики знаем, что мощность можно рассчитать по формуле P = IU, где I – сила тока, U – напряжение. С помощью этой формулы и характеристик легко рассчитать потребляемую мощность готового устройства, а зная потребляемую мощность и рабочее напряжение питания, можно узнать оптимальную силу тока, необходимую для работы устройства, зная силу тока, можно определиться с необходимой емкостью аккумулятора и время работы устройства от выбранного аккумулятора.

Как я и говорил, всегда следует ставить конкретную цель, при достижении которой проект можно считать выполненным. В этой мысли есть нюансы. Если проект достаточно большой, то добраться до цели не так-то просто, особенно, когда пишешь код. Написал я однажды большой код, думал - «Вот сейчас напишу все и проверю! », при попытке скомпилировать код, он не сразу скомпилировался, так как было несколько ошибок. Ошибки я убрал, да вот только код не работал, как я хотел. Пришлось переписывать все почти с нуля, понемногу добавляя код и проверяя на работоспособность получившийся код. Так советую поступить и вам.

Если есть цель сделать “пароль” из трех символов, то не стоит программировать все три сразу. Лучше сделать пароль из одного символа, проверить его, потом из двух, а после проверки – из трех. Мне помогает.

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

Заключение

Робототехника – классная штука! В скором времени, я думаю, роботы займут, а то и уже заняли место в жизни людей. Мы сделали простейшего робота-машинку с управлением со смартфона, позже займемся более серьезными проектами, ну а пока – до скорого!