ARDUINO Машинка на управлении по Bluetooth 4.0 (BLE) со смартфона

CauMoH

✩✩✩✩✩✩✩
19 Дек 2018
1
0
Всем привет.
Делюсь с вами своим небольшим проектом bluetooth машинки.
Проект сделан для обкатки технологии передачи данных со смартфона на Arduino по протоколу BLE (bluetooth 4.0)
Так как тема РУ моделей мне очень близка и в коробке завалялась старинная, нерабочая машинка на 433 МГц, было решено дать ей вторую жизнь.

Собственно проект состоит из 2 софтверных частей.
  • Приложение на Android, работающее по протоколу BLE.
  • Собственно код на Arduino
Приложение на мобилку написано на C#, с использованием фреймворка Xamarin.
MainPage.pngBluetoothPage.pngSettingsPage.png
Приложение не претендует на релизную версию для выкладывания в Play Market, так что не обессудьте.
Если кто-то захочет ознакомиться с кодом или внести новый функционал для своего проекта, прошу, используйте по ссылке Проект управления по bluetooth 4.0
Для тех, кто хочет использовать приложение "как есть" вот ссылка Joystick.
Сразу скажу, приложение точно работает на android 6.0 и выше, с разрешением 1980x1020 (другие не тестил), только для устройств с поддержкой BLE (как проверить, ищите в интернете), так что не пинайте.
Вкратце расскажу по работе с текущей версией.
Так-как я любитель квадрокоптеров, то и управление делал схожим.
  • Два стика - левый газ, правый поворот колес.
  • По нажатию на кнопку BLUETOOTH - окно с поиском устройств и подключением.
  • По нажатию на кнопку НАСТРОЙКИ - окно с конечными точками и интервалом отправки данных на Arduino ( сделано для универсального использования с любой конфигурацией машинки)
  • Главное окно с индикатором подключения и стиками.
Ну а теперь кусок кода на Arduino.
C++:
#include <SoftwareServo.h>
#include <timer-api.h>
#include <timer_setup.h>
#include <SoftwareSerial.h>

const int FwdPin = 5; //Forward Motor Pin
const int BwdPin = 6;  //Backward Motor Pin
const int ServoPin = 9; // Servo Pin
SoftwareSerial mySerial(11, 12); // RX, TX - Порт bluetooth
SoftwareServo servo; //Сервопривод

byte data[5]; // Массив, куда кладутся принятые данные

short prevXPos, prevYPos, xPos, yPos; //Переменные позиции газа и серво
bool light; // Индикатор включения фар или иного света (у меня не задействован)

void setup()
{
  mySerial.begin(9600);

  sendCommand("AT");
  sendCommand("AT+ROLE0");
  sendCommand("AT+NAMEbluino");

  servo.attach(ServoPin);
  servo.setMaximumPulse(2200);

  pinMode(FwdPin, OUTPUT);
  pinMode(BwdPin, OUTPUT);

  timer_init_ISR_500Hz(TIMER_DEFAULT); // запускаем таймер прерываний (частота подбирается индивидуально)
}

/**
* Метод отправки команд на bluetooth модуль
*/
void sendCommand(const char * command){
  mySerial.println(command);
  delay(100);

  byte reply[100];
  int i = 0;
  while (mySerial.available()) {
    reply[i] = mySerial.read();
    i += 1;
  }
}

void loop()
{
   int i = 0;
   //Ждем, пока не придет 5 байтов в соответсвии с протоколом (протокол описан в приложении на мобилу)
   while (i != 5){
     while (mySerial.available()) {
        data[i] = mySerial.read();
        i += 1;
      }
   }

   //Десериализации полученных данных
   xPos = (data[1] << 8) | (data[0]);
   yPos = (data[3] << 8) | (data[2]);
   light = data[4];

   //Пинаем серву
   SoftwareServo :: refresh ();
}

/**
* Обработчик прерываний
*/
void timer_handle_interrupts(int timer) {  
    if(xPos < 0){
    xPos = xPos * -1;
   }  

   //Собственно задаем скорость и направление мотору
   if(yPos < 0){
    yPos = yPos * -1;
    if(prevYPos != yPos){
      prevYPos = yPos;
      analogWrite(FwdPin, 0);
      analogWrite(BwdPin, yPos);
    }  
   }
   else{
    if(prevYPos != yPos){
      prevYPos = yPos;
      analogWrite(FwdPin, yPos);
      analogWrite(BwdPin, 0);
    }    
   }

   //Задаем угол поворота серве
   if(prevXPos != xPos)
   {
     prevXPos = xPos;
     servo.write(xPos);    
   }
}
Ссылки на использованные в этой машинке китайские модули.
Еще нужна сама Arduino (у меня UNO), выбрал её, потому что все питание у меня идет от 2s Li-po, а она может питаться до 10В.
Коллекторный двигатель и корпус (как писал выше, у меня от старинной модели вместе с движком). Можно заменить драйвер на ESC с б/к двигателем.

Схему рисовать не буду (посмотрев в редактор, половину устройств нет, искать их лень).
Подключается все не сложно. По пинам скажу на bluetooth RXD -> pin 12, TXD -> pin 11, остальное понятно по коду.
IMG_2018-12-19_154512.jpgIMG_2018-12-19_154535.jpgIMG_2018-12-19_154553.jpg
Пример работы ожившей машинки из прошлого с новым железом Здесь
 
Последнее редактирование: