Радиоуправляемая машинка на Arduino

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

Перейдем сразу к делу:

ArduinoIR

И машинка, и пульт дистанционного управления будут работать под управлением Arduino Uno. На схеме они обозначены Transmitter и Reciever. На передатчике у нас будет потенциометр для регулировки скорости движения, и кнопка для регулировки направления: вперед или назад. Пока что без поворотов. На приемнике у нас будет все тот же H-мост L293D и один моторчик, который будет крутить задние колеса. К сожаление, в Proteus нельзя добавить радио-приемник и передатчик, поэтому их будет симулировать провод, соединяющий 13-е порты Ардуин.
Перейдем к самой сложной части системы — шифрованию и дешифровке сигнала. Будем использовать термин «отсчет», который будет означать переполнение таймера. Начало посылки будет длиться 400 отсчетов, затем 255 отсчетов для регулировки скорости, 50 отсчетов на интервал между скоростью и направлением, и 255 отсчетов для регулировки направления. Скорость будет регулироваться ШИМ-сигналом. Насчет направления будем считать, что 255 означает вперед, 127 — назад, или наоборот.

сигнал

Для упрощения работы с таймером будем использовать библиотеку TimerOne. Далее приведен полный код приемника и передатчика с некоторыми комментариями:

// Передатчик
#include <TimerOne.h>

const int infra_red_pin = 13;
const int direction_pin = 3;
const int potentiometer_pin  = A0; 

int direction_of_motion;
int counter_cycles;
int m_speed = 0;

const int timer1_period = 1000; // Значение для переполнения мкс
const int package_start = 400;
const int package_gap = 50;

void setup() {
  pinMode(infra_red_pin, OUTPUT);
  pinMode(direction_pin, INPUT);
  pinMode(potentiometer_pin, INPUT);

  Timer1.initialize(timer1_period);
  Timer1.attachInterrupt(blinky);
}

void loop() {
  if (digitalRead(direction_pin)) {
    direction_of_motion = 127;
  }
  else {
    direction_of_motion = 255;
  }

  m_speed = map(analogRead(potentiometer_pin), 0, 1023, 0, 255);
}

// Обработка прерываний по таймеру
void blinky()
{
  if (counter_cycles == package_start) {
    digitalWrite(infra_red_pin, HIGH);
  }
  if (counter_cycles == (package_start + m_speed)) {
    digitalWrite(infra_red_pin, LOW);
  }

  if (counter_cycles == package_start + 255 + package_gap) {
    digitalWrite(infra_red_pin, HIGH);
  }
  if (counter_cycles == (package_start + 255 + package_gap + direction_of_motion)) {
    digitalWrite(infra_red_pin, LOW);
  }

  counter_cycles++;
  if (counter_cycles > package_start + (2 * 255) + package_gap) {
    counter_cycles = 0;
  }
}

// Приемник
#include <TimerOne.h>

const int infra_red_pin = 13;
const int motor_b1 = 10;
const int motor_b2 = 11;

int counter_cycles;
int m_speed = 200;

const int timer1_period = 1000; // Значение для переполнения мкс
const int package_start = 400;

void setup() {
  pinMode(infra_red_pin, INPUT);
  pinMode(motor_b1, OUTPUT);
  pinMode(motor_b2, OUTPUT);

  Timer1.initialize(timer1_period);
  Timer1.attachInterrupt(blinky);
}

void loop() {
  // ждем начала пакета
  while(digitalRead(infra_red_pin)!=0);
  counter_cycles = 0;
  while(digitalRead(infra_red_pin)!=1);

  if (counter_cycles < 400) return; //Если пауза не выдержана...

  // считываем скорость
  while(digitalRead(infra_red_pin)!=0);
  m_speed = counter_cycles;

  // считываем направление
  while(digitalRead(infra_red_pin)!=1);
  counter_cycles = 0;
  while(digitalRead(infra_red_pin)!=0);

  if(counter_cycles < 50){
    stop_car();
  }else if(counter_cycles < 150){
    forward();
  }else{
    backward();
  }

  counter_cycles = 0;
}

// Обработка прерываний по таймеру
void blinky()
{
  counter_cycles++;
}

// Остановиться
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