Управление Arduino-роботом с помощью G-сенсора смартфона
В этой статье вы узнаете, как с помощью сервиса RemoteXY очень просто настроить дистанционное управление роботизированной платформой или двухмоторной машинкой. Роботом мы будем управлять с помощью элемента управления «джойстик», который может работать с G-сенсором вашего смартфона. В конце статьи вы найдёте видео и сможете увидеть, что у нас получилось.
Мы собрали очень простую двухколёсную платформу, чтобы показать вам, как построить систему дистанционного управления. Платформа состоит из следующих компонентов (мы не претендуем на качество сборки — платформа собрана для демонстрации возможностей ресурса RemoteXY):
Шасси — вырезано из листового материала;
Переднее колесо — колесо с поворотом на 360 градусов;
Мотор-редукторы — 2 шт.;
Колёса с осью, подходящей для мотор-редукторов — 2 шт. Колёса мы приобрели вместе с мотор-редукторами;
Батарейный отсек с выключателем на 4 батарейки типа AA;
Arduino — мы использовали клон Seeeduino;
Bluetooth-модуль HC-06;
Драйвер моторов на микросхеме L298N.
Электрическая схема подключения всех модулей машинки представлена на следующем рисунке.
Программа управления
Используйте редактор данного ресурса и создайте следующий интерфейс управления:
Установите в центре экрана «джойстик». В свойствах джойстика выберите дополнительное управление «Включить G-сенсор». Выберите положение переключателя G-сенсора «нижний левый». Также в настройках можно изменить цвет на красный. В дальнейшем мы будем использовать джойстик для управления движением машинки.
Установите «Переключатель». Поместите его слева от джойстика. Вы также можете изменить его цвет. Переключателем мы будем управлять светодиодом на плате Arduino на пине 13.
Если вы всё сделали правильно, у вас должен получиться примерно такой интерфейс управления:
В настройках проекта выберите целевую платформу, для которой мы получим исходный код: «Arduino (SoftwareSerial), library version». Нажмите кнопку «Получить код» и скачайте исходный код на свой компьютер. По ссылке скачайте библиотеку RemoteXY и установите её в Arduino IDE.
Откройте загруженный скетч в Arduino IDE. Скетч компилируется без ошибок. Однако в нём, конечно, нет кода для управления нашей машинкой. Наша задача — дополнить этот код. Для этого мы воспользуемся загруженным примером.
Обратите внимание на определение структуры RemoteXY в скетче проекта. Структура содержит поля, которые полностью соответствуют установленным элементам управления на пользовательском интерфейсе. Мы видим переменные joystick_1_x и joystick_1_y, отражающие координаты x и y джойстика, а также переменную switch_1, отражающую состояние переключателя.
Далее представлен основной код программы, в котором уже встроено управление моторами нашей робот-платформы. Вы можете просто скопировать приведённый ниже код в свой скетч или выборочно добавить необходимые фрагменты кода в загруженный пример.
/////////////////////////////////////////////
// RemoteXY include library //
// //
/////////////////////////////////////////////
/* RemoteXY select connection mode and include library */
#define REMOTEXY_MODE__SOFTWARESERIAL
#include <SoftwareSerial.h>
#include <RemoteXY.h>
/* RemoteXY connection settings */
#define REMOTEXY_SERIAL_RX 2
#define REMOTEXY_SERIAL_TX 3
#define REMOTEXY_SERIAL_SPEED 9600
/* RemoteXY configurate */
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
};
/* this structure defines all the variables of your control interface */
struct {
/* input variable */
signed char joystick_1_x; /* =-100..100 x-coordinate joystick position */
signed char joystick_1_y; /* =-100..100 y-coordinate joystick position */
unsigned char switch_1; /* =1 if switch ON and =0 if OFF */
/* other variable */
unsigned char connect_flag; /* =1 if wire connected, else =0 */
} RemoteXY;
/////////////////////////////////////////////
// END RemoteXY include //
// //
/////////////////////////////////////////////
/* defined the right motor control pins */
#define PIN_MOTOR_RIGHT_UP 7
#define PIN_MOTOR_RIGHT_DN 6
#define PIN_MOTOR_RIGHT_SPEED 10
/* defined the left motor control pins */
#define PIN_MOTOR_LEFT_UP 5
#define PIN_MOTOR_LEFT_DN 4
#define PIN_MOTOR_LEFT_SPEED 9
/* defined the LED pin */
#define PIN_LED 13
/* defined two arrays with a list of pins for each motor */
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};
/*
speed control of the motor
motor - pointer to an array of pins
v - motor speed can be set from -100 to 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() {
/* initialization pins */
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);
/* initialization module RemoteXY */
RemoteXY_Init ();
}
void loop() {
/* event handler module RemoteXY */
RemoteXY_Handler ();
/* manage LED pin */
digitalWrite (PIN_LED, (RemoteXY.switch_1 == 0) ? LOW : HIGH);
/* manage the right motor */
Wheel (RightMotor, RemoteXY.joystick_1_y - RemoteXY.joystick_1_x);
/* manage the left motor */
Wheel (LeftMotor, RemoteXY.joystick_1_y + RemoteXY.joystick_1_x);
}
В начале кода определены пины, которые будут использоваться для управления моторами. Далее пины сгруппированы в два массива — для левого и правого мотора соответственно. Для управления каждым мотором через драйвер L298N необходимо использовать три сигнала: два дискретных, определяющих направление вращения мотора, и один аналоговый, определяющий скорость вращения. Расчёт этих сигналов выполняется в функции Wheel. На вход функции передаётся указатель на массив пинов выбранного мотора и скорость вращения в виде знакового значения от -100 до 100. Если значение скорости равно 0, мотор отключается.
В функции setup настраиваются выходные пины. Для аналогового сигнала используются пины, которые могут работать как ШИМ-преобразователи. Это пины 9 и 10, они не требуют дополнительной настройки в Arduino IDE.
В функции loop в каждой итерации программы вызывается обработчик библиотеки RemoteXY. Далее происходит управление светодиодом, а затем управление моторами. Для управления моторами считываются координаты X и Y джойстика из полей структуры RemoteXY. На основе координат выполняется расчёт скорости каждого мотора и вызывается функция Wheel, устанавливающая скорость мотора. Эти вычисления выполняются в каждом цикле программы, обеспечивая непрерывное управление пинами моторов на основе координат джойстика.
Загрузите готовый скетч в контроллер Arduino. Скачайте и запустите мобильное приложение на вашем смартфоне или планшете. Подключитесь к вашему робот-устройству, и вы сможете им управлять. Джойстиком можно управлять в обычном режиме, перемещая ползунок пальцем. Вы можете выбрать режим G-сенсора, и тогда робот будет двигаться в зависимости от наклона вашего смартфона.
Если после сборки один или оба мотора вращаются в противоположном направлении, поменяйте полярность подключения мотора.