ããã«ã¡ã¯ãENGããŽã§ãã
Arduinoç°å¢ã§ãœããéçºããŠãããšDIã«ä¿¡å·ãå ¥åããŠåŠçãå€å®ãããããšããããããŸããDIä¿¡å·ãã¹ã€ãããªã©ã§ãã£ãå Žåãã£ã¿ãªã³ã°ã«ãã£ãŠDIä¿¡å·ãå®å®ããªãããšããããŸãã察çãšããŠãã£ã«ã¿ãäœãæ¹æ³ãèšäºã«ããŸããã
Arduino UNOã察象ãšããŸãããArduinoã®ã©ã€ãã©ãªã§ããMsTimer2ã䜿çšããŠã¿ã€ããèµ·åãã¡ã€ã³é¢æ°å ã§ããŒã¹ã¿ã€ããäœã£ãŠã¿ã€ãã®ç®¡çãè¡ããŸãã
Arduino UNOã䜿ã£ãŠåäœç¢ºèªãè¡ã£ãããšãäžèšãªã³ã¯ã«ãŸãšããŠããŸãã
Arduinoã§åŠã¹ããã€ã³ã³ã®ãœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
Arduinoã§ã¿ã€ããåäœããã
Arduinoã®IDEã®åæã§ã¯ã¿ã€ãåäœããããã©ã€ãã©ãªããããŸãããïŒããã®ãããããŸãããåãããŸããã§ãããïŒArduinoç°å¢ã§ã¿ã€ã2ãåäœãããã©ã€ãã©ãªãšããŠãã䜿çšãããŠããMsTimer2ã®ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŠäœ¿çšããŸãã
MsTimer2ã®ã€ã³ã¹ããŒã«

Arduino IDEã®ããŒã«å ã®ã©ã€ãã©ãªã管çãéžæãããšã©ã€ãã©ãªãããŒãžã£ç»é¢ã衚瀺ãããŸããæ€çŽ¢ããã£ã«ã¿ã«ãmstimer2ãïŒå€§æåå°æåã¯ã©ã¡ãã§ãããïŒãå ¥åãããšè¡šç€ºããããMsTimer2ãäžã®å³äžã®ã€ã³ã¹ããŒã«ãã¿ã³ãæŒããšã€ã³ã¹ããŒã«ãããŸãã
äžèšã®äŸã¯æ¢ã«ã€ã³ã¹ããŒã«æžã¿ãªã®ã§ã€ã³ã¹ããŒã«ãã¿ã³ã衚瀺ãããŠããŸããã
ã¿ã€ãã®ç®¡çã®èãæ¹

ã¿ã€ãïŒãåæèšå®ããéã«èšå®ããå²ã蟌ã¿åšæãããŒã¹ã¿ã€ããšãªããŸããå²ã蟌ã¿ãå ¥ãæ¯ã«ã«ãŠã³ãã+1ããŠæŽæ°ããŠãããèŠå®åæ°ïŒãœãããŠã§ã¢ã¿ã€ãã®ååšæ¯ã決ããå€ïŒä»¥äžã«ãªã£ããšããœãããŠã§ã¢ã¿ã€ããæŽæ°ããŸãã
äŸïŒããŒã¹ã¿ã€ãã1msãšããèŠå®åæ°ã10ãšããå Žå
1msééã§ã¿ã€ãïŒã®å²ã蟌ã¿ãçºçãããŒã¹ã¿ã€ãå€ãæŽæ°ããŸããèŠå®åæ°ä»¥äžã«ãªã£ããšã1msã10åçµéããããšã«ãªãã®ã§10msã®ã¿ã€ãã³ã°ãã€ããããšãã§ããŸãã
æ¬ ç¹ã¯ã¡ã€ã³é¢æ°ã®1åšã®æéã«å·Šå³ãããããšã§ãããéåžžã¡ã€ã³é¢æ°ã®ã«ãŒãã¯1msãè¶ ããããšãå°ãªãããåé¡ã«ãªããªãããšãå€ãã§ããã¡ã€ã³é¢æ°ã®1åšã«æéãèŠããŠããå Žåã¯èª€å·®ã倧ãããªãå¯èœæ§ããããŸãã®ã§èª€å·®ãåé¡ã«ãªããããªå Žåã¯æ³šæãå¿ èŠã§ãã
æå³ããŠã¡ã€ã³ã«ãŒã1åšãé ããŠããå Žåã¯åé¡ãããŸããããå²ã蟌ã¿ãå«ããŠé ããªããããå Žåã¯ããã°ã©ã ã®æ§æãèãçŽããæ¹ãè¯ããããããŸããã
ã¿ã€ã管çãå®è£ ãã
MsTimer2ã®åæåãšã¿ã€ã管çã«ã€ããŠäžäŸã瀺ããŸãã
#include <MsTimer2.h>
#define TIME_UP 0
#define TIME_OFF -1
#define BASE_CNT 10 //10msãããŒã¹ã¿ã€ããšãªã
#define LED_ONOFF 50
// application use
int8_t timled;ã//管çãããã¿ã€ã
int8_t cnt1ms; //1msæ¯ã«ã«ãŠã³ãã¢ããããã
/*** Local function prototypes */
void TimerCnt();
MsTimer2ã䜿çšããããã«ã€ã³ã¯ã«ãŒãããŸããææã¡ããŠãããã§ããã¹ã±ããå ã®ã©ã€ãã©ãªã®ã€ã³ã¯ã«ãŒãããMsTimer2ãéžæããããšã§è¡šç€ºã远å ããããšãã§ããŸãã
管çãããã¿ã€ãã笊å·ä»ã®å€æ°ãšããŠå®£èšããŸãã-1ãTIME_OFFãšå®çŸ©ãã¿ã€ãã䜿çšããªãæã«ã»ããããŸããMsTimer2ã®ã³ãŒã«ããã¯çšã®é¢æ°ãšããŠTimerCnt()ã宣èšããŠããŸãã
void setup() {
MsTimer2::set(1,TimerCnt); //1msããšã«é¢æ°ãžé·ç§» TimerCnt颿°ãã³ãŒã«ããã¯ããã
MsTimer2::start();
timled = LED_ONOFF; //ãœãããŠã§ã¢ã¿ã€ããèµ·åïŒå€ãã»ããïŒ
}
/* Timer2 callback function add */
void TimerCnt(){
++cnt1ms; //ããŒã¹ã«ãŠã³ããæŽæ°
}
MsTimer2å²ã蟌ã¿ãçºçãããšTimerCnt()ãã³ãŒã«ããã¯ãšããŠåŒã³åºãããŸããTimerCnt()ã§ããŒã¹ã«ãŠã³ããã«ãŠã³ãããŠå²ã蟌ã¿ãçºçããåæ°ãã«ãŠã³ãããŠããŸãã
void loop() {
if( cnt1ms >= BASE_CNT ){//10msããšã«ããã«é·ç§»ãã
cnt1ms -=BASE_CNT;
if( timled > TIME_UP ){ //ã¿ã€ãå€ãæŽæ°
timled--;
}
}
if( timled == TIME_UP ){
//ã¿ã€ã ã¢ãããæã«åŠçãããå
容ãå
¥ãã
//timled = TIME_OFF; ã¿ã€ãã䜿çšããªãæã¯OFFã«ãããšæŽæ°åæ¢ãšãªã
}
}
ããŒã¹ã«ãŠã³ããèŠå®å€ïŒ10ïŒã«ãªã£ããšãifæã®æ¡ä»¶ãæºããããã¿ã€ãå€ã®æŽæ°åŠçãšãªããŸãã
MsTimer2ã®å²ã蟌ã¿ã¿ã€ãã³ã°ãšBASE_CNTãçµã¿åãããããšã§ä»»æã®ã¿ã€ããäœãããšãã§ããŸãã
MsTimer2ã䜿çšããªãå ŽåïŒåèïŒ
Arduinoç°å¢ã§ã¯32ãããã§msec管çã§ãã颿°ãšããŠmillis()ãã©ã€ãã©ãªãšããŠæèŒãããŠããŸãã
#define BASE_CNT 10
uint32_t basemillis;
if( millis() - basemillis > BASE_CNT ){
basemillis = millis(); //æ¡ä»¶ãæºããããšãã®msecãä¿ç®¡
if( timled > TIME_UP ){ //ã¿ã€ãå€ãæŽæ°
timled--;
}
}
millis()ã§ã¯çµéããmsecãã«ãŠã³ããç¶ããããã«ãŠã³ãå€ãBASE_CNT以äžã®å·®ã«ãªã£ããšãã10msçµéããæéã«ãªãããMsTImer2ã䜿çšãããšããšåãåãã«ãªããŸãã
æ¬ ç¹ãšããŠã¯å€ããªãŒããŒãããŒããŠ0xFFFFFFFFãã0ã«æ»ã£ããšãã«ã«ãŠã³ãå€ã®å€å®ãäžåºŠã ããããŠããŸãããšã§ãããªãŒããŒãããŒããã®ã¯é»æºONãã1193æéåŸãªã®ã§åžžã«ONããŠããããšããªãã°åé¡ã«ãªããŸããã
ãã£ã¿ãªã³ã°é²æ¢ãèãã
ãã€ã³ã³ã®DIã¯ããžã¿ã«å ¥åã§å ¥åãããé»å§å€ããHighã¬ãã«ïŒ1ïŒãLowã¬ãã«ïŒ0ïŒãã®å€å®ãè¡ããŸããã¹ã€ããã®ãã£ã¿ãªã³ã°ãªã©ãåå ã§ãã€ã³ã³ã誀åäœããå¯èœæ§ãããããæ³šæãå¿ èŠã§ãã
DIä¿¡å·ã®ãã£ã¿ãªã³ã°

ã¹ã€ãããONããOFFã«ãªã£ããšãã¹ã€ããã®æ¥è§Šæµæãªã©ã«ãã£ãŠé»å§ã¬ãã«ãå®å®ããªãç¬éããããŸããæ°msçµéãããšDIä¿¡å·ãå®å®ãããããå®å®åŸã«DIæ å ±ãåã蟌ã察çãå¿ èŠã§ãã
å ãæ°mséã§ã¯ãããŸããïŒãš0ãç¹°ãè¿ãããããšïŒãããã£ã«ã¿ãå ¥ããŠããªãã£ãå Žå誀åäœã®å¯èœæ§ããããŸãããªã¬ãŒã®æ¥ç¹ãªã©ã¯å®¹éã倧ãããã£ã¿ãªã³ã°ã倧ããåºãããšããããŸãã
åšèŸºåè·¯ã§ã³ã³ãã³ãµãå ¥ãããããããšã§ãã£ã¿ãªã³ã°ã®é«åšæ³¢æåãæžè¡°ãããããšãã§ããŸãããå®å šã«é€å»ã§ããããã§ã¯ãããŸããã
DIãã£ã«ã¿ãå®è£ ãã
DIãã£ã«ã¿ã¯DIã®ãã£ã¿ãªã³ã°å¯Ÿçã®ããã«å®è£ ãããã®ã§ããDIãã£ã«ã¿ã®æ¹æ³ã¯æ§ã ã§ãã以äžã®ïŒéããäž»ã«ãªããŸãã
- ã¿ã€ãã䜿ã£ãŠè€æ°åäžèŽããå€ãæ¡çšããæ¹æ³
- ã¡ã€ã³ã«ãŒãåšåããšã«DIæ å ±ãæ¯èŒããŠèŠå®åæ°äžèŽã確èªããæ¹æ³
ä»åã¯ïŒã®ã¿ã€ãã䜿ã£ãæ¹æ³ãå®è£ ããŸãã
#define DI_FILT_MAX 4
enum DI_NO{
DI1 = 0,
DI2,
DI_MAX
};
struct DIFILT_TYP{
uint8_t wp;
uint8_t buf[DI_MAX][DI_FILT_MAX];
uint8_t di1;
uint8_t di2;
};
DIFILT_TYP difilt;
void DiFilter();
äžèšã®ã¿ã€ã管çã®æ¹æ³ã䜿ã£ãŠ10msæ¯ã«DIã®æ å ±ã確èªã4åäžèŽãããšãDIå€ãšããŠæ¡çšããæ¹æ³ãDiFilter()颿°ã®åŠçãšããŠå®è£ ããŸãã
void DiFilter(){
if( timdifilt == TIME_UP ){
difilt.buf[DI1][difilt.wp] = digitalRead(PIN_DI1);
difilt.buf[DI2][difilt.wp] = digitalRead(PIN_DI2);
if( difilt.buf[DI1][0] == difilt.buf[DI1][1] &&
difilt.buf[DI1][1] == difilt.buf[DI1][2] &&
difilt.buf[DI1][2] == difilt.buf[DI1][3] ){
difilt.di1 = difilt.buf[DI1][0];
}
if( difilt.buf[DI2][0] == difilt.buf[DI2][1] &&
difilt.buf[DI2][1] == difilt.buf[DI2][2] &&
difilt.buf[DI2][2] == difilt.buf[DI2][3] ){
difilt.di2 = difilt.buf[DI2][0];
}
if( ++difilt.wp >= DI_FILT_MAX ){
difilt.wp = 0;
}
timdifilt = FILT_MIN;
}
}
timdifiltã¿ã€ããTIME_UPãããšå éšã®åŠçãè¡ããŸããDIæ å ±ãæ ŒçŽãããããã¡ãæŽæ°ããªããå ¥ããŠãã4ã€ã®ãããã¡ã®å€ãäžèŽãããšãDIæ å ±ãšããŠæ¡çšããŠããŸãã
4åäžèŽã§DIæ å ±ãšããŠæ¡çšãããããã£ã¿ãªã³ã°ã«ããäžå®å®ãªéšåãé€ããŠå€ãæ¡çšã§ããããã«ãªããŸãã
äŸã§ã¯4ã€ã®ãããã¡ã§æ§æããŠããŸãããã¿ã€ãã®å€ãçãããããããã¡ã®å€ãå¢ããæ¹æ³ãéžæãããããããšã§ä»»æã®ãã£ã«ã¿ãå®è£ ããããšãã§ããŸãã
void setup() {
MsTimer2::set(1,TimerCnt); //1msããšã«é¢æ°ãžé·ç§»
MsTimer2::start();
timdifilt = FILT_MIN;
for( uint8_t i=0; i < 10; i++ ){
ã //ã¡ã€ã³ã«è¡ãåã«DIæ
å ±ã確å®ããŠãã
mainTimer();
DiFilter();
delay(10);
}
}
ã¡ã€ã³ã«ãŒãã«é·ç§»ããåã«DIæ å ±ã確å®ããŠããããå Žåã¯setup()颿°ããæããåã«DIãã£ã«ã¿åŠçãå ¥ããŠãããšããã§ãã
ã¿ã€ã管çãšDIãã£ã«ã¿ã®åäœã確èªãã

11çªãDOã«ããŠã¿ã€ã管çã®æ¹æ³ã§LEDãç¹ç¯/æ¶ç¯ããŠããŸããåãã¿ã€ãã³ã°ã ãšã¿ã€ã管çãã§ããŠããããšã®ç¢ºèªããã«ããããç¹ç¯ã®æéãçãããŠæ¶ç¯ã®æéãçãããããã«ããŸãã
ïŒçªãDIãã³ã®ãã€ã³ã³ãã«ã¢ããã«èšå®ãSW1ãæŒãããšãLOWã¬ãã«ã«ãªãã·ãªã¢ã«ã¢ãã¿ã«ãdi1–okãã衚瀺ããããã«ããŸããåæ§ã«7çªãDIãã³ã®ãã€ã³ã³ãã«ã¢ããã«ãSW2ãæŒãããšãLOWã¬ãã«ã«ãã·ãªã¢ã«ã¢ãã¿ã«ãdi2–okãã衚瀺ããããã«ããŸãã
10msã®ã¿ã€ã管çã§4ååã®å€ãäžèŽããŠããåºåã倿Žãããããšããå¿çæéãæå°ã§çŽ40msãšãªããŸãã

SW1ãšSW2ãæŒãããšãã«ã·ãªã¢ã«ã¢ãã¿ã«å¯Ÿè±¡ã®æåã衚瀺ãããŸãã10msã®ã¿ã€ãã§ç¢ºèªããŠãããã广ãåããã«ããã®ã§ãããDIãã£ã«ã¿ãã¿ã€ã管çãé·ããšãããšã§å€åãåããããããªããŸããtimdifiltã«ã»ããããå€ãå¢ãããšSWã«å¯Ÿããåå¿ãé ããªããã广ãåãããããªããŸãã
äŸãã°timdifiltã«50ãã»ãããããš50Ã10msã§1åDIã®ç¶æ ã確èªãã4åäžèŽããŠDIæ å ±ãšããã®ã§2ç§çµéããªããšå¿çããªããã£ã«ã¿ã«ãªããŸããå¿çãé ãããã®ã¯åé¡ãªã®ã§ã»ã©ã»ã©ãããããã§ãã
ãœãŒã¹ã³ãŒãå šäœ
ãœãŒã¹ã³ãŒãã¯èšäºäœææç¹ã«ãããŠåäœç¢ºèªã§ããŠããŸããã䜿çšããŠããã©ã€ãã©ãªã®æŽæ°ã«ããåäœãä¿èšŒã§ããªããªãå¯èœæ§ããããŸãããŸãããœãŒã¹ã³ãŒãã䜿çšããããšã«ãã£ãŠçããäžå©çãªã©ã®äžåã®è²¬ä»»ãè² ããããŸããåèè³æãšããŠã䜿ããã ããã
#include <MsTimer2.h>
#define TIME_UP 0
#define TIME_OFF -1
#define BASE_CNT 10 //10msãããŒã¹ã¿ã€ããšãªã
#define LED_ONOFF 50
#define LED_ONOFF2 100
#define FILT_MIN 1
#define PIN_DO1 11
#define PIN_DI1 6
#define PIN_DI2 7
#define DI_FILT_MAX 4
enum DI_NO{
DI1 = 0,
DI2,
DI_MAX
};
struct DIFILT_TYP{
uint8_t wp;
uint8_t buf[DI_MAX][DI_FILT_MAX];
uint8_t di1;
uint8_t di2;
};
// application use
int8_t timled = LED_ONOFF;
int8_t timled2 = TIME_OFF;
int8_t timdifilt = TIME_OFF;
int8_t cnt10ms;
bool btnflg1;
bool btnflg2;
DIFILT_TYP difilt;
/*** Local function prototypes */
void TimerCnt();
void mainTimer();
void DiFilter();
void setup() {
pinMode( PIN_DO1, OUTPUT);
pinMode( PIN_DI1, INPUT_PULLUP );
pinMode( PIN_DI2, INPUT_PULLUP );
MsTimer2::set(1,TimerCnt); //1msããšã«é¢æ°ãžé·ç§»
MsTimer2::start();
Serial.begin(115200);
timdifilt = FILT_MIN;
for( uint8_t i=0; i < 10; i++ ){
mainTimer();
DiFilter();
delay(10);
}
}
void loop() {
mainTimer();
DiFilter();
if( timled == TIME_UP ){ //timled2ãšäº€äºã«äœ¿çšããŠLEDãONOFFããŠãã
timled = TIME_OFF;
timled2 = LED_ONOFF2; //LED_ONOFF2ãé·ããããšONæéãé·ããªã
digitalWrite(PIN_DO1, HIGH);
}
if( timled2 == TIME_UP ){
timled2 = TIME_OFF;
timled = LED_ONOFF; //LED_ONOFFãé·ããããšOFFæéãé·ããªã
digitalWrite(PIN_DO1, LOW);
}
if(difilt.di1 == 0){
if(btnflg1){
btnflg1 = false;
Serial.println("di1--ok");
}
}else{
btnflg1 = true;
}
if(difilt.di2 == 0){
if(btnflg2){
btnflg2 = false;
Serial.println("di2--ok");
}
}else{
btnflg2 = true;
}
}
/* callback function add */
void TimerCnt(){
++cnt10ms;
}
/* Timer Management function add */
void mainTimer(){
if( cnt10ms >= BASE_CNT ){
cnt10ms -=BASE_CNT;
//10msããšã«ããã«é·ç§»ãã
if( timled > TIME_UP ){
timled--;
}
if( timled2 > TIME_UP ){
timled2--;
}
if( timdifilt > TIME_UP ){
timdifilt--;
}
}
}
/* DiFilter function add */
void DiFilter(){
if( timdifilt == TIME_UP ){
difilt.buf[DI1][difilt.wp] = digitalRead(PIN_DI1);
difilt.buf[DI2][difilt.wp] = digitalRead(PIN_DI2);
if( difilt.buf[DI1][0] == difilt.buf[DI1][1] &&
difilt.buf[DI1][1] == difilt.buf[DI1][2] &&
difilt.buf[DI1][2] == difilt.buf[DI1][3] ){ //4åäžèŽã確èª
difilt.di1 = difilt.buf[DI1][0];
}
if( difilt.buf[DI2][0] == difilt.buf[DI2][1] &&
difilt.buf[DI2][1] == difilt.buf[DI2][2] &&
difilt.buf[DI2][2] == difilt.buf[DI2][3] ){ //4åäžèŽã確èª
difilt.di2 = difilt.buf[DI2][0];
}
if( ++difilt.wp >= DI_FILT_MAX ){
difilt.wp = 0;
}
timdifilt = FILT_MIN;
}
}
ã¡ã€ã³é¢æ°ã§ããloop()ã«é·ç§»ããåã«setup()颿°å ã§DIãã£ã«ã¿ã®å€ã確å®ããããã«foræã§delay(10)ã§é å»¶ãããªããDIå€ã確å®ããŠããŸãã
é¢é£ãªã³ã¯
Arduinoã®ã©ã€ãã©ãªã䜿ã£ãŠåäœç¢ºèªãè¡ã£ãããšãäžèšãªã³ã¯ã«ãŸãšããŠããŸãã
Arduinoã§åŠã¹ããã€ã³ã³ã®ãœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
Seeeduino XIAOã§åŠã¹ããœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
ESP32-WROOM-32Eã§åŠã¹ããœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
Raspberry Pi Picoã§åŠã¹ããœããéçº
PRïŒãã£ãªã¢åœ¢æã§ãæ©ã¿ã®ããªããžïŒååç¡æçžè«ã§çžè«ã§ãã[coachee]
æåŸãŸã§ãèªãã§ããã ãããããšãããããŸããã


