Контролируем устройства через Bluetooth с помощью Arduino

Контролируем устройства через Bluetooth с помощью Arduino Машинки

Добавляем основной код

Пришла пора вдохнуть жизнь в наше приложение. Открываем файл MainActivity.java (src → ru.amperka.arduinobtled). Изначально он содержит следующий код:

MainActivityAutogen.java
packageru.amperka.arduinobtled;
 
importandroid.os.Bundle;importandroid.app.Activity;importandroid.view.Menu;
 
publicclass MainActivity extends Activity {
 
        @Override
	protectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);}
 
	@Override
	publicboolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);returntrue;}
 
}

Дополним код в соответствии с тем, что нам нужно:

  1. Будем включать Bluetooth, если он выключен.

  2. Будем обрабатывать нажатия на кнопки

  3. Будем посылать информацию о том, какая кнопка была нажата.

Передавать на Arduino мы будем один байт с двузначным числом. Первая цифра числа — номер пина, к которому подключен тот или иной светодиод, вторая — состояние светодиода: 1 — включен, 0 — выключен.

Число-команда, рассчитывается очень просто:
Если нажата красная кнопка, то берется число 60 (для красного светодиода мы выбрали 6-й пин Arduino) и к нему прибавляется 1 или 0 в зависимости от того, должен ли сейчас гореть светодиод или нет. Для зеленой кнопки всё аналогично, только вместо 60 берется 70 (поскольку зеленый светодиод подключен к 7 пину).
В итоге, в нашем случае, возможны 4 команды: 60, 61, 70, 71.

Смотрите про коптеры:  Математическая модель полёта дрона-квадрокоптера и способ гарантированной посадки его в «гнездо»

Напишем код, который реализует всё сказанное.

MainActivity.java
packageru.amperka.arduinobtled;
 
importjava.io.IOException;importjava.io.OutputStream;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;
 
importandroid.app.Activity;importandroid.bluetooth.BluetoothAdapter;importandroid.bluetooth.BluetoothDevice;importandroid.bluetooth.BluetoothSocket;importandroid.content.Intent;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Toast;importandroid.widget.ToggleButton;
 
publicclass MainActivity extends Activity implementsView.OnClickListener{
 
    //Экземпляры классов наших кнопок
    ToggleButton redButton;
    ToggleButton greenButton;
 
    //Сокет, с помощью которого мы будем отправлять данные на Arduino
    BluetoothSocket clientSocket;
 
    //Эта функция запускается автоматически при запуске приложения
    @Override
    protectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        //"Соединям" вид кнопки в окне приложения с реализацией
        redButton =(ToggleButton) findViewById(R.id.toggleRedLed);
        greenButton =(ToggleButton) findViewById(R.id.toggleGreenLed);
 
        //Добавлем "слушатель нажатий" к кнопке
        redButton.setOnClickListener(this);
        greenButton.setOnClickListener(this);
 
        //Включаем bluetooth. Если он уже включен, то ничего не произойдетString enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE;
        startActivityForResult(new Intent(enableBT), 0);
 
        //Мы хотим использовать тот bluetooth-адаптер, который задается по умолчанию
        BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
 
        //Пытаемся проделать эти действияtry{//Устройство с данным адресом - наш Bluetooth Bee//Адрес опредеяется следующим образом: установите соединение//между ПК и модулем (пин: 1234), а затем посмотрите в настройках//соединения адрес модуля. Скорее всего он будет аналогичным.
            BluetoothDevice device = bluetooth.getRemoteDevice("00:13:02:01:00:09"); 
 
            //Инициируем соединение с устройствомMethod m = device.getClass().getMethod("createRfcommSocket", newClass[]{int.class});
 
            clientSocket =(BluetoothSocket) m.invoke(device, 1);
            clientSocket.connect();
 
            //В случае появления любых ошибок, выводим в лог сообщение}catch(IOException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(SecurityException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(NoSuchMethodException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(IllegalArgumentException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(IllegalAccessException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(InvocationTargetException e){
            Log.d("BLUETOOTH", e.getMessage());}
 
        //Выводим сообщение об успешном подключении
        Toast.makeText(getApplicationContext(), "CONNECTED", Toast.LENGTH_LONG).show();
 
    }
 
    @Override
    publicboolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);returntrue;}
 
 
    //Как раз эта функция и будет вызываться 
 
    @Override
    publicvoid onClick(View v){
 
        //Пытаемся послать данныеtry{//Получаем выходной поток для передачи данныхOutputStream outStream = clientSocket.getOutputStream();
 
            int value =0;
 
            //В зависимости от того, какая кнопка была нажата, //изменяем данные для посылкиif(v == redButton){
                value =(redButton.isChecked()?1:0) 60;}elseif(v == greenButton){
                value =(greenButton.isChecked()?1:0) 70;}
 
            //Пишем данные в выходной поток
            outStream.write(value);
 
        }catch(IOException e){//Если есть ошибки, выводим их в лог
            Log.d("BLUETOOTH", e.getMessage());}}}

Arduino – машинка на управлении по bluetooth 4.0 (ble) со смартфона

Всем привет.

Делюсь с вами своим небольшим проектом bluetooth машинки.

Проект сделан для обкатки технологии передачи данных со смартфона на Arduino по протоколу BLE (bluetooth 4.0)

Так как тема РУ моделей мне очень близка и в коробке завалялась старинная, нерабочая машинка на 433 МГц, было решено дать ей вторую жизнь.

Собственно проект состоит из 2 софтверных частей.

  • Приложение на Android, работающее по протоколу BLE.
  • Собственно код на Arduino

Приложение на мобилку написано на C#, с использованием фреймворка Xamarin.

Приложение не претендует на релизную версию для выкладывания в Play Market, так что не обессудьте.

Если кто-то захочет ознакомиться с кодом или внести новый функционал для своего проекта, прошу, используйте по ссылке

Проект управления по bluetooth 4.0

Для тех, кто хочет использовать приложение “как есть” вот ссылка

Joystick

.

Сразу скажу, приложение точно работает на android 6.0 и выше, с разрешением 1980×1020 (другие не тестил), только для устройств с поддержкой BLE (как проверить, ищите в интернете), так что не пинайте.

Вкратце расскажу по работе с текущей версией.

Так-как я любитель квадрокоптеров, то и управление делал схожим.

  • Два стика – левый газ, правый поворот колес.
  • По нажатию на кнопку BLUETOOTH – окно с поиском устройств и подключением.
  • По нажатию на кнопку НАСТРОЙКИ – окно с конечными точками и интервалом отправки данных на Arduino ( сделано для универсального использования с любой конфигурацией машинки)
  • Главное окно с индикатором подключения и стиками.

Ну а теперь кусок кода на Arduino.

#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, остальное понятно по коду.

Пример работы ожившей машинки из прошлого с новым железом

Здесь

§

Всем привет.

Делюсь с вами своим небольшим проектом bluetooth машинки.

Проект сделан для обкатки технологии передачи данных со смартфона на Arduino по протоколу BLE (bluetooth 4.0)

Так как тема РУ моделей мне очень близка и в коробке завалялась старинная, нерабочая машинка на 433 МГц, было решено дать ей вторую жизнь.

Собственно проект состоит из 2 софтверных частей.

  • Приложение на Android, работающее по протоколу BLE.
  • Собственно код на Arduino

Приложение на мобилку написано на C#, с использованием фреймворка Xamarin.

Приложение не претендует на релизную версию для выкладывания в Play Market, так что не обессудьте.

Если кто-то захочет ознакомиться с кодом или внести новый функционал для своего проекта, прошу, используйте по ссылке

Проект управления по bluetooth 4.0

Для тех, кто хочет использовать приложение “как есть” вот ссылка

Joystick

.

Сразу скажу, приложение точно работает на android 6.0 и выше, с разрешением 1980×1020 (другие не тестил), только для устройств с поддержкой BLE (как проверить, ищите в интернете), так что не пинайте.

Вкратце расскажу по работе с текущей версией.

Так-как я любитель квадрокоптеров, то и управление делал схожим.

  • Два стика – левый газ, правый поворот колес.
  • По нажатию на кнопку BLUETOOTH – окно с поиском устройств и подключением.
  • По нажатию на кнопку НАСТРОЙКИ – окно с конечными точками и интервалом отправки данных на Arduino ( сделано для универсального использования с любой конфигурацией машинки)
  • Главное окно с индикатором подключения и стиками.

Ну а теперь кусок кода на Arduino.

#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, остальное понятно по коду.

Пример работы ожившей машинки из прошлого с новым железом

Здесь

Беспроводное программирование arduino через bluetooth

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

На этом этапе предполагается, что Модуль HC-05 уже был в паре с компьютером .

Таким образом, вам придется пройти процесс сопряжения, и таким же образом есть последовательный порт через Блютуз где он правильно отображается в диспетчере устройств. Процедура сопряжение устройства Bluetooth варьируется в зависимости от операционной системы.

Там виртуальные последовательные порты должны отображаться правильно, как это видно на изображении, которое мы представляем ниже:

  • Следующее, что нужно будет открыть IDE Arduino и там вам нужно выбрать новый последовательный порт, который был создан, когда HC-05 имеет был связан с компьютером.

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

Если по какой-то причине эскиз не может быть сохранен в Arduino , тогда необходимо будет испытать емкость конденсатора , очень хорошей идеей для этого является увеличение его значения до тех пор, пока оно не будет гарантировать, что Arduino сбрасывается правильно при открытии последовательного порта на Блютуз , в этом случае рекомендуемые значения От 100 нФ до 1 мкФ .

Библиотека servo

Можно генерировать управляющие импульсы самостоятельно, но это настолько распространённая задача, что для её упрощения существует стандартная библиотека Servo.

Сервопривод постоянного вращения можно управлять с помощью библиотек Servo или Servo2. Отличие заключается в том, что функция Servo.write(angle) задаёт не угол, а скорость вращения привода.

Библиотека Servo позволяет осуществлять программное управление сервоприводами. Управление осуществляется следующими функциями:

  • attach() — присоединяет объект к конкретному выводу платы. Возможны два варианта синтаксиса для этой функции: servo.attach(pin) и servo.attach(pin, min, max). При этом pin — номер пина, к которому присоединяют сервопривод, min и max — длины импульсов в микросекундах, отвечающих за углы поворота 0° и 180°. По умолчанию выставляются равными 544 мкс и 2400 мкс соответственно. Возвращаемого значения нет.
  • write() — отдаёт команду сервоприводу принять некоторое значение параметра. Синтаксис: servo.write(angle), где angle — угол, на который должен повернуться сервопривод
  • writeMicroseconds() — отдаёт команду послать на сервопривод имульс определённой длины, является низкоуровневым аналогом предыдущей команды. Синтаксис следующий: servo.writeMicroseconds(uS), где uS — длина импульса в микросекундах. Возвращаемого значения нет.
  • read() — читает текущее значение угла, в котором находится сервопривод. Синтаксис: servo.read(), возвращается целое значение от 0 до 180
  • attached() — проверка, была ли присоединён объект к конкретному пину. Синтаксис следующий: servo.attached(), возвращается логическая истина, если объект была присоединён к какому-либо пину, или ложь в обратном случае
  • detach() — производит действие, обратное действию attach(), то есть отсоединяет объект от пина, к которому был приписан. Синтаксис: servo.detach()

В библиотеке Servo для Arduino по умолчанию выставлены следующие значения длин импульса: 544 мкс — для 0° и 2400 мкс — для 180°.

Пример подключения двух сервоприводов.


#include <Servo.h>

// создаём объекты для управления сервоприводами
Servo myservo1;
Servo myservo2;
 
void setup() 
{
  // подключаем сервоприводы к выводам 11 и 12
  myservo1.attach(11);
  myservo2.attach(12);
} 
 
void loop() 
{
  // устанавливаем сервоприводы в серединное положение
  myservo1.write(90);
  myservo2.write(90);
  delay(500);
  // устанавливаем сервоприводы в крайнее левое положение  
  myservo1.write(0);
  myservo2.write(0);
  delay(500);
  // устанавливаем сервоприводы в крайнее правое положение
  myservo1.write(180);
  myservo2.write(180);
  delay(500);
}

Библиотека Servo не совместима с библиотекой VirtualWire для работы с приёмником и передатчиком на 433 МГц, так как они используют одно и то же прерывание. Это означает, что их нельзя использовать в одном проекте одновременно.

При работе с сервоприводами на 360 градусов функции работают по другому.

Функция ArduinoСервопривод 180°Сервопривод 360°
Servo.write(0)Крайне левое положениеПолный ход в одном направлении
Servo.write(90)Среднее положениеОстановка сервопривода
Servo.write(180)Крайне правое положениеПолный ход в обратном направлении

Заготовка

Разработка для ОС Android ведется в среде разработки ADT, Android Development Tools. Которую можно скачать с портала Google для разработчиков.
После скачивания и установке ADT, смело его запускаем. Однако, еще рано приступать к разработке приложения. Надо еще скачать Android SDK нужной версии. Для этого необходимо открыть Android SDK Manager «Window → Android SDK Manager». В списке необходимо выбрать нужный нам SDK, в нашем случае Android 2.3.3 (API 10). Если телефона нет, то выбирайте 2.3.3 или выше; а если есть — версию, совпадающую с версией ОС телефона. Затем нажимаем на кнопку «Install Packages», чтобы запустить процесс установки.

Контролируем устройства через Bluetooth с помощью Arduino

После завершения скачивания и установки мы начинаем создавать приложение. Выбираем «File → New → Android Application Project». Заполним содержимое окна так, как показано на рисунке.

Контролируем устройства через Bluetooth с помощью Arduino

В выпадающих списках «Minimum Required SDK», «Target SDK», «Compile With» выбираем ту версию, которую мы скачали ранее.
Более новые версии SDK поддерживают графические темы для приложений, а старые нет. Поэтому в поле «Theme» выбираем «None».
Нажимаем «Next».

Снимаем галочку с «Create custom launcher icon»: в рамках данной статьи не будем заострять внимание на создании иконки приложения. Нажимаем «Next».

В появившемся окне можно выбрать вид «Activity»: вид того, что будет на экране, когда будет запущено приложение. Выбираем «Blank activity», что означает, что мы хотим начать всё с чистого листа. Нажимаем «Next».

В нашем приложении будет всего одно Activity, поэтому в появившемся окне можно ничего не менять. Поэтому просто жмем на «Finish».

Все, наше приложение создано.

Загрузка скетчей в arduino через bluetooth

Программируя Arduino, иногда желательно обойтись без физического соединения через USB к компьютеру, например:

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

Плата Arduino подключена к Bluetooth модулю для беспроводной заливки

Я использовал наиболее дешёвые Bluetooth-модули с незамысловатым названием «Bluetooth-модуль HC-05(HC-06)». На ebay их можно найти от 200 руб. за штуку, в отечественных магазинах — от 500 руб. Советую брать модуль уже распаянный на переходнике «для Arduino», разница в деньгах минимальная, а экономит время на сборке схемы сопряжения.

image

Нам нужен именно HC-05, но так как визуально отличить их крайне сложно, велик шанс, что в руках окажется HC-06, даже если на упаковке написано «HC-05», как это произошло со мной:

image

К счастью, HC-06 можно перепрошить в HC-05, но придётся найти компьютер с LPT-портом и потратить несколько часов. Инструкцию по перепрошивке можно прочесть здесь. От себя хочу добавить, что под Windows7 прошивка не состоялась, пришлось устанавливать Windows XP, а также в BIOS сменить режим порта LPT на EPP 1.7.

Зачем перепрошивать?

Прошивка HC-05, в отличие от HC-06, при установке соединения меняет сигнал на 32 выводе — это нужно чтобы хардварно сбросить программируемый Arduino и начать процесс заливки. Можно не перепрошивать, а нажимать кнопку RESET на плате каждый раз перед заливкой, причем нужно ловить нужный момент, что крайне неудобно. Выглядит это примерно

так

Итак, имеем на руках модуль HC-05. Теперь нужно задать ему параметры работы. Для перевода в режим установки параметров нужно подпаять последнюю, 34-ю ногу к питанию 3.3в.

image

Затем подключаем к компьютеру через любой переходник USB-UART-TTL и в терминале даём следующую последовательность команд:

AT
AT RESET
AT ORGL
AT ROLE=0
AT POLAR=1,0
AT UART=57600,0,0
AT INIT
AT INQ

Если есть желание поменять стандартный пароль на спаривание, то дополнительно:
AT PSWD=5678

Если есть желание поменять название устройства, то дополнительно:
AT NAME=RemoteArduino

После этого модуль отключаем, перемычку с 34 ноги убираем и приступаем финальной доработке модуля. Это можно сделать прямо на плате HC-05, мне же показалось удобнее сделать это в виде платы-переходника для прямого подключения к Mini Pro.

image

Для автоматического сброса Arduino при установке соединения необходимо вывести 32-ю ногу на разъём, для этого я отрезал ненужный мне вывод «WAKE-UP» и обозначил его как «RESET». Схема переходника получилась такой:

image

Зажигание светодиода будет показывать установленное соединение.

На этом с пайкой всё, но заливка всё равно пока не заработает. Дело в том, что Arduino IDE при каждой попытке заливки скетчка делает очистку буферов COM-порта, что приводит к закрытию BlueTooth соединения и отмене загрузки.

Чтобы избежать этого, нужно поправить конфигурацию Arduino IDE, который находится в файле C:arduinohardwarearduinoboards.txt. Отрываем этот файл в текстовом редакторе, ищем секцию, соответствующую плате, с которой работаем (у меня это Pro Mini 5V) и добавляем следующую строку:

pro5v328.upload.disable_flushing=true

Не забываем менять первое слово в строке, например, для Arduino Uno это будет:

uno.upload.disable_flushing=true

Теперь заливка должна заработать. Осталось маленькая досаждающая деталь — когда заходим в меню Arduino IDE и выбираем пункт «Tools», программа «морозится» на несколько секунд. Дело в том, что при каждом обращении к данному пункту меню, программа перебирает все доступные в системе, COM-порты, но, неоптимальным способом, что приводит к большим задержкам. Чтобы убрать эту задержку, нужно заменить библиотеку rxtxSerial.dll на доработанную версию, которую можно взять здесь. Кому интересны подробности проблемы, могут ознакомиться с веткой на форуме ардуино.

Вот другой вариант с кнопкой отключения питания и вывода TX от Arduino:

image

Схема второго варианта (Bluetooth-модуль другой, поэтому пины расположены по другому и Pro Mini не оригинальный, а «Deek-Robot», распиновка зеркальная):

image

Схема занимает минимум места, подключается быстро, настройки не требует. Также остаётся работоспособной возможность в Arduino IDE включить Serial Monitor и получать данные от устройства как при соединении через USB.

P.S.
Оказалось, что есть уже готовые такие переделанные модули, и возможно когда-нибудь мы увидим их в продаже в нашей стране.

Машина-робот на базе arduino с управление через bluetooth

#include // Подключаем библиотеку для управления двигателями

#include // Подключаем библиотеку для сервоприводов

#include // Подключаем библиотеку для работы с Serial через дискретные порты

//Создаем объекты для двигателей
AF_DCMotor motor1(1); //канал М1 на Motor Shield — левый
AF_DCMotor motor2(2); //канал М2 на Motor Shield — правый

// Создаем объект для сервопривода
Servo vservo;

SoftwareSerial BTSerial(A0, A1); // RX, TX

// Создаем переменную для команд Bluetooth
char vcmd;
// Создаем переменные для запоминания скорости двигателей
int vspdL, vspdR;
/* Создаем переменную, на значение которой будет уменьшаться скорость при плавных поворотах.
Текущая скорость должна быть больше этого значения. В противном случае двигатели со стороны направления поворота просто не будут вращаться */
int vspd = 200;

void setup() {
// Устанавливаем скорость передачи данных по Bluetooth
BTSerial.begin(9600);
// Устанавливаем скорость передачи данных по кабелю
Serial.begin(9600);
// Выбираем пин к которому подключен сервопривод
vservo.attach(9); // или 10, если воткнули в крайний разъём
// Поворачиваем сервопривод в положение 90 градусов при каждом включении
vservo.write(90);
// Устанавливаем максимальную скорость вращения двигателей
vspeed(255,255);
}

void loop() {
// Если есть данные
if (BTSerial.available())
{
// Читаем команды и заносим их в переменную. char преобразует код символа команды в символ
vcmd = (char)BTSerial.read();
// Отправляем команду в порт, чтобы можно было их проверить в «Мониторе порта»
Serial.println(vcmd);

// Вперед
if (vcmd == ‘F’) {
vforward();
}
// Назад
if (vcmd == ‘B’)
{
vbackward();
}
// Влево
if (vcmd == ‘L’)
{
vleft();
}
// Вправо
if (vcmd == ‘R’)
{
vright();
}
// Прямо и влево
if (vcmd == ‘G’)
{
vforwardleft();
}
// Прямо и вправо
if (vcmd == ‘I’)
{
vforwardright();
}
// Назад и влево
if (vcmd == ‘H’)
{
vbackwardleft();
}
// Назад и вправо
if (vcmd == ‘J’)
{
vbackwardright();
}
// Стоп
if (vcmd == ‘S’)
{
vrelease();
}
// Скорость 0%
if (vcmd == ‘0’)
{
vspeed(0,0);
}
// Скорость 10%
if (vcmd == ‘1’)
{
vspeed(25,25);
}
// Скорость 20%
if (vcmd == ‘2’)
{
vspeed(50,50);
}
// Скорость 30%
if (vcmd == ‘3’)
{
vspeed(75,75);
}
// Скорость 40%
if (vcmd == ‘4’)
{
vspeed(100,100);
}
// Скорость 50%
if (vcmd == ‘5’)
{
vspeed(125,125);
}
// Скорость 60%
if (vcmd == ‘6’)
{
vspeed(150,150);
}
// Скорость 70%
if (vcmd == ‘7’)
{
vspeed(175,175);
}
// Скорость 80%
if (vcmd == ‘8’)
{
vspeed(200,200);
}
// Скорость 90%
if (vcmd == ‘9’)
{
vspeed(225,225);
}
// Скорость 100%
if (vcmd == ‘q’)
{
vspeed(255,255);
}
}
}

// Вперед
void vforward() {
vspeed(vspdL,vspdR);
vforwardRL();
}

// Вперед для RL
void vforwardRL() {
motor1.run(FORWARD);
motor2.run(FORWARD);
}

// Назад
void vbackward() {
vspeed(vspdL,vspdR);
vbackwardRL();
}

// Назад для RL
void vbackwardRL() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
}

// Влево
void vleft() {
vspeed(vspdL,vspdR);
motor1.run(BACKWARD);
motor2.run(FORWARD);
}

// Вправо
void vright() {
vspeed(vspdL,vspdR);
motor1.run(FORWARD);
motor2.run(BACKWARD);
}

// Вперед и влево
void vforwardleft() {
if (vspdL > vspd) {
vspeed(vspdL-vspd,vspdR);
}
else
{
vspeed(0,vspdR);
}
vforwardRL();
}

// Вперед и вправо
void vforwardright() {
if (vspdR > vspd) {
vspeed(vspdL,vspdR-vspd);
}
else
{
vspeed(vspdL,0);
}
vforwardRL();
}

// Назад и влево
void vbackwardleft() {
if (vspdL > vspd) {
vspeed(vspdL-vspd,vspdR);
}
else
{
vspeed(0,vspdR);
}
vbackwardRL();
}

// Назад и вправо
void vbackwardright() {
if (vspdR > vspd) {
vspeed(vspdL,vspdR-vspd);
}
else
{
vspeed(vspdL,0);
}
vbackwardRL();
}

// Стоп
void vrelease(){
motor1.run(RELEASE);
motor2.run(RELEASE);
}

// Изменение скорости
void vspeed(int spdL,int spdR){
if (spdL == spdR) {
vspdL=spdL;
vspdR=spdR;
}
motor1.setSpeed(spdL);
motor2.setSpeed(spdR);
}

Модуль hc-05 и hc-06

Оба модули bluetooth которые можно использовать для коммуникации различных проектов Arduino с этим беспроводное соединение , по сути, это два наиболее часто используемых модуля для этого вида деятельности.

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

Необходимо учитывать, что в случае Модуль HC-06, он ведет себя как подчиненное устройство, то есть постоянно ждет запросов на соединение. Следовательно, если устройство подключено, модуль HC-06 ему передает все данные, полученные от Ардуино и наоборот .

Также следует отметить, что HC-06 работает как ведомый, а HC-05 как ведущий и ведомый , в этом случае HC-05 имеет в общей сложности 6 контактов, в то время как HC-06 имеет всего 4 контакта .

Подключение угла и код


Для каждого уровня был выбран свой цвет: нижний – зеленый, первый снизу – красный, второй – черный, третий – белый. На начальном этапе использовались breadboard и светодиоды для визуальной отладки.

Схема подключения показана на рисунке. Плюс тянем к зеленому, остальные протягиваем к минусу. Через резистор, установленный для устранения помех и отсутствия КЗ, подключаем провода к выходам A0-A2. Выбраны они просто из экономии остальных портов.

Код дан с комментариями. Подключаем пины и опрашиваем их через digitarRead(). Если напряжение есть, вернется значение true. Далее смотрим, если результат означает, что колеса в крайних положениях, запрещаем дальнейший поворот в эту сторону.

Небольшая хитрость: поскольку выходы на 5В и 3.3В понадобятся в будущем, можно поставить плюс на один из digital-пинов. Перед каждой проверкой угла выдавать ток через digitalWrite(whitePin), потом проверять угол и убирать ток.

int speedTurn = 180; //скорость поворота, от 0 до 255

//пины для определения поворота
int pinRed = A0;
int pinWhite = A1;
int pinBlack = A2;

int pinAngleStop = 12; //выводит ток на светодиод, если достигнут максимальный угол, нужен 
//только для отладки 

void setup() {
 //пины поворота на считывание
  pinMode(pinRed, INPUT);
  pinMode(pinBlack, INPUT);
  pinMode(pinWhite, INPUT);
//светодиод 
  pinMode(pinAngleStop, OUTPUT);
//пины драйвера двигателя, направление и скорость
  pinMode(angleDirection, OUTPUT);
  pinMode(angleSpeed, OUTPUT);

  Serial.begin(9600);
}
//функция вызывается из loop(), когда приходит команда с андроида
void turn(int angle) {
  digitalWrite(pinAngleStop, HIGH); //выдаем ток на провод, подключенный к плюсу
  delay(5); //немного ждем, чтобы ток "успел" дойти
  
  if(angle > 149) {
        if( digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinBlack) == LOW) { 
          //если достигнуто крайне правое положение, выйти из функции не подавая ток, чтобы не 
          //сжечь мотор
          return;
        }
        //если угол не максимальный, поворачиваем
        digitalWrite(angleDirection, HIGH);
        analogWrite(angleSpeed, speedTurn);
  } else if (angle < 31) { 
        if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) {
          //если достигнуто крайне левого положение, выйти из функции не подавая ток, чтобы не 
          //сжечь мотор
          return;
        }
        //если угол не максимальный, поворачиваем
        digitalWrite(angleDirection, LOW);
        analogWrite(angleSpeed, speedTurn);
  }
  digitalWrite(pinAngleStop, LOW); //убираем ток с определителя угла
  delay(5);
}

Примечание:

Так как Trema-модуль Bluetooth HC-05 установленный на «Дройдике» подключён к аппаратной шине UART, то перед загрузкой скетча робота нужно отсоединить провод, либо от вывода TX модуля, либо от вывода RX на плате Tream-Power Shield, а после загрузки скетча, подсоединить его обратно.

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

В скетче пульта исключите оператор «if» из предпоследней строки кода setup, оставив только тело оператора:

/* Было так:  */ if(varK){while(!objHC05.createMaster("Droidik","1234")){;}} // Если кнопка джойстика нажата при старте ...
/* Стало так: */          while(!objHC05.createMaster("Droidik","1234")){;}  // Теперь bluetooth модулю назначается роль мастера при каждом включении пульта!

В скетче робота исключите раздел «Режим сопряжения:» из кода loop, а код setup перепишите так:

void setup(){                                                                //
    while( !objHC05.begin(Serial)                ){;}                        //  Инициируем работу с bluetooth модулем, указывая имя объекта или класса для управления шиной UART. При провале инициализации функция begin() вернёт false и тогда оператор while запустит её вновь.
    while( !objHC05.createSlave("Droidik","1234")){;}                        //  Назначаем Bluetooth модулю роль ведомого с именем "Droidik" и PIN-кодом "1234"
    while( !objHC05.checkConnect()               ){delay(1000);}             //  Проверка подключения к внешнему Bluetooth устройству, до тех пор пока связь не будет установлена.
    delay(500);                                                              //
    objSensor.distance();                                                    //
    objSensor.distance();                                                    //
}                                                                            //

После внесения этих изменений к роботу можно не подключать кнопку, а при подаче питания не требуется нажимать на джойстик (или кнопку робота), но установка связи между пультом и роботом будет занимать больше времени.

Робомобиль на базе arduino mega 2560 с bluetooth управлением и автономным движением с объездом препятствий

Представляю свой проект робомобиля на Arduino. На просторах интернета есть масса подобных статей, наткнувшись на одну из них решил реализовать увиденное со своими изменениями в конструкцию и функционал. Реализованы следующие возможности: управление робомобилем по Bluetooth со смартфона; автономное движение робомобиля с объездом препятствий.

Контролируем устройства через Bluetooth с помощью Arduino

Контролируем устройства через Bluetooth с помощью Arduino

Для реализации нам понадобится:

Комплект: рама, моторы, колёса, крепления (Car Chassis Kit for Arduino — фото)
Arduino Mega 2560
Motor Control Shield for Arduino L293D
Сервопривод MG995
Ультразвуковой дальномер HC-SR04
Bluetooth модуль HC-05 JY-MCU
Active High Level Buzzer Alarm / Speaker Buzzer Module
Диоды для фар
Соединительные провода
Держатели для дальномера и Bluetooth модуля (делал сам)
Блок питания (я взял от кассового аппарата)
Приложение на Android для управления робомобилем по Bluetooth Arduino Bluetooth RC Car (фото, при подключении к Bluetooth модулю пин-код по умолчанию «1234»)

Подключение комплектующих
Процесс сборки

К моторам припаиваем провода, обратите внимание, на всех нижних контактах у меня чёрные провода, на верхних — красные, не перепутайте полярность при подключении к Motor Shield.

Контролируем устройства через Bluetooth с помощью Arduino

Контролируем устройства через Bluetooth с помощью Arduino

Крепим сервопривод к верхней части рамы, моторы к нижней, собираем раму, ставим колёса. Устанавливаем Motor Shield сверху Arduino Mega и крепим на раму, подключаем всё по схеме выше, заливаем соответствующий скетч (в конце статьи) — наслаждаемся.

Управление по Bluetooth — устанавливаете приложение на свой смартфон, запускаете, подключаетесь (Connect) к Bluetooth модулю (при необходимости вводите пин-код); управлять можно классическим способом по стрелкам (Buttons), а так же в меню программы можно выбрать Accelerometer и управлять с помощью наклонов смартфона.

Автономное движение с объездом препятствий — алгоритм следующий: дальномер измеряет расстояние впереди, если оно > 30 см (в скетче параметр const int vmindistance), то продолжаем двигаться вперед, если < 30 см, то: останавливаем моторы; крутим сервопривод на углы от 0° до 180° с шагом в 15° и измеряем расстояния на этих углах; заносим полученные значения в массив; поворачиваем сервопривод прямо на угол 90°; ищем в массиве позицию с максимальным значением данных; если это значение < 30 см, то едем назад, если > 30 см, то проверяем какому углу поворота сервопривода оно соответствует и в зависимости от этого поворачиваем влево или вправо.

Контролируем устройства через Bluetooth с помощью Arduino

Контролируем устройства через Bluetooth с помощью Arduino

Контролируем устройства через Bluetooth с помощью Arduino

Контролируем устройства через Bluetooth с помощью Arduino

Контролируем устройства через Bluetooth с помощью Arduino

Контролируем устройства через Bluetooth с помощью Arduino

Контролируем устройства через Bluetooth с помощью Arduino

Небольшое видео

Управление по Bluetooth:

Автономное движение с объездом препятствий:

Ссылки для скачивания:

→ Библиотека AFMotor
Скетч — управление по Bluetooth
Скетч — автономное движение с объездом препятствий
Мануал по Bluetooth модулю HC-05

Шаг 1. код arduino

Мы будем использовать модуль Bluetooth HC-06, для этого мы установим связь программой для нашего Arduino Mega. Мы объявим необходимые параметры совместимости с приложением «Ardudroid»,

Приложение содержит 13 параметров, через которые мы можем управлять различными нагрузками с использованием реле, если оно использует 120 Вольт переменного тока или обычные лампы 12 В. Будем использовать схему с транзистором в этом проекте для управления лампами.

#define CARACTER_INICIO_CMD '*'
#define CARACTER_FINAL_CMD '#'
#define CARACTER_DIV_CMD '|'
#define ESCRITURA_DIGITAL_CMD 10
#define ESCRITURA_ANALOGA_CMD 11
#define TEXTO_CMD 12
#define LECTURA_ARDUDROID_CMD 13
#define MAX_COMMAND 20
#define MIN_COMMAND 10
#define LONGITUD_ENTRADA_STRING 40
#define ESCRITURA_ANALOGICA_MAX 255
#define PIN_ALTO 3
#define PIN_BAJO 2
int Valordigital;
int Kaioken = 14;
int ledPin = 52;
int speakerPin = 16;
String inText;

void setup() {
  Serial.begin(9600);
  Serial.println("6to Electronica B");
  Serial.flush();
  pinMode(14, OUTPUT);
  pinMode(15, INPUT);
  pinMode(16, OUTPUT);
}

void loop()
{
  march();
  Serial.flush();
  int ard_command = 0;
  int pin_num = 0;
  int pin_value = 0;
  Valordigital = analogRead(A1);


  //Sensor de luz
  if (Valordigital >= 953) // Si hay luz, apago la luz :v
  {
    digitalWrite(Kaioken, HIGH); // Apagamos la luz
  }
  else if (Valordigital < 953) // Si no hay luz, enciendo la luz :v
  {
    digitalWrite(Kaioken, LOW); // Encendemos el LED
  }

  char get_char = ' ';

  if (Serial.available() < 1) return;
  get_char = Serial.read();
  if (get_char != CARACTER_INICIO_CMD) return;
  ard_command = Serial.parseInt(); // Lee comando
  pin_num = Serial.parseInt(); // leer el pin
  pin_value = Serial.parseInt();  // leer el valor

  // 1)COMANDOS
  if (ard_command == TEXTO_CMD) {
    inText = "";
    while (Serial.available())  {
      char c = Serial.read();
      delay(5);
      if (c == CARACTER_FINAL_CMD) {
        break;
      }
      else {
        if (c !=  CARACTER_DIV_CMD) {
          inText  = c;
          delay(5);
        }
      }
    }
  }

  // 2) OBTENER DATOS
  if (ard_command == ESCRITURA_DIGITAL_CMD) {
    if (pin_value == PIN_BAJO) pin_value = LOW;
    else if (pin_value == PIN_ALTO) pin_value = HIGH;
    else return;
    set_digitalwrite( pin_num,  pin_value);
    return;
  }

  // 3) Escritura analogica
  if (ard_command == ESCRITURA_ANALOGA_CMD) {
    analogWrite(  pin_num, pin_value );
    return;
  }

  // 4) Enviar datos (Temperatura :V)
  if (ard_command == LECTURA_ARDUDROID_CMD) {
    return;
  }
}

// Escritura Digital
void set_digitalwrite(int pin_num, int pin_value)
{
  switch (pin_num) {
    case 13:
      pinMode(13, OUTPUT);
      digitalWrite(13, pin_value);
      break;
    case 12:
      pinMode(12, OUTPUT);
      digitalWrite(12, pin_value);
      break;
    case 11:
      pinMode(11, OUTPUT);
      digitalWrite(11, pin_value);
      break;
    case 10:
      pinMode(10, OUTPUT);
      digitalWrite(10, pin_value);
      break;
    case 9:
      pinMode(9, OUTPUT);
      digitalWrite(9, pin_value);
      break;
    case 8:
      pinMode(8, OUTPUT);
      digitalWrite(8, pin_value);
      break;
    case 7:
      pinMode(7, OUTPUT);
      digitalWrite(7, pin_value);
      break;
    case 6:
      pinMode(6, OUTPUT);
      digitalWrite(6, pin_value);
      break;
    case 5:
      pinMode(5, OUTPUT);
      digitalWrite(5, pin_value);
      break;
    case 4:
      pinMode(4, OUTPUT);
      digitalWrite(4, pin_value);
      break;
    case 3:
      pinMode(3, OUTPUT);
      digitalWrite(3, pin_value);
      break;
    case 2:
      pinMode(2, OUTPUT);
      Serial.println(analogRead(A0) * 0.48);
      Serial.println("° Celsius");
      break;
  }
}

void march()//LAMAS A MI :v
{
  while (analogRead(A2) <= 15) {
digitalWrite(16,HIGH);
  }
  return;
}

Шаг 1: нужные части и инструмент

Я воспользовался готовыми решениями, и все запчасти и инструменты были приобретены через интернет.

Запчасти:

  1. Набор шасси 4WD для робота (GearBest)
  2. Arduino Nano (GearBest)
  3. Модуль H-моста LM298 (GearBest)
  4. Модуль bluetooth HC-06 (Amazon)
  5. Литий-ионные батарейки 2 x 18650 (GearBest)
  6. Отсек для батареек 2x 18650 (GearBest)
  7. Небольшая макетная плата (GearBest)
  8. Провода сечением 0.5 мм2
  9. Провода с джамперами папа-мама (Amazon)
  10. Провода с джамперами мама-мама (Amazon)
  11. Малярная лента, изолента или что-то подобное (Amazon)

Для робота, объезжающего препятствия:

Ультразвуковой модуль измерения расстояния HC — SR04 (GearBest)

Необходимый инструмент :

  1. Паяльник (Amazon)
  2. Кусачки (Amazon)
  3. Стриппер для провод (GearBest)
  4. Клеевой пистолет (GearBest)
Оцените статью
Радиокоптер.ру
Добавить комментарий