Машинка на Arduino своими руками

Машинка на Arduino своими руками

Не давно я писал о машинке на основе Arduino. Сейчас снова хочу предоставить вам интересный вариант «Управляем Arduino-машинкой при помощи G-сенсора на Android смартфоне»

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

/* структура определяет все переменные вашего интерфейса управления */ typedef 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_TypeDef;

 

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

#include <SoftwareSerial.h> #include <inttypes.h> #include "remotexy.h"

/* определяем пины управления правым мотором */
#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 в контроллер. Загрузите и запустите Android мобильное приложение на ваш смартфон или планшет. Соединитесь с вашим устройством и можете им управлять. Джойстиком можно управлять в обычном режиме, перемещая движок пальцем. Можно включить G-сенсор, и движок джойстика будет перемещаться сам в зависимости от наклона вашего смартфона.

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

Поделиться:

Просмотров: 15 502