Logo

Cлучайные товары

Модуль питания 12 В 400mA
PDI-HV2060MG 60 КГ

Посмотреть товар в Магазине »

Мы в соц сетях


Подпишись на канал
Мы на facebook

Собираем Arduino машинку на Motor Shield L293D и ИК пульте

.Собираем Arduino машинку на Motor Shield L293D и ИК пульте

Пол года назад коме пришла идея изучать программирование микроконтроллеров. Почитал в интернете и понял, что самая простая среда разработки Arduino IDE. Посмотрел кто и что делает и решил сделать свою машинку на пульте управления. Почему именно на ИК пульте управления? Просто по всем отзывам и разработкам это самая простая и дешевая машинка.

При выборе комплектующих выбор пал на Arduino UNO и Motor Shield L293D.

Почему именно Motor Shield ? Это связанно с тем что я к тому моменту паять пробовал в жизни 2 раза. И решил что использование шилд паять не нужно будет.

Что мне понадобилось:

1. Arduino UNO 190 руб.

2. Motor Shield L293D 100 руб.

3. Два мотор редуктора и два колеса. 240 руб.

4.IR приемник + пульт ДУ 50 руб.

5. Источник питания. Я покупал power bank за 300 руб. или тут

Можно купить бокс под батарейки 50 руб.

6. провода для подключения мотор редуктора к шилду можно взять от мышки, USB- зарядки и пр., что у вас не работает и лежит без дела.

7. ПВХ панель. Обрезок картонки, фанерки и пр.

8. мебельное колесико в магазине стоит около 50 руб.

9. винтики болтик можно купить руб за 40 в строительном магазине.

И того машинку на Motor Shield L293D и ИК пульте можно собрать за 670 руб.


Когда пришли все комплектующие я понял, что паять все таки нужно будет. И на первом этапе мне показалось что Motor Shield не предназначен для сборки машинок на ИК пульте управления.

Прочитал я статьи про Motor Shield и понял, что стандартную библиотеку использовать в данном случае не получиться. Разобрав электрическую схему я понял как можно подключить I R приемник и двигателя. Написал небольшой скетч. Сделал основу из панели ПВХ. Процесс сборки смотрите в видео. Я повторил первую версию машинки в точности как была сделана.


После пары переделок скетча, машинка поехала. Большой минус был в том, что пока не нажмешь кнопку стоп машинка продолжает движения. Это доставляло массу неудобств особенно, когда машинка заезжала под диван или кровать. Сигнал от пульта не попадал на IR приемник и машинку приходилось вручную доставать.

В новый год у меня сломался power bank. Я заказал запчасти чтобы его отремонтировать. Dc-Dc преобразователь и плата контроля заряда шли больше 2 месяцев. И поэтому машинка у меня стояла, пылилась.

После того как я восстановил Power bank и переписал код, исправив недостаток предыдущей версии. Машинка стала ездить и поворачивать пока нажата кнопка на пульте. Пульт можно отвернуть в противоположную сторону, при этом машинка продолжает движение.

После того как отпускаем кнопку машинка останавливается. Стало намного удобнее.


По просьбе подписчиков выкладываю скетч. Снять отдельно видео пока не получается. Если возникнут вопросы пишите в группу в контакте: Arduino Portal-PK.

Нужно поставить библиотеку для работы со сдвиговым регистром

#include <Shift595.h> // https://sites.google.com/site/shift595arduino/downloads

Укажите ваши коты с пульта ДУ

#define POWER_KEY 0x61D66897 // коды пульта ДУ
#define KEY1 0x61D6D02F  // вперед 
#define KEY2 0x61D6A857 // назад
#define KEY3 0x61D618E7  // влево
#define KEY4 0x61D630CF  // вправо

Подключения IR приемника производиться к пинам серво привода 1 или 2

#define SER1 10
#define SER2 9

IRrecv irrecv(SER1);

Полный код Arduino машинки на Motor Shield L293D и ИК пульте

#include <Shift595.h> // https://sites.google.com/site/shift595arduino/downloads
#include <IRremote.h> 
#define POWER_KEY 0x61D66897 // коды пульта ДУ
#define KEY1 0x61D6D02F  // вперед 
#define KEY2 0x61D6A857 // назад
#define KEY3 0x61D618E7  // влево
#define KEY4 0x61D630CF  // вправо
#define M1A 2 
#define M1B 3 
#define M2A 1
#define M2B 4
#define M4A 0
#define M4B 6
#define M3A 5
#define M3B 7
#define PWM_M1 11
#define PWM_M2 3
#define PWM_M3 6
#define PWM_M4 5
#define SER1 10
#define SER2 9
#define PWRON 7
IRrecv irrecv(SER1);
Shift595 Shifter(8, 12, 4, 1);
decode_results results;
 /* определяем два массива с перечислением пинов для каждого мотора */
unsigned char RightMotor[3] =  {M3A, M3B, PWM_M3};
unsigned char LeftMotor[3] = {M4A, M4B, PWM_M4}; 
long prestro1Millis = 0;        // до мигания ( в целом переменная времени)
int key;
int v= 10;
void setup()
{ 
  irrecv.enableIRIn();
  pinMode(PWRON, OUTPUT); 
  digitalWrite(PWRON, LOW); // включение 74HC595
  pinMode(PWM_M1, OUTPUT); // включение L293D
  pinMode(PWM_M2, OUTPUT); 
  pinMode(PWM_M3, OUTPUT); 
  pinMode(PWM_M4, OUTPUT); 
  digitalWrite(PWM_M1, HIGH);
  digitalWrite(PWM_M2, HIGH);
  digitalWrite(PWM_M3, HIGH);
  digitalWrite(PWM_M4, HIGH);
}
void loop(){
  unsigned long curstro1Millis = millis();  // устанавливаем время в сейчас
  if ((curstro1Millis - prestro1Millis) > 200) // проверяем интервал
  {
  if (irrecv.decode(&results)) {
        if (results.value == KEY1)
          key = 1;
         else if (results.value == KEY2)
          key = 2;
         else if (results.value == KEY3)
          key = 3;
           else if (results.value == KEY4)
          key = 4;
           else if (results.value == POWER_KEY)
           {
            key = 0;
            v= 10;
           }
          if (results.value == 0xFFFFFFFF)
          {
            key = key;
            v= v+10;
          }
        irrecv.resume();// Receive the next value
    }
    else
    {
      key = 0;
      v= 10;
     }
    prestro1Millis = curstro1Millis;
    } 
      if (key == 1){ 
        Motor (RightMotor, v);
        Motor (LeftMotor, v);
     }
     else if (key == 2){
        Motor (RightMotor, -v);
        Motor (LeftMotor, -v);     
     }
     else if (key == 3){
        Motor (RightMotor, -v);
        Motor (LeftMotor, v);
     }
     else if (key == 4){
        Motor (RightMotor, v);
        Motor (LeftMotor, -v);  
     } 
     else if (key == 0) {       
        Motor (RightMotor,0);
        Motor (LeftMotor,0);  
     }
}
   void Motor(unsigned char * motor, int v) {
    if (v>100) v=100;
    if (v<-100) v=-100;
    if (v>0) {
      Shifter.setRegisterPin(motor[0], LOW);
      Shifter.setRegisterPin(motor[1], HIGH);
      digitalWrite(motor[2], v*2.55);
      Serial.println(motor[0]);
    }
    else if (v<0) {
      Shifter.setRegisterPin(motor[0], HIGH);
      Shifter.setRegisterPin(motor[1], LOW);
      digitalWrite(motor[2], (-v)*2.55);
    }
    else {
      Shifter.setRegisterPin(motor[0], LOW);
      Shifter.setRegisterPin(motor[1], LOW);
      digitalWrite(motor[2], 0);
    } 
}
Вернуться в раздел: Проекты на Arduino Дата публикации 28 апреля , 2017

Яндекс.Метрика

Portal-PK (Портал ПК) © 2015 - 2017 MiniYiiCMS Заказать сайт: f-studio.biz
Обратная связь
Вопрос-Ответ