Управление arduino с ик приемником tsop 1833

Подключаем Arduino к Интернету.

Общая суть всей затеи, это на контролере поднять web сервер, и при отправки GET запроса на Arduino, создать событие включение кондиционера. Для подключение Arduino к сети Интернет, используем модуль Enc28j60. Подключаем его к контроллеру по следующей схеме:
Arduino — Enc28j60
10 — CS
11 — SI (ST)
12 — SO
13 — SCK
5V — 5V
GND — GND
Хочу остановиться на такой проблеме: сам чип модуля Enc28j60 работает с напряжением 3.3V. Я использую контроллер Arduino Pro Mini 5V, соответственно и модуль Enc28j60 я использую с штатным стабилизатором AMS1117. То есть, по идеи, я могу сразу подавать питание к пину на Enc28j60 — 5V, и все будет нормально. Но при таком подключении, у меня модуль отказывался работать! Потеряв более полдня на танцы с бубном, решил попробовать подключить питание на пин 3.3v, с использованием еще одного стабилизатора AMS1117, и все заработало. Как оказалось, штатный стабилизатор вышел из строя.
Итак, после подключения модуля к контроллеру, нужно скачать еще одну библиотеку ETHER_28J60, и установить.
Создаем новый скетч, и вставляем следующий код

#include <enc28j60.h>
#include <etherShield.h>
#include <ETHER_28J60.h>
#include <ip_arp_udp_tcp.h>
#include <net.h>
#include <IRremote.h>
IRsend irsend;
static uint8_t mac = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};
static uint8_t ip = {192, 168, 4, 45};
static uint16_t port = 80;
ETHER_28J60 e;
void setup()
{
  e.setup(mac, ip, port);
}
void loop()
{
  int khz = 38;
  unsigned int irSignal[] = {4400,4350, 550,1550, 550,500, 550,1600, 550,1550, 550,500, 550,550, 550,1550, 550,500, 550,550, 550,1550, 550,500, 550,550, 550,1550, 550,1600, 550,500, 550,1550, 550,1600, 550,500, 550,500, 550,1600, 550,1550, 550,1600, 550,1550, 550,1600, 550,500, 550,1550, 550,1600, 550,500, 550,500, 550,550, 550,500, 550,500, 550,500, 550,1600, 550,500, 550,500, 550,1600, 550,1550, 550,550, 550,500, 550,1550, 550,550, 550,1550, 550,1550, 550,550, 550,500, 550,1550, 550,1600, 550};
  char* params;
  if (params = e.serviceRequest()){
    e.print("<H1>Web Remote</H1>");
    e.print("<A HREF='?cmd=power'>Power</A></br>");
    if (strcmp(params, "?cmd=power") == 0) irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal), khz);
e.respond();
  }
}

Ссылки для скачивания библиотек:
— IRremote
— ETHER_28J60
Продолжение статьи: Создания универсального ИК пульта из Arduino. Работа над ошибками

Компоненты в системе ИК-ретранслятора

В комплекте ИК-повторителя нет тонны компонентов. Основные из них:

  • ИК-приемник – принимает ИК-сигнал и передает этот сигнал на блок подключения.
  • Блок подключения – принимает входящие сигналы от ИК-приемника, обрабатывает их и выводит на подключенные ИК-излучатели / жучки / бластеры.
  • ИК-излучатель, ИК-датчик или ИК-передатчик – устанавливается поверх ИК-приемника или размещается рядом с ним для устройства, принимающего ИК-сигналы. (например, телевизор, кабельная приставка, проигрыватель Blu-Ray и т. д.).

ИК-приемник

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

Блок ИК-подключения

Эта электрическая версия инфракрасного сигнала проходит по проводам от приемника, а оттуда может идти прямо к ИК-излучателю или, возможно, останавливаться на соединительном блоке по пути. Это будет зависеть от того, какой тип устройства вы покупаете. Некоторые простые устройства не имеют блока подключения как такового, вместо этого сигнал будет проходить от приемника к эмиттеру с подключенным к нему источником питания. Но даже немного продвинутые устройства будут иметь соединительный блок, и именно здесь можно управлять несколькими выходами и где при необходимости можно усилить сигнал.

ИК-излучатель, ИК-ошибка или ИК-излучатель

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

Зажигаем светодиоды в случайном порядке, или знакомимся с оператором случайных чисел…

Всем привет! Продолжаем изучать наш ардуино конструктор и сегодня продолжим тему светодиодов. Кто-то скажет что было уже — сколько можно? Ответим на этот раз будет гораздо интереснее. До сих пор мы работали с одним активным светодиодом, а теперь давайте попробуем включить их побольше, скажем этак 7-8 светодиодов. Но при этом заставим их мигать совершенно случайно. Эффект при этом должен получиться очень интересным. 

С чего будем начинать? Правильно с скетча. Хотя лучше пожалуй рассказать сейчас поподробнее о новом операторе случайных чисел: random (x,y). Все очень просто: этот оператор просто будет генерировать случайные числа в диапазоне от х до y. Именно это свойство мы и используем

Далее приведем и скетч:

void setup() 

{

//  инициализация пинов как выходы

for (int i=2; i

Процедура гашения происходит точно так же.

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

И вот как говориться все получилось. Конечно же лучше все это увидеть не на фотографиях а на видео. кроме того видео получилось не просто с демонстрации собранной мигалки, но так же немного затрагивает (главное дает возможность задуматься) некоторые вопросы ардуино (в плане сборки самодельного конструктора, и так же заострил я одну проблему). Приятного просмотра! Вот теперь все на сегодня! Удачи в ваших самоделках!

Скетч для 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);
}

Дистанционное управление освещением

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

Устройство состоит из бестрансформаторного блока питания, микроконтроллера, ИК приёмника. Силовая часть выполнена на реле. Мозгом всей конструкции является микроконтроллер PIC12F675. Он считывает принимаемый фотоприёмником TSOP1736 ИК-сигнал, декодирует его и управляет через транзистор VT1 реле Р1, которое в свою очередь коммутирует источник света. Выбор типа реле зависит от мощности нагрузки и напряжения его питания. В качестве VD2 можно применить КД208. Для индикации работы используется маломощный светодиод HL1 c токоограничивающим резистором R2. Номинал резистора R2 рассчитывается исходя из падения напряжения на HL1 и рабочего тока. Опять же, исходя из минимизации энергопотребления, был взят резистор номиналом побольше. SB1 — малогабаритная кнопка. Она необходима для записи ИК команды в память контроллера любой не используемой кнопки ИК пульта и индикации включения ламп.

После монтажа схемы печатную плату необходимо обязательно промыть спиртом и высушить. Не вставляя контроллера в панель, проверяют необходимые напряжения питания. Если все нормально, снимают напряжение и вставляют ранее запрограммированный микроконтроллер. Снова подают напряжение питания и нажимают на кнопку SB1, схема готова к приему ИК кода. Далее нажимают на любую неиспользуемую кнопку пульта, должен засветиться светодиод HL1 (команда принята и дешифрирована) и сразу же опять нажимаем на SB1 – код команды записан в память контроллера. Промежуток между включением светодиода и нажатие кнопки для записи кода должен быть небольшим. Все. Теперь, при нажатий выбранной вами кнопки, должен будет включаться и выключаться свет.

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

Скачать код программы.

Finding the key codes for your remote

Because there are many different types of remotes on the market (different number of keys and values printed on the keys), we need to determine which received signal corresponds to which key.

The IRremote library will read the signal and output a specific code in the form of a hexadecimal number depending on which key is pressed.

By printing this output in the Serial Monitor, we can create a conversion table.

You can copy the code below by clicking in the top right corner of the code field.

/* Finding the key codes for your remote. More info: https://www.makerguides.com */

#include <IRremote.h> // include the IRremote library

#define RECEIVER_PIN 2 // define the IR receiver pin
IRrecv receiver(RECEIVER_PIN); // create a receiver object of the IRrecv class
decode_results results; // create a results object of the decode_results class

void setup() {
  Serial.begin(9600); // begin serial communication with a baud rate of 9600
  receiver.enableIRIn(); // enable the receiver
  receiver.blink13(true); // enable blinking of the built-in LED when an IR signal is received
}

void loop() {
  if (receiver.decode(&results)) { // decode the received signal and store it in results
    Serial.println(results.value, HEX); // print the values in the Serial Monitor
    receiver.resume(); // reset the receiver for the next code
  }
}

After you have uploaded the code, open the Serial Monitor (Ctrl + Shift + M on Windows). Now press each key on the remote and record the corresponding hexadecimal value that you see in the Serial Monitor.

Serial Monitor output

Note that you will see the code FFFFFFFF when you press on a key continuously. This is the repeat code send by the remote.

For my remote I got the following conversion table:

Key Code
POWER 0xFD00FF
VOL+ 0xFD807F
FUNC/STOP 0xFD40BF
│◄◄ 0xFD20DF
►││ 0xFDA05F
►►│ 0xFD609F
0xFD10EF
VOL- 0xFD906F
0xFD50AF
0xFD30CF
EQ 0xFDB04F
ST/REPT 0xFD708F
1 0xFD08F7
2 0xFD8877
3 0xFD48B7
4 0xFD28D7
5 0xFDA857
6 0xFD6897
7 0xFD18E7
8 0xFD9867
9 0xFD58A7

As you can see in the table, hexadecimal values are indicated by the prefix “0x”.

Note that your table will probably look different! You will have to create your own to use in the rest of the code examples below.

9.4 Передача ИК сигналов между двумя Arduino

9.4.3 Программируем ИК-передатчик

void setup()
{
  pinMode(4, OUTPUT);
}
 
void loop()
{
  digitalWrite(4, HIGH);
  delay(1000); // Wait for 1000 millisecond(s)
  digitalWrite(4, LOW);
  delay(1000); // Wait for 1000 millisecond(s)
}

9.4.4 Программируем ИК-приемник

#include "IRremote.h" 	//подключаем библиотеку
IRrecv irrecv(2);    	// указываем вывод, к которому подключен приемник
decode_results results; //создаем переменную, хранящую результат
int led = 6;         	//объявляем светодиод
 
void setup() {
  pinMode(led, OUTPUT);	//настраиваем пин светодиода как выход
  Serial.begin(9600); 	//настраиваем работу с монитором порта
  irrecv.enableIRIn();	//запускаем прием ИК сигнала
}
 
void loop() {
  if ( irrecv.decode( &results )) {        //если данные пришли
    digitalWrite(led, HIGH);
  else {
    digitalWrite(led, LOW);
  }    
  irrecv.resume();        	//принимаем следующую команду
}

Z- IR receiver. Модуль ИК приемника

Опубликовано 05.05.2014 8:44:00

Модуль ИК Приемника в связке и ИК пультом дистанционного управления позволит легко реализовать дистанционное управление платой Arduino.

Он представляет из себя не что иное, как ИК приемник VS1838B с установленной на плате рекомендуемой производителем обвязкой.

Для работы с данным модулем “из коробки” необходим ПДУ с частотой 38 кГц.

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

• Напряжение питания: 2.7 – 5.5В

• Частота модуляции: 38кГц

• Диапазон температур: – 20 … +  80°C

• Интерфейс: Цифровой

Подключение к Arduino

Модуль оборудован трехпиновым разъемом стандарта 2.54мм

 : подключается к выводу GND

 подключается к выводу +5V

 : подключается к цифровому выводу ( в примере D2 )

Пример работы в среде Arduino

Для работы с данным модулем необходимо установить библиотеку IRRemote

Скачиваем, распаковываем и закидываем в папку libraries в папке Arduino. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.

Считывание показаний кнопок ПДУ

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

В качестве примера будем использовать пульт, как на картинке, т.к. пульт такого типа идет в наборе ИК пульт + ИК модуль приемник

Пример программного кода:

// Тестировалось на Arduino IDE 1.0.3
#include 
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN); //Создаем объект получения сигнала с определенного порта
decode_results results; //Переменная, хранящая результат void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Начинаем прием
} void loop() {
  if (irrecv.decode(&results)) //При получении сигнала…
  { 
    Serial.println(results.value); //…выводим его значение в последовательный порт
    irrecv.resume(); // Получаем следующее значение
  }
}

В мониторе порта должны увидеть слудущее:

При почти секундном удержании каждой кнопки, мы получаем около 10 кодов. Первый из них и является кодом кнопки. А после него начинает идти стандартный код, который сообщает о залипании кнопки.

Управление платой Arduino c ПДУ

Заставим светодиод на плате Arduino (D13) загораться при получении кодировки первой кнопки и выключаться при получении кодировки второй.

Пример программного кода:

// Тестировалось на Arduino IDE 1.0.3
#include  int RECV_PIN = 2;
int LED = 13;
IRrecv irrecv(RECV_PIN);
decode_results results; void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Запуск приемника
  pinMode(LED, OUTPUT);
} void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value);
    if (results.value == 16769565) // При получении кодировки 1
    {
      digitalWrite(LED, HIGH); // Включаем светодиод
    }
    if (results.value == 16761405) // При получении кодировки 2
    {
      digitalWrite(LED, LOW); // Выключаем светодиод
    }
    irrecv.resume(); // Получаем следующее значение
  }
}

Купить в России  Z- Модуль ИК приемника

В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.

Окончательное решение

Домашние кинотеатры и домашние развлекательные системы иногда становятся экспериментом в расцвете сложности. Проблемы требуют все более изобретательных решений. Управление высоким разрешением, многоканальным звуком, а теперь и инфракрасными ретрансляторами иногда заставляет вас чувствовать, что вы пытаетесь управлять небольшим самолетом. Когда все, что вам нужно сделать, это поменять местами входы без разрыва цепи.

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

Да, верно, вы можете сопоставить свои несколько пультов с Harmony Hub и, наконец, обратиться к последнему звену в цепочке: к стеку пультов в вашем кинотеатре. Harmony Hub не только направляет инфракрасные лучи в шкаф или развлекательный центр, хранящийся вне поля зрения, но также переносит всю тяжелую работу пульта дистанционного управления в чистое приложение для смартфона. Я мог бы продолжить об уровне автоматизации, который это позволяет (это и другие примечания по настройке обсуждаются в Руководстве по установке Logitech Harmony Hub, но суть в том, что если вы уже собираетесь устанавливать решение ретранслятора, вы можете захотеть хотя бы вкратце рассмотрим вариант Hub.

Вы также можете использовать Logitech Harmony Hub вместе с комплектом ИК-повторителя! Это отличный метод, если у вас есть несколько разных устройств, которые расположены не очень близко друг к другу.

Источник записи: https://thehometheaterdiy.com

Материалы

В данной статье речь пойдет о радиосвязи, а конкретнее – о радиомодулях, для подключения их к Arduino и об успешном применении в различных проектах.

Самым интересным способом для знакомства с радиомодулями, является установление соединения между двумя платами Ардуино посредством так называемого приемопередатчика.

Наибольшей популярностью среди радиомодулей с поддержкой Arduino пользуются передатчики с частотой 433МГц. Самое такое устройство обычно делиться на две составные части: это приемник и передатчик. Первый модуль имеет 4 вывода для подключения к плате (но один из них можно не использовать) Два из этих вывода отвечают за питание (соответственно, подключаются к таким контактам на плате, как 5V и Gnd (ground – “земля”), а другой к цифровому выходу на плате.

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

Наглядная картинка подключенных модулей есть на фото ниже:

Теперь займемся написанием программного кода. Для этого откроем среду разработки – программу Arduino IDE. Для работы с модулями понадобится специализированная библиотека RCSwitch.h, ее скачать вы можете здесь

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

Начнем с передатчика. Этот модуль будет передавать информацию к другой плате, которая, обработав информацию, выполнит со всей подключенной к ней периферии необходимые действия.

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() 
{
    mySwitch.enableTransmit(2);
}

void loop() 
{
    mySwitch.send(B0100, 4);
    delay(1000);
    mySwitch.send(B1000, 4); 
    delay(1000);
}

Сначала инициализируем библиотеку для работы с модулями, с помощью директивы include

В следующее строчке мы называем наш модуль для дальнейшей работы с ним. Внутри функции void setup прописывается контакт на плате, к которому подключен передатчик. Далее, в цикле, мы можем заметить еще одну новую функцию — mySwitch.send . Она предназначается для непосредственной отправки сообщений. Сначала в ней указывается само сообщение для отправки, а далее размер отправляемого файла. Кстати, указывать отправляемое сообщение можно также и в виде двоичных чисел и строк.

Для приемника будет следующий программный код:

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
    pinMode( 3, OUTPUT );
    mySwitch.enableReceive(0);
}

void loop() {
    if (mySwitch.available()) {
        int value = mySwitch.getReceivedValue();
        if (value == B1000)     
            digitalWrite(3, HIGH);
        else if (value == B0100)   
            digitalWrite(3, LOW);

        mySwitch.resetAvailable();
    }
}

В цикле программного кода можно легко заметить, что при отправке определенного сообщения устанавливается на выходе максимальное напряжение(high), в ином случае – минимальное (low)

Таким образом данный пример-код взаимодействия между элементами радиомодуля вы можете легко применить в собственных проектах: например, ИК-управление с помощь пульта, управление машинкой на этой же основе и многое другое

Надеемся, что статья была для вас полезной. Удачной всем компиляции! И следите за нашим блогом:)

Купить компоненты, используемые в статье, вы можете на нашем сайте: Амперкот.ру

Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.

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

#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
2
3
4
5
6
7
8

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
2
3
4
5
6
7
8
9
10
11

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
2
3
4
5
6
7
8
9
10

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).

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

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

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(); // Ждем следующий сигнал от пульта
  }  
}

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