воскресенье, 27 января 2019 г.

bluetooth arduino car

Управление машинкой осуществляется с телефона с андроидом через блутуф. Внутри arduino nano управляет двумя парами двигателей (одна пара состоит из левых переднего и заднего колес, другая - из правых). Непосредственно включение питания на электромагнитные двигатели идет через диодный мост на базе платы драйвера двигателей L293D без радиатора.

Фото, схема, таблица подключений:
1) верх:

2) низ:

3) схема (fritzing):

4) сводные таблицы подключений и требуемого питания (ods):





Скетчи для arduino ide:
1) для начала просто проверим подключение телефона через bluetooth-терминал android через управление светодиодом на ноге 13 платы arduino_nano (ino):

// bluetooth value
// 0 - led13 off, 1 - led13 on
int val = '0';

// arduino nano led13
int OUT_LED_13 = 13;

void setup()
{
  Serial.begin(9600);
  pinMode (OUT_LED_13, OUTPUT);
  digitalWrite (OUT_LED_13, LOW);
}

void loop()
{
  if (Serial.available())
  {
    val = Serial.read();

    if (val == '1')
    {
      digitalWrite (OUT_LED_13, HIGH); 
    }
    else if (val == '0')
    {
      digitalWrite (OUT_LED_13, LOW); 
    }
    else
    {
      digitalWrite (OUT_LED_13, HIGH); 
    }
  }
}

2) движение машины вперед с интервалами машины без управления (4dc motors through l293d) (ino):

//! two right wheels
int IN1 = 2;
int IN2 = 3;

//! enable right move
int EN2 = 12;

//! two left wheels
int IN3 = 4;
int IN4 = 5;

//! enable left move
int EN1 = 11;

//int i;
void setup()
{
  //! right pins
  pinMode (EN2, OUTPUT);
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  
  //! left pins
  pinMode (EN1, OUTPUT);
  pinMode (IN4, OUTPUT);
  pinMode (IN3, OUTPUT);
  
  // left-forward
  digitalWrite (IN3, LOW); 
  digitalWrite (IN4, HIGH);

  // right-forward
  digitalWrite (IN1, LOW); 
  digitalWrite (IN2, HIGH);
}

void loop()
{
  // left-right
  digitalWrite (EN1, HIGH);
  digitalWrite (EN2, HIGH);
  delay(2000);
  
  digitalWrite (EN1, LOW);
  digitalWrite (EN2, LOW);
  delay(2000);
}

3) движение машины вперед и назад с увеличивающейся скоростью через ШИМ (схема l293d очень сильно греется, в данном случае лучше использовать motor sheild с радиатором) (4dc motors through l293 pwm) (ino):

//! two right wheels
int IN1 = 2;
int IN2 = 3;

//! enable right move
int EN2 = 12;

//! two left wheels
int IN3 = 4;
int IN4 = 5;

//! enable left move
int EN1 = 11;

void setup()
{
  //! right pins
  pinMode (EN2, OUTPUT);
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  
  //! left pins
  pinMode (EN1, OUTPUT);
  pinMode (IN4, OUTPUT);
  pinMode (IN3, OUTPUT);
  
}

void pwm_increase()
{
  int i;

  //! pwm increase
  for (i = 50; i <= 180; ++i)
  {
      analogWrite(EN1, i);
      analogWrite(EN2, i);
      delay(200);
  }
}

void pwm_decrease()
{
  int i;

  //! pwm decrease
  for (i = 180; i > 0; --i)
  {
      analogWrite(EN1, i);
      analogWrite(EN2, i);
      delay(200);
  }
}

void forward_gpios()
{
  // left-forward
  digitalWrite (IN3, LOW); 
  digitalWrite (IN4, HIGH);

  // right-forward
  digitalWrite (IN1, LOW); 
  digitalWrite (IN2, HIGH);
}

void backward_gpios()
{
  // left-backward
  digitalWrite (IN3, HIGH); 
  digitalWrite (IN4, LOW);

  // right-backward
  digitalWrite (IN1, HIGH); 
  digitalWrite (IN2, LOW);
}

void all_stop()
{
  //! stop
  analogWrite (EN1, 0);
  analogWrite (EN2, 0);
  delay(2000);
}

void loop()
{
  //! warning hotting the l293d 
  forward_gpios();

  pwm_increase();

  pwm_decrease();

  all_stop();

  backward_gpios();

  pwm_increase();

  pwm_decrease();

  all_stop();
}

4) управление движением машины вперед и назад без ШИМ через bluetooth-терминал ('0' - стоп, '1' - вперед, '2' - назад) (ino):

// bluetooth value
// 0 - stop, 1 - forward, 2 - backward
int val = '0';

//! two right wheels
int IN1 = 2;
int IN2 = 3;

//! enable right move
int EN2 = 12;

//! two left wheels
int IN3 = 4;
int IN4 = 5;

//! enable left move
int EN1 = 11;

// arduino nano led13
int OUT_LED_13 = 13;

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

  //! right pins
  pinMode (EN2, OUTPUT);
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  
  //! left pins
  pinMode (EN1, OUTPUT);
  pinMode (IN4, OUTPUT);
  pinMode (IN3, OUTPUT);
  
  all_stop();
}

void forward_gpios()
{
  // left-forward
  digitalWrite (IN3, LOW); 
  digitalWrite (IN4, HIGH);

  // right-forward
  digitalWrite (IN1, LOW); 
  digitalWrite (IN2, HIGH);
}

void backward_gpios()
{
  // left-backward
  digitalWrite (IN3, HIGH); 
  digitalWrite (IN4, LOW);

  // right-backward
  digitalWrite (IN1, HIGH); 
  digitalWrite (IN2, LOW);
}

void all_stop()
{
  //! stop
  digitalWrite (EN1, LOW);
  digitalWrite (EN2, LOW);
}

void all_go()
{
  //! go
  digitalWrite (EN1, HIGH);
  digitalWrite (EN2, HIGH);
}

void led13_light_up()
{
  digitalWrite (OUT_LED_13, HIGH);
  delay(2000);
  digitalWrite (OUT_LED_13, LOW);
}

void loop()
{
  if (Serial.available())
  {
    val = Serial.read();

    if (val == '1')
    {
      //! forward
      forward_gpios();
      
      all_go();

      led13_light_up(); 
    }
    else if (val == '2')
    {
      //! backward
      backward_gpios();
      
      all_go();

      led13_light_up(); 
    }
    else
    {
      //! stop
      all_stop();

      led13_light_up(); 
    }
  }
}

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

Для установки соединения с телефоном по bluetooth мы используем модуль HC-06. Для его подключения используются стандартные tx, rx-пины, которые использует usb-контроллер CH340, присутствующий на плате Arduino Nano в частности для взаимодействия с компом для заливки новых скетчей. То есть при подключенной схеме для заливки скетчей приходится на время отключать контакты rx, tx модуля HC-06.

На телефоне я использую приложение KvushCo Bluetooth Terminal, который позволяет передавать отдельные символы, например "1" означает "ехать вперед". В идеале же я бы хотел видеть своё приложение, которое позволяет более тонко управлять машинкой с поворотами, ШИМом, например, как сделано в этом проекте.

Следующий вариант машинки я делаю с использованием модуля драйвера двигателя l298d, выполненного на отдельной плате с радиатором. Из-за проблем с контактами на breadboard я буду использовать распайку на макетной плате.

Ссылки:
3) motor driver L293D http://zelectro.cc/L293D
4) L293D datasheet http://www.ti.com/lit/ds/symlink/l293.pdf
5) LG 18650D1 3.7V 3000mAh Rechargeable Li-Ion Batteries unprotected
https://mysku.ru/blog/aliexpress/30357.html
6) Зарядка-защита лития + применение (TP4056) https://mysku.ru/blog/aliexpress/30210.html
7) Arduino Nano 3.0 http://arduino.ru/Hardware/ArduinoBoardNano
8) lego, arduino, bluetooth, android https://habr.com/ru/post/424087/
9) old car, two arduino card, radio modules https://usamodelkina.ru/5239-delaem-mashinku-na-radioupravlenii-na-arduino-uno.html
10) https://www.instructables.com/id/Smartphone-Controlled-Arduino-Rover (перевод на русский https://masterclub.online/topic/15343-mashinka-na-arduino)
11) How to Use the L293D Motor Driver - Arduino Tutorial https://www.instructables.com/id/How-to-use-the-L293D-Motor-Driver-Arduino-Tutorial/
12) Control the speed and direction of a DC Motor using a L293D
https://playground.arduino.cc/Main/DirectionalMotorControlWithAL293D/
13) Bluetooth танк - powerbank своими руками https://alexgyver.ru/bluetooth-car/
14) Модуль драйвера двигателей L298N и Arduino http://zelectro.cc/motor_shield_l298n_arduino

четверг, 17 января 2019 г.

Включение экранов для carpc "vga-hdmi" при появлении данных на VGA-входе/HDMI-входе

По умолчанию дисплей включается при нажатии на кнопку "power" на передней панели. Нам нужно, чтобы он становился активным при появлении данных, передаваемых на VGA-вход/HDMI-вход с платы Beagle Bone Black.

Режим включения можно настроить через инженерное меню. Для перехода в него надо при включенном дисплее нажать кнопку "av/pc" и удерживать ее секунд десять. Появившееся меню состоит из одного экрана тонкой настойки монитора. Вверх/вниз между разделами можно переключаться при помощи клавиш "<", ">". Изменение подсвеченного пункта меню - при помощи клавиши "menu".

Нас интересует пункт "Power" внизу. По умолчанию он стоит в режиме "0" - включение с кнопки. Режим "1" - включение при подаче питания. Нам подходит режим "2" - включение при появлении видеоданных на VGA-входе/HDMI-входе.