Схема размещения элементов робота на ардуино. Создание робота-гонщика на платформе Arduino. Проверяем полярность и правильность соединения модулей

Библиографическое описание: Страковский Д. А., Симаков Е. Е. Создание робота-гонщика на платформе Arduino // Юный ученый. — 2016. — №3. — С. 120-124..03.2019).





Ключевые слова:

Цель работы: изучить принципы построения роботов на основе платы ArduinoUno. Создать действующую модель робота-гонщика и разработать алгоритм его поведения.

Задачи работы:

  1. Изучить особенности построения роботов на базе плат Arduino и их модулей.
  2. Изучить особенности среды программирования роботов на базе платформы Arduino.
  3. Создать модель робота-гонщика. Разработать алгоритм движения робота на базе анализа входной информации.
  4. Проанализировать работу робота.

Введение. Основы робототехники на платформе Arduino

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

Рис. 1. Структура микроконтроллера

Для построения роботов используются различные платформы. В рамках проводимого исследования для разработки робота-гонщика была выбрана платформа Arduino. Первый прототип Arduino был разработан в 2005 году программистом Массимо Банци. На сегодняшний день платформа Arduino представлена не одной платой, а целым их семейством. Такой подход позволяет собирать всевозможные электронные устройства, работающие работать как автономно, так и в связке с компьютером. ПлатыArduino представляют собой наборы, состоящие из готового электронного блока и программного обеспечения. Электронный блок - это печатная плата с установленным микроконтроллером. Фактически электронный блок Arduino является аналогом материнской платы компьютера. На нем имеются разъемы для подключения внешних устройств, а также разъем для связи с компьютером, по которому осуществляется программирование.

Самой популярной и наиболее универсальной платформой семейства является плата ArduinoUno. Она выполнена на базе процессора с тактовой частотой 16 МГц, обладает памятью 32кБ, два из которых выделено под загрузчик, позволяющий прошивать Arduino с обычного компьютера через USB. Также имеется 2 кБ SRAM-памяти, которые используются для хранения временных данных (это оперативная память платформы) и 1кБ EEPROM-памяти для долговременного хранения данных (аналог жёсткого диска).

На платформе расположены 14 контактов, которые могут быть использованы для цифрового ввода и вывода. Какую роль исполняет каждый контакт, зависит от программы. Некоторые контакты обладают дополнительными ролями. Например, Serial 0-й и 1-й - используются для приёма и передачи данных по USB; LED 13-й - к этому контакту подключен встроенный в плату светодиод. Также имеется 6 контактов аналогового ввода и входной контакт Reset для сброса.

Рис. 2. Плата Arduino Uno

Отличительной особенностью Arduino является наличие плат расширения, так называемых, «шилдов». Это дополнительные платы, которые ставятся подобно «слоям бутерброда» поверх Arduino, чтобы дать ему новые возможности. Shield подключаются к Arduino с помощью имеющихся на них штыревых разъемов. Рассмотрим подробнее Shield, которые использовались при проведении исследования:

‒ MotorShield - обеспечивает управление двигателями постоянного тока. Выводы микроконтроллера являются слаботочными, поэтому ток мотора, при подключении его напрямую, выведет их из строя. Эту проблему решает так называемый H-мост. Он позволяет управлять скоростью и направлением вращения мотора.

‒ TroykaShield - помогает подключать большое количество периферии вроде сенсоров через стандартные 3-проводные шлейфы. Для принятия решения о направлении дальнейшего движения разрабатываемого робота использовались цифровые датчики линии, подключаемые к данному «шилду». Эти датчики позволяют определять цвет поверхности около него. Выходом является простой цифровой сигнал: логический 0 или 1 в зависимости от цвета, который он видит перед собой. Единица - чёрный или пустота, ноль - не чёрный.

Рис. 3. Motor Shield и Troyka Shield

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

Базовая структура программы для Arduino состоит из двух обязательных частей: функций setup() и loop(). Перед функцией setup() идет объявление переменных, подключение вспомогательных библиотек. Функция setup() запускается один раз после каждого включения питания или сброса платы. Она используется для инициализации переменных, установки режима работы портов и т. д. Функция loop() в бесконечном цикле последовательно исполняет описанные команды. Для взаимодействия с различными устройствами, для обеспечения ввода и вывода используются специализированные процедуры и функции.

Сборка робота-гонщика на платформе Arduino

Рассмотрим практическую часть проекта - создание робота гонщика. Для этого использовались плата ArduinoUno, «шилды», описанные выше, датчики линии, микромоторы с редуктором, колеса, балансировочные шары. Процесс построения модели робота можно разделить на несколько этапов.

Этап I . Сборка платформы. Вначале необходимо собрать основу робота - подвижную платформу. Колеса крепятся к моторам, а затем к установочной платформе. Для поддержания равновесия платформы используются балансировочные шары. Один устанавливается снизу с тыльной стороны платформы. Этот шар играет роль третьего колеса и опоры одновременно. Второй шар, при необходимости, может быть использован в качестве балласта. Датчики линии устанавливаются спереди платформы.

Этап II . Установка платы Arduino и подключение моторов. Плата ArduinoUno крепится с тыльной стороны. Такое расположение позволит обеспечить корректное расположение платформы при движении. Сверху на плату устанавливается MotorShield, к которому подключаются моторы.

Этап III . Установка Troyka Shield и подключение датчиков. Следующий «шилд» устанавливается поверх предыдущего, образуя своеобразный «бутерброд». Цифровые датчики линии подключается к 8 и 9 контактам «шилда»

Этап IV . Балансировка. На заключительном этапе сборки необходимо закрепить провода на платформе, чтобы они не мешали движению робота. Также можно установить дополнительные балансировочные шары, учитывая при этом вес всех плат и батареи.

Рис. 4. Робот гонщик в сборке

Разработка алгоритма поведения робота

Далее необходимо разработать алгоритм движения робота на основании показаний датчиков. Основная идея заключается в следующем. Пусть у нас есть белое поле и на нём чёрным нарисован «дорога» для робота (трек). Используемые датчики линии выдают логический ноль, когда «видят» чёрное и единицу, когда «видят» белое. На прямой робот должен пропускать трек между сенсоров, т. е. оба сенсора должны показывать «1». При повороте траектории направо правый сенсор наезжает на трек и начинает показывать логический ноль. При повороте налево ноль показывает левый сенсор.

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

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

Рис. 5. Поиск зависимости пройденного расстояния при заднем ходе от времени

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

Заключение

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

‒ Можно поэкспериментировать с системой грузов и добиться идеального равновесия.

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

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

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

Литература:

  1. Блум Д. Изучаем Arduino. - СПб.: БХВ-Петербург, 2015.
  2. Петин В. А. Проекты с использованием контроллера Arduino. - СПб.: БХВ-Петербург, 2014.
  3. Соммер У. Программирование микроконтроллерных плат Arduino/Freeduino. - СПб.: БХВ-Петербург, 2012.
  4. Терехов С. А. Лекции по теории и приложениям искусственных нейронных сетей. - Снежинск: ВНИИТФ, 2003.
  5. Уоссермен Ф. Нейрокомпьютерная техника: Теория и практика. - М.: Мир, 1992.
  6. Амперка. Вики [Электронный ресурс].
  7. URL: http://wiki.amperka.ru/ (Дата обращения: 3.10.2015г.)
  8. Информационный портал RoboCraft [Электронный ресурс].
  9. URL:http://robocraft.ru/page/summary (Дата обращения: 12.11.2015г.)
  10. Информационный портал Arduino.ru [Электронный ресурс].
  11. URL:http://arduino.ru/ (Дата обращения: 14.11.2015г.)

Ключевые слова: робототехника, программирование, искусственный интеллект. .

Аннотация: Сегодня сложно представить мир без роботов. Робототехника является эффективным методом для изучения важных областей науки, технологии, конструирования, математики. На сегодняшний день невозможно говорить о роботах и не затрагивать такое понятие, как искусственный интеллект. Эти два направления тесно связаны. Автором ранее была проведена работа по изучению нейронных сетей, а также возможности «роботизирования» некоторых аспектов человеческой жизни. Данная статья посвящена рассмотрению вопросов робототехники.

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

Сигвей от англ. 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.

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

Робототехнический набор Двухколёсный Robot Car

Робототехнический набор Двухколесный Robo Car - набор для сборки робота на базе контроллера Arduino. Набор содержит всё необходимое чтобы собрать и запрограммировать робота без работы паяльником.

Основная платформа из (прозрачного акрила с защитной бумагой) размером -------x------ мм предназначена для монтажа на нее ходовой части, микроконтроллера, датчиков, батарейного блока.
Ходовая часть робота, состоящая из 2 ведущих колес (пластиковый мотор-редуктор с колесом на резиновой покрышке) и заднего колеса на шарикоподшипнике, которое свободно вращается на 360 градусов, позволяет роботу свободно и быстро менять направление движения.

Напряжение питания пластиковых моторов-редукторов 3-6 В. Моторы-редукторы при питании 5 В обеспечивают момент 0,9кгс*см, обороты на выходном валу редуктора 200 об/мин, что при диаметре колеса 65 мм позволяет разгонять робота до скорости 0,5 м/сек.
В комплекте идут колеса для оптических сенсоров, что позволит при добавлении соответствующих датчиков измерять скорость движения, а также использовать данные о движении приводов для оценки перемещения робота (одометрии).

Сверху платформы крепится держатель батарей 4AA, обеспечивающий питание всей электроники напряжением 6В.

Плата Arduino UNO - мозг нашего робота, крепится сверху платформы.

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

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

Диапазон измерения расстояния модуля 2-400 см с
разрешением 0.3 см, эффективный угол <15°. Результат обнаружения не зависит от цвета или отражающей способностью объекта в оптическом диапазоне. Однако, обнаружение мягких материалов, таких как ткань, может быть затруднено.
Для измерения расстояния в различных направлениях модуль HС SR-04 должен вращаться по кругу. Для вращения используется сервопривод SG90 и мобильная платформа для его крепления.




Вот платформа для крепления сервопривода в сборе. В таком виде это крепится с помощью болтов к основной платформе.

В набор входит плата Arduino Sensor Shield V5.0, которая предназначена для расширения функциональности контроллеров на платформе Arduino UNO.
Плата позволяет подключить различные вариации внешних устройств, таких как датчики, сервомашинки, реле, кнопки, потенциометры и т.д. На плате расположено множество интерфейсов для подключения различных внешних устройств и питания. Для данного робота нас интересуют:
Для подключения HC SR-04 - Ultrasonic interface (интерфейс для подключения ультразвуковых датчиков) - имеет 4 вывода, первый вывод обозначен на плате знаком «+». Обозначение выводов: VCC, A0, A1, GND.
Для подключения сервопривода и драйвера моторов - Digital IO ports (колодка цифровых входов-выходов) имеет 16 выводов. Обозначение выводов: D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, GND, AREF. Каждый вход-выход имеет 3 контакта GND, VCC, Signal.
После сборки робота можно приступать к программированию.

Напишем простой скетч для движения робота, при обнаружении препятствий робот останавливается, отьезжает назад, начинает крутиться пока не обнаружит свободное направление и опять движется вперед.
Для написания скетча нам понадобятся библиотеки (для работы с модулем HC SR-04 скачать) и Servo (стандартная Arduino библиотека).
Вот код данного скетча

// добавить библиотеки
#include "Ultrasonic.h"
#include "Servo.h"

// HC SR-04 подключение
// Trig - A0, Echo - A1
Ultrasonic ultrasonic(A0, A1);
// L298 driver
int MotorRight1 = 5;
int MotorRight2 = 4;
int SpeedRight = 3;
int MotorLeft1 = 8;
int MotorLeft2 = 7;
int SpeedLeft = 6;

Float dist_cm; // переменная для хранения расстояния
boolean flag;

Void setup() {
// настроить выводы для моторов в OUTPUT
pinMode (SpeedRight, OUTPUT);
pinMode (MotorRight11, OUTPUT);
pinMode (MotorRight2, OUTPUT);
pinMode (SpeedLeft, OUTPUT);
pinMode (MotorLeft1, OUTPUT);
pinMode (MotorLeft2, OUTPUT);
// вперед
robot_forward();
}

Void loop() {
// получить данные с HC SR-04
if(dist_cm<20)
{
robot_stop();
flag=false;
while(flag==false)
{
robot_rotation();
dist_cm = ultrasonic.Ranging(CM);
if(dist_cm>50)
flag=true;
delay(100);
}
robot_forward();
}
}
// движение вперед
void robot_forward() {
digitalWrite(MotorRight1,HIGH);

analogWrite(SpeedRight,127);
analogWrite(SpeedLeft,127);
}
// движение назад
void robot_forward() {

digitalWrite(MotorLeft2, HIGH);
analogWrite(SpeedRight,127);
analogWrite(SpeedLeft,127);
delay(1000);
}
// остановить робота
void robot_stop() {
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,LOW);
digitalWrite(MotorLeft1, LOW);
digitalWrite(MotorLeft2, LOW);
}
// вращение робота
void robot_rotation() {
digitalWrite(MotorRight2,HIGH);
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorLeft2, LOW);
digitalWrite(MotorLeft1, HIGH);
analogWrite(SpeedRight,64);
analogWrite(SpeedLeft,64);
delay(200);
}

Схема сборки шасси

Описание Робототехнического набора "Двухколёсный Robot Car"




Top