ããã«ã¡ã¯ãENGããŽã§ãã
Arduinoã®DIã«èµ€å€ç·åä¿¡æ©ã¢ãžã¥ãŒã«ã»ã³ãµãŒãæ¥ç¶ããããšã§ãªã¢ã³ã³ãšéä¿¡ããããšãã§ããŸããArduinoã¹ã¿ãŒã¿ãŒãããã«ä»å±ããŠãããªã¢ã³ã³ãšèµ€å€ç·åä¿¡ã»ã³ãµãŒã䜿ã£ãŠèµ€å€ç·ã«ããé éæäœã®æ¹æ³ããŸãšããŸããã
䜿çšãããªã¢ã³ã³ã¯Car mp3ãªã¢ã³ã³ïŒã¡ãŒã«äžæïŒãèµ€å€ç·åä¿¡æ©ã¢ãžã¥ãŒã«ã¯OSRB38C9AAïŒã·ã£ãŒãïŒã䜿çšããŠããŸãã
Arduinoã®DIã䜿ã£ãŠèµ€å€ç·åä¿¡æ©ã¢ãžã¥ãŒã«ãåä¿¡ããããŒã¿ãè§£æããŠãªã¢ã³ã³ã®ãã¿ã³æäœã«ããæä»€å€ãååŸããæ¹æ³ããŸãšããŠããŸãããŸããIRremoteã©ã€ãã©ãªã䜿çšããæ¹æ³ã«ã€ããŠã説æããŠããŸãã
Arduino UNOïŒä»¥äžArduinoãšããŸããïŒã察象ãšããŸããArduinoã®ã©ã€ãã©ãªã䜿çšããŠåäœç¢ºèªããããšããŸãšããŠããŸãã
Arduinoã§åŠã¹ããã€ã³ã³ã®ãœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
èµ€å€ç·åä¿¡æ©ã¢ãžã¥ãŒã«ããããŒã¿ãååŸãã
èµ€å€ç·åä¿¡æ©ã¢ãžã¥ãŒã«ã¯ãªã¢ã³ã³ïŒéä¿¡æ©ïŒããéåºããã900nm垯ã®ããŒã¹ãæ³¢ãåä¿¡ããŠããžã¿ã«ä¿¡å·ã«å€æããã¢ãžã¥ãŒã«ã§ããããžã¿ã«ä¿¡å·ã¯èµ€å€ç·ãªã¢ã³ã³çšã®éä¿¡ãã©ãŒãããã«ãã£ãŠæ±ºããããŠãããéä¿¡ãã©ãŒããããè§£æããããšã§ãªã¢ã³ã³ã®æä»€ã«å¿ããåäœãã§ããŸããèµ€å€ç·ãªã¢ã³ã³ã®éä¿¡ãã©ãŒãããã«ã€ããŠã¯äžèšãªã³ã¯ãåèã«ããŠããŸãã
èµ€å€ç·ãªã¢ã³ã³ã®éä¿¡ãã©ãŒããã (elm-chan.org)
ãã䜿çšãããéä¿¡ãã©ãŒãããã¯ã·ã§ã¢ã®é¢ä¿äžãNEC/å®¶é»å/SONYã«ãããã®ãå€ããããŸããæ¬èšäºã®ãªã¢ã³ã³ã¯éä¿¡ãã©ãŒãããã®ç¢ºèªã®æ¹æ³ã§ç¢ºèªãããšããNECãã©ãŒãããã§ããã®ã§ãNECãã©ãŒãããã®ããŒã¿ååŸãäžå¿ã«èª¬æããŸãã

NECãã©ãŒãããã®æ§æã¯ãªãŒããŒã³ãŒããã«ã¹ã¿ã ã³ãŒããããŒã¿ã³ãŒããã¹ããããããã®é ã«LSBãã¡ãŒã¹ãã§éä¿¡ãããŸããéä¿¡ãã©ãŒãããã¯æçã§ã108msã®ééã§éä¿¡ãããŸãã108ms以äžãªã¢ã³ã³ã®ãã¿ã³ãæŒãç¶ããŠãããšãªããŒãã³ãŒããéä¿¡ãããŸããæåã®ãªãŒããŒã³ãŒããè§£æããããšã§éä¿¡ãã©ãŒããããåºå¥ããããšãã§ããŸãã
ãªã¢ã³ã³ã®åºåãèµ€å€ç·åä¿¡æ©ã¢ãžã¥ãŒã«ã®å éšã§ããžã¿ã«ä¿¡å·ã«å€æãããŸãããåä¿¡æ©ã¢ãžã¥ãŒã«ã®åºåã¯ãã«ã¢ãããããŠãããããªã¢ã³ã³ã®éä¿¡ãã©ãŒãããã«å¯ŸããŠLOWïŒ0ïŒãšHIGHïŒïŒïŒãå転ããã®ã§æ³šæãå¿ èŠã§ããéä¿¡ãã©ãŒãããããããŒã¿ãååŸããæé ã説æããŸãã以äžã§ã¯LOWã0ãHIGHã1ãšããŸãã
- æé 1éä¿¡ãã©ãŒãããã®ç¢ºèª
ãªãŒããŒã³ãŒãã®é·ãããéä¿¡ãã©ãŒãããã倿ããã
- æé 2ããŒã¿ã³ãŒãã®ååŸ
ãªãŒããŒã³ãŒã以éã¯ããŒã¿ã³ãŒããšãªãã®ã§éä¿¡ãã©ãŒãããã«å¿ãããããåã®ããŒã¿ããããïŒãã€ãããŒã¿ã§ååŸãããããŒã¿ãããã®0/1ã¯1ããããããã®1ã®é·ãã§å€æããã
- æé 3ããŒã¿ã®ç¢ºèª
æé ïŒã§ååŸããããŒã¿ã³ãŒããã1ãã€ãã®ããŒã¿ãšå転ããŒã¿ãçæãã2ã€ã®ããŒã¿ã®è«çåïŒ0xFFïŒãŸãã¯è«çç©ïŒ0x00ïŒã§ããŒã¿ã®å¥å šæ§ã確èªããã
äžèšã®èª¬æã§äœ¿çšããŠããTïŒå€èª¿åäœïŒã¯NECãã©ãŒãããã§ã¯562usã«ãªããŸããå³ã§ã¯ïŒïŒå ã«msæç®ããŠè¡šèšããŠããŸãã
æé ïŒã§ã¯éä¿¡ãã©ãŒãããã®ç¢ºèªãè¡ããŸãããªãŒããŒã³ãŒãã®é·ãããéä¿¡ãã©ãŒããããå€å®ããŸãã

NECãã©ãŒããããåä¿¡æ©ããèŠãå Žåã0ã®åºéã16TïŒ9msïŒéç¶ãã1ã®åºéã8TïŒ4.5msïŒéç¶ããŸãããªãŒããŒã³ãŒãã§éä¿¡ãã©ãŒããããè§£æããããšãã§ããŸããéä¿¡ãã©ãŒãããã®ç¢ºèªã§DIã§ååŸããããŒã¿ããéä¿¡ãã©ãŒãããã倿ããæ¹æ³ã説æããŠããŸãã
æé 2ã§ã¯ããŒã¿ã³ãŒãã®DIã確èªããŠ0ã®åºéãš1ã®åºéã®é·ãããåããŒã¿ãããã®å€å®ãè¡ããŸããããŒã¿ãããã®å€æã¯ããŒã¿ãããã®1ãš0ãå€å®ããã§èª¬æããŠããŸãã

ããŒã¿ã³ãŒãã¯ã«ã¹ã¿ã çªå·ãããŒã¿å€ãããŒã¿å転å€ã§æ§æãããŠããŸããã«ã¹ã¿ã çªå·ã¯ã¡ãŒã«èå¥çªå·ã§16bitæ§æãããŠãããããŒã¿ã¯ïŒãããæ§æããã§ãã¯çšã®å転ããŒã¿ã8ãããæ§æã«ãªã£ãŠããŸãã
åä¿¡æ©ããèŠãå ŽåãïŒã®åºéã1TïŒ0.5msïŒã®å Žåã¯ããŒã¿ãããã0ãšå€æã§ããŸãã1ã®åºéã3TïŒ1.69msïŒã®å Žåã¯ããŒã¿ãããã1ãšå€æã§ããŸãããã®å€å®ãç¹°ãè¿ãè¡ãããŒã¿ã³ãŒããšã¹ãããããããååŸããŸãã
æé ïŒã§ã¯æé ïŒã§ååŸããããŒã¿ã®é åãã1ãã€ãã®ããŒã¿å€ãšå転ããŒã¿ãçæããè«çåãŸãã¯è«çç©ãèšç®ããŠããŒã¿ã®å¥å šæ§ã確èªããŸããããŒã¿ãæ£åžžã§ããã°ãªã¢ã³ã³ã®ããŒã¿ãšããŠåŠçããŸãã
éä¿¡ãã©ãŒãããã®ç¢ºèª
rcnt_l = 0;
while( digitalRead(REMOTE_DI) == LOW && errflg == false){
++rcnt_l;
delayMicroseconds(100);
}
rcnt_h = 0;
while( digitalRead(REMOTE_DI) == HIGH && errflg == false){
++rcnt_h;
delayMicroseconds(100);
}
Serial.print(rcnt_l);
Serial.print("--");
Serial.println(rcnt_h);
ãªãŒããŒã³ãŒãã§éä¿¡ãã©ãŒãããã倿ããäŸã説æããŸããåä¿¡æ©ã¯åŸ æ©ç¶æ ã§ã¯1ã«ãªããŸãããªã¢ã³ã³ã®ãã¿ã³ãæŒããšåä¿¡æ©ãå¿çãéä¿¡ãã©ãŒãããã«åŸã£ãŠ0ãåºåããŸããïŒã®åºéã¯100usæ¯ã«ã«ãŠã³ãïŒrcnt_lïŒãæŽæ°ããŸãããã®åºéã¯ãªãŒããŒã³ãŒãã®16TïŒ9.0msïŒã«çžåœããŸãã
次ã«1ã®åºéã100usæ¯ã«ã«ãŠã³ãïŒrcnt_hïŒãæŽæ°ããŸãããã®åºéã¯ãªãŒããŒã³ãŒãã®8TïŒ4.5msïŒã«çžåœããŸãã
ã·ãªã¢ã«ã¢ãã¿ãŒã§rnct_låã³rcnt_hã確èªãããšéä¿¡ãã©ãŒããããå€å®ããããšãã§ããŸãã100usæ¯ã®ã«ãŠã³ããšãªãããã¿ã€ãã³ã°ã«ãã£ãŠã¯-3ïœ-2çšåºŠã«ãŠã³ãæ°ãå€åããŸãããéä¿¡ãã©ãŒãããã®å€å®ã«ã¯åé¡ãªã誀差ãšãªããŸãã
æ¬èšäºã§äœ¿çšããŠãããªã¢ã³ã³ã§rcnt_låã³rnct_hã®å€ã確èªãããšããããããã®å€ã87ïŒ8.7msïŒã42(4.2ms)ã§ãã£ãããšããNECãã©ãŒãããã§ãããšå€æããŠããŸãã
ããŒã¿ãããã®1ãš0ãå€å®ãã

åä¿¡æ©ããèŠãå ŽåããŒã¿ãããã¯ïŒã®åºéã®é·ãã§æ±ºãŸããŸãã100usæ¯ã«DIã確èªããŠã«ãŠã³ãå€ãæŽæ°ããªãã0ã®åºéãš1ã®åºéã®é·ãã確èªããŸãã0ã®åºéã¯ããŒã¿ãããã®å€å®ã«äœ¿çšããŸããããã«ãŠã³ãå€ã¯5以äžïŒïŒïœ5ïŒã®å€ã«ãªããŸãã
ããŒã¿ãããã0ã®å Žåã¯1ã®åºéã1Tã«ãªãã®ã§0ã®åºéãšåæ§ã®å€ãšãªããŸããäžæ¹ããŒã¿ãããã1ã®å Žåã¯1ã®åºéã3Tã«ãªãã®ã§ã«ãŠã³ãå€ã16以äžïŒ14ïœ16ïŒã«ãªããŸãã
以äžã«ããŒã¿ãããã®å€å®ã®äŸã瀺ããŸããå€å®ã®çµæã1ãã€ãããŒã¿ã®é åã«æ ŒçŽããŸãã
uint8_t *dat;
dat = &remote.cus[0];ã//1ãã€ãã®é
åã«ããŒã¿ããããæ ŒçŽ
for(uint8_t i=0; i < 33; i++){
lcnt = 0; //LOWã®éšåã®ã«ãŠã³ããã¯ãªã¢
while( digitalRead(REMOTE_DI ) == LOW && errflg == false){
++lcnt;
delayMicroseconds(100); //100usãŠã§ã€ã
}
hcnt = 0;ã//HIGHã®éšåã®ã«ãŠã³ããã¯ãªã¢
while( digitalRead(REMOTE_DI ) == HIGH && errflg == false){
++hcnt;
if(hcnt >= 14 && i == 32){
break; //ã¹ããããããã¯1ãªã®ã§14以äžã§ããã°åŠçã忢
}
delayMicroseconds(100);ã//100usãŠã§ã€ã
}
if(hcnt >= 10){ //10(2T)以äžã§ããã°ïŒãšå€æãã
*dat = 1;
}
else{
*dat = 0;
}
++dat;
}
digitalRead()颿°ã§DIã確èªããŸããæåã«while()ã§0ã®åºéã®ã«ãŠã³ãå€ïŒlcntïŒã確èªããŸããdelayMicroseconds()颿°ã§100usã®ãŠã§ã€ãã眮ãããšã§æŽæ°é »åºŠã®èª¿æŽãè¡ã£ãŠããŸããDIã1ã®åºéã«åãæ¿ãããšã«ãŒããæããŸãã
次ã«while()ã§1ã®åºéã®ã«ãŠã³ãå€ïŒhcntïŒã確èªããŸããdelayMicroseconds()颿°ã§100usã®ãŠã§ã€ãã眮ãããšã§æŽæ°é »åºŠã®èª¿æŽãè¡ã£ãŠããŸããDIã0ã®åºéã«åãæ¿ãããšã«ãŒããæããŸãããã¹ããããããã®åä¿¡åŸDIã1ã«åºå®ãããããã¹ããããããã®å Žåã®ã¿ã«ãŠã³ãå€ã14以äžã§ã«ãŒããæããããã«ããŠããŸãã
ããŒã¿ãããã®0ã1ãã¯1ã®åºéã®ã«ãŠã³ãå€ã§å€å®ããŸããããŒã¿ãããã0ãšãªãå Žåã®ã«ãŠã³ãå€ã®ç®å®ã¯6以äžã§ãããããŒã¿ãããã1ãšãªãã«ãŠã³ãå€ã®ç®å®ã¯16以äžã§ããããšãã6ããã倧ãããã°ããŒã¿ãããã1ãšãªããšå€æã§ããŸãã
å€å®ã®åºæºã«äœè£ãã¿ãŠ2Tåã®çµéã«ãŠã³ãæ°ã®ç®å®ã§ãã10以äžã§ããã°è©²åœã®ãããã1ã§ãããšå€æããŠ1ãæ ŒçŽããŸãã10æªæºã§ããã°ãããã0ã§ãããšå€æããŠ0ãæ ŒçŽããŸãã
ããŒã¿ãããã®å€å®ãŸã§ã®1ã»ãããšããŠã«ã¹ã¿ã ããã¹ãããããããŸã§ã®33ãããåãç¹°ãè¿ããŸãã
ãªã¢ã³ã³ã®ããŒã¿ã®çæãšãã§ãã¯
uint8_t i;
uint16_t cus_l=0;
uint16_t cus_h=0;
uint16_t cus =0;
uint8_t data=0;
uint8_t idata=0;
uint8_t chk;
for(i=0; i < 8; i++){ //16ãããã®ãã¡äžäœ8ããã
cus_l |= ( remote.cus[i] << i); //ã«ã¹ã¿ã ã³ãŒãäžäœ
}
for(i=0; i < 8; i++){ //16ãããã®ãã¡äžäœ8ããã
cus_h |= ( remote.cus[i + 8] << i); //ã«ã¹ã¿ã ã³ãŒãäžäœ
}
cus = (cus_h << 8) | cus_l;ã//16ãããããŒã¿ãçæ
for(i=0; i < 8; i++){
data |= ( remote.data[i] << i); //ããŒã¿
idata |= ( remote.Idata[i] << i); //å転ããŒã¿
}
chk = ~idata; //å転ããŒã¿ãå転
if( data == chk){ //ããŒã¿ãäžèŽããã
btnval = data;ã//ããŒã¿ãæ ŒçŽ
}
1ãã€ãããŒã¿ã®é åã«ããŒã¿ããããé çªã«æ ŒçŽããŠããããããŒã¿ã®é åããã·ããæŒç®ã䜿ã£ãŠããŒã¿ãããã1ãã€ãã®ãªã¢ã³ã³ã®ããŒã¿ãçæããŸããããŒã¿ã³ãŒãã¯LSBãã¡ãŒã¹ãã§éä¿¡ãããŠããããé åã®ïŒçªç®ããé ã«å·Šã«ã·ããããªããè«çåãèšç®ããããšã§ïŒãã€ãããŒã¿ãçæããããšãã§ããŸãã
ããŒã¿ãšå転ããŒã¿ã®çæãäŸã«ãããšãLSBãã¡ãŒã¹ãïŒæäžäœãããããéä¿¡ïŒããã®ã§é åã®ããŒã¿ãå·Šã«0åã·ããïŒÃ1ãšåãïŒããŠè«çåãèšç®ããŸããç¶ããŠ2ãããç®ã¯æŽæ°ããé åã®ããŒã¿ãå·Šã«1åã·ããïŒÃ2ãšåãïŒããŠè«çåãèšç®ããŸããåæ§ã«ããŠ3ãããç®ïœMSBãŸã§å·Šã«ã·ããããªããè«çåãèšç®ãããš1ãã€ãããŒã¿ïŒ8ãããã®ããŒã¿ïŒãçæã§ããŸãã
ã«ã¹ã¿ã ã³ãŒãã«ã€ããŠãåæ§ã®æ¹æ³ã§çæã§ããŸããã16ãããã®æ§æãªã®ã§äžäœã®8ããããšäžäœã®8ããããå ¥ãæ¿ãã£ãŠããããæ³šæãå¿ èŠã§ããäŸãã°ã«ã¹ã¿ã ã³ãŒãã0xFF00ã®å Žåã¯ãLSBãã¡ãŒã¹ãã§éã£ãŠããã®ã§2ãã€ãããŒã¿ã®å Žåã¯äžäœãããã0x00ã§äžäœãããã0xFFã«ãªããŸãã
ããŒã¿ãšå転ããŒã¿ã§ããŒã¿ã®å¥å šæ§ã確èªããŸããå転ããŒã¿ãå転ïŒããŒã¿ãå転ïŒããŠ2ã€ã®ããŒã¿ãæ¯èŒããæ¹æ³ã2ã€ã®ããŒã¿ã®è«çåãèšç®ããŠ0xFFã確èªããæ¹æ³ã2ã€ã®ããŒã¿ã®è«çç©ãèšç®ããŠ0x00ã確èªããæ¹æ³ããããŸãããããã®æ¹æ³ã§ããŒã¿ãå¥å šã§ãããšå€æã§ããã°ãªã¢ã³ã³ã®ããŒã¿ãšããŠæ¡çšããŸãã
IRremoteã©ã€ãã©ãªã远å ããŠäœ¿çšããïŒåèïŒ

Arduino IDEã§IRremoteã©ã€ãã©ãªã远å ããæ¹æ³ã説æããŸããArduino IDEã®ã©ã€ãã©ãªãããŒãžã£ã®æ€çŽ¢æ¬ã«irremoteãå ¥åãããšã©ã€ãã©ãªã®åè£ã衚瀺ãããŸããåè£ã®äžããIRremote by shirriff,z3t0,ArminJoãã€ã³ã¹ããŒã«ããŸãã䜿çšäŸã¯ä»¥äžã®éãã§ãã
#include <IRremote.hpp>
#define TIME_UP 0
#define TIME_OFF -1
#define TIME_LED 50
#define BASE_CNT 10 //10msãããŒã¹ã¿ã€ããšãªã
#define PIN_DO 7
#define REMOTE_DI 2
int16_t timled;
int16_t ledval;
uint32_t beforetimCnt = millis();
uint16_t btnval;
/* ãããã¿ã€ãå®£èš */
void mainTimer(void);
void setup() {
Serial.begin(115200);
pinMode(PIN_DO,OUTPUT);
IrReceiver.begin(REMOTE_DI);
ledval = TIME_OFF;
timled = ledval;
}
void loop() {
mainTimer();
if( IrReceiver.decode()){ //åä¿¡ããã
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); //åä¿¡ããŒã¿ã®è¡šç€º
IrReceiver.printIRResultShort(&Serial); //éä¿¡ãã©ãŒããããªã©ããŒã¿ã衚瀺
IrReceiver.printIRSendUsage(&Serial); //ãªã¢ã³ã³ã®ã¢ãã¬ã¹ããã¿ã³ã«ããæä»€å€ã®è¡šç€º
IrReceiver.resume(); //次ã®åä¿¡ãèš±å¯
btnval = IrReceiver.decodedIRData.command;
switch(btnval){
case 22: //0
ledval = TIME_OFF;
digitalWrite(PIN_DO,LOW);
break;
case 12: //1
ledval = TIME_OFF;
digitalWrite(PIN_DO,HIGH);
break;
case 24: //2
ledval = TIME_LED;
break;
case 94: //3
ledval = TIME_LED*2;
break;
case 8: //4
Serial.println("push-4");
break;
case 28: //5
Serial.println("push-5");
break;
case 90: //6
Serial.println("push-6");
break;
case 66: //7
Serial.println("push-7");
break;
case 82: //8
Serial.println("push-8");
break;
case 74: //9
Serial.println("push-9");
break;
}
timled = ledval;
}
}
/* ã¿ã€ã管ç */
void mainTimer(void){
if ( millis() - beforetimCnt >= BASE_CNT ){
beforetimCnt = millis();
if( timled > TIME_UP ){
--timled;
}
}
if( timled == TIME_UP ){
timled = ledval;
digitalWrite(PIN_DO, !digitalRead(PIN_DO));
}
}
IRremote.hppãã€ã³ã¯ã«ãŒãããŸããIrRecvã¯ã©ã¹ã§ã€ã³ã¹ã¿ã³ã¹åãããŠããIrReciver倿°ã䜿ã£ãŠåŠçãè¡ããŸããsetup()颿°å ã§ã¡ã³ããŒé¢æ°ã®begin()颿°ã§åä¿¡æ©ããã®ããŒã¿ãåãåãDIãã³ãæå®ããŸãã
Loop()颿°å ã§åä¿¡ãããšãã®åŠçã远å ããŸããdecode()颿°ã¯ããŒã¿ã®åä¿¡ã確èªããŸããåä¿¡ãããã°æ»ãå€ã«trueãè¿ããŸãã
åä¿¡åŸã¯decodedIRData.decodedRawDataã«åä¿¡ããããŒã¿ãæ ŒçŽãããŠããŸããã·ãªã¢ã«ã¢ãã¿ãŒã§ç¢ºèªããå Žåã¯Serial.print()颿°ã®åŒæ°ã«æå®ããŠè¡šç€ºããŸãã第2åŒæ°ã«HEXãæå®ããããšã§16鲿°ã§è¡šç€ºããããšãã§ããŸãã
printIRResultShort()颿°ã¯éä¿¡ãã©ãŒãããããŒã¿ã®æ å ±ãããŒã¿ã®è¡šç€ºããŸãšããæååãçæããŸããåŒæ°ã«ã·ãªã¢ã«éä¿¡ã®ããŒããŠã§ã¢ã®ã¢ãã¬ã¹ãæå®ããŸããSerialã®ã¢ãã¬ã¹ãæå®ããããšã§æååãã·ãªã¢ã«ã¢ãã¿ãŒã§è¡šç€ºãããŸãã
printIRsendUsage()颿°ã¯ãªã¢ã³ã³ã®ã¢ãã¬ã¹ãããŒã¿ã®è¡šç€ºããŸãšããæååãçæããŸããåŒæ°ã«ã·ãªã¢ã«éä¿¡ã®ããŒããŠã§ã¢ã®ã¢ãã¬ã¹ãæå®ããŸããSerialã®ã¢ãã¬ã¹ãæå®ãããšæååãã·ãªã¢ã«ã¢ãã¿ãŒã«è¡šç€ºãããŸãã
decodedIRData.commandã¯ãªã¢ã³ã³ã®ããŒã¿ãæ ŒçŽãããŠããŸãããªã¢ã³ã³ããšã«ãã¿ã³ã®ããŒã¿ãç°ãªãããã·ãªã¢ã«ã¢ãã¿ãŒã§ç¢ºèªããªããåŠçã®ãã¿ãŒã³ã远å ããŸãã
resume()颿°ã¯ãªã¢ã³ã³ããã®æ¬¡ã®åä¿¡ãèš±å¯ããŸãã
åäœç¢ºèª

黿ºãå ¥ãããšãªã¢ã³ã³ããã®åä¿¡ãåŸ ã¡ãŸããåä¿¡ãããšãªã¢ã³ã³ã®ãã¿ã³ã«ããæä»€ã®åŠçãè¡ããŸããç§ã䜿çšããŠãããªã¢ã³ã³ã«ãããŠ0ïœ9ã®ãã¿ã³ã§åŠçãåå²ãããŠåäœç¢ºèªãè¡ããŸãã
ã0ããæŒããšLED1ãæ¶ç¯ããŸããã1ããæŒããšLED1ãç¹ç¯ããŸããã2ããæŒããšLED1ãç¹ç¯/æ¶ç¯ïŒ500msã§ããªãã«ç¹ç¯ïŒã3ããæŒããšLED1ãç¹ç¯/æ¶ç¯ïŒ1ïœã§ããªãã«ç¹ç¯ïŒããŸããã4ãïœã9ããæŒããšpush-4ïœpush-9ãã·ãªã¢ã«ã¢ãã¿ãŒã§è¡šç€ºããŸãã
ãªã¢ã³ã³ã®ãã¿ã³ã108ms以äžé·æŒããããšãªããŒãã³ãŒããéä¿¡ãããŸããã4ãïœã9ããé·æŒããããšå®æçã«ã·ãªã¢ã«ã¢ãã¿ãŒã®æåãæŽæ°ããããšã確èªã§ããŸããã·ãªã¢ã«ã¢ãã¿ãŒã§ç¢ºèªããçµæã¯ä»¥äžã®éãã§ãã

ã·ãªã¢ã«ã¢ãã¿ãŒã«ã«ã¹ã¿ã ã³ãŒãïŒcus:ïŒãããŒã¿(data:)ãå転ããŒã¿ïŒIdata:ïŒã衚瀺ããŠããŸããã1ããæŒããŠLED1ãç¹ç¯ããã0ãã§LED1ãæ¶ç¯ããããšã確èªã§ããŸãããã2ããæŒããšLED1ãããªãã«ç¹ç¯ãããïŒããæŒãããšã§ããªãã«ã®ã¿ã€ãã³ã°ãé ããªãããšã確èªã§ããŸãããã4ãïœã9ããé ã«æŒããŠãããšpush-4ïœpush-9ãŸã§ãã·ãªã¢ã«ã¢ãã¿ãŒã«è¡šç€ºãããããšã確èªã§ããŸããã
ãœãŒã¹ã³ãŒãå šäœ
ãœãŒã¹ã³ãŒãã¯èšäºäœææç¹ã«ãããŠåäœç¢ºèªã§ããŠããŸããã䜿çšããŠããã©ã€ãã©ãªã®æŽæ°ã«ããåäœãä¿èšŒã§ããªããªãå¯èœæ§ããããŸãããŸãããœãŒã¹ã³ãŒãã䜿çšããããšã«ãã£ãŠçããäžå©çãªã©ã®äžåã®è²¬ä»»ãè² ããããŸããåèè³æãšããŠã䜿ããã ããã
#include <MsTimer2.h>
#define REMOTE_DI 2
#define TIME_UP 0
#define TIME_OFF -1
#define TIME_WAIT 9
#define TIME_LED 50
#define REPEAT_CNT 120
#define PIN_DO 7
struct SIG_TYP{
uint8_t cus[16];
uint8_t data[8];
uint8_t Idata[8];
uint8_t stop;
};
enum REMOTE_MD{
REMOTE_READ = 0,
REMOTE_DATA,
REMOTE_END,
REMOTE_MAX
};
SIG_TYP remote;
uint8_t re_md;
int16_t timrepeat;
int16_t timled;
int16_t ledval;
uint8_t btnval;
bool errflg;
bool btnflg;
bool repeatflg;
/* ãããã¿ã€ãå®£èš */
void mainTimer(void);
void mainApp(void);
void chkData(void);
void remoteControl(void);
void setup() {
Serial.begin(115200);
pinMode(REMOTE_DI,INPUT);
pinMode(PIN_DO,OUTPUT);
MsTimer2::set(10, mainTimer); // 10ms period
MsTimer2::start();
ledval = TIME_OFF;
timled = ledval;
}
void loop() {
mainApp();
remoteControl();
}
/* ã¿ã€ã管ç */
void mainTimer(void){
if( timled > TIME_UP ){
--timled;
}
if( timrepeat == TIME_UP ){
timrepeat = TIME_OFF;
re_md = REMOTE_END;
}
}
/* ãªã¢ã³ã³åä¿¡åŠç */
void mainApp(void){
uint8_t i;
uint16_t lcnt;
uint16_t hcnt;
uint16_t rcnt_h;
uint16_t rcnt_l;
uint8_t *dat;
uint16_t rep_judge;
switch(re_md){
case REMOTE_READ:
if(digitalRead(REMOTE_DI) == LOW ){
memset(&remote,0, sizeof(remote));
timrepeat = TIME_WAIT;
re_md = REMOTE_DATA;
errflg = false;
repeatflg = false;
}
break;
case REMOTE_DATA:
dat = &remote.cus[0];
rcnt_l = 0;
while( digitalRead(REMOTE_DI) == LOW && errflg == false){
++rcnt_l;
delayMicroseconds(100);
}
rcnt_h = 0;
while( digitalRead(REMOTE_DI) == HIGH && errflg == false){
++rcnt_h;
delayMicroseconds(100);
}
//Serial.print(rcnt_l);
//Serial.print("--");
//Serial.println(rcnt_h);
rep_judge = rcnt_h + rcnt_l;
if( rep_judge >= REPEAT_CNT){
for(uint8_t i=0; i < 33; i++){
lcnt = 0;
while( digitalRead(REMOTE_DI ) == LOW && errflg == false){
++lcnt;
delayMicroseconds(100);
}
hcnt = 0;
while( digitalRead(REMOTE_DI ) == HIGH && errflg == false){
++hcnt;
if(hcnt >= 14 && i == 32){
break; //ã¹ããããããã¯1ãªã®ã§14以äžã§ããã°åŠçã忢
}
delayMicroseconds(100);
}
if(hcnt >= 10){ //10(2T)以äžã§ããã°ïŒãšå€æãã
*dat = 1;
}
else{
*dat = 0;
}
++dat;
}
chkData();
re_md = REMOTE_END;
timrepeat = TIME_OFF;
}
else{
re_md = REMOTE_END;
repeatflg = true;
}
break;
case REMOTE_END:
if( digitalRead(REMOTE_DI ) == HIGH ){
errflg = false;
//btnflg = true;
re_md = REMOTE_READ;
}
break;
}
}
/*ããŒã¿ã®ãã§ãã¯ãšå€æ*/
void chkData(void){
uint8_t i;
uint16_t cus_l=0;
uint16_t cus_h=0;
uint16_t cus =0;
uint8_t data=0;
uint8_t idata=0;
uint8_t chk;
for(i=0; i < 8; i++){ //16ãããã®ãã¡äžäœ8ããã
cus_l |= ( remote.cus[i] << i); //ã«ã¹ã¿ã ã³ãŒãäžäœ
}
for(i=0; i < 8; i++){ //16ãããã®ãã¡äžäœ8ããã
cus_h |= ( remote.cus[i + 8] << i); //ã«ã¹ã¿ã ã³ãŒãäžäœ
}
cus = (cus_h << 8) | cus_l; //16ãããããŒã¿ãçæ
for(i=0; i < 8; i++){
data |= ( remote.data[i] << i); //ããŒã¿
idata |= ( remote.Idata[i] << i); //å転ããŒã¿
}
//if( (data & idata) == 0x00){ //è«çç©ã§å€å®
if( (data | idata) == 0xFF){ //è«çåã§å€å®
btnval = data;
btnflg = true;
Serial.print("cus:");
Serial.print(cus,HEX);
Serial.print(" data:");
Serial.print(data,HEX);
Serial.print(" Idata:");
Serial.print(idata,HEX);
Serial.println();
}
}
/* ãªã¢ã³ã³ã«ããåŠçïŒLEDæäœïŒ */
void remoteControl(void){
if(btnflg | repeatflg){
btnflg = false;
repeatflg = false;
switch(btnval){
case 22: //0
ledval = TIME_OFF;
digitalWrite(PIN_DO,LOW);
break;
case 12: //1
ledval = TIME_OFF;
digitalWrite(PIN_DO,HIGH);
break;
case 24: //2
ledval = TIME_LED;
break;
case 94: //3
ledval = TIME_LED*2;
break;
case 8: //4
Serial.println("push-4");
break;
case 28: //5
Serial.println("push-5");
break;
case 90: //6
Serial.println("push-6");
break;
case 66: //7
Serial.println("push-7");
break;
case 82: //8
Serial.println("push-8");
break;
case 74: //9
Serial.println("push-9");
break;
}
timled = ledval;
}
if( timled == TIME_UP ){
timled = ledval;
digitalWrite(PIN_DO, !digitalRead(PIN_DO));
}
}
䜿çšãããªã¢ã³ã³ã«ãã£ãŠéä¿¡ãã©ãŒããããæä»€å€ãå€ããããã·ãªã¢ã«ã¢ãã¿ãŒã§ãããããæä»€å€ã確èªããŠåŠçãåå²ããããã«èª¿æŽããå¿ èŠããããŸãã
é¢é£ãªã³ã¯
Arduinoã®ã©ã€ãã©ãªã䜿ã£ãŠåäœç¢ºèªãè¡ã£ãããšãäžèšãªã³ã¯ã«ãŸãšããŠããŸãã
Arduinoã§åŠã¹ããã€ã³ã³ã®ãœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
Seeeduino XIAOã§åŠã¹ããœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
ESP32-WROOM-32Eã§åŠã¹ããœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
Raspberry Pi Picoã§åŠã¹ããœããéçº
æåŸãŸã§ãèªãã§ããã ãããããšãããããŸããã



ãªã¢ã³ã³ã§è€æ°ã®ãã¿ã³åŠçã®ãã¿ãŒã³ãäœãããšãã§ãããã䜿çšçšéãåºãããŸãããæå€§70msçšåºŠåŠçãåæ»ããã®ã§é »ç¹ã«ã¡ã€ã³åŠçãå¿ èŠãªããã°ã©ã ãšã¯çžæ§ãæªããã§ãã