Роботы на arduino uno. Собираем роботов-самоходов на Arduino. Проверяем полярность и правильность соединения модулей

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

Сигвей от англ. Segway – двухколесное средство передвижения стоя, оснащенное электроприводом. Еще их называют гироскутерами или электрическими самокатами.

Вы когда-нибудь задумывались, как работает Сигвей? В этом уроке мы постараемся показать вам, как сделать робота Ардуино, который уравновешивает себя точно так же, как Segway.

Чтобы сбалансировать робота, двигатели должны противодействовать падению робота. Это действие требует обратной связи и корректирующих элементов. Элемент обратной связи - , который обеспечивает как ускорение, так и вращение во всех трех осях (). Ардуино использует это, чтобы знать текущую ориентацию робота. Корректирующим элементом является комбинация двигателя и колеса.

В итоге должен получиться примерно такой друг:

Схема робота

Модуль драйвера двигателя L298N:

Мотор редуктора постоянного тока с колесом:

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

Завершенный вариант самостоятельно балансирующего робота можно посмотреть на рисунке выше. В верхней части находятся шесть Ni-Cd-батарей для питания печатной платы. В промежутках между моторами используется 9-вольтовая батарея для драйвера двигателя.

Теория

В теории управления, удерживая некоторую переменную (в данном случае позицию робота), требуется специальный контроллер, называемый ПИД (пропорциональная интегральная производная). Каждый из этих параметров имеет «прирост», обычно называемый Kp, Ki и Kd. PID обеспечивает коррекцию между желаемым значением (или входом) и фактическим значением (или выходом). Разница между входом и выходом называется «ошибкой».

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

PID требует, чтобы значения Kp, Ki и Kd были настроены на оптимальные значения. Инженеры используют программное обеспечение, такое как MATLAB, для автоматического вычисления этих значений. К сожалению, мы не можем использовать MATLAB в нашем случае, потому что это еще больше усложнит проект. Вместо этого мы будем настраивать значения PID. Вот как это сделать:

  1. Сделайте Kp, Ki и Kd равными нулю.
  2. Отрегулируйте Kp. Слишком маленький Kp заставит робота упасть, потому что исправления недостаточно. Слишком много Kp заставляет робота идти дико вперед и назад. Хороший Kp сделает так, что робот будет совсем немного отклоняться назад и вперед (или немного осциллирует).
  3. Как только Kp установлен, отрегулируйте Kd. Хорошее значение Kd уменьшит колебания, пока робот не станет почти устойчивым. Кроме того, правильное Kd будет удерживать робота, даже если его толькать.
  4. Наконец, установите Ki. При включении робот будет колебаться, даже если Kp и Kd установлены, но будет стабилизироваться во времени. Правильное значение Ki сократит время, необходимое для стабилизации робота.

Поведение робота можно посмотреть ниже на видео:

Код Ардуино самобалансирующего робота

Нам понадобилось четыре внешних библиотеки, для создания нашего робота. Библиотека PID упрощает вычисление значений P, I и D. Библиотека LMotorController используется для управления двумя двигателями с модулем L298N. Библиотека I2Cdev и библиотека MPU6050_6_Axis_MotionApps20 предназначены для чтения данных с MPU6050. Вы можете загрузить код, включая библиотеки в этом репозитории .

#include #include #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #define MIN_ABS_SPEED 20 MPU6050 mpu; // MPU control/status vars bool dmpReady = false; // set true if DMP init was successful uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU uint8_t devStatus; // return status after each device operation (0 = success, !0 = error) uint16_t packetSize; // expected DMP packet size (default is 42 bytes) uint16_t fifoCount; // count of all bytes currently in FIFO uint8_t fifoBuffer; // FIFO storage buffer // orientation/motion vars Quaternion q; // quaternion container VectorFloat gravity; // gravity vector float ypr; // yaw/pitch/roll container and gravity vector //PID double originalSetpoint = 173; double setpoint = originalSetpoint; double movingAngleOffset = 0.1; double input, output; //adjust these values to fit your own design double Kp = 50; double Kd = 1.4; double Ki = 60; PID pid(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT); double motorSpeedFactorLeft = 0.6; double motorSpeedFactorRight = 0.5; //MOTOR CONTROLLER int ENA = 5; int IN1 = 6; int IN2 = 7; int IN3 = 8; int IN4 = 9; int ENB = 10; LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, motorSpeedFactorLeft, motorSpeedFactorRight); volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high void dmpDataReady() { mpuInterrupt = true; } void setup() { // join I2C bus (I2Cdev library doesn"t do this automatically) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin(); TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz) #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif mpu.initialize(); devStatus = mpu.dmpInitialize(); // supply your own gyro offsets here, scaled for min sensitivity mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // 1688 factory default for my test chip // make sure it worked (returns 0 if so) if (devStatus == 0) { // turn on the DMP, now that it"s ready mpu.setDMPEnabled(true); // enable Arduino interrupt detection attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); // set our DMP Ready flag so the main loop() function knows it"s okay to use it dmpReady = true; // get expected DMP packet size for later comparison packetSize = mpu.dmpGetFIFOPacketSize(); //setup PID pid.SetMode(AUTOMATIC); pid.SetSampleTime(10); pid.SetOutputLimits(-255, 255); } else { // ERROR! // 1 = initial memory load failed // 2 = DMP configuration updates failed // (if it"s going to break, usually the code will be 1) Serial.print(F("DMP Initialization failed (code ")); Serial.print(devStatus); Serial.println(F(")")); } } void loop() { // if programming failed, don"t try to do anything if (!dmpReady) return; // wait for MPU interrupt or extra packet(s) available while (!mpuInterrupt && fifoCount < packetSize) { //no mpu data - performing PID calculations and output to motors pid.Compute(); motorController.move(output, MIN_ABS_SPEED); } // reset interrupt flag and get INT_STATUS byte mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus(); // get current FIFO count fifoCount = mpu.getFIFOCount(); // check for overflow (this should never happen unless our code is too inefficient) if ((mpuIntStatus & 0x10) || fifoCount == 1024) { // reset so we can continue cleanly mpu.resetFIFO(); Serial.println(F("FIFO overflow!")); // otherwise, check for DMP data ready interrupt (this should happen frequently) } else if (mpuIntStatus & 0x02) { // wait for correct available data length, should be a VERY short wait while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); // read a packet from FIFO mpu.getFIFOBytes(fifoBuffer, packetSize); // track FIFO count here in case there is > 1 packet available // (this lets us immediately read more without waiting for an interrupt) fifoCount -= packetSize; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); input = ypr * 180/M_PI + 180; } }

Значения Kp, Ki, Kd могут работать или не работать. Если они этого не делают, выполните шаги, описанные выше. Обратите внимание, что наклона в коде установлен на 173 градуса. Вы можете изменить это значение, если хотите, но обратите внимание, что это угол наклона, которым должен поддерживаться роботом. Кроме того, если ваши двигатели слишком быстры, вы можете отрегулировать значения motorSpeedFactorLeft и motorSpeedFactorRight.

На этом пока всё. До встречи.

В итоге получился довольно забавный робот , который может видеть перед собой препятствия, анализировать ситуацию и затем, только выбрав лучший маршрут, едет дальше. Робот получился очень маневренным. Он способен разворачиваться на 180 градусов, а угол поворота составляет 45 и 90 градусов. В качестве основного контроллера автор использовал Iteaduino, который является аналогом Arduino.

Материалы и инструменты для изготовления робота:
- микроконтроллер (Arduino или ему подобный Iteaduino);
- ультразвуковой датчик;
- держатель для батареек;
- китайские игрушки для создания колесной базы (можно купить готовую);
- кусачки;
- клей;
- провода;
- моторчики;
- ДВП;
- лобзик;
- транзисторы (D882 P).

Процесс изготовления робота:

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

Выбирая машинки, лучше всего брать игрушки с обычными колесами, так как, по словам автора, с такими шипами как у него, робот сильно скачет.

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


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


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








К контроллеру моторчики подключаются при помощи транзисторов типа D882 P. Они были вытащены из старого пульта управления машинкой. Лучше всего конечно использовать силовые транзисторы типа TIP120Б, но автор выбирал просто по подходящим характеристикам. Вся электронная часть подключается по указанной схеме.

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

Что касается датчиков, то ультразвуковой нужно подключить к 7-му цифровому выходу микроконтроллера. Серводвигатель подключается к 3-му цифровому входу, база транзистора левого мотора подключается к 11 контакту, а база правого к 10-му.

Если в качестве питания будет использоваться Крона, то минус подключается к GND, а плюс к VIN. Еще к GND нужно подключить эмиттер транзистора и отрицательный контакт от источника питания шасси робота.

Начинают изучение ардуино с создания простеньких роботов. Сегодня я расскажу о простейшем роботе на ардуино уно, который как собачка будет следовать за вашей рукой или за любым другим объектом, отражающим инфракрасный свет. Также этот робот позабавит детишек. Мой 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); } } } }

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

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

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

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

Заключительная часть статьи о маленьком роботе, которого мы собираем на шасси - крышке от пластикового контейнера для еды. Мозгом нашего робота является плата Arduino UNO, двигателями и сервоприводом управляет плата Driver Motor Shield, датчик препятствий - Ультразвуковой сонар - глазки как у Валли (из мультика) - «HC-SR04 Ultrasonic Sensor». , . Как создать робота на Arduino?

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

При подключении батареи нужно быть абсолютно уверенным в правильности соблюдения полярности, как говорится 7 раз отмерь, один раз подключи. Старайтесь соблюдать такое правило - красны провод всегда к + питания, черный провод - земля, он же минус, он же GND. Производители стараются соблюдать такие же правила. Поэтому провода идущие от аккумуляторного отсека подсоединяем к колодке +M и GND, на плате управления двигателями. Провода от ходовых двигателей подключаем к колодкам M1, M2 платы управления двигателями. Левая сторона, по ходу движения подсоединяется к колодке M1, правая сторона к колодке M2. По поводу полярности двигателей пока волноваться не стоит, её можно будет поменять, если во время теста пойдёт что то не так.

10. Проверяем полярность и правильность соединения модулей

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

11. Этап программирования Arduino

Программа в микроконтроллер Arduino заливается из компьютера, посредством USB кабеля и специальной программы - среды программирования и редактирования скетчей (программ) - Arduino IDE. Взять программу можно с сайта arduino.cc, раздел Download, там всегда можно скачать последнюю, самую свежую версию программы. После того как среда программирования установлена остаётся только выбрать из меню программы драйвера для какой платы вы хотите использовать, - в нашем случае Arduino UNO, и COM порт через который посредством эмуляции USB подключена Arduino. На этот счёт очень много всяческих мануалов, поэтому этот этап мы пропускаем (на всякий случай - меню Tools > Serial Port) .

Программу для микро робота можно с нашего сайта, правда только после регистрации, шутка Мини робот на Arduino. Для того чтобы программа заработала необходимы дополнительные библиотеки - AFMotor.h, Sevo.h, NewPing.h, все они есть в архиве, вам необходимо распаковать архив в папку установленной программы Arduino IDE. У меня -это директория c:Program Files (x86)Arduino, библиотеки нужно положить в папку c:Program Files (x86)Arduinolibraries. Затем войти в директорию c:Program Files (x86)ArduinolibrariesAPC_4_ROBOT и два раза щёлкнуть мышкой по APC_4_ROBOT.ino это и есть сам скетч, затем запустится среда программирования. Подсоединяем голую плату Arduino Uno (это значит без подключенных модулей) через шнур USB к компьютеру, жмём кнопку со стрелочкой в право, программа начнёт заливаться в контроллер. Весь процесс занимает несколько секунд, и если всё правильно подсоединено, то не должно загораться никаких красных надписей, а индикатор в нижнем правом углу закончит свое движение на 100%. Программа для Arduino установлена в контроллер Atmega328.

12. Запуск робота

Мини робот на Arduino — готов к движению. Robot Wally

Можно осуществить первый, пока ещё пробный запуск нашего робота. У нас робот поехал не правильно, одно колесо крутилось правильно, а другое в противоположную сторону. Пришлось менять полярность проводов двигателя на колодке M2. Зато потом наш маленький робот с честью справлялся со всеми углами и препятствиями комнаты.

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

P.S. Это был достаточно вольный перевод статьи найденной, когда-то давно, на бескрайних просторах интернет, больше конечно отсебятины, т.к всё делалось по новой, рисунки доработаны, ссылок на источник нет, потому как документ был вордовский.

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

Итак, введение в задачу:

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

Теперь разберемся, что нам понадобится:

  1. Платформа (корпус). Здесь есть варианты: сделать самому всё, купить детальки и собрать из них, либо же купить готовое. Выбирайте, что душе угодно

В комплектеобычно идет платформа и по одному мотору на два ведущих колеса (гусенице) и отсек для батареек. Есть варианты полного привода - по мотору на 4 колеса. Для начинающих рекомендуем брать платформы танкового типа

Два ведущих колеса и третье опорное.

  1. Далее, нам понадобиться дальномер. Сонар (он же дальномер, он же Ultrasonic module) В качестве дальномера изначально выбор был между ультразвуковым и инфракрасным. Поскольку характеристики ультразвукового существенно лучше (максимальная дальность около 4-5 метров, против 30-60 см), а цена примерно одинаковая, то выбор пал на Ultrasonic. Наиболее распространена модель HC-SR04.

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

Как быть? Первое что приходит в голову это - поставить на выход микроконтроллера транзистор и с него уже питать моторы. Это конечно хорошо, но не прокатит, если мы захотим мотор в другую сторону пустить… Зато с этой задачей хорошо справится H - мост, который представляем собой немного более сложную схему, чем пара транзисторов. Но в данном случае их полно в виде готовых интегральных схем, так что думаю велосипед изобретать незачем - купим готовый. К тому же цена располагает - 2-3 доллара…Двинемся дальше. Для этих целей купим микросхему L293D, или что еще лучше, Motor Shield на ее основе.

Motor shield на микросхеме L298N

  1. Генерация звука – пьезоизлучатель

Самым простым вариантом генерации звука является использование пьезоизлучателя.

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

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

Обратный пьезоэлектрический эффект: в пьезоизлучателях (эффективны на высоких частотах и имеют небольшие габариты);)

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

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

Урок 2. Работа с ультразвуковым датчиком измерения расстояния (дальномером)

Урок 3. Arduino и Motor Shield на основе L298N

Урок 4. Воспроизведение звука – пьезоизлучатель

Урок 5. Сборка робота и отладка программы