Управляем бытовой техникой из консоли

Содержание

Hardware Requirements

TODO: Add part numbers of known-good infrared LEDs and receivers. The LED
in this photo is Lumex OED-EL-8L (Digikey 67-1000-ND) and the receiver is
probably Sharp GP1UD281YK0F (now discontinued, Digikey 425-1987-ND).

TODO: Test Vishay TSOP39338 receiver (Digikey 751-1390-5-ND). It’s very
likely to work. Update this photo. Maybe PJRC should sell a known-good
LED & receiver pair?

For transmitting, you must connect the LED to a specific pin. The receiver
output may be connected to any pin.

Board ReceivePin TransmitPin TimerUsed PWM PinsDisabled
Teensy 4.1 / 4.0 Any 8 FlexPWM1.3 None
Teensy 3.6 / 3.5 Any 5 CMT None
Teensy 3.2 / 3.1 Any 5 CMT None
Teensy 3.0 Any 5 CMT None
Teensy LC Any 16 FTM1 17
Teensy 2.0 Any 10 4 12
Teensy 1.0 Any 17 1 15, 18
Teensy++ 2.0 Any 1 2
Teensy++ 1.0 Any 1 2

Как работает инфракрасная связь

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

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

В нашем проекте мы будем использовать пульт ДУ от телевизора для передачи инфракрасных сигналов и инфракрасный приемник TSOP1838 для их приема.

Functionality

The functions available in the library include

hour();            // the hour now  (0-23)
minute();          // the minute now (0-59)
second();          // the second now (0-59)
day();             // the day now (1-31)
weekday();         // day of the week (1-7), Sunday is day 1
month();           // the month now (1-12)
year();            // the full four digit year: (2009, 2010 etc)

there are also functions to return the hour in 12-hour format

hourFormat12();    // the hour now in 12 hour format
isAM();            // returns true if time now is AM
isPM();            // returns true if time now is PM

now();             // returns the current time as seconds since Jan 1 1970

The time and date functions can take an optional parameter for the time. This prevents
errors if the time rolls over between elements. For example, if a new minute begins
between getting the minute and second, the values will be inconsistent. Using the
following functions eliminates this problem

time_t t = now(); // store the current time in time variable t
hour(t);          // returns the hour for the given time t
minute(t);        // returns the minute for the given time t
second(t);        // returns the second for the given time t
day(t);           // the day for the given time t
weekday(t);       // day of the week for the given time t
month(t);         // the month for the given time t
year(t);          // the year for the given time t

Functions for managing the timer services are:

setTime(t);                      // set the system time to the give time t
setTime(hr,min,sec,day,mnth,yr); // alternative to above, yr is 2 or 4 digit yr
                                 // (2010 or 10 sets year to 2010)
adjustTime(adjustment);          // adjust system time by adding the adjustment value
timeStatus();                    // indicates if time has been set and recently synchronized
                                 // returns one of the following enumerations:
timeNotSet                       // the time has never been set, the clock started on Jan 1, 1970
timeNeedsSync                    // the time had been set but a sync attempt did not succeed
timeSet                          // the time is set and is synced

Time and Date values are not valid if the status is timeNotSet. Otherwise, values can be used but
the returned time may have drifted if the status is timeNeedsSync.

setSyncProvider(getTimeFunction);  // set the external time provider
setSyncInterval(interval);         // set the number of seconds between re-sync

There are many convenience macros in the file for time constants and conversion
of time units.

To use the library, copy the download to the Library directory.

Protocol=UNKNOWN

If you see something like as output of e.g. the ReceiveDemo example, you either have a problem with decoding a protocol, or an unsupported protocol.

  • If you have an odd number of bits received, it is likely, that your receiver circuit has problems. Maybe because the IR signal is too weak.
  • If you see timings like then one 450 µs space was split into two 150 and 100 µs spaces with a spike / error signal of 200 µs between. Maybe because of a defective receiver or a weak signal in conjunction with another light emitting source nearby.
  • If you see timings like , then marks are generally shorter than spaces and therefore (specified in your ino file) should be negative to compensate for this at decoding.
  • If you see it may be that the space after the initial mark is longer than . This was observed for some LG air conditioner protocols. Try again with a line e.g. before the line in your ino file.
  • To see more info supporting you to find the reason for your UNKNOWN protocol, you must enable the line in IRremoteInt.h.

Examples

The Time directory contains the Time library and some example sketches
illustrating how the library can be used with various time sources:

  • shows Arduino as a clock without external hardware.
    It is synchronized by time messages sent over the serial port.
    A companion Processing sketch will automatically provide these messages
    if it is running and connected to the Arduino serial port.

  • adds day and month name strings to the sketch above
    Short (3 character) and long strings are available to print the days of
    the week and names of the months.

  • uses a DS1307 real time clock to provide time synchronization.
    A basic RTC library named DS1307RTC is included in the download.
    To run this sketch the DS1307RTC library must be installed.

  • is similar to the above and adds the ability to set the Real Time Clock

  • demonstrates how to calculate the difference between times.
    It is a very simple logger application that monitors events on digital pins
    and prints (to the serial port) the time of an event and the time period since
    the previous event.

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.

Дистанционное управление роботом на базе Ардуино своими руками

Перевёл alexlevchenko для mozgochiny.ru

Сегодня никого не удивишь радиоуправляемыми самоделками.

Но согласитесь, как-то «по старинке» нажимать на клавиши управления… Гораздо интереснее управлять поделками с помощью движений кисти, не так ли? В данной статье показан пример того, как можно организовать дистанционное управление при помощи платы Arduino и нескольких датчиков изгиба. В качестве подопытного будет выступать PHIRO Pro

Шаг 2: Загружаем стандарт Firmata на Arduino

Необходимо загрузить стандарт firmata на плату Ардуино, для того, что соединить её с Pocket Code. В данном проекте используем Arduino UNO, однако может быть использована любая плата Arduino.

  • Подключаем плату Arduino к компьютеру/ноутбуку.
  • В Arduino ID выбираем COM Port. Tools -> Serial Port -> Corresponding COM Port
  • Далее выбираем тип платы. Tools -> Board -> Your Arduino Board
  • Затем выбираем стандарт Firmata. Examples -> Firmata -> Standard Firmata
  • Нажимаем «Upload» и загружаем код на плату.

Шаг 3: Соединяем датчики с платой и крепим их на перчатку

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

Шаг 4: Подсоединяем Bluetooth модуль HC-05 к Arduino

Соединяем выводы bluetooth модуля и платы Arduino следующим образом:

  • HC05 Tx — Arduino Rx
  • HC05 Rx — Arduino Tx
  • Vcc — 5V
  • GND — GND

Шаг 5: Соединяем Arduino с батареей

Используем 9В батарею для питания платы Arduino с Bluetooth модулем. Такой тип компоновки объясняется возможностью легкого монтажа на запястье/браслете. Чем компактнее тем лучше.

Шаг 6: Программа Pocket Code

Ниже представлены примеры использования программы. Прежде всего убедитесь, что PHIRO Pro находится в Mode 3 (Bluetooth Mode). Нажмите на кнопку Mode на PHIRO не раньше, чем синий светодиод, что расположен рядом с дисплеем на верху, включится.

Для программы, в общем есть 7 режимов.

  • Указательный палец выпрямлен. Фары светятся красным. Программа показывает STOP.
  • Указательный и средний палец выпрямлены. Фары светятся зеленым. Программа показывает STOP.
  • Указательный, средний и безымянный пальцы выпрямлены. Фары светятся синим. Программа показывает STOP.
  • Ладонь открыта. PHIRO движется вперёд. Фары светятся белым. Программа показывает FORWARD (вперёд).
  • Ладонь сжата в кулак. PHIRO останавливается. Фары выключены. Программа показывает STOP.
  • Ладонь сжата в кулак и наклонена влево (телефон наклонён влево). PHIRO поворачивает налево. Левая фара светится желтым. Программа показывает LEFT (влево).
  • Ладонь сжата в кулак и наклонена вправо (телефон наклонён вправо). PHIRO поворачивает вправо. Правая фара светится желтым. Программа показывает RIGHT (право).

Шаг 7: Проводим финальный монтаж

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

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

Вот и всё!) Спасибо за внимание)

(A-z Source)

Объяснение программы для 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).

Why do we use 33% duty cycle

We do it according to the statement in the Vishay datasheet:

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

Настройка приложения для Android для создания инфракрасного передатчика

В качестве приложения Android для нашего универсального инфракрасного пульта мы будем использовать приложение MIT’s APP inventor-2, но вы можете использовать любое другое подобное приложение. А если вы еще и профессионал в программировании на Android, то вы можете достигнуть гораздо лучших результатов чем рассмотренные в нашем проекте. Все, что нам понадобится, это создать несколько кнопок в приложении.

При создании кнопок в этом приложении старайтесь давать кнопкам осмысленные названия, чтобы они по смыслу соответствовали кнопкам пультов ДУ, которые вы будете замещать своим пультом. Также следите за тем текстом (набором символов), который будет передаваться при нажатии каждой кнопки. Также удостоверьтесь в тем, что вы обеспечиваете правильный адрес для своего модуля Bluetooth HC-05. На следующем рисунке показан примерный вид экрана приложения, который вы должны создать.

Вам целесообразно выполнить следующую последовательность шагов.

Шаг 2. После того как вы залогинитесь в ai2.appinventor.mit.edu с помощью своего аккаунта Google, вас перебросит на рабочую веб-страницу AI2, которая будет выглядеть примерно следующим образом:

Начните новый проект при помощи нажатия вкладки “Projects” вверху экрана и выберете там “Start New Project”. После этого вы увидите пустой экран, на котором вы можете разместить нужные вам кнопки и текст.
Для использования пакета с кнопками выберите вкладку “Button” в левом крае экрана под секцией “User Interface”. Просто перетащите любой пакет из меню слева и поместите его на рабочий экран. Аналогично текст можно поместить на рабочий экран с помощью пакета “Label”.

Шаг 3. После того как вы разместите на экране все необходимые вам кнопки и текстовые метки (labels) можно заняться кодом для этого приложения. Но перед этим необходимо выбрать пакет Bluetooth поскольку именно с помощью этой технологии вы будете связываться с Arduino.

Этот пакет не показывается сразу на экране потому что он расположен под “Non-visible Components” – это компоненты, которые не отображаются в графическом интерфейсе пользователя.

Шаг 4. На этом шаге вам предстоит формирование программного кода, в котором вы должны определить функции для всех компонентов, которые вы выбрали, и каким образом вы будете работать с ними.

Слева экрана вы увидите все пакеты, которые вы выбрали в графической секции (GUI section). Картинки сверху показывают все компоненты, которые содержатся в каждом использованном вами пакете. Также учтите, что адрес Bluetooth модуля будет нужен в текстовом формате.

Шаг 5. После того как вы завершите конфигурирование вашего приложения, нажмите на вкладку “Build” как показано выше и выберите вторую опцию. Это позволит скачать созданное вами приложение на компьютере в “.apk” формате. Затем просто передайте этот .apk файл на ваш телефон с Android и установите приложение там.

How IR Remotes and Receivers Work

A typical infrared communication system requires an IR transmitter and an IR receiver. The transmitter looks just like a standard LED, except it produces light in the IR spectrum instead of the visible spectrum. If you have a look at the front of a TV remote, you’ll see the IR transmitter LED:

The same type of LED is used in IR transmitter breakout boards for the Arduino. You can see it at the front of this Keyes IR transmitter:

The IR receiver is a photodiode and pre-amplifier that converts the IR light into an electrical signal. IR receiver diodes typically look like this:

Some may come on a breakout board like this:

IR Signal Modulation

IR light is emitted by the sun, light bulbs, and anything else that produces heat. That means there is a lot of IR light noise all around us. To prevent this noise from interfering with the IR signal, a signal modulation technique is used.

In IR signal modulation, an encoder on the IR remote converts a binary signal into a modulated electrical signal. This electrical signal is sent to the transmitting LED. The transmitting LED converts the modulated electrical signal into a modulated IR light signal. The IR receiver then demodulates the IR light signal and converts it back to binary before passing on the information to a microcontroller:

The modulated IR signal is a series of IR light pulses switched on and off at a high frequency known as the carrier frequency. The carrier frequency used by most transmitters is 38 kHz, because it is rare in nature and thus can be distinguished from ambient noise. This way the IR receiver will know that the 38 kHz signal was sent from the transmitter and not picked up from the surrounding environment.

The receiver diode detects all frequencies of IR light, but it has a band-pass filter and only lets through IR at 38 kHz. It then amplifies the modulated signal with a pre-amplifier and converts it to a binary signal before sending it to a microcontroller.

IR Transmission Protocols

The pattern in which the modulated IR signal is converted to binary is defined by a transmission protocol. There are many IR transmission protocols. Sony, Matsushita, NEC, and RC5 are some of the more common protocols.

The NEC protocol is also the most common type in Arduino projects, so I’ll use it as an example to show you how the receiver converts the modulated IR signal to a binary one.

Logical ‘1’ starts with a 562.5 µs long HIGH pulse of 38 kHz IR followed by a 1,687.5 µs long LOW pulse. Logical ‘0’ is transmitted with a 562.5 µs long HIGH pulse followed by a 562.5 µs long LOW pulse:

This is how the NEC protocol encodes and decodes the binary data into a modulated signal. Other protocols differ only in the duration of the individual HIGH and LOW pulses.

IR Codes

Each time you press a button on the remote control, a unique hexadecimal code is generated. This is the information that is modulated and sent over IR to the receiver. In order to decipher which key is pressed, the receiving microcontroller needs to know which code corresponds to each key on the remote.

Different remotes send different codes for the keypresses, so you’ll need to determine the code generated for each key on your particular remote. If you can find the datasheet, the IR key codes should be listed. If not though, there is a simple Arduino sketch that will read most of the popular remote controls and print the hexadecimal codes to the serial monitor when you press a key. I’ll show you how to set that up in a minute, but first we need to connect the receiver to the Arduino…

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

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

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


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

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

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


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

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


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

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


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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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