Машина на Arduino, управляемая с помощью датчика силы тяжести мобильного телефона

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

Внешний вид машины на Arduino, управляемой с мобильного телефона

Датчик силы тяжести (Gravity sensor, G-Sensor) представляет собой акселерометр (измеритель ускорения), который используется для управления ориентацией экрана смартфона. Акселерометр измеряет гравитационную силу в направлениях X,Y, Z и в соответствии с этим поворачивает экран смартфона в нужное положение. В современных телефонах можно также встретить более совершенное устройство для этих целей – датчик на основе гироскопа. Аналогичный, но немного более простой проект мы уже рассматривали на нашем сайте — робот на Arduino управляемый с помощью жестов рук и акселерометра.

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

Необходимые компоненты

Плата Arduino Uno
Двухколесное шасси для роботизированной машины
Контроллер двигателя L298N
Bluetooth модуль HC-06 (или HC-05)
Источник питания или батарейка
Соединительные провода

Создание интерфейса для управления машиной с помощью RemoteXY app

Для создание данного интерфейса с использованием приложения RemoteXY вы должны перейти по следующей ссылке — https://remotexy.com/en/editor/. Открывшаяся по данной ссылке страница будет выглядеть примерно так:

Внешний вид редактора

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

Размещение необходимых элементов в редакторе

После этого перетащите на экран датчик силы тяжести (G sensor) чтобы мы могли управлять движениями машины с помощью наклона мобильного телефона. Веб-страница после этого будет выглядеть следующим образом:

Редактор после помещения на него датчика силы тяжести

После этого кликните на кнопку “Get source code” (получить исходный код) и сохраните этот код на свой компьютер. Затем скачайте библиотеку по этой ссылке и поместите ее в каталог с библиотеками Arduino. Скомпилируйте этот код чтобы проверить что в нем нет ошибок. Это не код программы для нашего робота – это код чтобы просто проверить работу Arduino с этим приложением. Скачайте приложение RemoteXY по этой ссылке и потом загрузите его в свой смартфон, либо сразу со смартфона скачайте его из Play Store (необходим смартфон на операционной системе Android).

Работа схемы

Первым делом нам необходимо подключить контроллер двигателя L298N к плате Arduino. Подсоедините контакты ENA и ENB контроллера к контактам 12 и 11 платы Arduino соответственно. Эти два контакта будут использоваться для управления двигателем с помощью широтно-импульсной модуляции (ШИМ). Используя эти контакты, мы можем уменьшать или увеличивать скорость движения машины. Затем подсоедините контакты IN1, IN2, IN3 и IN4 контроллера к контактам 10, 9, 8 и 7 платы Arduino соответственно. Эти контакты будут использоваться для вращения двигателей в обоих направлениях (по часовой и против часовой стрелки).

Внешний вид контроллера двигателя L298N

Чтобы подать питание на двигатели, соедините положительный и отрицательный контакты батареи к контакту 12V и земле контроллера двигателя. Затем соедините контакты 5V и землю контроллера с контактами Vin и землей платы Arduino.

Затем необходимо соединить Bluetooth модуль HC-06 (или HC-05) с платой Arduino. Подсоедините контакт VCC и землю Bluetooth модуля к контактам 5V и земле платы Arduino. Затем подсоедините контакт TX Bluetooth модуля к контакту 2 платы Arduino, а контакт RX Bluetooth модуля — к контакту 3 платы Arduino. Для более лучшего понимания работы этого проекта можете также изучить проект управления машины на основе Arduino по Bluetooth.

Схема устройства представлена на следующем рисунке.

Схема машины на Arduino, управляемой с мобильного телефонаИсходный код программы

Первым делом при написании программы мы должны подключить библиотеку последовательной связи (Software Serial) и библиотеку для работы с приложением RemoteXY, которая во многом упростит управление нашей машиной. После этого необходимо инициализировать контакты для подключения Bluetooth модуля и установить скорость для обмена данными с этим модулем равную 9600 бод/с.

#define REMOTEXY_MODE__SOFTWARESERIAL
#include <SoftwareSerial.h> //подключение библиотеки последовательной связи
#include <RemoteXY.h> //подключение библиотеки remotexy
/* RemoteXY connection settings */
#define REMOTEXY_SERIAL_RX 2 //defining the pin 2 as RX pin (прием)
#define REMOTEXY_SERIAL_TX 3 //defining the pin 3 as TX pin (передача)
#define REMOTEXY_SERIAL_SPEED 9600 //установка скорости 9600 бод/с

Следующий участок кода будет увеличивать или уменьшать скорость вращения двигателей. Когда джойстик будет посередине скорость будет равна нулю, а когда мы будем двигать его прямо скорость будет увеличиваться от 0 до 100. Скорость будет уменьшаться с 0 до -100 когда машина будет двигаться в обратном направлении. Также машина может двигаться с заранее определенной скоростью – этого можно достичь с использованием ШИМ модуляции. ШИМ сигнал будет подаваться на двигатели в соответствии с положением джойстика.

if (motor_speed>100) motor_speed=100;
if (motor_speed<-100) motor_speed=-100;
if (motor_speed>0) {
digitalWrite(pointer[0], HIGH);
digitalWrite(pointer[1], LOW);
analogWrite(pointer[2], motor_speed*2.55);
}
else if (motor_speed<0) {
digitalWrite(pointer[0], LOW);
digitalWrite(pointer[1], HIGH);
analogWrite(pointer[2], (-motor_speed)*2.55);
}
else {
digitalWrite(pointer[0], LOW);
digitalWrite(pointer[1], LOW);
analogWrite(pointer[2], 0);
}

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

void loop()
{
RemoteXY_Handler ();
digitalWrite (ledpin, (RemoteXY.switch_1==0)?LOW:HIGH);
Speed (first_motor, RemoteXY.joystick_1_y - RemoteXY.joystick_1_x);
Speed (second_motor, RemoteXY.joystick_1_y + RemoteXY.joystick_1_x);

Далее приведен полный текст программы.

#define REMOTEXY_MODE__SOFTWARESERIAL
#include <SoftwareSerial.h> //Including the software serial library
#include <RemoteXY.h> //Including the remotexy library
/* RemoteXY connection settings */
#define REMOTEXY_SERIAL_RX 2 //defining the pin 2 as RX pin
#define REMOTEXY_SERIAL_TX 3 //defining the pin 3 as TX pin
#define REMOTEXY_SERIAL_SPEED 9600 //setting baudrate at 9600
unsigned char RemoteXY_CONF[] = //remotexy configuration
{ 3,0,23,0,1,5,5,15,41,11
,43,43,1,2,0,6,5,27,11,5
,79,78,0,79,70,70,0 };
struct { //Function for declaring the variables
signed char joystick_1_x; //joystick x-axis
signed char joystick_1_y; //joystick y-axis
unsigned char switch_1; //variables for switch
unsigned char connect_flag;
} RemoteXY;
//defining the pins for first motor
#define IN1 10
#define IN2 9
#define ENA 12
//defining the pins for second motor
#define IN3 8
#define IN4 7
#define ENB 11
//defining the LED pin
#define ledpin 13
unsigned char first_motor[3] =
{IN1, IN2, ENA};
unsigned char second_motor[3] =
{IN3, IN4, ENB};
void Speed (unsigned char * pointer, int motor_speed)
{
if (motor_speed>100) motor_speed=100;
if (motor_speed<-100) motor_speed=-100;
if (motor_speed>0) {
digitalWrite(pointer[0], HIGH);
digitalWrite(pointer[1], LOW);
analogWrite(pointer[2], motor_speed*2.55);
}
else if (motor_speed<0) {
digitalWrite(pointer[0], LOW);
digitalWrite(pointer[1], HIGH);
analogWrite(pointer[2], (-motor_speed)*2.55);
}
else {
digitalWrite(pointer[0], LOW);
digitalWrite(pointer[1], LOW);
analogWrite(pointer[2], 0);
}
}
void setup()
{
//defining the motor pins as the output pins
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (ledpin, OUTPUT);
RemoteXY_Init ();
}
void loop()
{
RemoteXY_Handler ();
digitalWrite (ledpin, (RemoteXY.switch_1==0)?LOW:HIGH);
Speed (first_motor, RemoteXY.joystick_1_y - RemoteXY.joystick_1_x);
Speed (second_motor, RemoteXY.joystick_1_y + RemoteXY.joystick_1_x);
}

Как запустить проект в работу

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

Внешний приложения RemoteXY для смартфона

Затем идите в пункт Bluetooth и включите там Bluetooth. После включения вам будут показаны все рядом находящиеся Bluetooth-устройства. Выберите из них Bluetooth модуль HC-06 и затем вы попадете на интерфейс с которого можно будет управлять нашей роботизированной машиной.

Включение Bluetooth в приложении RemoteXY

Видео, демонстрирующее работу схемы

(Проголосуй первым!)
Загрузка...
15 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *