Как собрать
-
Возьмите Troyka Shield LP и установите сверху на управляющую плату — Arduino или Iskra JS.
-
Закрепите на обратную сторону управляющей платы с помощью двустороннего скотча два сервопривода спереди — «передние колёса», и два сзади — «задние колёса». Закрепите круглые качельки на валах сервоприводов.
-
Подключите передние колёса «ServoFordL» и «ServoFordR» через 3-проводные шлейфы к и пину Troyka Shield LP соответственно, а задние колёса «ServoBackL» и «ServoBackR» — к и пину Troyka Shield LP соответственно.
-
Подключите ИК-приёмник к пину Troyka Shield LP. В итоге должна получиться схема.
-
Установите Power Shield сверху на Troyka Shield LP.
Исходный код программы
В программе мы первым делом должны подключить библиотеку для работы с инфракрасным каналом связи, инициализировать необходимые контакты и объявить переменные.
Затем необходимо подключить библиотеку для работы с ЖК дисплеем и инициализировать контакты для работы с ЖК дисплеем и управления домашними электронными устройствами.
После этого необходимо инициализировать последовательный порт, ЖК дисплей и задать направление работы инициализированных контактов.
В следующей части программы, как уже обсуждалось ранее в данной статье, происходит сравнение принятого шестнадцатеричного значения и записанного в программе шестнадцатеричного значения для каждой кнопки. Если фиксируется совпадение этих значений, то происходит выполнение соответствующей команды по включению/выключению управляемого электронного устройства.
Далее приведен полный текст программы.
Arduino
#include <LiquidCrystal.h>
#include <IRremote.h>
const int RECV_PIN=14;
IRrecv irrecv(RECV_PIN);
decode_results results;
LiquidCrystal lcd(6,7,8,9,10,11);
#define Fan 3
#define Light 4
#define TV 5
int i=0,j=0,k=0,n=0;
void setup()
{
Serial.begin(9600);
lcd.begin(16,2);
pinMode(Fan, OUTPUT);
pinMode(Light, OUTPUT);
pinMode(TV, OUTPUT);
//digitalWrite(13,HIGH);
lcd.print(«Remote Controlled»);
lcd.setCursor(0,1);
lcd.print(«Home Automation»);
delay(2000);
lcd.clear();
lcd.print(«Circuit Digest»);
lcd.setCursor(0,1);
delay(1000);
lcd.print(«System Ready…»);
delay(1000);
irrecv.enableIRIn(); // Start the receiver
irrecv.blink13(true);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«Fan Light TV «);
lcd.setCursor(0,1);
lcd.print(«OFF OFF OFF»);
}
void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value,HEX);
delay(100);
lcd.setCursor(0,0);
lcd.print(«Fan Light TV»);
if(results.value==0x1FE00FF)
{
i++;
int x=i%2; // вычисление остатка от деления на 2
digitalWrite(Fan, x);
lcd.setCursor(0,1);
if(x)
lcd.print(«ON «);
else
lcd.print(«OFF «);
// delay(200);
}
else if(results.value==0x1FEF00F) // key 1
{
j++;
int x=j%2;
digitalWrite(Light, x);
lcd.setCursor(6,1);
if(x)
lcd.print(«ON «);
else
lcd.print(«OFF «);
// delay(200);
}
if(results.value==0x1FE9867)
{
k++;
int x=k%2;
digitalWrite(TV, x);
lcd.setCursor(13,1);
if(x)
lcd.print(«ON «);
else
lcd.print(«OFF»);
// delay(200);
}
if(results.value==0x1FE48B7)
{
n++;
int x=n%2;
digitalWrite(TV, x);
digitalWrite(Fan,x);
digitalWrite(Light,x);
lcd.setCursor(0,1);
if(x)
lcd.print(«ON ON ON «);
else
lcd.print(«OFF OFF OFF»);
//delay(200);
}
irrecv.resume(); // Receive the next value
//delay(100);
}
}
1 |
#include <LiquidCrystal.h> constintRECV_PIN=14; IRrecvirrecv(RECV_PIN); decode_resultsresults; LiquidCrystallcd(6,7,8,9,10,11); #define Fan 3 inti=,j=,k=,n=; voidsetup() { Serial.begin(9600); lcd.begin(16,2); pinMode(Fan,OUTPUT); pinMode(Light,OUTPUT); pinMode(TV,OUTPUT); //digitalWrite(13,HIGH); lcd.print(«Remote Controlled»); lcd.setCursor(,1); lcd.print(«Home Automation»); delay(2000); lcd.clear(); lcd.print(«Circuit Digest»); lcd.setCursor(,1); delay(1000); lcd.print(«System Ready…»); delay(1000); irrecv.enableIRIn();// Start the receiver irrecv.blink13(true); lcd.clear(); lcd.setCursor(,); lcd.print(«Fan Light TV «); lcd.setCursor(,1); lcd.print(«OFF OFF OFF»); } voidloop() { if(irrecv.decode(&results)) { Serial.println(results.value,HEX); delay(100); lcd.setCursor(,); lcd.print(«Fan Light TV»); if(results.value==0x1FE00FF) { i++; intx=i%2;// вычисление остатка от деления на 2 digitalWrite(Fan,x); lcd.setCursor(,1); if(x) lcd.print(«ON «); else lcd.print(«OFF «); // delay(200); } elseif(results.value==0x1FEF00F)// key 1 { j++; intx=j%2; digitalWrite(Light,x); lcd.setCursor(6,1); if(x) lcd.print(«ON «); else lcd.print(«OFF «); // delay(200); } if(results.value==0x1FE9867) { k++; intx=k%2; digitalWrite(TV,x); lcd.setCursor(13,1); if(x) lcd.print(«ON «); else lcd.print(«OFF»); // delay(200); } if(results.value==0x1FE48B7) { n++; intx=n%2; digitalWrite(TV,x); digitalWrite(Fan,x); digitalWrite(Light,x); lcd.setCursor(,1); if(x) lcd.print(«ON ON ON «); else lcd.print(«OFF OFF OFF»); //delay(200); } irrecv.resume();// Receive the next value //delay(100); } } |
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
How IR Remotes and Receivers Work
A typical infrared communication system requires an IR transmitter and an IR receiver. The transmitter looks just like a standard LED, except it produces light in the IR spectrum instead of the visible spectrum. If you have a look at the front of a TV remote, you’ll see the IR transmitter LED:
The same type of LED is used in IR transmitter breakout boards for the Arduino. You can see it at the front of this Keyes IR transmitter:
The IR receiver is a photodiode and pre-amplifier that converts the IR light into an electrical signal. IR receiver diodes typically look like this:
Some may come on a breakout board like this:
IR Signal Modulation
IR light is emitted by the sun, light bulbs, and anything else that produces heat. That means there is a lot of IR light noise all around us. To prevent this noise from interfering with the IR signal, a signal modulation technique is used.
In IR signal modulation, an encoder on the IR remote converts a binary signal into a modulated electrical signal. This electrical signal is sent to the transmitting LED. The transmitting LED converts the modulated electrical signal into a modulated IR light signal. The IR receiver then demodulates the IR light signal and converts it back to binary before passing on the information to a microcontroller:
The modulated IR signal is a series of IR light pulses switched on and off at a high frequency known as the carrier frequency. The carrier frequency used by most transmitters is 38 kHz, because it is rare in nature and thus can be distinguished from ambient noise. This way the IR receiver will know that the 38 kHz signal was sent from the transmitter and not picked up from the surrounding environment.
The receiver diode detects all frequencies of IR light, but it has a band-pass filter and only lets through IR at 38 kHz. It then amplifies the modulated signal with a pre-amplifier and converts it to a binary signal before sending it to a microcontroller.
IR Transmission Protocols
The pattern in which the modulated IR signal is converted to binary is defined by a transmission protocol. There are many IR transmission protocols. Sony, Matsushita, NEC, and RC5 are some of the more common protocols.
The NEC protocol is also the most common type in Arduino projects, so I’ll use it as an example to show you how the receiver converts the modulated IR signal to a binary one.
Logical ‘1’ starts with a 562.5 µs long HIGH pulse of 38 kHz IR followed by a 1,687.5 µs long LOW pulse. Logical ‘0’ is transmitted with a 562.5 µs long HIGH pulse followed by a 562.5 µs long LOW pulse:
This is how the NEC protocol encodes and decodes the binary data into a modulated signal. Other protocols differ only in the duration of the individual HIGH and LOW pulses.
IR Codes
Each time you press a button on the remote control, a unique hexadecimal code is generated. This is the information that is modulated and sent over IR to the receiver. In order to decipher which key is pressed, the receiving microcontroller needs to know which code corresponds to each key on the remote.
Different remotes send different codes for the keypresses, so you’ll need to determine the code generated for each key on your particular remote. If you can find the datasheet, the IR key codes should be listed. If not though, there is a simple Arduino sketch that will read most of the popular remote controls and print the hexadecimal codes to the serial monitor when you press a key. I’ll show you how to set that up in a minute, but first we need to connect the receiver to the 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(); // Ждем следующий сигнал от пульта } }
В случае успешного тестирования ИК-управления сервомотором, можно приступать к испытанию проекта на Ардуино для начинающих в реальных условиях. Но перед этим обязательно позаботьтесь о защите электрических схем и микроконтроллера от возможных брызг воды и влаги. Для этого можно использовать пищевую пленку (пленка свободно пропустит ИК сигнал от пульта дистанционного управления).
Как использовать комплект ИК-ретранслятора
Итак, вы пришли к выводу, что использование инфракрасного ретранслятора в составе домашнего кинотеатра будет лучшим решением. Поздравляю. Осталось осветить еще несколько деталей, которые помогут вам выбрать правильное решение для реализации.
Во-первых, вы должны знать, что, хотя скрытие всего вашего оборудования и использование ретранслятора действительно обеспечивает более чистое пространство / внешний вид вашего домашнего кинотеатра, это только косметическое обновление. Если у вас есть шесть устройств, каждое из которых имеет свои собственные выделенные пульты, все из которых используют ИК-порт, у вас все еще есть проблема: для этих шести (или любого другого количества) пультов потребуются собственные ИК-повторители !
Для этого существуют специальные решения, такие как система Cables Direct IR Repeater System, которая позволяет разместить 1 датчик в любом месте по вашему выбору, которое передает ИК-сигналы обратно на 6 различных излучателей. Это решит проблему с кабелем ниже по потоку в шкаф с оборудованием, но, эй, наличие только 1 кабеля к ИК-датчику в выбранном вами положении – это прогресс. У этого репитера Cables Direct даже есть красивый ИК-приемник на стене, так что с его помощью можно полностью избавиться от шнуров.
Но все это все равно не решает проблему контроллера. Шесть устройств по-прежнему в значительной степени означают, что шесть контроллеров загромождают ваш кинотеатр.
Собираем передатчик IR сигнала.
Подключение IR передатчика к Arduino производится следующим образом: минус передатчика подключаем к пину GND. Плюс подключаем к 3 пину (цифровой выход). Причем, номер пина указан в самой библиотеке IRremote, и выставить другой пин в самом скетче нельзя. Поэтому внимательно удостоверьтесь в том, что плюс передатчика подключен правильно. Так же, желательно, плюс к пину подключать через резистор 180 Ом, чтобы не спалить передатчик (я не использовал).
Открываем скетч для примеров IRsendRawDemo, библиотеки IRremote, находим обьявление одномерного массива irSignal[], где указан код сигнала у формате Raw, и заменяем на свой. Например: .
Проверяем скетч на ошибки, и загружаем его в контроллер. После загрузки, каждые 5 секунд, arduino будет отправлять сигнал. Если поднести его к управляющему устройству, должно произойти какие-то изменение (в моем случае – включение кондиционера). Если нет изменений, проверьте, работает ли сам передатчик: включите камеру на телефоне, и наведите на передатчик. Каждые 5 секунд, передатчик должен засветиться. Если передатчик работает – проверяйте правильность ввода Raw кода сигнала в скетч передатчика. Если передатчик не светится, проверьте подключение и работоспособность передатчика (возможно, Вы подключили передатчик без резистора, и он сгорел, или подключили слишком большой резистор). Переходим к третьему шагу.
Print Keys to an LCD
Instead of printing the key values to the serial monitor, you can also display the information on an LCD. Check out our article on setting up and programming an LCD on the Arduino for more information on programming the LCD, but the basic setup looks like this:
The resistor sets the LCD’s backlight brightness. It can be anything from 200 ohms to about 2K ohms. The potentiometer sets the character contrast. I normally use a 10K ohm potentiometer for this one.
Once everything is connected, upload this code to the Arduino:
Again, if the hex codes don’t match the codes output by your remote, just replace them for each character where it says .
Увеличение дальности радиочастотных модулей 433 МГц
Антенна, которую вы используете как для передатчика, так и для приемника, может реально повлиять на дальность передачи, которую вы сможете получить с помощью этих радиочастотных модулей. На самом деле без антенны вы сможете общаться на расстоянии не более метра.
При правильной конструкции антенны вы сможете общаться на расстоянии до 50 метров. Конечно, это на открытом пространстве. Ваш диапазон в помещении, особенно через стены, будет слегка ослаблен.
Антенна не должна быть сложной. Простой кусок одножильного провода может послужить отличной антеной для передатчика и приемника. Диаметр антенны вряд ли имеет какое-либо значение, если длина антенны правильная.
Самая эффективная антенна имеет ту же длину, что и длина волны, для которой она используется. Для практических целей достаточно половины или четверти этой длины.
Длина волны частоты рассчитывается как:
Длина волны = скорость распространения (v) / частота (f)
В воздухе скорость передачи равна скорости света, которая, если быть точным, составляет 299 792 458 м/с. Итак, для частоты 433 МГц длина волны равна:
Длина волны = 299 792 458 м/с / 433 000 000 Гц = 0,6924 м
Полноволновая антенна длиной 69,24 см довольно длинная, ее использование не очень удобно. Вот почему мы выберем четвертьволновую антенну, длина которой составляет 17,3 см.
На всякий случай, если вы экспериментируете с другими радиопередатчиками, которые используют разные частоты, вы можете использовать ту же формулу для расчета необходимой длины антенны. Довольно просто, верно?
Скачать библиотеку RadioHead (402,8 KiB, скачано: 396)
1Описание и принцип действия ИК датчика препятствий
Инфракрасное (ИК) или infrared (IR) излучение – это невидимое человеческим глазом электромагнитное излучение в диапазоне длин волн от 0,7 до 2000 мкм. Вокруг нас существуют огромное количество объектов, которые излучают в данном диапазоне. Его иногда называют «тепловое излучение», т.к. все тёплые предметы генерируют ИК излучение.
Длины волн разных типов электромагнитного излучения
Модули на основе ИК излучения используются, в основном, как детекторы препятствий для различного рода электронных устройств, начиная от роботов и заканчивая «умным домом». Они позволяют обнаруживать препятствия на расстоянии от нескольких сантиметров до десятков сантиметров. Расстояние до препятствия при этом определить с помощью ИК-сенсора невозможно.
Если оснастить, для примера, своего робота несколькими такими ИК модулями, можно определять направление приближения препятствия и менять траекторию движения робота в нужном направлении.
Модуль сенсора обычно имеет излучатель (светодиод) и детектор (фотодиод) в инфракрасном диапазоне. Инфракрасный светодиод излучает в пространство ИК излучение. Приёмник улавливает отражённое от препятствий излучение и при определённой интенсивности отражённого излучения происходит срабатывание. Чтобы защититься от видимого излучения, фотодиод имеет светофильтр (он выглядит почти чёрным), который пропускает только волны в инфракрасном диапазоне. Разные поверхности по-разному отражают ИК излучение, из-за чего дистанция срабатывания для разных препятствий будет отличаться. Выглядеть ИК модуль может, например, вот так:
Модуль с ИК излучателем и ИК приёмником
Когда перед сенсором нет препятствия, на выходе OUT модуля напряжение логической единицы. Когда сенсор детектирует отражённое от препятствия ИК излучение, на выходе модуля напряжение становится равным нулю, и загорается зелёный светодиод модуля.
Помимо инфракрасного свето- и фотодиода важная часть модуля – это компаратор LM393 (скачать техническое описание на LM393 можно в конце статьи). С помощью компаратора сенсор сравнивает интенсивность отражённого излучения с некоторым заданным порогом и устанавливает «1» или «0» на выходе. Потенциометр позволяет задать порог срабатывания ИК датчика (и, соответственно, дистанцию до препятствия).
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
После этого необходимо подключить заголовочный файл библиотеки в программу.
Arduino
#include <IRremote.h>
1 | #include <IRremote.h> |
Затем в программе необходимо указать контакт платы Arduino, к которому подключен контакт данных (Data pin) инфракрасного приемника. В нашем случае он подключен к контакту D2 платы Arduino.
Arduino
int IRPIN = 2;
1 | intIRPIN=2; |
После этого необходимо создать объект для работы с инфракрасным приемником.
Arduino
IRrecv irrecv(IRPIN);
1 | IRrecvirrecv(IRPIN); |
Далее объявим объект класса decode_results – он будет использоваться инфракрасным приемником для передачи декодированной информации.
Arduino
decode_results result;
1 | decode_resultsresult; |
Внутри функции setup() инициализируем последовательную связь и инфракрасный приемник при помощи вызова функции irrecv.enableIRIn().
Arduino
void setup()
{
Serial.begin(9600);
Serial.println(«Enabling IRin»);
irrecv.enableIRIn();
Serial.println(«Enabled IRin»);
Initialize_streamer();
}
1 |
voidsetup() { Serial.begin(9600); Serial.println(«Enabling IRin»); irrecv.enableIRIn(); Serial.println(«Enabled IRin»); Initialize_streamer(); } |
В функции loop() мы с помощью функции irrecv.decode будем непрерывно проверять наличие нового сигнала и если новый сигнал был принят, то его код мы будем сохранять в переменной result.value.
Arduino
void loop()
{
if (irrecv.decode(&result))
{
Serial.print(«Value: «);
Serial.println(result.value, HEX);
Write_streamer();
irrecv.resume();
}
delay(500);
}
1 |
voidloop() { if(irrecv.decode(&result)) { Serial.print(«Value: «); Serial.println(result.value,HEX); Write_streamer(); irrecv.resume(); } delay(500); } |
Для передачи данных из Arduino в лист Excel мы будем использовать плагин PLX-DAQ (ранее мы его уже использовали в проекте логгера данных температуры и влажности на основе Arduino). С помощью функции Write_streamer() мы будем передавать данные последовательно в специальном формате (фактически, это формат файлов .csv, которые можно считать с помощью Excel), которые нам будут затем необходимы для вывода информации в лист Excel.
Arduino
void Write_streamer()
{
Serial.print(«DATA»); //всегда передавайте «DATA» чтобы показать что следующая информация будет представлять собой данные
Serial.print(«,»); // переходим к следующему столбцу используя символ «,»
Serial.print(result.value, HEX); //сохраняем данные в Excel
Serial.print(«,»); // переходим к следующему столбцу используя символ «,»
Serial.print(button); // сохраняем данные в Excel
Serial.print(«,»); // переходим к следующему столбцу используя символ «,»
Serial.println(); //конец строки, переходим к следующей строке
}
1 |
voidWrite_streamer() { Serial.print(«DATA»);//всегда передавайте «DATA» чтобы показать что следующая информация будет представлять собой данные Serial.print(«,»);// переходим к следующему столбцу используя символ «,» Serial.print(result.value,HEX);//сохраняем данные в Excel Serial.print(«,»);// переходим к следующему столбцу используя символ «,» Serial.print(button);// сохраняем данные в Excel Serial.print(«,»);// переходим к следующему столбцу используя символ «,» Serial.println();//конец строки, переходим к следующей строке } |
После того как аппаратная и программная части проекта будут готовы, можно будет загружать программу в плату Arduino. После загрузки кода в плату направьте пульт ДУ на спроектированный нами декодер и начинайте нажимать на нем кнопки. Шестнадцатеричный код (hex code) каждой кнопки будет печататься в окне монитора последовательной связи (serial monitor).