Чтобы написать приложение, нужно понимать, как работает ИК-связь. Короче говоря, ИК-пульт посылает серию коротких импульсов, после чего приемник декодирует их как последовательный битовый поток. Я выбрал ESP8266 NodeMCU в качестве микроконтроллера, который обрабатывает всю эту информацию, и Micro Servo 9g в качестве серводвигателя.

Дизайн высокого уровня
Кнопки выбора ИК заставят микро серводвигатель выполнять определенные действия.
Действия, которые может выполнять микро серводвигатель:
- Поворот двигателя вправо на 90 градусов (максимальный угол поворота 180 градусов)
- Повернуть влево на 90 градусов (при условии, что сервопривод повернулся как минимум на 90 градусов)
- Сброс двигателя (заставляет сервопривод вернуться на 0 градусов).
Серводвигатель питается от платы Arduino Uno, обеспечивающей напряжение источника 5 В.
YouTube: https://youtu.be/KkeR2XltDvQ
Выполнение
Основная логика ИК-пульта дистанционного управления
Основная логика ИК-управления и тесты значения ИК-сигнала дистанционного управления на ESP8266 NodeMCU были выполнены в соответствии с этой статьей под названием ESP8266 NodeMCU — управление инфракрасным приемником дистанционного управления ИК.
// Drives the servo to a particular position based on the IR received command
void moveServoMotorByCommand(void) {
// Perform servo motor commands based on the IR message value
if (irrecv.decode(&results)) {
// results.value is uint64_t; print() & println() can't handle printing long longs (uint64_t)
// Based on the received value the program performs a specific servo motor operation
switch(results.value) {
case 0xFFA857:
servoMotorCmd(MOTOR_ROTATE_RIGHT);
break;
case 0xFFC23D:
servoMotorCmd(MOTOR_ROTATE_LEFT);
break;
case 0xFF6897:
servoMotorCmd(MIN_MOTOR_POSITION);
break;
default:
servoMotorCmd(UNKNOWN_MOTOR_CMD);
break;
}
Serial.println("Current Servo Position: " + String(currentServoPosition)); // for debugging purposes
irrecv.resume(); // Receive the next value
}
delay(100); // some wait time before the next servo command
}
Функции серводвигателя
- Сервопривод поворачивается вправо с шагом 90 градусов, только если текущее положение сервопривода меньше 180 градусов.
- Точно так же сервопривод поворачивается влево с шагом 90 градусов, только если текущее положение сервопривода больше 0 градусов.
- Сбросьте положение двигателя на 0 градусов.
// A simple no operation function that does nothing
void noop() {}
void changeServoMotorPositionToMinimumPosition(void) {
currentServoPosition = MIN_MOTOR_POSITION;
}
// Increment the motor position by 90
void servoMotorPositionIncrement(void) {
// Do nothing if the servo is already at max position
if (currentServoPosition == MAX_MOTOR_POSITION)
return;
currentServoPosition = (currentServoPosition + 90 <= MAX_MOTOR_POSITION) ? currentServoPosition + 90 : MAX_MOTOR_POSITION;
}
// Decrement the motor position by 90
void servoMotorPositionDecrement(void) {
// Do nothing if the servo is already at min position
if (currentServoPosition == MIN_MOTOR_POSITION)
return;
currentServoPosition = (currentServoPosition - 90 > MIN_MOTOR_POSITION) ? currentServoPosition - 90 : MIN_MOTOR_POSITION;
}
// Force servo position to zero; if servo is already at position zero then do nothing (noop)
void resetServoMotorPositionToMinimumPosition(void) {
(currentServoPosition != MIN_MOTOR_POSITION) ? changeServoMotorPositionToMinimumPosition() : noop();
}
// Peforms servo motor action based on the servo command received
void servoMotorCmd(int cmd) {
// Servo turns right or left direction; Also checks if servo is forced back to zero position
// Servo performs no operation for unknown commands
(cmd != UNKNOWN_MOTOR_CMD) ? ((cmd != MOTOR_ROTATE_LEFT) ? ((cmd != MIN_MOTOR_POSITION) ? servoMotorPositionIncrement() : resetServoMotorPositionToMinimumPosition()) : servoMotorPositionDecrement()) : noop();
// Drive the servo to the given position
servo.write(currentServoPosition);
}
Схема
**Примечание. Заземлите контакты заземления ESP8266 NodeMCU и Arduino. Это предотвращает повреждение ESP8266 NodeMCU из-за потенциальных различий между микроконтроллерами.

Схема

Полный код
Вы можете найти полный код в моем репозитории GitHub: https://github.com/Sayeed97/ServoMotor-Control-Using-IR/blob/main/ServoControlWithIR.ino