AtomS3 Liteで赤外線リモコン [Arduino]
AtomS3 Liteには赤外線LEDが付いていて、サンプルにもNECタイプのリモコンスケッチがあった。
でも、うちのテレビはソニー製。うちのソニーのテレビリモコンは電源ボタン以外は赤外線ではないものの、テレビ本体は赤外線リモコンの受信は可能。
というわけで、サンプルスケッチをいじってソニーのテレビの操作。
といってもボタンも1つしかないので単機能、ミュートのトグル。
それにしても、うちの遅いパソコンではコンパイルに時間がかかる。
調べてみると、ESP32は簡単にPWMをつくることができるようだ。
というわけでリモコン信号も簡単にできた。
ライブラリ不要となり、多少コンパイル時間も短くなり、プログラムのサイズも減った。
AtomS3 Liteの赤外線LEDが光っている様子。
でも、うちのテレビはソニー製。うちのソニーのテレビリモコンは電源ボタン以外は赤外線ではないものの、テレビ本体は赤外線リモコンの受信は可能。
というわけで、サンプルスケッチをいじってソニーのテレビの操作。
といってもボタンも1つしかないので単機能、ミュートのトグル。
// Infrared remote control (M5atomS3, SIRC version)
#define DISABLE_CODE_FOR_RECEIVER
#define SEND_PWM_BY_TIMER // use hardware PWM
#define IR_TX_PIN 4
#include "M5AtomS3.h"
#include <IRremote.hpp>
void setup() {
auto cfg = M5.config();
AtomS3.begin(cfg);
IrSender.begin(DISABLE_LED_FEEDBACK); // Start with IR_SEND_PIN as send pin
IrSender.setSendPin(IR_TX_PIN);
}
void loop() {
AtomS3.update();
if( AtomS3.BtnA.wasPressed() ) {
IrSender.sendSony( 0x01, 0x14, 3, SIRCS_12_PROTOCOL ); // SONY TV mute toggle
} // address:0x01(TV,5bits), command:0x14(mute,7bits), repeat:3times, 12bits
}
それにしても、うちの遅いパソコンではコンパイルに時間がかかる。
調べてみると、ESP32は簡単にPWMをつくることができるようだ。
というわけでリモコン信号も簡単にできた。
// Infrared remote control with 40kHz PWM (ESP32, SIRC version)
uint8_t ledIR = 4;
void setup() {
ledcSetup( 1, 40000, 8 ); // 40 kHz PWM, 8-bit resolution
ledcAttachPin( ledIR, 1 ); // assign IR LED pin to channel
pinMode( 41, INPUT_PULLUP );
}
void loop() {
while( digitalRead( 41 ) );
sendIrSIRCesp32( 0x14 | 0x01 << 7 ); // SONY mute toggle (cmd:0x14(7bit), adrs:0x01(5bit))
sendIrSIRCesp32( 0x14 | 0x01 << 7 ); // repeat 3 times
sendIrSIRCesp32( 0x14 | 0x01 << 7 );
}
void sendIrSIRCesp32( uint32_t d ) { // T = 0.60msec
uint8_t b = (d & 0xF8000) ? 20 :
(d & 0x07000) ? 15 : 12; // number of bits
uint16_t usON, usTrailer = 42000; // 70T = interval(75T) - leader(5T)
ledcWrite( 1, 85 ); delayMicroseconds( 2400 ); // leader ON (4T)
ledcWrite( 1, 0 ); delayMicroseconds( 600 ); // leader OFF (1T)
for(uint8_t i = 0; i < b; i++) { // data(command + address)
usON = ((d>>i)&1) ? 1200 : 600; // data(0:1T / 1:2T)
ledcWrite( 1, 85 ); delayMicroseconds( usON ); // data ON
ledcWrite( 1, 0 ); delayMicroseconds( 600 ); // data OFF (1T)
usTrailer -= (usON + 600); // trailer
}
delayMicroseconds( usTrailer );
}
ライブラリ不要となり、多少コンパイル時間も短くなり、プログラムのサイズも減った。
AtomS3 Liteの赤外線LEDが光っている様子。
2024-01-16 13:11
nice!(0)
コメント(0)
コメント 0