Ведроїд-мобіль - робот на Arduino - Частина 3

GeekElectronics » Arduino від А до Я » Ведроїд-мобіль - робот на Arduino - Частина 3. Підключаємо Bluetooth

Модернізація Motor Shield

Вийшло так, що виробники модуля Motor Shield позбавили своїх покупців можливості встановлювати поверх свого продукту інший модуль. Мабуть, їм подобається бути зверху або просто затиснули нормальну панельку контактів.

робот

Мене цей нюанс зовсім не влаштовує. Саме тому я вирішив взятися за паяльник і привести Motor Shield до зручного для мене вигляду.

робот

Акуратно видер рідні панельки контактів і викинув їх нафіг.

vspeed

Встановив на їхнє місце нормальні.

vspeed

У такому вигляді модулем почало користуватися набагато зручніше. Тепер я зможу нормально підключити дроти від Bluetooth до роз'ємів, а не припаювати їх намертво до контактів на Motor Shield.

Bluetooth модуль JY-MCU для Arduino

vspeed

Сам Bluetooth модуль JY-MCU досить мініатюрний. В комплект поставки входить кабель для підключення. Призначення висновків розписане на звороті.

vcmd

Запитати його можна від джерела живлення 36-6В. Це надає можливість підключити його безпосередньо до Arduino без використання стабілізатора або дільника напруги.

Код, який використовується при підключенні до пристрою: 1234.

Підключення Bluetooth JY-MCU до Arduino Mega 2560

Підключення досить просте.

Офіційна схема підключення:

  • VCC на JY-MCU підключаємо до +5В Arduino
  • GND на JY-MCU підключаємо до GND Arduino
  • TXT на JY-MCU підключаємо до RX (0) на Arduino
  • RXD на JY-MCU підключаємо до TX (1) на Arduino

При такому варіантіпідключення доведеться щоразу відключати живлення модуля Bluetooth перед завантаженням скетчу. Не забувайте про це.

Мене такий варіант не влаштовує, тому вирішив використовувати дискретні порти з підтримкою Serial.

Неофіційна схема підключення:

  • VCC на JY-MCU підключаємо до +5В Arduino
  • GND на JY-MCU підключаємо до GND Arduino
  • TXT на JY-MCU підключаємо до дискретного PIN 50 на Arduino
  • RXD на JY-MCU підключаємо до дискретного PIN 51 на Arduino

Ось тепер можна завантажувати скетчі без вимкнення живлення модуля Bluetooth.

Щоб закріпити Bluetooth, я вирішив використати плату Proto Shield та мініатюрну безпайкову макетну плату. До неї в майбутньому і підключатиму інше обладнання, елементи управління та індикації.

ведроїд-мобіль
arduino
vspeed

У своєму скетчі я реалізував такі функції:

  • Рух вперед
  • Рух тому
  • Розворот вліво
  • Розворот праворуч
  • Плавний поворот вліво під час руху вперед
  • Плавний поворот праворуч під час руху вперед
  • Плавний поворот вліво під час руху назад
  • Плавний поворот праворуч під час руху назад
  • Зупинка

У скетчі використовував функції, щоб не дублювати код при подібних подіях.

//Створюємо об'єкти для двигунів AF_DCMotor motor1(1); //канал М1 на Motor Shield - задній лівий AF_DCMotor motor2(2); //канал М2 на Motor Shield - задній правий AF_DCMotor motor3(3); //канал М3 на Motor Shield - передній лівий AF_DCMotor motor4(4); //канал М4 на Motor Shield - передній правий

// Створюємо об'єкт для сервоприводу

SoftwareSerial BTSerial(50, 51); // RX, TX

// Створюємо змінну для Bluetooth char vcmd; // Створюємо змінні для запам'ятовування швидкості двигунів int vspdL, vspdR; /* Створюємо змінну, значення якої буде зменшуватися швидкість при плавних поворотах. Поточна швидкість повинна бути більшою за це значення. В іншому випадку двигуни з боку напрямку повороту просто не будуть обертатися */ 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); > > >

// Вперед vforwardRL(); >

// Вперед для RL motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); >

// Назад vbackwardRL(); >

// Назад для RL motor2.run(BACKWARD); motor3.run(BACKWARD); motor4.run(BACKWARD); >

// Вліво void vleft() vspeed(vspdL,vspdR); motor1.run(BACKWARD); motor2.run(FORWARD); motor3.run(BACKWARD); motor4.run(FORWARD); >

// Вправо motor1.run(FORWARD); motor2.run(BACKWARD); motor3.run(FORWARD); motor4.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); > інакше vspeed(vspdL,0); > vforwardRL(); >

// Назад і влево void vbackwardleft() if (vspdL > vspd) vspeed(vspdL-vspd,vspdR); > інакше vspeed(0,vspdR); > vbackwardRL(); >

// Назад і вправо void vbackwardright() if (vspdR > vspd) vspeed(vspdL,vspdR-vspd); > інакше vspeed(vspdL,0); > vbackwardRL(); >

// Зупинка void vrelease() motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); >

// Зміна швидкості void vspeed(int spdL,int spdR) if (spdL == spdR) vspdL=spdL; vspdR=spdR; > motor1.setSpeed(spdL); motor2.setSpeed(spdR); motor3.setSpeed(spdL); motor4.setSpeed(spdR); >

ведроїд-мобіль

vcmd

vspeed

робот

Для роботи програми потрібна версія Android 2.3.3 або вище. Розмір програми 3 мегабайта.

  • F – вперед
  • B – назад
  • L – влево
  • R – вправо
  • G – прямо і влево
  • Я – прямо і вправо
  • H – назад і влево
  • J – назад і вправо
  • S – стоп
  • W – передня фара включена
  • w – передня фара виключена
  • U – задня фара включена
  • u – задня фара виключена
  • V – включений звуковий сигнал
  • v – звуковий сигнал вимкнений
  • X – включений сигнал «аварійка».
  • x - сигнал “аварійка” вимкнений
  • 0 – швидкість руху 0%
  • 1 – швидкість руху 10%
  • 2 – швидкість руху 20%
  • 3 – швидкість руху 30%
  • 4 – швидкістьруху 40%
  • 5 - швидкість руху 50%
  • 6 - швидкість руху 60%
  • 7 - швидкість руху 70%
  • 8 - швидкість руху 80%
  • 9 - швидкість руху 90%
  • q – швидкість руху 100%

Як бачите, полігон для творчості цілком непоганий. Я ще додав би можливість роздільного включення правих і лівих ліхтарів для передніх і задніх фар.

Жирним я виділив команди, підтримка яких уже реалізована у скетчі. Інші я збираюся використовувати за іншим призначенням.

Принцип передачі команд: при натисканні на кнопку в програмі команда передається по Bluetooth один раз, а при відпусканні кнопки відразу передається команда S-зупинка.

Демонстрація роботи

Наступного разу я планую підключити до роботи ультразвуковий далекомір та реалізувати алгоритм об'їзду перешкод.