Как работает инфракрасная связь
Как и другие системы связи, инфракрасная связь также имеет передатчик и приемник. Передатчик в инфракрасной связи похож на обычный светодиод, но он испускает свет в инфракрасном диапазоне, а не в видимом. А инфракрасный приемник представляет собой фотодиод с интегрированным в него предварительным усилителем, который преобразует инфракрасный свет в электрический сигнал. Для осуществления инфракрасной связи ее передатчик и приемник должны быть направлены друг на друга.
Когда на привычном нам пульте ДУ (дистанционного управления) вы нажимаете какую либо кнопку, инфракрасный светодиод (IR LED) испускает инфракрасный свет. Этот свет улавливается инфракрасным приемником, который обычно представляет собой фотодиод или фототранзистор. Но инфракрасный свет также формируется Солнцем, лампами накаливания и вообще любыми предметами, которые производят тепло. Это обстоятельство может помешать осуществлению инфракрасной связи. Чтобы этого не происходило, сигнал передатчика модулируется несущей частотой от 36 до 46 кГц. При приеме сигнала инфракрасный приемник производит демодуляцию сигнала и преобразует его в двоичный код перед подачей его на микроконтроллер.
В нашем проекте мы будем использовать пульт ДУ от телевизора для передачи инфракрасных сигналов и инфракрасный приемник TSOP1838 для их приема.
Начинаем работать с ИК приемником, или будем управлять светодиодами с пульта.
Для реализации этого проекта нам понадобиться немного
радиодеталей: ИК приемник (VS 1838B), пульт ДУ (подойдет любой, но я буду
использовать пока пульт от набора ардуино), два резистора на 100-200 Ом,
конденсатор 10 мкФ, три светодиода разных цветов, и макетные провода с макетной
платой.
Теперь немного теории (без этого никуда). Инфракрасный
пульт дистанционного управления — один из самых простых способов взаимодействия
с электронными приборами. Наверняка в каждом доме найдётся немало таких
устройств: телевизор, музыкальный центр, видеоплеер, кондиционер. А можно ли с
помощью ПДУ (пульт дистанционного управления) управлять нашей Arduino Uno?
Оказывается да! Для начала поставим скромную задачу: с помощью ПДУ зажигать и
гасить светодиоды.
Для начала нам понадобиться любой ИК пульт (если у вас
остались старые ИК ПДУ, то вот можно найти им применение). Такие устройства ИК работают испуская на
инфракрасном светодиоде импульсы ИК излучения определённой частоты
(приблизительно от 38 до 40 кГц). Соответственно приемник (в нашем случае это VS1838B)
может принимать любой ИК излучение, но «ненужное» излучение (несущая) должно
быть отфильтровано (иначе будут ложные срабатывания), и в итоге остаётся только
«нужный» сигнал данных (который передается при нажатии на кнопку ПДУ).
Но вернемся к нашему приемнику ИК VS1838B
Важно его
грамотно подключить. А для этого давайте сначала познакомимся с его выводами.
Он имеет три вывода: если посмотреть на датчик со стороны приёмника ИК сигнала,
как показано на рисунке, то слева будет — выход на контроллер, по центру —
отрицательный контакт питания (земля), и справа — положительный контакт питания
(2.7 — 5.5В)
Далее собираем
схему и давайте подключим библиотеку IRremote (ее можно будет загрузить с Яндекс диска по этой ссылке). Если кто еще не знает как это
сделать, то вот здесь можно будет все наглядно посмотреть (ссылка на видео).
Следующим этапом нам нужно убедиться, что наш ПДУ действительно подает сигналы
на ИК приемник и все отображается в мониторе порта. Вообще для этого есть
отдельный скетч (который можно загрузить из примера в библиотеке IRremote), но
давайте сразу убьём обоих зайцев: возьмём готовый скетч (который мы в
дальнейшем будем настраивать).
/*
Arduino, ИК(IR)
приемник и пульт управления
*/
// Подключаем библиотеку для работы с IR приемником
#include
<IRremote.h>
#define
LED_PIN
int IRRECV_PIN = 2;
// Для управления цветом светодиода используем 3 ШИМ
порта
int
bluePin = 9;
int
greenPin = 10;
int
redPin = 11;
// Выставляем, на каком порту весит выход IR приемника
IRrecv
irrecv(IRRECV_PIN);
decode_results
res;
void setup() {
// Включаем
последовательное соединение с ПК
Serial.begin(9600);
// Включаем IR
приемник
irrecv.enableIRIn();
// НАстраиваем
выходы для нашего RGB светодиода
pinMode(bluePin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(redPin, OUTPUT);
}
void
loop() {
// Принимаем и декодируем сигнал
if (irrecv.decode(&res)) {
// Сохраняем полученное значение в
переменной
int value =
res.value;
// Выводим на
монитор последовательного порта значения.
Serial.println(value);
// В
зависимости от кода полученного сигнала, выполняем действия.
// Для
используемого пульта кнопки 1,2,3 — RGB свечение, 9 — выключение
if (value == 26775){
setColor(255, 0, 0);
} else if (value == 12495){
setColor(0, 255, 0);
} else if (value == 6375){
setColor(0, 0, 255);
} else if (value == 31365){
setColor(0,
0, 0);
}
// Даем команду
получать следующее значение
irrecv.resume();
}
}
// Функция включения необходимого цвета на нашем RGB
светодиоде
void
setColor(int red, int green, int blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
Чтение кодов кнопок ПДУ
Когда мы нажимаем кнопку на пульте дистанционного управления, он через инфракрасный светодиод отправляет специально закодированный уникальный код кнопки.
Прежде чем мы начнем управлять светодиодами или реле, нам нужно знать коды каждой кнопки ПДУ (или, по крайней мере, тех кнопок которыми мы хотим управлять).
В этом нам поможет пример из библиотеки. Чтобы запустить его, выберите Файл > Примеры > 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-, никакой код выполняться не будет.
Управляем освещением при помощи датчика освещенности
В этом примере наш блок управления светом будет управлять светом автоматически. Поможет ему в этом датчик освещенности, который будет передавать информацию на микроконтроллер о состоянии текущего показателя освещения. Если освещенность очень низкая, то микроконтроллер будет автоматически включать лампочку, подключенную к сети 220 вольт. Такую систему освещения еще называют адаптивной. Для примера сборки схемы с адаптивным освещением потребуется такое оборудование и ПО:
- Arduino UNO — одна из разновидностей плат ардуино;
- Блок реле SRD-12VDC-SL-C;
- Резистор на 10 кОм;
- Фоторезистор (выступает в роли датчика освещенности);
- Arduino IDE — программное обеспечение для загрузки микрокода в микроконтроллер Arduino;
- Лампочка, подключаемая к сети 220 вольт.
Первым делом соберем схему с помощью этих компонентов изображенную ниже.
Теперь откроем Arduino IDE и внесем в нее такой код:
Этот код не предназначен для включения нашей лампочки. С помощью этого кода мы проверим наш датчик освещенности. Поэтому загрузим этот код в Arduino UNO и откроем «Монитор порта».
В «Мониторе порта» видно, что мы получаем значения с фоторезистора, а это значит, что он нормально функционирует. Теперь пришло время загрузить основной код для автоматического управления светом. Для этого вставьте этот код в Arduino IDE:
Принцип работы этого скетча основан на условном операторе, при котором выполняется условие «s2 < 700». Это условие означает, что при значении датчика меньше 700 лампочка будет включаться, а если значение больше 700, то лампочка отключится. Из примера видно, как легко можно создать адаптивную систему автоматического освещения.
Управление скоростью коллекторного двигателя с помощью ИК пульта
Есть задача, регулировать пультом скорость коллекторного двигателя. Сам пока только познаю азы в понятиях Ардуино. Нашел в нете подходящий по-помему мнению скетч, с регулировкой светодиода, но при компиляции он выдает ошибку в строке 46. Подскажите, господа разбирающиеся, что здесь неправильно?
Да, это не заметил, но увы — не полегчало. Выдает вот такую ошибку:
sketch_mar29e:46: error: ‘pinl’ was not declared in this scope
exit status 1 ‘pinl’ was not declared in this scope
Нашел еще один скетч, он нормально заливается в плату, но ничего не работает. (коды пульта изменены на мои):
Какой из них предпочтительнее и легче привести в рабочее состояние?
Потому что в строке 13 написано pin1, а в строке 46 написано pinl. Разницу видите?
Спасибо, уже увидел! А по второму скетчу навскидку ничего не видно проблематичного?
В первом: int RECV_PIN = 11;
Во втором: int RECEIVE_PIN = 2;
К какой ноге реально подключен датчик?
Датчик пульта перевешивал на нужную ногу. Скорее всего где-то контакта не было. Сейчас заработали оба скетча, первый оказался немного не такой как надо — регулировка одной кнопкой по кругу минимум-максимум. Во второй добавляю регулировку второго двидателя — опять какая-то засада. Знаний мало, а хочется сделать что-то сразу. Вот переделанный скетч, посмотрите, ПОЖАЛУЙСТА, что я не так наковырял?
Источник
Инструкция по изготовлению лодки с пультом
Проверку работы ИК-приемника и сервомотора на Ардуино лучше проводить с отключенным электромоторчиком, поскольку он будет создавать сильные вибрации при работе. На этом этапе тестирования проекта следует лишь оценить подвижность киля и отцентровать рычаг привода на сервомоторе. Необходимо сделать так, чтобы при нажатии кнопки «вперед» или «стоп» на пульте, киль вставал по центру.
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(); // Ждем следующий сигнал от пульта } }
В случае успешного тестирования ИК-управления сервомотором, можно приступать к испытанию проекта на Ардуино для начинающих в реальных условиях. Но перед этим обязательно позаботьтесь о защите электрических схем и микроконтроллера от возможных брызг воды и влаги. Для этого можно использовать пищевую пленку (пленка свободно пропустит ИК сигнал от пульта дистанционного управления).
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
Управляем освещением при помощи датчика приближения
Датчик приближения удобно использовать для сигнализации, но мы его будем использовать для автоматического включения света при сближении с каким-либо объектом. Например, если человек входит в темный угол какого-то помещения, датчик его регистрирует, и микроконтроллер включает свет в этом месте.
Для этого примера потребуется такое оборудование и ПО:
- Arduino UNO — одна из разновидностей плат Ардуино;
- PIR-датчик;
- Блок реле SRD-12VDC-SL-C;
- Arduino IDE — программное обеспечение для загрузки микрокода в микроконтроллер Arduino;
- Лампочка, подключаемая к сети 220 вольт.
Как и в предыдущих примерах, первым делом соберем схему, представленную ниже.
Теперь наберем в Arduino IDE код, представленный ниже, и загрузим его на плату:
Принцип работы этой программы детально описан в ее комментариях. Проверить работу датчика можно с помощью «Монитора порта», в котором будут выводиться сообщения «The object started moving» и «The object does not move».
Управление Ардуино с помощью ИК приемника и пульта
Нам понадобится:
Ссылочка на 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 Демонстрация работы данной программы можно увидеть в видео приведенном в конце статьи.
Радиоуправление на Arduino
Соберем радиоуправление на основе Arduino Uno и радиомодуля MX-05v. Этот модуль работает на частоте 443 МГц, что позволяет использовать его под водой (волны в диапазоне 2.4 ГГц не проникают под воду). Потом поставим его на модель Радиоуправляемой Подводной Лодки.
Радиомодуль MX-05V + MX-FS-03V подкупает своей низкой ценой – около 60 рублей за пару. Заявленной дальности связи 20-200 метров хватает для небольших моделей машин или лодок.
Сделаем одноканальную аппаратуду. Для этого нам понадобятся:
- 2 платы Ардуино для приемника и передатчика
- комплект радиомодуля MX-05V + MX-FS-03V
- переменный резистор или джойстик для передатчика
- рулевая машинка (серва) для приемника
Суть работы программы заключается в следующем:
- считываем значение с переменного резистора (число от 0 до 1023)
- переводим это число в 2 байта (16 бит, т.к. 1023 занимает 10 бит и не поместится в один байт)
- передаем по радио-каналу
- приемник принимает 2 байта по радио каналу
- переводит их обратно в число от 0 до 1023
- передает команду серво-машинке
Принцип работы Arduino доступно описан на разных веб-ресурсах. Мне понравился бесплатный обучающий онлайн курс «Строим роботов и другие устройства на Arduino». Рекомендую.
https://youtube.com/watch?v=VcrG3KMn6o4
Загружаем текс программы (скетч) для передатчика и приемников. Кстати, программы надо хранить в разных папках, иначе во время компиляции они будут сливаться в один файл и конфликтовать из-за дублирования функций setup и loop. Как подключить сторонние библиотеки к Arduino описано например тут.
Передатчик
// Библиотека передатчика
#include void setup() { // Запуск передатчика vw_set_ptt_inverted(true); vw_setup(1000); // Bits per sec } void loop() { // чтение показаний с переменного резистора int sensorValue = analogRead(A0); // отправляем значение send(sensorValue); } void send(int param) { // конвертируем int в массив из 2 байт uint8_t msg; int len = 2; msg = highByte(param); msg = lowByte(param); // отправляем непосредственно в радиоканал vw_send(msg, len); // ждем пока сообщение не уйдет целиком vw_wait_tx(); }
Приемник
// Библиотека для приемника
#include // Библиотека для серво машинки. В отличии от обычной Servo.h не конфликтует с VirtualWire.h
// Скачать библиотеку можно тут. // http://en.osdn.jp/projects/sfnet_pgahtow/downloads/Arduino%20(v1.0)%20libaries/ServoTimer2.zip/
// Надо закомментировать 41 строчку в файле ServoTimer2.
h в случае ошибки компиляции
// ‘typedef uint8_t boolean;’
#include // Создаем объект серво-машинки
ServoTimer2 myservo; void setup() { // для отладки // Serial.begin(9600); // Запуск приемника vw_set_ptt_inverted(true); vw_setup(1000); // бит в секунду vw_rx_start(); // запуск приемника // подключаем серво к 6 пину myservo.
attach(6);
} void loop() { uint8_t msg; uint8_t len = 2; if (vw_get_message(msg, &len)) { // переводим байты в int int value = word(msg, msg); // подгоняем под диапазон входных данных сервы int sValue = map(value, 0, 1023, 600, 2400); myservo.write(sValue); // Serial.
println(sValue); }
}
И в итоге – ничего не работает! Почему?
Питание
Радиомодуль MX-05V очень простой, из-за этого он очень восприимчив к внешним помехам. И даже такой маленький мотор как в серво-машинке способен нарушить его работу.
Для того, чтобы минимизировать влияние электромотора (это касается только колекторных моторов), нужно разделить питание силовой части от приемника. При этом «минус» у них должен быть общий.
Итоговая схема подключения приемника выглядит так.
Результат
Данные радиомодуль слишком восприимчив к помехам, и управлять летательной техникой на нем нельзя. Но для игрушечной машинки или лодки вполне подойдет.
Библиотеки для работы с IR
Для работы с ИК устройствами можно использовать библиотеку IRremote, которая позволяет упростить построение систем управления. Скачать библиотеку можно здесь. После загрузки скопируйте файлы в папку \arduino\libraries. Для подключения в свой скетч библиотеки нужно добавить заголовочный файл #include <IRemote.h>.
Для чтения информации используется пример IRrecvDumpV2 из библиотеки. Если пульт уже существует в списке распознаваемых, то сканирование не потребуется. Для считывания кодов нужно запустить среду ARduino IDE и открыть пример IRrecvDemo из IRremote.
Существует и вторая библиотека для работы с ИК сигналами – это IRLib. Она похожа по своему функционалу на предыдущую. По сравнению с IRremote в IRLib имеется пример для определения частоты ИК датчика. Но первая библиотека проще и удобнее в использовании.
После загрузки библиотеки можно начать считывать получаемые сигналы. Для этого используется следующий код.
Оператор decode_results нужен для того, чтобы присвоить полученному сигналу имя переменной results .
В коде нужно переписать «HEX» в «DEC».
Затем после загрузки программы нужно открыть последовательный монитор и нажимать кнопки на пульте. На экране будут появляться различные коды. Нужно сделать пометку с тем, к какой кнопке соотносится полученный код. Удобнее полученные данные записать в таблицу. После этот код можно записать в программу, чтобы можно было управлять прибором. Коды записываются в память самой платы ардуино EEPROM, что очень удобно, так как не придется программировать кнопки при каждом включении пульта.
Бывает, что при загрузке программы выдается ошибка «TDK2 was not declared In his scope». Для ее исправления нужно зайти в проводник, перейти в папку, в которой установлено приложение Arduino IDE и удалить файлы IRremoteTools.cpp и IRremoteTools.h. После этого нужно произвести перезагрузку программы на микроконтроллер.
Скетч для 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); }
3Скетч Arduino для инфракрасного датчика препятствий
Скетч для работы с инфракрасным сенсором препятствий также предельно простой: мы будем читать показания с выхода модуля и выводить в монитор порта. А также, если ИК модуль обнаружил препятствие, будем сообщать об этом.
const int ir = A7; void setup() { Serial.begin(115200); } void loop() { int r = analogRead(ir); // r в диапазоне от 0 до 1023 Serial.println(r); if (r < 100) { // т.к. используется аналоговый пин Arduino Serial.println("Detected!"); } delay(100); }
Напомню, в Arduino используется 10-разрядный АЦП, поэтому значение аналогового сигнала кодируется числом в диапазоне от 0 до 1023. При использовании аналогового входа Arduino предельные значения «0» или «1023» мы вряд ли получим с датчика, поэтому лучше использовать некоторый порог, например, равный 100 (поэтому в скетче r < 100). При использовании же цифрового вывода Arduino для чтения показаний инфракрасного датчика, можно можно написать (r == LOW) или (r == 0) или (r < 1).
Хорошая статья про аналоговые измерения на Arduino.
Думаю, довольно понятно, как найти применение такому модулю в ваших проектах. Необходимо периодически опрашивать состояние на выходе модуля, и как только напряжение меняется с HIGH на LOW, предпринимать необходимые действия: менять направление движения робота, включать свет в помещении и т.п.
Управляй телевизором силой мысли и Arduino
Название проекта: Управляй телевизором силой мысли и ArduinoПлатформа: Arduino
Пульт от телевизора больше не нужен. Все что нужно сделать – это подумать о смене канала. В проекте использован чип из игры Star Wars Force Trainer (Звездные войны), выпущенной в 2009 году.
Использованные компоненты: Arduino UNO, игра Star Wars Force Trainer, ИК-приемник / ИК-передатчик
,
Сайт проекта: http://goo.gl/8lwjjp
Если вы когда-нибудь мечтали переключать каналы телевизора, просто думая, об этом, то этот arduino-проект – ваша удача. Не только системы “умный дом”, но и магия становятся реальностью.
Более того, некоторые проекты мейкеров доказывают, что фантастические трюки можно сделать самому, затратив при этом не много средств.
Она включает в себя гарнитуру, способную обнаруживать электрические поля разума (по аналогии с ЭЭГ). Сигналы ретранслируются и вентилятор поднимает мяч, находящийся в трубе, в воздух. Иллюзия левитации. Сила работы вентилятора зависит от мыслей пользователя.
https://youtube.com/watch?v=jIIm9sU681c
Мейкер разобрал игру и обнаружили чип NeuroSky ЭЭГ, встроенный в гарнитуру, который он решил подключить к Arduino Uno (ATmega328), чтобы собирать и преобразовывать исходные данные ЭЭГ на компьютере. В проекте также были использованы ИК-приемник и ИК-передатчик от старого видеомагнитофона.
Чтобы посмотреть какие сигналы передает пульт дистанционного управления на ИК-приемник при нажатии кнопок достаточно воспользоваться Serial-монитором, предварительно загрузив в arduino простую программу.
Код кнопки нужно записать для последующего использования. Написав совсем немного строк кода, мейкер создал умопомрачительный проект. Шлем позволяет переключать каналы на ТВ и выключать его питание, просто путем сосредоточения мыслей.
Исходный код проекта можно скачать на GitHub.
Другие проекты на этой платформе:
- Робот на Arduino, управляемый с помощью жестов
- Как сделать аниматронный хвост
- Вездеход из Lego с видео и bluetooth на Raspberry Pi
- Робот Juno: изучай Arduino и программирование
- Робот-манипулятор из настольной лампы IKEA
- Arduino-робот, объезжающий препятствия
- Роботизированная интеллектуальная система — РИС
- Серво-выключатель света для умного дома
- Робот-рыба на Arduino
- Сделай сам большого человекоподобного робота