Сканер ик-пультов с записью на sd-карту

Урок 5 – Управление Arduino с помощью пульта ДУ (IR). Библиотека IRremote

При создании проектов на Arduino. Часто возникает вопрос, с помощью чего управлять проектом. И желательно на расстоянии. Кнопки уже не модно.

Самый просто и доступный способ это управление с помощью пульта дистанционного управления и IR приемника . Реализовать можно различные проекты, например вытяжку с ик управлением.

Для урока я буду использовать вот такой набор и Arduino UNO.

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

Приемники могут быть распаянные как в моем случае.

И вот такого плана.

Различий в подключении нет. Первый просто удобнее для тестирования и проверки работы. При подключении самое главное не перепутать ноги и подключить правильно. В противном случае приемник может сгореть.

Для работы нам понадобиться библиотека IRremote. Скачать ее можно тут.

С библиотекой устанавливается ряд примеров. Нам понадобиться IrrecvDemo.

IRremote.h> int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); // In case the interrupt driver crashes on setup, give a clue // to the user what’s going on. Serial.println(“Enabling IRin”); irrecv.enableIRIn(); // Start the receiver Serial.println(“Enabled IRin”); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value } delay(100); }

После того как скетч загружен и IR приемник подключен можно проверить какой код соответствует той или иной кнопке пульта ДУ. Поднажимайте на кнопки и в мониторе последовательного порта (Ctrl+Shift+M) вы уведите следующее.

;FF18E7 FFFFFFFF FFA857 FF02FD FF18E7 FF38C7 FF4AB5 FF5AA5 FF10EF FF5AA5 FFFFFFFF FF10EF FF5AA5

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

Отпускаем и машина перестает ехать и поворачивать.

Само простое, чем можно управлять это включение и выключения встроенного светодиода на плату Arduino при помощи пульта дистанционного управления и инфракрасного приемника.

Схема подключения как и в примере выше. Коды кнопок моего пульта:

//FF10EF — стрелочка вправо //FF5AA5 — стрелочка влево

У вашего пульта команды будут другие. Код получается вот такой.

//FF10EF — стрелочка вправо //FF5AA5 — стрелочка влево #include “IRremote.h” IRrecv irrecv(11); // указываем вывод, к которому подключен приемник decode_results results; void setup() { irrecv.enableIRIn(); // запускаем прием } void loop() { if ( irrecv.decode( &results )) { // если данные пришли switch ( results.value ) { case 0xFF10EF: digitalWrite( 13, HIGH ); break; case 0xFF5AA5: digitalWrite( 13, LOW ); break; } irrecv.resume(); // принимаем следующую команду } delay(100); }

Вот так можно легко научить вашу Arduinо понимать команды с пульта.

Скетч для Arduino

ir-servo-robot.ino
// библиотека для ИК приёмника
#include <IRremote.h>
// подключаем библиотеку для работы с сервоприводами
#include <Servo.h> 
// создаём объект для управления сервоприводом
Servo myservoFordL;
Servo myservoFordR;
Servo myservoBackL;
Servo myservoBackR;
 
// даем имя пину подключения ИК приёмника
int RECV_PIN = 4;
 
// указываем к какому пину подключен ИК приёмник
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup() 
{
  // запускаем работу ИК приемника
  irrecv.enableIRIn();
  // подключаем сервоприводы
  myservoFordL.attach(8);
  myservoFordR.attach(9);
  myservoBackL.attach(10);
  myservoBackR.attach(11);
} 
 
void loop() 
{
  // принимаем данные с ИК пульта
  // в зависимости от нажатой кнопки пульта
  // даём разные команды роботу
  if (irrecv.decode(&results)) {
    if (results.value == 0x1689609F) {
      ford();
    } else if (results.value == 0x1689B847) {
      back();   
    } else if (results.value == 0x168910EF) {
      left();   
    } else if (results.value == 0x16899867) {
      right();   
    } else if (results.value == 0x168938C7) {
      stop();   
    }
    // ждем следующее значение
    irrecv.resume();
  }
  //делаем задержку
  delay(100);
}
 
// функция движение вперёд
void ford() {
  myservoFordL.write();
  myservoFordR.write(180);
  myservoBackL.write();
  myservoBackR.write(180);
}
 
// функция движение назад
void back() {
  myservoFordL.write(180);
  myservoFordR.write();
  myservoBackL.write(180);
  myservoBackR.write();
}
 
// функция поворота налево
void left() {
  myservoFordL.write(180);
  myservoFordR.write(180);
  myservoBackL.write(180);
  myservoBackR.write(180);
}
 
// функция поворота направо
void right() {
  myservoFordL.write();
  myservoFordR.write();
  myservoBackL.write();
  myservoBackR.write();
}
 
// функция остановки
void stop() {
  myservoFordL.write(90);
  myservoFordR.write(90);
  myservoBackL.write(90);
  myservoBackR.write(90);
}

Как собрать

  1. Возьмите Troyka Shield LP и установите сверху на управляющую плату — Arduino или Iskra JS.

  2. Закрепите на обратную сторону управляющей платы с помощью двустороннего скотча два сервопривода спереди — «передние колёса», и два сзади — «задние колёса». Закрепите круглые качельки на валах сервоприводов.

  3. Подключите передние колёса «ServoFordL» и «ServoFordR» через 3-проводные шлейфы к и пину Troyka Shield LP соответственно, а задние колёса «ServoBackL» и «ServoBackR» — к и пину Troyka Shield LP соответственно.

  4. Подключите ИК-приёмник к пину Troyka Shield LP. В итоге должна получиться схема.

  5. Установите Power Shield сверху на Troyka Shield LP.

Управление Ардуино с помощью ИК приемника и пульта

Нам понадобится:

Ссылочка на Arduino uno: http://ali.ski/gC_mOa Ссылочка на модуль Реле: http://ali.ski/X26ZC Ссылочка на контактные провода: http://ali.ski/Exjr3 Ссылочка на Ик приемик: http://ali.ski/Xb4xK4

В данном примере я покажу как с помощью Ик пульта включить и выключить реле. Это можно применить например в управлении освещением с помощью пульта. Да и вообще кучу кнопок на пульте запрограммировать и можно всем домом управлять. было бы желание.

Подключаем ИК приемник и модуль реле к ардуино, согласно схеме приведенной в начале статьи.

Для начала нам нужно скачать библиотеку из стандартных библиотек IRremote.h . как скачать данную библиотеку рассказывается в видео в конце стать.

После того как скачали библиотеку, нужно залить из примеров в библиотеке IRremote.h пример считывание кодов кнопок пульта, как это сделать тоже рассказывается в видео в конце статьи.

После того как считали код нужной нам кнопки ее нужно записать в строку case 0xFD00FF заместо 0xFD00FF Далее

Необходимо скопировать программный код приведенный ниже и вставить его в программу Arduino IDE и загрузить этот программный код в саму плату Arduino.

Ссылка на Скетч: https://yadi.sk/d/SRWyMOeZv8DcG Демонстрация работы данной программы можно увидеть в видео приведенном в конце статьи.

Плавное мигание светодиоды или познакомимся еще с новыми операторами…

Всем привет! Добро пожаловать на новый урок ардуино. Сегодня
мы продолжим работу со светодиодам, и освоим новый способ заставить его мигать.
Но обо всем по порядку. Сначала давайте освоим еще несколько новых «слов» в
нашем языке программирования ардуино. Для начала нам нжуно будет использовать
особый тип данных (до этого мы использовали целочисленный тип int). Настало время освоить новый тип
переменной – с плавающей запятой.

Оператор float — как раз и задает тип данных с плавающей
запятой. Синтаксис его точно такой же как и при объявлении ранее использовании
переменной int:

float b; // объявление переменной b типа данных с плавающей
запятой.

Теперь давайте разберёмся каким еще способом можно изменять
плавно значение переменной, например от меньшего к большему и так до
бесконечности. Для этого мы воспользуемся оператором тригонометрической
функции: синусом. С помощью функции sin() мы будем получать плавно меняющиеся значения и после
небольшого преобразования будем направлять эти значения прямо в канал ШИМ. 

Теперь давайте разберемся с преобразованием. Для чего это
нам нужно? А вот для чего: дело в том, что тригонометрические функции (в нашем
случае это функция вычисления синуса) работает не с градусами, а с радианами. Поэтому
нужно будет произвести перерасчет из градусов в радианы. Это вычисляется по
формуле: x*(3.1415/180)
где 3.1415 это округленное значение числа Пи, а х это переменная которая будет
принимать значения от 0 до 180 и выраженная в градусах. Наконец умножив
полученный результат на 255 мы сможем получить плавно нарастающие числа от 0 до
255.

Давайте подведем итоги. Изменяя значения переменной x от 0 до 180, наша формула y=255*((sin(x*(3.1415/180))))
будет выдавать значения х от 0 до 255 (напомним, что переменную х выраженную в
градусах от 0 до 180, мы преобразуем в радианы)

Для наглядности я пересчитал
все данные в электронных таблицах и обратите внимание на получившийся график

А сам скетч получился таким:

int
ledPin=11;

float
Val;

int led;

void
setup()

{

pinMode
(ledPin, OUTPUT);

}

void
loop ()

{

for (int
x=0; x<180; x++)

{

  Val=(sin(x*(3.1415/180)));

  led=int(Val*255);

  analogWrite (ledPin, led);

  delay (20);

}

}

Схема элементарно простая: подключаем светодиод (длинной ножкой)
через резистор 220 Ом к 11 пину. Короткую ножку соответственно на землю. И все!
Даже схему можно не приводить, но для наглядности все же приведу схему.

А
теперь давайте наконец собереми испытаем нашу схему. Собирать будем на макетной
плате, думаю что для нашего читателя это не составит большого труда. А далее
все должно заработать! Вы обратили как интересно мигает светодиод? Все потому
что подключен он к 11 выводу, который на плате ардуино не простой, а который
поддерживает ШИМ.

Для
интереса давайтеподключим теперь вместо светодиода осцилограф и посмотрим какую
осциллограмму нам выдает ШИМ на 11 пине. Саму осциллограмму вы можете так же
увидеть в видеоролике ниже. Приятного просмотра и удачных вам экспериментов с
ардуино. 

Управляй телевизором силой мысли и Arduino

Название проекта: Управляй телевизором силой мысли и ArduinoПлатформа: Arduino

Пульт от телевизора больше не нужен. Все что нужно сделать – это подумать о смене канала. В проекте использован чип из игры Star Wars Force Trainer (Звездные войны), выпущенной в 2009 году.

Использованные компоненты: Arduino UNO, игра Star Wars Force Trainer, ИК-приемник / ИК-передатчик

,

Сайт проекта: http://goo.gl/8lwjjp

Если вы когда-нибудь мечтали переключать каналы телевизора, просто думая, об этом, то этот arduino-проект – ваша удача. Не только системы “умный дом”, но и магия становятся реальностью.

Более того, некоторые проекты мейкеров доказывают, что фантастические трюки можно сделать самому, затратив при этом не много средств.

Она включает в себя гарнитуру, способную обнаруживать электрические поля разума (по аналогии с ЭЭГ). Сигналы ретранслируются и вентилятор поднимает мяч, находящийся в трубе, в воздух. Иллюзия левитации. Сила работы вентилятора зависит от мыслей пользователя.

Мейкер разобрал игру и обнаружили чип NeuroSky ЭЭГ, встроенный в гарнитуру, который он решил подключить к Arduino Uno (ATmega328), чтобы собирать и преобразовывать исходные данные ЭЭГ на компьютере. В проекте также были использованы ИК-приемник и ИК-передатчик от старого видеомагнитофона.

Чтобы посмотреть какие сигналы передает пульт дистанционного управления на ИК-приемник при нажатии кнопок достаточно воспользоваться Serial-монитором, предварительно загрузив в arduino простую программу.

Код кнопки нужно записать для последующего использования. Написав совсем немного строк кода, мейкер создал умопомрачительный проект. Шлем позволяет переключать каналы на ТВ и выключать его питание, просто путем сосредоточения мыслей.

Исходный код проекта можно скачать на GitHub.

Другие проекты на этой платформе:

  • Робот на Arduino, управляемый с помощью жестов
  • Как сделать аниматронный хвост
  • Вездеход из Lego с видео и bluetooth на Raspberry Pi
  • Робот Juno: изучай Arduino и программирование
  • Робот-манипулятор из настольной лампы IKEA
  • Arduino-робот, объезжающий препятствия
  • Роботизированная интеллектуальная система — РИС
  • Серво-выключатель света для умного дома
  • Робот-рыба на Arduino
  • Сделай сам большого человекоподобного робота

Инструкция по изготовлению лодки с пультом

Проверку работы ИК-приемника и сервомотора на Ардуино лучше проводить с отключенным электромоторчиком, поскольку он будет создавать сильные вибрации при работе. На этом этапе тестирования проекта следует лишь оценить подвижность киля и отцентровать рычаг привода на сервомоторе. Необходимо сделать так, чтобы при нажатии кнопки «вперед» или «стоп» на пульте, киль вставал по центру.

1. Изготовление корпуса лодки из пеноплекса

Изготовление корпуса лодки на Ардуино своими руками

Размеры и форма лодки могут быть абсолютно разными — все зависит лишь от фантазии. Что касается прорезей, то они должны соответствовать размерам деталей. На трафарете (слева-направо) размечены прорези для: платы Ардуино UNO, сервомотора, привода киля и микромоторчика. Учтите, что привод от сервомотора к килю должен свободно ходить в прорези, для этого надо точно рассчитать радиус.

2. Изготовление деталей для привода и управления

Изготовление деталей для привода и управления лодкой

Киль можно изготовить из любого материала — пластик, дерево и т.д. Стержень от ручки, прикрепленный к килю служит осью, на котором он поворачивается. Скрепка на киле обеспечивает подвижное соединение киля и рычага сервомотора из проволоки. Размер и конструкция привода сервомотора будет зависеть от конструкции лодки. Винт изготавливается из стержня шариковой ручки и куска пластиковой баночки.

Сборка деталей для привода радиоуправляемой лодки

3. Сборка лодки на Ардуино с управлением

Для начала следует установить плату, сервопривод и двигатель

В этом проекте мы обошлись без использования макетной платы. Если вспомнить схему подключения ИК приемника к Ардуино, то она очень проста (слева-направо): A0 — GND — 5V  и не требует расходов на приобретение макетной платы. Транзистор мы использовали в этой схеме для включения советского электромоторчика от 3,3 V.

Сборка электрической схемы лодки на ИК управлении

Транзистор размещен на пинах 12, 11 и 10. На Pin11 (средняя ножка транзистора — это база) мы подаем напряжение для включения электродвигателя. Pin12 и Pin10 в скетче не используются, поэтому служат нам эмиттером и коллектором. К Pin12 подключен выход 3,3 V, а к Pin10 подключен электромоторчик (красный плюсовой провод).

4. Крепление привода винта на валу двигателя

Разогрейте стержень от ручки над паяльником и он зайдет на вал двигателя

Винт для судна изготавливается из любой пластиковой баночки или корпуса с небольшим закруглением, например, баночка от витаминок или корпус от  клея-карандаша. Для начала необходимо вырезать из пластика винт в форме восьмерки, а затем выпрямить противоположные края винта, используя высокую температуру для размягчения пластика. Смотрите фото винта для лодки Ардуино выше.

Скетч для лодки на Ардуино с ИК пультом

#include <IRremote.h> // библиотека для IR-приемника
#include <Servo.h>      // библиотека для сервомотора

// Замените коды команд от пульта ДУ на свои значения
#define forward 16736925
#define left 16769565
#define right 16754775
#define turm_left 16712445
#define turm_right 16711935
#define stope 16755285

Servo servo; // присваиваем имя сервомотору

int RECV_PIN = A0;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  Serial.begin(9600); // подключаем монитор, чтобы узнать коды кнопок пульта
  irrecv.enableIRIn();
  pinMode(11, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(A0, INPUT);
  servo.attach (7);
}

void loop() {
  
    if (irrecv.decode(&results)) {
    
    Serial.println(results.value); // выводим на монитор порта коды с пульта ДУ

    if (results.value == left) {
    servo.write(60);
    digitalWrite(11, HIGH);
   }
   
    if (results.value == right) {
    servo.write(120);
    digitalWrite(11, HIGH);
   }
   
    if (results.value == turm_left) {
    servo.write(10);
    digitalWrite(11, HIGH);
   }
   
    if (results.value == turm_right) {
    servo.write(170);
    digitalWrite(11, HIGH);  
   }
   
    if (results.value == forward) {
    servo.write(90);
    digitalWrite(11, HIGH);
   }
   
    if (results.value == stope) {
    servo.write(90);
    digitalWrite(11, LOW);
   }
   
    irrecv.resume(); // Ждем следующий сигнал от пульта
  }  
}

В случае успешного тестирования ИК-управления сервомотором, можно приступать к испытанию проекта на Ардуино для начинающих в реальных условиях. Но перед этим обязательно позаботьтесь о защите электрических схем и микроконтроллера от возможных брызг воды и влаги. Для этого можно использовать пищевую пленку (пленка свободно пропустит ИК сигнал от пульта дистанционного управления).

Чтение кодов кнопок ПДУ

Когда мы нажимаем кнопку на пульте дистанционного управления, он через инфракрасный светодиод отправляет специально закодированный уникальный код кнопки.

Прежде чем мы начнем управлять светодиодами или реле, нам нужно знать коды каждой кнопки ПДУ (или, по крайней мере, тех кнопок которыми мы хотим управлять).

В этом нам поможет пример из библиотеки. Чтобы запустить его, выберите  Файл  >  Примеры  >  IRremote  >  IRrecvDump  и загрузите скетч. Теперь откройте  монитор последовательного порта и по очереди  нажимайте кнопки на пульте дистанционного управления. На мониторе должно появиться что-то вроде этого:

Электрический паяльник с регулировкой температуры
Мощность: 60/80 Вт, температура: 200’C-450’C, высококачествен…

Подробнее

Нас интересует шестизначное шестнадцатеричное число. Я пометил образец кода на скриншоте красной рамкой.

Выберем две кнопки на пульте дистанционного управления CH + и CH- и, используя этот метод, определим соответствующие коды:  0xFFE21D (CH +) и  0xFFA25D(CH-). Код кнопки начинается с 0x  — это говорит о том, что это число в шестнадцатеричной системе исчисления. Часто это обозначение используется в листингах программ.

Имея коды кнопок, перейдем к самой программе управления.

#include <IRremote.h>
#define IRRECV 11 // Номер контакта ИК-приемника
#define RELAY 8 // Номер контакта реле

Директива  #include сообщает IDE Arduino, что мы будем использовать библиотеку IRremote. Две последующие директивы (#define) вводят метки IRRECV и RELAY. С этого момента мы можем писать в программном коде  IRRECV и RELAY, в IDE Arduino будет заменять IRRECV  на 11 и RELAY на 8.

Кто-то может задать резонный вопрос: зачем использовать такие метки, если мы можете написать просто числа в программном коде?

А все просто. Наш модуль реле подключен к контакту 8. Если в будущем мы захотим изменить номер контакта для реле, то достаточно будет исправить номер в директиве #define, и нам не придется искать все места, где мы использовали данный номер.

IRrecv irrecv (IRRECV);

В следующей строке мы создаем объект irrecv. Это тип IRrecv (инфракрасный приемник), определенный в библиотеке IRremote. Теперь irrecv становится связующим звеном между нашей программой и кодом, содержащимся в библиотеке IRremote. Этот код знает, как декодировать сообщения, полученные инфракрасным приемником.

void setup() {
irrecv.enableIRIn();
pinMode(RELAY, OUTPUT);
}

Функция setup() подготавливает Arduino к работе. Две строки — первая включает ИК-приемник, вторая настраивает контакт, к которому мы подключили реле, в режим вывода.

При нажатии кнопки на пульте дистанционного управления последовательность сигналов отправляется через светодиод, встроенный в пульт дистанционного управления. Наша Arduino, оснащенная ИК-приемником и кодом из библиотеки, может преобразовывать заданную последовательность ИК-импульсов в соответствующий код.

Когда код из библиотеки IRremote распознает полную последовательность импульсов, он преобразует ее в читаемый вид. Arduino остается сопоставить код кнопки. В нашей программе мы используем следующие функции  readIRCode:

unsigned long readIRCode() {
decode_results results;
unsigned long resultValue = results.value;
irrecv.resume();
return resultValue;
}

decode_results — это тип переменной, определенный библиотекой IRremote. Создаем переменную results, которая через поле value позволяет читать последний считанный код кнопки. Мы сохраняем код во вспомогательной переменной resultValue и вызываем irrecv.resume() заставляя библиотеку IRremote прослушивать последующие импульсы.

Далее код на усмотрение: в основном цикле  у нас будет только структура if, которая проверяет, является ли считанный код кодом одной из кнопок CH+ или CH-, и если да, мы включаем или выключаем модуль реле.

Поскольку единовременно может быть считана только одна кнопка, то в коде будет выполнена только одна из команд в условии if. Если код кнопки не совпадает с CH+ или CH-, никакой код выполняться не будет.

1Описание и принцип действия ИК датчика препятствий

Инфракрасное (ИК) или infrared (IR) излучение – это невидимое человеческим глазом электромагнитное излучение в диапазоне длин волн от 0,7 до 2000 мкм. Вокруг нас существуют огромное количество объектов, которые излучают в данном диапазоне. Его иногда называют «тепловое излучение», т.к. все тёплые предметы генерируют ИК излучение.

Длины волн разных типов электромагнитного излучения

Модули на основе ИК излучения используются, в основном, как детекторы препятствий для различного рода электронных устройств, начиная от роботов и заканчивая «умным домом». Они позволяют обнаруживать препятствия на расстоянии от нескольких сантиметров до десятков сантиметров. Расстояние до препятствия при этом определить с помощью ИК-сенсора невозможно.

Если оснастить, для примера, своего робота несколькими такими ИК модулями, можно определять направление приближения препятствия и менять траекторию движения робота в нужном направлении.

Модуль сенсора обычно имеет излучатель (светодиод) и детектор (фотодиод) в инфракрасном диапазоне. Инфракрасный светодиод излучает в пространство ИК излучение. Приёмник улавливает отражённое от препятствий излучение и при определённой интенсивности отражённого излучения происходит срабатывание. Чтобы защититься от видимого излучения, фотодиод имеет светофильтр (он выглядит почти чёрным), который пропускает только волны в инфракрасном диапазоне. Разные поверхности по-разному отражают ИК излучение, из-за чего дистанция срабатывания для разных препятствий будет отличаться. Выглядеть ИК модуль может, например, вот так:

Модуль с ИК излучателем и ИК приёмником

Когда перед сенсором нет препятствия, на выходе OUT модуля напряжение логической единицы. Когда сенсор детектирует отражённое от препятствия ИК излучение, на выходе модуля напряжение становится равным нулю, и загорается зелёный светодиод модуля.

Помимо инфракрасного свето- и фотодиода важная часть модуля – это компаратор LM393 (скачать техническое описание на LM393 можно в конце статьи). С помощью компаратора сенсор сравнивает интенсивность отражённого излучения с некоторым заданным порогом и устанавливает «1» или «0» на выходе. Потенциометр позволяет задать порог срабатывания ИК датчика (и, соответственно, дистанцию до препятствия).

Подключаем Arduino к RC модели

Допустим, вы хотите создать на Arduino нечто, перемещающееся на колёсах. Можно самостоятельно собрать шасси из различных деталей, озаботиться дополнительным питанием моторов и т.п. И оно у вас, конечно, поедет.

Вариант неплохой, если в этом и состоит проект. Однако, если шасси является лишь одним из компонентов проекта, то целесообразно рассмотреть и другой вариант. Возможно, вы уже выбрали именно его и поэтому читаете данный текст.

Я говорю про шасси от RC модели.

Это очень удобно: продуманное шасси, на борту которого уже присутствует мощная батарея с большим запасом напряжения и тока, регулятор скорости, система поворота колёс и ещё куча других классных штук типа подвески, редуктора, дифференциалов.

Электроника RC модели (здесь рассматривается модель без ДВС) работает следующим образом: питание от батареи сперва идёт на регулятор скорости, посылающий на приёмник стабильное напряжение 5 вольт через три контакта: земля (чёрный/коричневый), питание +5В (красный) и сигнальный (белый/оранжевый).

Приёмник, получив команду от пульта, подаёт сигнал по сигнальному контакту в регулятор скорости, который в свою очередь подаёт напряжение питания на мотор с нужной полярностью для задания скорости вращения вала и его направления (в случае коллекторных моторов).

Приёмник также перенаправляет полученное напряжение на следующие каналы (как минимум, на сервопривод рулевой системы).

На что следует обратить внимание, так это на то, что состояния «мотор остановлен» и «колёса стоят ровно» соответствует углу 90 градусов. Теперь, зная это, соберём следующую схему:

Теперь, зная это, соберём следующую схему:

У обоих переменных резисторов одно из крайних положений подключено к земле как подтягивающее сопротивление для того, чтобы устранить возможный шум на аналоговых входах. Питание +5В от регулятора скорости подключено напрямую к сервоприводу.

Если вы решите питать Arduino от +5В регулятора скорости, настоятельно рекомендую добавить в цепь стабилизатор!

Загрузим в микроконтроллер простейшую программу (скетч):

В дальнейшем вы можете создать искусственный интеллект и наделить им модель.

IR транскодер на Arduino

Устройства с управлением от инфракрасного пульта тесно вошли в нашу жизнь. Иногда пульт от телевизора или древней аудиосистемы теряется, а купить новый за давностью лет уже невозможно. Заказать новый пульт не всегда возможно, изготовить клон тоже, но обладая донором или информацией о нём можно изготовить конвертер.

Такой транскодер будет принимать команды одного пульта и транслировать их в формат другого.

Для Arduino существует прекрасная библиотека IRemote которая делает построение разнообразных ИК систем управления очень простым.

Но при решении даже такой простой задачи как транскодер обязательно находятся проблемы которые интересно решать. Итак для начала нам необходим интегральный ИК приёмник типа TSOP312 или соответствующий шилд для Arduino. Не стоит забывать что ИК приёмников существует очень много и цоколёвка у них меняется случайным образом.

Собранная схема нужна нам для получения кодов команд от обеих пультов, к несчастью снять команды с устройства для которого пульт утерян несколько сложнее. Вы можете всё-таки найти пульт донор, воспользоваться универсальным пультом подобрав код (а зачем тогда вам тогда транскодер, раз уж пульт подошёл?) или попытавшись воспользоваться данными из интернет баз по IR кодам.

Самым простым для меня оказалось воспользоваться приложением под андроид, эмулирующий нужный мне пульт.

Для чтения данных используем пример IRrecvDumpV2 из поставки IRremote, если ваш пульт относится к распознаваемым библиотекой то сырой результат сканирования вам не понадобится, хотя например пульт от LG у меня ложно распознавался как Samsung и не заработал при попытке отправлять команды через sendLG.

Пример полученных данных под спойлером:Encoding: SAMSUNG Code: 34346897 (32 bits) Timing: +4450, -4350 + 600, — 500 + 600, — 500 + 600, -1600 + 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500 + 600, — 500 + 600, — 500 + 600, — 500 + 600, -1600 + 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500 + 600, — 500 + 600, — 500 + 600, -1600 + 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500 + 600, — 500 + 600, — 500 + 550, -1650 + 550, — 550 + 550, — 550 + 550, -1650 + 550, — 550 + 550, -1650 + 550, -1600 + 600, -1600 + 600 unsigned int rawData = {4450,4350, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 550,1650, 550,550, 550,550, 550,1650, 550,550, 550,1650, 550,1600, 600,1600, 600}; // SAMSUNG 34346897

unsigned int data = 0x34346897;

В случае если захват выдаёт сообщение “IR code too long. Edit IRremoteInt.h and increase RAWLEN” библиотеку придётся немного исправить — увеличив размер буфера для команд.

В ту же таблицу сохраняем коды для пульта донора в сыром виде. Подключаем к Arduino инфракрасный светодиод и пишем простейшую программу которая получает инфракрасный сигнал с заданным кодом и отправляет другой код через светодиод. Резистор на 82 выбран из соображений того что валялось под рукой.

Для встраиваемого устройства его можно смело увеличивать до 200 Ом а если передатчик должен быть дальнобойным то придётся дополнить его нехитрым транзисторным каскадом, иначе тока от Arduino обязательно не хватит.

При наличии кодов команд от обеих пультов код транскодера приобретает следующий видvoid loop() {
if (irrecv.decode(&results)) { switch(results.value){ case(0x845E5420):{ irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal), khz); }break; } } irrecv.resume(); irrecv.enableIRIn();
}

Запускаем скетч, заливаем в Arduino. Как ни странно после запуска одна команда проходит, после чего все последующие устройством игнорируются. Чтобы не связываться с отладкой добавляем в цикл мигалку на 13 пине и видим что после первой попытки отправить команду плата зависает.

Можно эмпирически добавить задержку в пол секунды (delay(500) )и всё будет работать, но зная что сырые данные у нас представляют собой отсчёты времени в миллисекундах то можно просто добавить функцию отправки с задержкой.

В модуле Irsend есть даже подходящая функция custom_delay_usec, которой я изначально воспользовался неправильно, забыв домножить величину задержки на множитель USECPERTICK из библиотеки (50 мс).

void sendDelayed(unsigned int array[]){ irsend.sendRaw(array, sizeof(array) / sizeof(array), khz); int array_size = sizeof(array) / sizeof(array); for(int i=0;i

1Описание и принцип действия ИК датчика препятствий

Инфракрасное (ИК) или infrared (IR) излучение – это невидимое человеческим глазом электромагнитное излучение в диапазоне длин волн от 0,7 до 2000 мкм. Вокруг нас существуют огромное количество объектов, которые излучают в данном диапазоне. Его иногда называют «тепловое излучение», т.к. все тёплые предметы генерируют ИК излучение.

Длины волн разных типов электромагнитного излучения

Модули на основе ИК излучения используются, в основном, как детекторы препятствий для различного рода электронных устройств, начиная от роботов и заканчивая «умным домом». Они позволяют обнаруживать препятствия на расстоянии от нескольких сантиметров до десятков сантиметров. Расстояние до препятствия при этом определить с помощью ИК-сенсора невозможно.

Если оснастить, для примера, своего робота несколькими такими ИК модулями, можно определять направление приближения препятствия и менять траекторию движения робота в нужном направлении.

Модуль сенсора обычно имеет излучатель (светодиод) и детектор (фотодиод) в инфракрасном диапазоне. Инфракрасный светодиод излучает в пространство ИК излучение. Приёмник улавливает отражённое от препятствий излучение и при определённой интенсивности отражённого излучения происходит срабатывание. Чтобы защититься от видимого излучения, фотодиод имеет светофильтр (он выглядит почти чёрным), который пропускает только волны в инфракрасном диапазоне. Разные поверхности по-разному отражают ИК излучение, из-за чего дистанция срабатывания для разных препятствий будет отличаться. Выглядеть ИК модуль может, например, вот так:

Модуль с ИК излучателем и ИК приёмником

Когда перед сенсором нет препятствия, на выходе OUT модуля напряжение логической единицы. Когда сенсор детектирует отражённое от препятствия ИК излучение, на выходе модуля напряжение становится равным нулю, и загорается зелёный светодиод модуля.

Помимо инфракрасного свето- и фотодиода важная часть модуля – это компаратор LM393 (скачать техническое описание на LM393 можно в конце статьи). С помощью компаратора сенсор сравнивает интенсивность отражённого излучения с некоторым заданным порогом и устанавливает «1» или «0» на выходе. Потенциометр позволяет задать порог срабатывания ИК датчика (и, соответственно, дистанцию до препятствия).

Принцип работы универсального пульта

Многие из вас для управления телевизором вынуждены использовать 2 пульта ДУ: один для управления телевизором и один для управления телевизионной приставкой. В этом проекте мы объединим эти 2 пульта на основе смартфона чтобы с его помощью можно было управлять телевизором в полной мере, не задействуя дополнительные пульты.

Используя плату Arduino Uno достаточно просто в этом универсальном пульте ДУ реализовать процессы кодирования и декодирования нужных сигналов. Для удобства изготовления подобного устройства целесообразно сконструировать самодельный шилд (плату расширения) для платы Arduino как показано на следующем рисунке. Шилд будет состоять из приемника (ресивера) TSOP IR 1838T, инфракрасного светодиода и Bluetooth модуля (HC-05).

Вы можете либо изготовить приведенный шилд, либо просто соединить эти компоненты с платой Arduino Uno как показано на приведенной ниже схеме устройства.

Большинство инфракрасных устройств работают на частоте 38 кГц, поэтому мы и выбрали для нашего проекта 1838T. При этом рассматривая принципы работы устройств с инфракрасной связью следует помнить о том, что в них нет логических единиц и нулей в прямом понимании этих понятий. И единица, и ноль в этих устройствах кодируются набором специальных импульсов как показано на следующем рисунке. Сущность этих процессов кодирования описана в NEC протоколе.

Принцип работы проектируемого нами универсального пульта ДУ будет заключаться в следующем. Сначала смартфон с помощью приложения для Android передает сигнал плате Arduino при помощи технологии Bluetooth, далее Arduino принимает его при помощи приемника TSOP-IR (1838T) и анализирует его. Затем Arduino передает команду инфракрасному светодиоду чтобы он мигал по определенному алгоритму (шаблону), зависящему от того, какая кнопка нажата в приложении для Android в смартфоне. Этот сигнал принимается телевизором или телевизионной приставкой, которые выполняют закодированную в сигнале команду.

Но перед осуществлением этого проекта мы должны декодировать сигналы с пультов ДУ, которые мы хотим заменить. Этот процесс рассмотрен далее в статье.