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

Дизайн высокого уровня

Кнопки выбора ИК заставят микро серводвигатель выполнять определенные действия.

Действия, которые может выполнять микро серводвигатель:

  1. Поворот двигателя вправо на 90 градусов (максимальный угол поворота 180 градусов)
  2. Повернуть влево на 90 градусов (при условии, что сервопривод повернулся как минимум на 90 градусов)
  3. Сброс двигателя (заставляет сервопривод вернуться на 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
}

Функции серводвигателя

  1. Сервопривод поворачивается вправо с шагом 90 градусов, только если текущее положение сервопривода меньше 180 градусов.
  2. Точно так же сервопривод поворачивается влево с шагом 90 градусов, только если текущее положение сервопривода больше 0 градусов.
  3. Сбросьте положение двигателя на 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