AtomS3 Liteで赤外線リモコン

AtomS3 Liteには赤外線LEDが付いていて、サンプルにもNECタイプのリモコンスケッチがあった。
でも、うちのテレビはソニー製。うちのソニーのテレビリモコンは電源ボタン以外は赤外線ではないものの、テレビ本体は赤外線リモコンの受信は可能。
というわけで、サンプルスケッチをいじってソニーのテレビの操作。
といってもボタンも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 );
}

ライブラリ不要となり、多少コンパイル時間も短くなり、プログラムのサイズも減った。

m5atoms3ir.jpg
AtomS3 Liteの赤外線LEDが光っている様子。

この記事へのコメント