В этом проекте мы будем использовать arduino для приема и декодирования сигналов пульта дистанционного управления, а затем применения переданных кодов для управления сервоприводами.
Нам понадобится
- Плата Arduino Uno
- Макетная плата
- Перемычки
- Инфракрасный (ИК) датчик с частотой 38 кГц
- Пульт дистанционного управления
- 2 сервопривод Tower Pro9g SG90
- Корпус с поворотным устройством
Требуемые библиотеки
- Servo
- IRremote

Принцип работы
Сначала мы научимся получать и декодировать сигналы пульта дистанционного управления с помощью инфракрасного датчика. ИК-датчик оборудован тремя контактами: OUT, GND и VCC (слева направо на рис. 11.1). Изучите техническую документацию, прилагаемую к купленному вами ИК-датчику и убедитесь, что его контакты соответствуют приведенной схеме. У некоторых моделей расположение контактов может отличаться, но вы можете правильно соединить контакты для подключения такого датчика.

Вам также понадобится пульт дистанционного управления. Можно использовать любой, например телевизионный, но лучше взять какой-нибудь старый, который вы больше не используете. Когда вы нажимаете кнопку на пульте, он передает некое числовое значение, которое принимает ИК-датчик. Значения различны для каждой кнопки. С помощью скетча мы научимся распознавать значение каждой кнопки, а затем присваивать их соответствующим контактам платы Arduino, чтобы управлять выходным устройством — в данном случае двумя сервоприводами.
Указав в скетче значения, полученные при декодировании сигналов, вы можете назначить выполнение определенных инструкций при нажатии той или иной кнопки и использовать пульт дистанционного управления для управления сервоприводами. Если вы уже собрали корпус с поворотным устройством, описанный в Проекте 10, то можете воспользоваться им и в этом проекте. В противном случае вернитесь к Проекту 10 и прочитайте инструкции по сборке корпуса.
Мы назначим четыре кнопки для управления вращением сервоприводов в корпусе с поворотным устройством, чтобы движение осуществлялось во всех направлениях: влево/вправо для сервопривода оси х и вверх/вниз для сервопривода оси у. Кратковременное нажатие кнопки будет приводить к небольшому повороту сервопривода, а удерживание кнопки — к непрерывному вращению сервопривода, пока не будет достигнуто максимальное или минимальное значение поворота.
Настройка
1. Загрузите библиотеку IRremote (архив, содержащий библиотеку, доступен по адресу https://vk.com/s/v1/doc/V3o2X74YY7UA_jYg--f2Mk_V2Fny6W6OuwYaqlnTAnVeJmh9KTQ или по ссылке) и установите ее в среде разработки Arduino, как это продемонстрировано в разделе «Библиотеки» Руководства
2. Установите ИК-датчик на макетную плату. Подключите штырь OUT датчика к контакту 11 платы Arduino, штырь GND — к контакту GND Arduino, а штырь VCC — к контакту 5V платы Arduino. Повторюсь, у некоторых ИК-датчиков расположение контактов может отличаться от описываемого здесь. Изучите техническую документацию, прилагаемую к купленному вами ИК-датчику.

3. Теперь загрузите и выполните следующий код.
#include <IRremote.h>// Импорт библиотеки int receiver = 11; // Контакт, к которому подключен ИК-датчик IRrecv irrecv(receiver); decode_results results; void setup() { Serial.begin(9600) ; // Вывод кодов нажатых кнопок в IDE irrecv.enablelRIn(); // Включение датчика } void loop() { if (irrecv.decode(Sresults)) { // Если получены входные данные, декодировать значение Serial.println(results.value, HEX); // Передача значения кнопки в монитор порта в шестнадцатеричном виде irrecv.resume(); // Получение следующего значения } }
Вначале код скетча обращается к библиотеке IRremote, с помощью которой перехватывается сигнал с ИК-датчика и полученные данные передаются на плату Arduino. ИК-датчику назначается контакт 11 платы Arduino, и код скетча формирует канал связи со средой разработки Arduino. Теперь при нажатии той или иной кнопки на пульте ее значение сразу отображается в окне монитора порта. Скетч продолжает работать в зацикленном режиме, ожидая нажатия кнопок и передавая соответствующие значения в среду разработки Arduino.
4. Откройте окно монитора порта в среде разработки Arduino.
5. Направьте пульт дистанционного управления на ИК-датчик и попробуйте нажать несколько кнопок. Их значения отобразятся в окне монитора порта в шестнадцатеричном виде, как показано ниже. Для достижения наилучшего результата, нажимайте кнопки быстро, сразу отпуская их. Если удерживать кнопку нажатой, монитор порта выведет значение Fs и будет отображать его до тех пор, пока вы не отпустите кнопку.
FFA05F FF05AF FF807F FF609F
Запишите появляющиеся цифры и названия кнопок, которым они соответствуют. Позже вам понадобятся эти данные.
Теперь мы расшифровали сигналы кнопок пульта и можем использовать их для управления двумя сервоприводами.
Сборка
1. Используя схему подключения из таблицы в шаге 2 (выше в этой главе) и макетную плату с уже установленным ИК-датчиком, подключите сервоприводы к плате Arduino. Подключите коричневый провод каждого сервопривода к контакту GND, а красный — к контакту 5V платы Arduino. Затем подключите желтый провод сигнала управления первого сервопривода к контакту 10 платы Arduino, а желтый провод второго сервопривода — к контакту 9.

2. Не забудьте подать питание на макетную плату.
3. Убедитесь, что ваша цепь соответствует схеме на рис. 11.3, а затем загрузите в память Arduino код скетча, приведенный в разделе «Скетч» далее в этом проекте.

Скетч
Обязательно проверьте, что в коде вы указали значения, полученные на шаге 3 в разделе «Настройки» ранее в этой главе, а не те, которые приведены в книге. При изменении значений на собственные не удаляйте символы Ох, которые определяют начало шестнадцатеричного кода. Например, нажав первую кнопку в этом примере, я получил ее шестнадцатеричное значение FFA05F, которое прописал в скетче следующим образом:
unsigned long Valuel = 0xFFA05F;
В этом проекте осуществляется дистанционное управление сервоприводами, но вы можете адаптировать код для удаленного управления любыми компонентами, подключаемыми к контактам с режимом HIGH, например светодиодом или пьезоизлучателем.
Код скетча обращается к библиотеке IRremote для считывания данных от ИК-датчика и к библиотеке Servo для приведения сервоприводов в движение. Значения первых двух кнопок настроены на вращение сервопривода осих с ограничениями поворота на 70° влево и на 160° вправо. Значения третьей и четвертой кнопок настроены на вращение сервопривода оси у для управления наклоном вверх/вниз.
Если вы хотите адаптировать код для управления другим компонентом, измените код:
servo.write
на:
digitalWrite(pin, HIGH)
Полный код скетча приведен ниже:
#include <Servo.h>// Импорт библиотеки Servo #include <IRremote.h> // Импорт библиотеки IRremote unsigned long Value1 = 0xFFA05F; // Измените это значение на собственное unsigned long Value2 = 0xFF50AF; // Измените это значение на собственное unsigned long value3 = 0xFF807F; // Измените это значение на собственное unsigned long value4 = 0xFF609F; // Измените это значение на собственное int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; Servo servo1; Servo servo2; void setup() { // Настройка алгоритма работы Serial.begin(9600); irrecv.enableIRIn(); // Включение ИК-датчика servo1.attach(10); // Контакт, к которому подключен сервопривод 1 servo2.attach(9); // Контакт, к которому подключен сервопривод 2 } void loop() { // Зацикленный алгоритм, выполняемый непрерывно if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value } if (results.value == Value1) { // Если полученный код соответствует значению Valuel, управлять соответствующим сервоприводом в указанном направлении servo1.write(160); } else if (results.value == Value2) { // Если полученный код соответствует значению Value2, управлять соответствующим сервоприводом в указанном направлении servo1.write(70); } else if (results.value == value3) { servo2.write(70); } else if (results.value == value4) { servo2.write(160); } }
Теги: