В этом проекте мы будем использовать arduino для приема и декодирования сигналов пульта дистанционного управления, а затем применения переданных кодов для управления сервоприводами.
Нам понадобится
- Плата Arduino Uno
- Макетная плата
- Перемычки
- Инфракрасный (ИК) датчик с частотой 38 кГц
- Пульт дистанционного управления
- 2 сервопривод Tower Pro9g SG90
- Корпус с поворотным устройством
Требуемые библиотеки
- Servo
- IRremote
Нам понадобитсяПринцип работы
Сначала мы научимся получать и декодировать сигналы пульта дистанционного управления с помощью инфракрасного датчика. ИК-датчик оборудован тремя контактами: OUT, GND и VCC (слева направо на рис. 11.1). Изучите техническую документацию, прилагаемую к купленному вами ИК-датчику и убедитесь, что его контакты соответствуют приведенной схеме. У некоторых моделей расположение контактов может отличаться, но вы можете правильно соединить контакты для подключения такого датчика.
Рисунок 11.1: ИК-датчик с тремя контактами слева направо: OUT (выход), GND (заземление) и VCC (питание)Вам также понадобится пульт дистанционного управления. Можно использовать любой, например телевизионный, но лучше взять какой-нибудь старый, который вы больше не используете. Когда вы нажимаете кнопку на пульте, он передает некое числовое значение, которое принимает ИК-датчик. Значения различны для каждой кнопки. С помощью скетча мы научимся распознавать значение каждой кнопки, а затем присваивать их соответствующим контактам платы 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 код скетча, приведенный в разделе «Скетч» далее в этом проекте.
Рисунок 11.3: Принципиальная схема устройства для дистанционного управления сервоприводамиСкетч
Обязательно проверьте, что в коде вы указали значения, полученные на шаге 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); } }
Теги: