Чтобы написать приложение, нужно понимать, как работает ИК-связь. Короче говоря, ИК-пульт посылает серию коротких импульсов, после чего приемник декодирует их как последовательный битовый поток. Я выбрал 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