Bluetooth-управляемая машинка на Arduino

Posted: Декабрь 14, 2015 in Arduino, Микроконтроллеры
Метки: ,

В прошлой части было рассказано как сделать радиоуправляемую машинку с использованием ATtiny2313 на языке ассемблер. Теперь давайте посмотрим как ее можно сделать с использованием Arduino. Возьмем самую популярную модель Arduino Uno. Она хороша тем, что в ней есть АЦП. Его мы будем использовать для регулировки скорости движения. Сама регулировка будет осуществляться с помощью обычного потенциометра. Еще хотелось бы управлять такой машинкой дистанционно, например через последовательный порт компьютера, но тогда нам нужен будет провод, или через Bluetooth мобильного телефона. В Proteus есть замечательная вещь, которая называется «Виртуальный терминал», он нам заменит оба этих случая, достаточно только подключить RX с TX и наоборот. Теперь можно считать, что либо мы протянули длинный провод от компьютера, либо поставили на Arduino какой-нибудь Bluetooth shield или HC-05 модуль. Во втором случае можно даже написать простенькую программку для смартфона под управлением ОС Android или, зная команды, которые мы сейчас придумаем, просто скачать любой bluetooth терминал.
Схема в Proteus будет выглядеть следующим образом:
ArduinoBluetooth
В качестве H-моста используется все тот же L293D. По-хорошему, скорость тоже надо бы передавать через блютуз, но, чтобы продемонстрировать работу АЦП, сделаем такую химеру, где направление движения передается от пульта, а скорость регулируется на самой машинке. Жуть, но с такими примерами программисты сталкиваются практически каждый день 😉 Еще хорошо было бы добавить второй мотор для возможности поворачивать, но тут очень сильно зависит от конструкции самой машинки: либо как трактор будет управляться включением только одной гусеницы, либо серводвигатель будет поворачивать специальную конструкцию. Так что пока ограничимся одним моторчиком.
Система команд будет следующая:
«f» — вперед
«b» — назад
«s» — стоп
Простенький скетч для ардуино

const int pot_pin  = A0;
const int motor_b1 = 10;
const int motor_b2 = 11;

int m_potentiometer = 0;
int m_speed = 0;
int m_state = 0;

void setup() {
  pinMode(pot_pin, INPUT);
  pinMode(motor_b1, OUTPUT);
  pinMode(motor_b2, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  while(m_state == -1){
    m_state = Serial.read();
  }

  m_potentiometer = analogRead(pot_pin);
  m_speed = map(m_potentiometer, 0, 1023, 0, 255);

  switch(m_state){
    case 'f' :
      forward();
      break;
    case 'b' :
      backward();
      break;
    case 's' :
      stop_car();
      break;
    default:
      break;
  }

  m_state = -1;
}

void stop_car(){
  analogWrite(motor_b1, LOW);
  analogWrite(motor_b2, LOW);
}

void backward(){
  analogWrite(motor_b1, m_speed);
  analogWrite(motor_b2, LOW);
}

void forward(){
  analogWrite(motor_b1, LOW);
  analogWrite(motor_b2, m_speed);
}

Запустим симуляцию в протеусе и будем в виртуальном терминале посылать наши команды.
Безымянный

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s