Arduino core for the ESP32を使った、ESP-WROOM-32開発ボードのRMT(Remote Control) Moduleの実験です。赤外線リモコンの信号を制御します。
ESP-WROOM-32には、RMT(Remote Control) Module という、赤外線リモコン信号を制御するための機能が実装されています。キャリア信号の生成や信号の受信が簡単にできるようになっています。Arduino core for the ESP32には、Arduino向けのAPIも用意されていますが、私にはよく理解できなかったので、ここではESP-IDFの機能をそのまま使っています。
#include"driver/rmt.h"#include"driver/periph_ctrl.h"#include"soc/rmt_reg.h"constrmt_channel_tchannel=RMT_CHANNEL_0;constgpio_num_tirPin=GPIO_NUM_25;RingbufHandle_tbuffer=NULL;voidsetup(){// put your setup code here, to run once:
Serial.begin(115200);rmt_config_trmtConfig;rmtConfig.rmt_mode=RMT_MODE_RX;rmtConfig.channel=channel;rmtConfig.clk_div=80;rmtConfig.gpio_num=irPin;rmtConfig.mem_block_num=1;rmtConfig.rx_config.filter_en=1;rmtConfig.rx_config.filter_ticks_thresh=255;rmtConfig.rx_config.idle_threshold=10000;rmt_config(&rmtConfig);rmt_driver_install(rmtConfig.channel,2048,0);rmt_get_ringbuf_handle(channel,&buffer);rmt_rx_start(channel,1);}voidloop(){// put your main code here, to run repeatedly:
size_trxSize=0;rmt_item32_t*item=(rmt_item32_t*)xRingbufferReceive(buffer,&rxSize,10000);if(item){printData(item,rxSize);vRingbufferReturnItem(buffer,(void*)item);}}voidprintData(rmt_item32_t*item,size_tsize){intn=-1;do{n++;Serial.printf("%4d %s: %5d, %s: %5d\n",n,item[n].level0?"ON ":"OFF",item[n].duration0,item[n].level1?"ON ":"OFF",item[n].duration1);}while(item[n].duration1);Serial.printf("size = %d, %d\n\n",size,n+1);}
#include"driver/rmt.h"#include"driver/periph_ctrl.h"#include"soc/rmt_reg.h"constrmt_channel_tchannel=RMT_CHANNEL_0;constgpio_num_tirPin=GPIO_NUM_25;constintleaderOnUs=9000;constintleaderOffUs=4500;constintdataOnUs=560;constintdata1OffUs=1690;constintdata0OffUs=560;constintrepeatOffUs=2250;constintdataErrorRange=100;RingbufHandle_tbuffer=NULL;voidsetup(){// put your setup code here, to run once:
Serial.begin(115200);rmt_config_trmtConfig;rmtConfig.rmt_mode=RMT_MODE_RX;rmtConfig.channel=channel;rmtConfig.clk_div=80;rmtConfig.gpio_num=irPin;rmtConfig.mem_block_num=1;rmtConfig.rx_config.filter_en=1;rmtConfig.rx_config.filter_ticks_thresh=255;rmtConfig.rx_config.idle_threshold=10000;rmt_config(&rmtConfig);rmt_driver_install(rmtConfig.channel,2048,0);rmt_get_ringbuf_handle(channel,&buffer);rmt_rx_start(channel,1);}voidloop(){// put your main code here, to run repeatedly:
size_trxSize=0;rmt_item32_t*item=(rmt_item32_t*)xRingbufferReceive(buffer,&rxSize,10000);if(item){parseData(item,rxSize);vRingbufferReturnItem(buffer,(void*)item);}}intcheckRange(intvalue,inttarget,interrorRange){return((value>(target-errorRange))&&(value<(target+errorRange)));}intcheckLeaderOrRpeat(rmt_item32_titem){if((item.level0!=0)||(item.level1!=1)){return-1;}if(!checkRange(item.duration0,leaderOnUs,dataErrorRange)){return-1;}if(checkRange(item.duration1,leaderOffUs,dataErrorRange)){return1;}if(checkRange(item.duration1,repeatOffUs,dataErrorRange)){return2;}return-1;}intcheckZeroOne(rmt_item32_titem){if((item.level0!=0)||(item.level1!=1)){return-1;}if(!checkRange(item.duration0,dataOnUs,dataErrorRange)){return-1;}if(checkRange(item.duration1,data1OffUs,dataErrorRange)){return1;}if(checkRange(item.duration1,data0OffUs,dataErrorRange)){return0;}return-1;}intprintData(rmt_item32_t*item,intindex){for(inti=0;i<2;i++){intcode=0;for(intj=0;j<8;j++){intk;Serial.printf("%d ",k=checkZeroOne(item[index++]));code+=(k<<j);}Serial.printf(": %02x\n",code);}returnindex;}voidparseData(rmt_item32_t*item,size_trxSize){intindex=0;intcode;switch(checkLeaderOrRpeat(item[index])){case1:break;case2:Serial.printf("Repeat code\n");return;default:return;}index++;Serial.printf("Custom Code\n");index=printData(item,index);Serial.printf("\nData Code\n");index=printData(item,index);Serial.printf("--------------------\n");}