Ардуино управление с компьютера

Как управлять Ардуино с клавиатуры

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

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • макетная плата;
  • 1 светодиод и резистор 220 Ом;
  • 1 сервопривод;
  • провода «папа-папа» и «папа-мама».

Управление светодиодом на Arduino UNO с компьютера

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

Скетч. Управление Ардуино с компьютера

int val; // освобождаем память в контроллере для переменой void setup() { Serial.begin(9600); // подключаем последовательный порт pinMode(13, OUTPUT); // объявляем пин 13 как выход } void loop() { // проверяем, поступают ли какие-то команды if (Serial.available()) { val = Serial.read(); // переменная val равна полученной команде if (val == ‘1’) {digitalWrite(13, HIGH);} // при 1 включаем светодиод if (val == ‘0’) {digitalWrite(13, LOW);} // при 0 выключаем светодиод } }

Пояснения к коду:

  1. функция Serial.available() проверяет поступление команд с компьютера;
  2. функция Serial.read() читает данные, поступившие в Serial monitor.
  3. в условном операторе if (val == ‘1’) стоит знак двойное равенство «соответствие», а в скобках необходимо использовать одинарные кавычки.

Управление сервоприводом на Arduino UNO с компьютера

После сборки схемы загрузите следующий скетч в плату

Скетч. Управление сервоприводом с компьютера

#include <Servo.h> // подключаем библиотеку для сервопривода Servo servo; // объявляем переменную servo типа «servo» int val; // освобождаем память в контроллере для переменой void setup() { Serial.begin(9600); // подключаем последовательный порт servo.attach(11); // привязываем сервопривод к выходу 11 } void loop() { // проверяем, поступают ли какие-то команды if (Serial.available()) { val = Serial.read(); // переменная val равна полученной команде if (val == ‘1’) { servo.write(10); } // при 1 поворачиваем серво на 10 if (val == ‘2’) { servo.write(45); } // при 2 поворачиваем серво на 45 if (val == ‘3’) { servo.write(90); } // при 3 поворачиваем серво на 90 } }

  1. в некоторых примерах программ можно встретить такой вариант проверки появления данных в Serial monitor if (Serial.available()>0).
  2. в качестве команд можно использовать не только цифры, но и буквы. При этом имеет значение какая буква — прописная или строчная.

Все материалы сюжета:

  • Собираем роботов-самоходов на Arduino
  • Робот для видеонаблюдения на Raspberry Pi
  • Тестируем робота без самого робота

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

Google купила Boston Dynamics. Это сообщение у меня вызвало некий шок. Boston Dynamics — одна из самых известных компаний, специализирующихся на робототехнике, и, если учесть, что Google покупает уже восьмую компанию на этом рынке, возникает правомерный вопрос: что же они задумали? Похоже, нас ждет интересное десятилетие!

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

Microsoft Robotics Developer Studio

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

  • библиотека Concurrent and Coordination Runtime (CCR) — предназначена для организации обработки данных с помощью параллельно и асинхронно выполняющихся методов. Взаимодействие между такими методами организуется на основе сообщений. Рассылка сообщений основана на использовании портов;
  • Decentralized Software Services (DSS) — среда, которая позволяет запускать алгоритмы обработки данных на разных ЭВМ, организовывать асинхронное взаимодействие процессов управления различными подсистемами робота;
  • Visual Simulation Environment (VSE) — среда визуализации, которая позволяет экспериментировать с моделями роботов, тестировать алгоритмы управления роботами;
  • Visual Programming Language (VPL) — язык, предназначенный для разработки программ управления роботами. Программа на таком языке представляется в виде последовательности блоков, которые выполняют обработку данных, и связей между ними.

За симулятор физики в Robotics отвечает Ageia Physx. Очень печально, но в симуляторе отсутствует трение между создаваемыми объектами, хотя моделируется трение между отдельным объектом и платформой, на которой он размещается.

Создать сцену в симуляторе и запрограммировать робота можно на VPL или C#. Естественно, что на C# сцену сделать сложнее, но зато и код получится более эффективный. Возможности Robotics позволяют смоделировать футбол роботов, железную дорогу, манипулятор, добавить на сцену нескольких роботов. Доступные из коробки сенсоры: GPS, лазерный дальномер, инфракрасный дальномер, компас, сенсор цвета, сенсор яркости, веб-камера.

Подробнее о работе с этой средой ты можешь прочитать в номерах 01’13 («Стань робототехником!») и 03’13 («Робот-шпион — это просто!»).

AnyKode Marilou Robotics Studio

AnyKode Marilou Robotics Studio — среда разработки и симулирования мобильных роботов, гуманоидов и манипуляторов с учетом физических законов реального мира. Для объектов можно указать следующие физические параметры: массу, упругость, свойства материала, вращающие моменты, а также некоторые другие.

Marilou позволяет подключать к роботу различные виртуальные устройства: компас, акселерометры, двигатели и сервомоторы, бампер, сенсоры расстояния (ультразвуковой и инфракрасный), GPS и другие устройства.

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

В Marilou есть MODA (Marilou Open Devices Access) — SDK для работы с роботами и их компонентами в симуляторе. После синхронизации с часами симулятора алгоритмы управления роботом могут запускаться на другом компьютере сети. В зависимости от выбранного языка MODA предоставляет библиотеки (.lib или .a) или .NET-сборки (.dll) для доступа к симулятору по сети. Программирование алгоритмов управления роботов возможно с помощью языков C/C++, C++ CLI, C#, J#, VB#.

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

В ноябре 2013 года вышел новый движок симулятора для Marilou — Exec V5. Бета-версия движка может работать на Windows, Ubuntu и Mint. Новый движок многопоточный, кросс-платформенный и использует OpenGL 2.1.

Code Rally: гонки на роботах

Code Rally (разработка IBM) нельзя назвать полноценным симулятором роботов. Если быть точным, Code Rally — симулятор гонок машин (бесплатный и с открытым исходным кодом).

Цель программиста — написать алгоритм управления движения машины («роботом») по трассе (кругу) с учетом следующих правил игры:

  1. В процессе движения машина должна проходить через контрольные точки, за что ей начисляются очки.
  2. Перемещаясь по трассе, машина тратит топливо, а также может расстреливать другие машины пулями.
  3. Машине доступны координаты заправочных станций, кассет с пулями и контрольных точек; трасса ограничена стенами, за пределы которых машина не может выехать.
  4. Допускается управление скоростью машины.
  5. На трассе могут находиться заправочные станции и кассеты с пулями. При заправке топливом машина должна оставаться неподвижной. Машина может включать защиту, но в это время в удвоенном объеме тратится топливо.
  6. Очки начисляются за проезд через контрольную точку (за проезд через точки в установленном порядке начисляется больше очков), за попадание в машину противника (подбитая машина теряет топливо) и за топливо, оставшееся на момент окончания гонки.

Побеждает машина, набравшая максимальное количество очков.

Тестировать свой алгоритм управления машиной можно на сервере (на своем компьютере), посоревноваться с друзьями по сети или запустить приложение на облачном сервере IBM (ведется рейтинг игроков).

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

Algodoo: специализированный симулятор физики

Algodoo — физический 2D-симулятор. Объекты, которые создаются в этом симуляторе, сразу начинают подчиняться законам физики. Конечно, полноценного робота в трехмерном пространстве ты в этой программе не сделаешь, зато сможешь проверить возможность работы любого механизма. В программе можно моделировать воду, пружины, оптические устройства, ракетные двигатели, оружие, автомобили.

Может показаться, что данный симулятор неполноценен в том смысле, что позволяет проектировать и исследовать только «плоских» роботов. Однако ты можешь сначала спроектировать 2D-робота, а потом создать в реале его трехмерную версию. Пример показан здесь (2:07): goo.gl/wzQ7q4. В Algodoo встроен скриптовый язык программирования Thyme, который добавляет большую свободу действий в симуляторе. В Thyme доступны переменные, условный оператор, массивы, обработка событий, происходящих в песочнице (среде моделирования).

История Algodoo началась с игры Phun, которую разработал швед Эмиль Эрнерфельдт (это была его магистерская работа). Поддерживаемые ОС: Windows, OS X, iOS. На сайте доступна библиотека AlgoBox, в которой есть куча обучающих материалов и примеров разработки. Также посмотри algophun.3dn.ru и vk.com/algodoo.

RoboCup Soccer Simulation League: симулятор футбола роботов

Соревнования роботов по футболу — еще одна из областей, в которых используются симуляторы. Для этого можно взять любой из описанных универсальных пакетов симуляции, но лучше воспользоваться специализированным. Это даст тебе возможность посоревноваться с другими любителями футбола роботов. Соревнования виртуальных роботов проводятся ежегодно с 1993 года в двух лигах: соревнования 2D-роботов и соревнования 3D-роботов. Информацию ищи на www.robocup.org.

В программное обеспечение симулятора футбола входит несколько компонентов:

  • сервер симуляции (simulation server) — основной компонент симулятора, запускает сам процесс симуляции; клиенты взаимодействуют с сервером по протоколу UDP, отправляя команды и получая сенсорную информацию;
  • монитор симуляции (simulation monitor) — используется для наблюдения за процессом симуляции (после подключения к серверу) или для просмотра записанной игры (после подключения к плееру лога симуляции);
  • плеер лога симуляции (simulation log player) — используется для проигрывания игры, записанной сервером симулятора; плеер используется для управлением проигрыванием лога, а монитор отображает симуляцию.

Лига 2D-роботов. В лиге двумерных роботов соревнуются две команды по 11 игроков в каждой. Каждый игрок представлен автономной программой (агентом). Игра выполняется на двумерной плоскости (стадионе), который предоставляет сервер симуляции. Сервер знает все об игре: положение игроков, мяча и так далее. Игра основана на взаимодействии сервера и агентов. Игрок получает данные с его виртуальных сенсоров (визуального, акустического и физического) и должен на основе этих данных принять решение: удар по мячу, перемещение по полю или разворот.

Соревнования 2D-роботов Другие статьи в выпуске:

Подружить Arduino с компьютером очень просто. Данные передаются через виртуальный порт RS-232(COM).

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

На компьютере управляющая программа будет отображать позицию горящего светодиода.

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

Небольшая программа для Arduino. (Скачиваем)

// Serial LED control // compblog.vlukyanov.com //Объявляем переменные. int pin = {3, 5, 6}; // Объявляем массив в котором указанны номера выводов int i = 0; // Переменная для определения текущей позиции горящего светодиода int prev_i = 0; // Переменная для запоминания предыдущего светодиода // Настраиваем Arduino void setup() { // Запускаем цикл, в котором определяем контакты 3,5,6 как выводные for (int t = 0; t { pinMode(pin, OUTPUT); } Serial.begin(9600); // Инициализируем перередачу данных по COM-порту на скорости 9600 бод } void loop() { // Запускаем цикл без каких либо действий // Только когда данные придут на COM-порт продолжится выполнение программы дальше этой строки while (Serial.available() == 0); // Данные пришли, считываем их в переменную i i = Serial.read(); // Постепенно гасим предыдущий светодиод, понижая яркость с 255 до 0; for (int j=255; j > 0; j—) { analogWrite(pin,j); delay(1); // Небольшая задержка } analogWrite(pin,0); // Окончательно гасим светодиод // Пришедшее значение i используем для включения следующего светодиода for (int j=0; j { analogWrite(pin,j); delay(1); } // Запоминаем значение светодиода, чтоб потом гасить его, когда появится новое значение на COM-порту prev_i = i; }

Теперь нужна программа на компьютере, которая будет посылать необходимые данные в COM-порт и отображать данные на экран. Processing хорошо подойдет.
IDE Arduino основана на processing, поэтому они очень похожи как внешне, так и по синтаксису.

Тоже довольно простая программа на Processing. (Скачиваем)

// Serial LED control // compblog.vlukyanov.com import processing.serial.*; // подключаем библиотеку для общения по COM-порту // в IDE Arduino это сделанно по умолчанию, тут надо это делать дополнительно int value = 1; // переменная которую будем отправлять в COM-порт для Arduino Serial port; // переменная обозначающая порт PFont f; // переменна для шрифта void setup() { size(500,500); // создаем окно 500 на 500 px f = createFont(«Colibri», 15,true); // определяем шрифт для данного окна port = new Serial(this, «COM5», 9600); // задаем параметры порта, у меня он пятый } void draw() { // создаем окно background(0, 0, 0); // черный бэкграунд для окна textFont(f,200); // создаем текст text(value-1,200,300); // выводим в центр значение переменной value } void keyPressed() { // обрабатываем нажатия клавиш // переменная value сдвинута от нулевой позиции на 2, чтоб не загонять ее в минус if (keyCode == LEFT) { // при нажатии клавиши влево value = value + 1; // увеличиваем значение value на 1 if ( value > 4 ) value=2; // если она оказывается вне пределов третьего светодиода — сбрасываем значение в 2 port.write(value-2); // и отправляем это значение в COM-порт } else if (keyCode == RIGHT) { // при нажатии клавиши вправо value = value — 1; // уменьшаем значение value на 1 if ( value port.write(value-2); // и отправляем это значение в COM-порт } else { } // в остальных случаях ничего не делаем }

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

Программка для управления роботом через UART

Всем привет.
Давным-давно, года три назад, я прочитал серию статей на хабре «Строим гусеничного Bluetooth-робота с камерой». Мне тут же захотелось сделать похожую дистанционно управляемую тележку на гусеницах, буду далее называть ее робот, так короче и моднее =) В топике речь пойдет о написанной мной программе для управления подобными роботами с клавиатуры, надеюсь она пригодится кому-то еще.
Я купил китайское шасси и сделал простенькую схему – микроконтроллер Atmega16, с одной стороны общающийся с компом по UART через блютус модуль, а с другой – рулящий парой коллекторных двигателей через H-мосты. Написал элементарную программу для мк – при получении символа через UART проверялось, что это за символ, и если это символ ‘w’, то робот едет вперед, ‘a’ – влево, ‘d’ – вправо, ’z’ – назад, ‘s’ – стоп. Если запустить putty и открыть в ней нужный ком-порт, то можно нажимать клавиши на клавиатуре и управление получится почти как в компьютерной игрушке при помощи WASD, благодаря тому, что putty немедленно отправляет вводимые символы, не дожидаясь «Enter», как многие другие терминальные программы. В принципе, эта система на тот момент меня вполне радовала.
Но у такого подхода есть два существенных недостатка. Во-первых, непривычно и неудобно нажимать и тут же отпускать кнопку, лично я привык в игрушках зажимать кнопку «вперед», все время, пока я хочу ехать вперед. Во-вторых, не регулируется скорость, в частности, нельзя «подруливать», робот либо едет на полную мощность вперед, либо влево, и так далее – движения получаются очень дерганными, а управление – неудобным.
Последние полтора года я регулярно преподаю электронику и робототехнику школьникам (возможно, участникам сообщества с детьми будет интересно, школа называется «Ланат»), и они частенько строят всякие ездящие, ползающие и водоплавающие тележки с управлением через UART, короче столкнулся я с этой проблемой на регулярной основе – неудобно управлять через putty. Тем более, школьникам неинтересно просто сделать робота и поездить на нем – им подавай какие-нибудь соревнования, а какие соревнования могут быть, если робот кое-как управляется.
В общем, давно я хотел научиться писать GUI приложения, и кажется этот момент настал. После не очень длительного выбора остановился на QT, ибо писать умел только на C, и понравились обещания кросплатформенности, да и отзывы неплохие. Попутно пришлось раскурить C++ и вообще ООП, чему я очень рад, и просто влюбился в этот подход =). Сходу было не так легко переломить в себе закостенелое «процедурное» мышление, мне очень помог курс «Объектно-ориентированное программирование» (C++). МарГТУ
Итак, в результате родилось приложение, которое позволяет управлять роботом на танковом шасси абсолютно так же, как в какой-нибудь Need For Speed, с плавным разгоном, поддержанием скорости, подруливанием, и автоматическим плавным торможением при отпускании.

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

Интерфейс программы
Связь у нас через UART, поэтому в левом верхнем углу в разделе «Connection» есть необходимые для этого инструменты, а именно – выбрать порт, скорость, подключиться, отключиться. Ну и обновить список портов.
Далее в левом нижнем углу, в разделе «Robot’s status», показывается фактическое состояние двигателей, в какую сторону они крутятся и с какой силой. Если быть точнее – показывается мощность, вкачиваемая в мотор, а если еще точнее – просто OCR ШИМ-а от 0 до 255, ну и направление. Отображение уровня заряда батареи пока не работает, не дошли руки, хотя допилить очень легко. Сейчас робот ничего не отвечает на команды, в дальнейшем хочу добавить обратную связь, чтобы напряжение батареи снималось через АЦП и отправлялось в прогу, и возможно еще показания каких-нибудь других датчиков.
Посередине, в разделе «Robot’s control», показывается логическое состояние робота – в какую сторону и с какой скоростью едет, с какой интенсивностью поворачивает. Я до конца не разобрался в QT, но сейчас для успешной работы программы необходимо, чтобы фокус был на одном из ползунков, и стояла английская раскладка.
Справа блок настроек.
Control packets send interval, ms – периодичность отправки управляющих пакетов роботу.
Keyboard poll interval, ms – периодичность опроса клавиатуры программой.
Speed user change step – параметр, определяющий, насколько быстро скорость будет нарастать при зажатии кнопки «W» и «S».
Speed auto back change step – параметр, определяющий, насколько быстро скорость будет спадать при отпускании кнопок «W» и «S».
Steering user change step – параметр, определяющий, насколько быстро «руль поворачивается» при зажатии кнопки «A» и «D».
Steering auto back change step – параметр, определяющий, насколько быстро «руль возвращается в центральное положение» при отпускании кнопок «A» и «D».
Engines PWM deadzone – параметр, определяющий величину заполнения ШИМ, которой едва хватает для того, чтобы сдвинуть робота с места. Например, для моих моторов при питании от 12V этот параметр – 100. Когда я нажимаю «вперед», скважность не набирается от нуля, а сразу прыгает на 100, и дальше уже регулируется плавно до максимума, таким образом управление получается без провалов. Эта мертвая зона отрабатывается также при любых других сценариях, не обязательно старте с места. И тут наверное стоило бы ввести еще один параметр – величину заполненения ШИМ, которой достаточно для поддержания уже крутящегося двигателя, и при снижении скорость вращения использовать другую мертвую зону на основе этого параметра, но пока не стал заморачиваться.
Left/right engine using power, % — параметр, нужный для корректировки несимметричности двигателей. Зачастую при подаче одинаковой мощности, двигатели крутятся немного с разной скоростью, и это мешает ехать вперед прямо. Данный параметр, как вы наверное уже догадались, вводит понижающий коэффициент для более скоростного мотора, что помогает решить проблему.
Протокол общения.
Программа периодически шлет в UART простенький пакет из 6 байт
0x0F, LEFT_SPEED, LEFT_DIRECTION, RIGHT_SPEED, RIGHT_DIRECTION, 0x0E
Стартовый байт — 0x0F, подразумевается, что скорости и направления не могут быть равны этому значению.
Скорость левого — от 0* до 255.
Направление левого — 0 или 1.
Скорость правого — от 0* до 255.
Направление правого — 0 или 1.
Финишный байт — 0x0F
*Скорости теоретически задаются от 0 до 255, но, как я писал выше, функция PWM deadzone приводит к тому, что значения ниже некоторой планки никогда не придут. Я принудительно ограничил в программе поле ввода на уровне 90, поэтому в качестве стартового и финального байтов смело использую 0x0F и 0x0E. Костыль, велосипед, но уж как сделал =)
На этом пока всё.
В дальнейшем планирую еще добавить кручение сервомашинок при движениях мышью.
Критика и пожелания приветствуются. =)
Файлы прикреплены(смотрите под топиком, адски мелким незаметным шрифтом):
Архив с уже скомпилированной для Windows программой и необходимыми библиотеками — Robot_control.zip
Исходники, проект для QtCreator 5 — com_control2.zip
Проект для Atmel Studio 6 с работающим примером, там все просто, только, возможно, надо будет поменять контроллер на ваш и передефайнить ножки направления двигателей — Control_board.zip