How to use an ir receiver and remote with arduino

Увеличение дальности радиочастотных модулей 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)

Подключаем 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. Работа над ошибками

Схема подключения ИК-приемника

Я же решил пойти несколько другим путем, может быть «варварским», но от этого не менее, а даже более эффективным.

Рис. 1. Примерная принципиальная схема включения ИК-приемника в ресиверах.

Рис. 2. Структурная схема фото-приемника TSOP4838.

На рисунке 1 показана схема включения фотоприемника дистанционного управления ресивера «Topfield 5000СІ». Схема состоит из интегрального фотоприемника TSOP4838 и нескольких деталей. Практически все аналогичные схемы других ресиверов выполнены точно так же, разница только в том, какой интегральный фотоприемник, на какую частоту, ну и цоколевка может отличаться.

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

На рисунке 2 показана структурная схема фотоприемника TSOP4838. Как видно, на выходе транзисторный ключ, подтянутый к плюсу питания через резистор 33 kOm. Похоже, 33 kOm показалось много, и в схеме на рисунке 1 параллельно ему включен еще резистор на 10 kOm.

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

Рис. 3. Принципиальная схема подключения дополнительного фотоприемника к спутниковому тюнеру.

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

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

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

Сам дополнительный фотоприемник прилепил к корпусу телевизора обычной изолентой.

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

Блок-схема TSOP17XX

Фотодатчики TSOP17XX снабжены полосовым фильтром, автоматической регулировкой усиления (AGC) и интегратором, что позволяет избежать изменений выходного сигнала из-за шумов или других помех

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

  • Несущая частота принимаемого сигнала должна быть близка к центральной частоте полосового фильтра устройства. Например: Несущая частота должна быть близка к 38 кГц для TSOP1738.
  • Длина пакета должна быть больше или равна 10 циклам / пакетам и меньше или равна 70 циклам / пакетам.
  • После каждого отправленного пакета необходимо выдерживать паузу не менее 14 циклов.
  • Пауза, по крайней мере, такой же длины, что и отправленный пакет, необходим в для пакетов длиной более 1,8 мс.
  • Он может непрерывно принимать до 1400 коротких очередей.

Conclusion

In this tutorial, I have shown you how to use an IR remote and receiver with Arduino. We looked at several different code examples for determining the IR protocol and identifying the IR key codes for your remote. We then looked at displaying the key/button values in the Serial Monitor and on a 16×2 character LCD. Lastly, I showed you how to control the outputs of the Arduino with the remote to toggle some LEDs on and off. There are many more applications for IR receivers and remotes, so be sure to leave some suggestions in the comments.

I hope you found this article useful and informative. If you did, please share it with a friend that also likes electronics and making things!

I would love to know what projects you plan on building (or have already built) with an IR remote and receiver. If you have any questions, suggestions, or if you think that things are missing in this tutorial, please leave a comment below.

Note that comments are held for moderation to prevent spam.

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Beginner

9.1 Назначение ИК-приемника

ИК-приемник на Ардуино способен принимать и обрабатывать инфракрасный сигнал, в виде импульсов заданной длительности и частоты.
ИК-датчик воспринимает инфракрасный сигнал только на частоте 38 кГц (иногда 40кГц). Именно такое свойство позволяет датчику игнорировать много посторонних световых шумов от ламп освещения и солнца.
Сигналы датчик принимает от пульта с ИК излучателем.
Приемники инфракрасного излучения получили сегодня широкое применение в бытовой технике, благодаря доступной цене, простоте и удобству в использовании. Эти устройства позволяют управлять приборами с помощью пульта дистанционного управления и их можно встретить практически в любом виде техники.

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

  • слева будет — выход на контроллер;
  • по центру — отрицательный контакт питания (земля);
  • и справа — положительный контакт питания (2.7 — 5.5В).

Собираем передатчик IR сигнала.

Подключение IR передатчика к Arduino производится следующим образом: минус передатчика подключаем к пину GND. Плюс подключаем к 3 пину (цифровой выход). Причем, номер пина указан в самой библиотеке IRremote, и выставить другой пин в самом скетче нельзя. Поэтому внимательно удостоверьтесь в том, что плюс передатчика подключен правильно. Так же, желательно, плюс к пину подключать через резистор 180 Ом, чтобы не спалить передатчик (я не использовал).
Открываем скетч для примеров IRsendRawDemo, библиотеки IRremote, находим обьявление одномерного массива irSignal[], где указан код сигнала у формате Raw, и заменяем на свой. Например: .
Проверяем скетч на ошибки, и загружаем его в контроллер. После загрузки, каждые 5 секунд, arduino будет отправлять сигнал. Если поднести его к управляющему устройству, должно произойти какие-то изменение (в моем случае – включение кондиционера). Если нет изменений, проверьте, работает ли сам передатчик: включите камеру на телефоне, и наведите на передатчик. Каждые 5 секунд, передатчик должен засветиться. Если передатчик работает – проверяйте правильность ввода Raw кода сигнала в скетч передатчика. Если передатчик не светится, проверьте подключение и работоспособность передатчика (возможно, Вы подключили передатчик без резистора, и он сгорел, или подключили слишком большой резистор). Переходим к третьему шагу.

Исходный код программы

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

Затем необходимо подключить библиотеку для работы с ЖК дисплеем и инициализировать контакты для работы с ЖК дисплеем и управления домашними электронными устройствами.

После этого необходимо инициализировать последовательный порт, ЖК дисплей и задать направление работы инициализированных контактов.

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

Далее приведен полный текст программы.

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

#include <LiquidCrystal.h>
#include <IRremote.h>

constintRECV_PIN=14;

IRrecvirrecv(RECV_PIN);

decode_resultsresults;

LiquidCrystallcd(6,7,8,9,10,11);

#define Fan 3
#define Light 4
#define TV 5

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

}

}

Why do we use 33% duty cycle

  • Carrier duty cycle 50 %, peak current of emitter IF = 200 mA, the resulting transmission distance is 25 m.
  • Carrier duty cycle 10 %, peak current of emitter IF = 800 mA, the resulting transmission distance is 29 m. — Factor 1.16
    The reason is, that it is not the pure energy of the fundamental which is responsible for the receiver to detect a signal.
    Due to automatic gain control and other bias effects high intensity and lower energy (duty cycle) of the 38 kHz pulse counts more than high low intensity and higher energy.

BTW, the best way to increase the IR power is to use 2 or 3 IR diodes in series. One diode requires 1.1 to 1.5 volt so you can supply 3 diodes with a 5 volt output.
To keep the current, you must reduce the resistor by (5 — 1.3) / (5 — 2.6) = 1.5 e.g. from 150 ohm to 100 ohm for 25 mA and 2 diodes with 1.3 volt and a 5 volt supply.
For 3 diodes it requires factor 2.5 e.g. from 150 ohm to 60 ohm.

Using the IR Remote to Control Things

Now I’ll show you a simple demonstration of how you can use the IR remote to control the Arduino’s output pins. In this example, we will light up an LED when a particular button is pressed. You can easily modify the code to do things like control servo motors, or activate relays with any button press from the remote.

The example circuit has the IR receiver connected to the Arduino, with a red LED connected to pin 10 and a green LED connected to pin 11:

The code below will write digital pin 10 HIGH for 2 seconds when the “5” button is pressed, and write digital pin 11 HIGH for 2 seconds when the “2” button is pressed:

So far we have covered the properties of infrared radiation and how communication happens between the transmitter and receiver. We saw how to identify the IR key codes for a given remote control. We learned how to display key presses on serial monitor and on an LCD screen. Finally I showed you how to control the Arduino’s output with the remote. Have fun playing with this and be sure to let us know in the comments if you have any questions or trouble setting this up!

Krishna Pattabiraman is a frequent guest writer on Circuit Basics and the founder of www.codelectron.com.

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

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

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

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

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

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

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

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

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

unsigned int data = 0x34346897;

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

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

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

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

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

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

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

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

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

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

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

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

Размеры и форма лодки могут быть абсолютно разными — все зависит лишь от фантазии. Что касается прорезей, то они должны соответствовать размерам деталей. На трафарете (слева-направо) размечены прорези для: платы Ардуино 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(); // Ждем следующий сигнал от пульта
  }  
}

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