- Добавляем основной код
- Arduino – машинка на управлении по bluetooth 4.0 (ble) со смартфона
- Беспроводное программирование arduino через bluetooth
- Библиотека servo
- Заготовка
- Загрузка скетчей в arduino через bluetooth
- Машина-робот на базе arduino с управление через bluetooth
- Модуль hc-05 и hc-06
- Подключение угла и код
- Примечание:
- Робомобиль на базе arduino mega 2560 с bluetooth управлением и автономным движением с объездом препятствий
- Шаг 1. код arduino
- Шаг 1: нужные части и инструмент
Добавляем основной код
Пришла пора вдохнуть жизнь в наше приложение. Открываем файл 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;} }
Дополним код в соответствии с тем, что нам нужно:
Будем включать Bluetooth, если он выключен.
Будем обрабатывать нажатия на кнопки
Будем посылать информацию о том, какая кнопка была нажата.
Передавать на 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», чтобы запустить процесс установки.
После завершения скачивания и установки мы начинаем создавать приложение. Выбираем «File → New → Android Application Project». Заполним содержимое окна так, как показано на рисунке.
В выпадающих списках «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 к компьютеру, например:
В интернете можно найти несколько публикаций на эту тему, но все они обрывочны и полностью готового решения нет. Также, несмотря на простоту и очевидность конструкции, имеется несколько маленьких затруднений, которые готовы сорвать всё мероприятие. О том, как их преодолеть, я и хочу рассказать в этой статье.
Я использовал наиболее дешёвые Bluetooth-модули с незамысловатым названием «Bluetooth-модуль HC-05(HC-06)». На ebay их можно найти от 200 руб. за штуку, в отечественных магазинах — от 500 руб. Советую брать модуль уже распаянный на переходнике «для Arduino», разница в деньгах минимальная, а экономит время на сборке схемы сопряжения.
Нам нужен именно HC-05, но так как визуально отличить их крайне сложно, велик шанс, что в руках окажется HC-06, даже если на упаковке написано «HC-05», как это произошло со мной:
К счастью, 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в.
Затем подключаем к компьютеру через любой переходник 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.
Для автоматического сброса Arduino при установке соединения необходимо вывести 32-ю ногу на разъём, для этого я отрезал ненужный мне вывод «WAKE-UP» и обозначил его как «RESET». Схема переходника получилась такой:
Зажигание светодиода будет показывать установленное соединение.
На этом с пайкой всё, но заливка всё равно пока не заработает. Дело в том, что 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:
Схема второго варианта (Bluetooth-модуль другой, поэтому пины расположены по другому и Pro Mini не оригинальный, а «Deek-Robot», распиновка зеркальная):
Схема занимает минимум места, подключается быстро, настройки не требует. Также остаётся работоспособной возможность в 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 со смартфона; автономное движение робомобиля с объездом препятствий.
Для реализации нам понадобится:
Комплект: рама, моторы, колёса, крепления (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.
Крепим сервопривод к верхней части рамы, моторы к нижней, собираем раму, ставим колёса. Устанавливаем Motor Shield сверху Arduino Mega и крепим на раму, подключаем всё по схеме выше, заливаем соответствующий скетч (в конце статьи) — наслаждаемся.
Управление по Bluetooth — устанавливаете приложение на свой смартфон, запускаете, подключаетесь (Connect) к Bluetooth модулю (при необходимости вводите пин-код); управлять можно классическим способом по стрелкам (Buttons), а так же в меню программы можно выбрать Accelerometer и управлять с помощью наклонов смартфона.
Автономное движение с объездом препятствий — алгоритм следующий: дальномер измеряет расстояние впереди, если оно > 30 см (в скетче параметр const int vmindistance), то продолжаем двигаться вперед, если < 30 см, то: останавливаем моторы; крутим сервопривод на углы от 0° до 180° с шагом в 15° и измеряем расстояния на этих углах; заносим полученные значения в массив; поворачиваем сервопривод прямо на угол 90°; ищем в массиве позицию с максимальным значением данных; если это значение < 30 см, то едем назад, если > 30 см, то проверяем какому углу поворота сервопривода оно соответствует и в зависимости от этого поворачиваем влево или вправо.
Небольшое видео
Управление по 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: нужные части и инструмент
Я воспользовался готовыми решениями, и все запчасти и инструменты были приобретены через интернет.
Запчасти:
- Набор шасси 4WD для робота (GearBest)
- Arduino Nano (GearBest)
- Модуль H-моста LM298 (GearBest)
- Модуль bluetooth HC-06 (Amazon)
- Литий-ионные батарейки 2 x 18650 (GearBest)
- Отсек для батареек 2x 18650 (GearBest)
- Небольшая макетная плата (GearBest)
- Провода сечением 0.5 мм2
- Провода с джамперами папа-мама (Amazon)
- Провода с джамперами мама-мама (Amazon)
- Малярная лента, изолента или что-то подобное (Amazon)
Для робота, объезжающего препятствия:
Ультразвуковой модуль измерения расстояния HC — SR04 (GearBest)
Необходимый инструмент :
- Паяльник (Amazon)
- Кусачки (Amazon)
- Стриппер для провод (GearBest)
- Клеевой пистолет (GearBest)