Каталог

Управляем Arduino-машинкой при помощи G-сенсора со смартфона



В данной статье вы узнаете, как при помощи данного сервиса RemoteXY очень легко настроить дистанционное управление робо-платформой или машинкой. Робомашинкой мы будем управлять при помощи элемента управления "Джойстик", который умеет работать от G-сенсора вашего смартфона. В конце статьи вы найдете видео и можете посмотреть, что же у нас получилось.

Управляем машинкой со смартфона

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

  • Платформа - ее мы вырезали из листового материала. Для простоты использовали ДВП;
  • Переднее колесо - поворотное колесико от кресла;
  • Мотор-редукторы 2 шт.;
  • Колеса, с осью подходящей к мотор-редукторам 2 шт. Колеса мы приобретали совместно с мотор редукторами;
  • Батарейный отсек с выключателем, на 4-е пальчиковые батарейки (тип АА);
  • Arduino, мы использовали все тот же клон Seeeduino;
  • Модуль Bluetooth HC-06;
  • Драйвер моторов на чипе L298N;

Электрическая часть и схема подключения всех модулей машинки представлена на следующем рисунке.

Схема подключения машинки

Программа управления

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

Установите по центру экрана "Джойстик". В свойствах джойстика выберите установку дополнительного элемента управления "Включить G сенсор". Выберите положение переключателя G-сенсора "Низ-лево". Так же в настройках можете изменить цвет на красный. В дальнейшем джойстиком мы будем управлять движением машинки.

Установите "Переключатель". Разместите его левее джойстика. Можете так же изменить его цвет. Переключателем мы будем управлять светодиодом на плате Arduino на пине 13.

Если вы все правильно сделали, у вас должен получиться примерно такой интерфейс управления:

Интерфейс управления машинкой

В настройках проекта выберите целевую платформу, для которой мы получаем исходный код "Arduino (SoftwareSerial), library version". Нажимаем кнопку "Получить код" и загружаем исходный код на свой компьютер. Так же по ссылке загружаем библиотеку RemoteXY и устанавливаем ее в Arduino IDE.

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

Обратите внимание на определение структуры RemoteXY в скетче проекта. Структура содержит поля, полностью соответствующие установленным на интерфейсе управления элементам управления. Мы видим переменные joystick_1_x и joystick_1_y, отражающие координаты x и y нашего джойстика, а так же переменную switch_1, отражающую переключатель.

/* структура определяет все переменные вашего интерфейса управления */ struct { /* input variable */ signed char joystick_1_x; /* =-100..100 координата x положения джойстика */ signed char joystick_1_y; /* =-100..100 координата y положения джойстика */ unsigned char switch_1; /* =1 если переключатель включен и =0 если отключен */ /* other variable */ unsigned char connect_flag; /* =1 if wire connected, else =0 */ } RemoteXY;

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

///////////////////////////////////////////// // RemoteXY include library // ///////////////////////////////////////////// /* определение режима соединения и подключение библиотеки RemoteXY */ #define REMOTEXY_MODE__SOFTWARESERIAL #include <SoftwareSerial.h> #include <RemoteXY.h> /* настройки соединения */ #define REMOTEXY_SERIAL_RX 2 #define REMOTEXY_SERIAL_TX 3 #define REMOTEXY_SERIAL_SPEED 9600 /* конфигурация интерфейса */ unsigned char RemoteXY_CONF[] = { 255,3,0,0,0,29,0,16,13,0,5,15,49,9,43,43,1,26,31,2, 0,6,7,32,15,5,26,31,31,79,78,0,79,70,70,0 }; /* структура определяет все переменные вашего интерфейса управления */ struct { /* input variable */ signed char joystick_1_x; /* =-100..100 координата x положения джойстика */ signed char joystick_1_y; /* =-100..100 координата y положения джойстика */ unsigned char switch_1; /* =1 если переключатель включен и =0 если отключен */ /* other variable */ unsigned char connect_flag; /* =1 if wire connected, else =0 */ } RemoteXY; ///////////////////////////////////////////// // END RemoteXY include // ///////////////////////////////////////////// /* определяем пины управления правым мотором */ #define PIN_MOTOR_RIGHT_UP 7 #define PIN_MOTOR_RIGHT_DN 6 #define PIN_MOTOR_RIGHT_SPEED 10 /* определяем пины управления левым мотором */ #define PIN_MOTOR_LEFT_UP 5 #define PIN_MOTOR_LEFT_DN 4 #define PIN_MOTOR_LEFT_SPEED 9 /* определяем пин управления светодиодом */ #define PIN_LED 13 /* определяем два массива с перечислением пинов для каждого мотора */ unsigned char RightMotor[3] = {PIN_MOTOR_RIGHT_UP, PIN_MOTOR_RIGHT_DN, PIN_MOTOR_RIGHT_SPEED}; unsigned char LeftMotor[3] = {PIN_MOTOR_LEFT_UP, PIN_MOTOR_LEFT_DN, PIN_MOTOR_LEFT_SPEED}; /* управление скоростью мотора motor - ссылка на массив пинов v - скорость мотора, может принимать значения от -100 до 100 */ void Wheel (unsigned char * motor, int v) { if (v>100) v=100; if (v<-100) v=-100; if (v>0) { digitalWrite(motor[0], HIGH); digitalWrite(motor[1], LOW); analogWrite(motor[2], v*2.55); } else if (v<0) { digitalWrite(motor[0], LOW); digitalWrite(motor[1], HIGH); analogWrite(motor[2], (-v)*2.55); } else { digitalWrite(motor[0], LOW); digitalWrite(motor[1], LOW); analogWrite(motor[2], 0); } } void setup() { /* инициализация пинов */ pinMode (PIN_MOTOR_RIGHT_UP, OUTPUT); pinMode (PIN_MOTOR_RIGHT_DN, OUTPUT); pinMode (PIN_MOTOR_LEFT_UP, OUTPUT); pinMode (PIN_MOTOR_LEFT_DN, OUTPUT); pinMode (PIN_LED, OUTPUT); /* инициализация модуля RemoteXY */ RemoteXY_Init (); } void loop() { /* обработчик событий модуля RemoteXY */ RemoteXY_Handler (); /* управляем пином светодиода */ digitalWrite (PIN_LED, (RemoteXY.switch_1==0)?LOW:HIGH); /* управляем правым мотором */ Wheel (RightMotor, RemoteXY.joystick_1_y - RemoteXY.joystick_1_x); /* управляем левым мотором */ Wheel (LeftMotor, RemoteXY.joystick_1_y + RemoteXY.joystick_1_x); }

В самом начале определяются номера пинов, которые будут использованы для управления моторами. Далее номера пинов группируются в два массива, для правого и левого мотора соответственно. Для управления каждым мотором через драйвер на чипе L298N необходимо использовать 3 сигнала: два дискретных, указывающих направление вращения мотора, и один аналоговый, определяющий скорость вращения. Данными преобразованиями у нас занимается функция Wheel. На вход функции передаем ссылку на массив пинов выбранного мотора, и скорость вращения как знаковое число от -100 до 100. Если передали скорость 0, то мотор отключается.

В предопределенной функции setup настраиваются пины на работу как выходы. Для аналогового сигнала используются пины, которые могут работать как ШИМ преобразователи. Это пины 9 и 10. Они не требуют настройки в среде Arduino.

В предопределенной функции loop в каждой итерации работы программы вызывается обработчик модуля RemoteXY. Далее происходит управление зажиганием светодиода, далее управление моторами. Для управления моторами из структуры RemoteXY считываются поля по координатам джойстика X и Y, на основе координат выполняется математическая операция расчета скорости для каждого мотора, и вызывается функция Wheel, задающая скорость мотора. Данные вычисления выполняются в каждом цикле работы программы, обеспечивая непрерывность вычисления управляющих импульсов моторов на основе координат джойстика.

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

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