Подключаем сервомашинку и управляем со смартфона

В данной статье вы узнаете, как при помощи данного сервиса RemoteXY очень легко управлять сервомашинками. Сервомашинкой мы будем управлять при помощи элемента управления "Слайдер".

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

Кратко о том, что представляет из себя сервомашинка. Это электромотор с редуктором и схемой управления в одном корпусе. На выходе мы получаем управляемое перемещение вала редуктора. Что бы управлять таким перемещением, сервомашинка имеет специальный входной сигнал управления. Сигнал представляет из себя импульс определенной длительности, который должен повторяться 50 раз в секунду. Временная ширина импульса определят положения выходного вала сервомашинки, к которому его стремится повернуть двигатель. То есть, задавая определенную ширину импульса и повторяя его 50 раз в секунду мы можем ожидать, что выходной вал сервы займет определенное желаемое положение.

Среднему положению выходного вала сервомашинки соответствует ширина импульса 1500 мс. Крайнему левому 500 мс, крайнему правому 2500 мс. Нам не придется вручную генерировать последовательность импульсов для нашей сервомашинки, мы используем библиотеку Arduino "servo.h", которая проделает за нас всю работу. Мы только ей укажем, какая ширина импульса нам необходима в данный конкретный момент.

Есть одна особенность использования библиотеки "servo.h". Ее нельзя использовать совместно с библиотекой программного последовательного порта "SoftwareSerial.h". Эти библиотеки используют совместные ресурсы микроконтроллера. Сервоприводы будут подергиваться, так как поддержание постоянной ширины импульсов будет невозможно. Для решения этой проблемы для обмена данными со смартфоном настроим библиотеку RemoteXY на аппаратный последовательный порт.

Однако аппаратный последовательный порт, использующий пины 0 и 1 используется для программирования чипа. Если к этим пинам подключить Bluetooth модуль, то программирование станет невозможно. Если у вас плата Arduino Mega, вы можете использовать один из трех дополнительных аппаратных последовательных портов. Если все же необходимо использовать единственный порт на стандартной Arduino, то для программирования придется отсоединять модуль Bluetooth.

Интерфейс управления

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

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

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

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

Нажимаем кнопку "Получить код" и загружаем исходный код на свой компьютер. Открываем в IDE Arduino.

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

Теперь нам необходимо написать код программы, который будет являться промежуточным звеном между слайдером и сервомашинкой. Информация о положении слайдера находится в структуре RemoteXY в поле slider_1 (если вы переименовали ваш слайдер, имя переменной будет соответствовать имени слайдера).


/* структура определяет все переменные вашего интерфейса управления */ 
struct { 
  
    /* input variable */
  unsigned char slider_1; /* =0..100 положение слайдера */

    /* other variable */
  unsigned char connect_flag;  /* =1 if wire connected, else =0 */

} RemoteXY; 

Нам необходимо написать математическую формулу, которая пересчитывает значение положения слайдера, изменяемое от 0 до 100 в величину длительности импульса для управления сервой. Длительность импульса изменяется от 500 до 2500 (1500 среднее значение). Получаем такую формулу:


int ms = RemoteXY.slider_1*20+500;

Так же в функции setup мы установим начальное положения слайдера равным 50 - среднее положение. При подключении со смартфона первым делом приложение считывает состояния всех элементов управления. Тем самым положение слайдера установится на середину. У меня получился следующий простой код:


///////////////////////////////////////////// 
//        RemoteXY include library         // 
///////////////////////////////////////////// 

/* RemoteXY select connection mode and include library */ 
#define REMOTEXY_MODE__SERIAL 
#include <RemoteXY.h> 

/* RemoteXY connection settings */ 
#define REMOTEXY_SERIAL Serial 
#define REMOTEXY_SERIAL_SPEED 9600 

/* RemoteXY configurate  */ 
unsigned char RemoteXY_CONF[] = 
  { 1,0,9,0,1,5,4,128,4,11
  ,90,20,2 }; 
   
/* this structure defines all the variables of your control interface */ 
struct { 

    /* input variable */
  unsigned char slider_1; /* =0..100 slider position */

    /* other variable */
  unsigned char connect_flag;  /* =1 if wire connected, else =0 */

} RemoteXY; 

///////////////////////////////////////////// 
//           END RemoteXY include          // 
///////////////////////////////////////////// 

#include <Servo.h>  

Servo myservo; 


void setup()  

  RemoteXY_Init ();  
     
  // TODO you setup code 
  myservo.attach(9); 
  RemoteXY.slider_1 = 50; 
   


void loop()  
{  
  RemoteXY_Handler (); 

  // TODO you loop code 
  // use the RemoteXY structure for data transfer 

  int ms = RemoteXY.slider_1*20+500; 
  myservo.writeMicroseconds(ms); 

}

В коде мы подключаем библиотеку servo.h и определяем одну серву с именем myservo. В процедуре инициализации setup инициализируется библиотека RemoteXY (как в примере), далее инициализируется серва на пин 9, и устанавливается среднее положение слайдера. В глобальном цикле - процедуре loop первым делом запускается обработчик RemoteXY. Далее вычисляется длительность импульса по формуле. И эта длительность передается в качестве параметра в функцию writeMicroseconds, тем самым задавая положение вала сервомашинки, соответствующее положению слайдера на смартфоне, в каждом цикле программы.

Схема соединения

Мы использовали микросервомашинку, питание которой подключили напрямую к +5V питания платы Arduino. Это не является правильным решением, так как сервомашинка потребляет достаточно большой ток под нагрузкой, и может мешать работе микроконтроллера. Правильным решением будет являться питание сервомашинок от отдельного источника. Но она у нас вращается свободно, и мы сможем провести тест. На схеме показано соединение сервомашинки и модуля Bluetooth к плате Arduino. Bluetooth модуль HC-06 подключен к аппаратному последовательному порту. Его необходимо отключать при программировании микроконтроллера.

Схема соединения сервомашинка с Arduino

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