ããã«ã¡ã¯ãENGããŽã§ãã
Arduinoã®DOã䜿çšããããšã§ã¹ãããã³ã°ã¢ãŒã¿ãŒãæäœããããšãã§ããŸããã¹ãããããšã«DOãåãæ¿ããŠå±ç£ãã¿ãŒã³ãçæããããšã§ã¹ãããã³ã°ã¢ãŒã¿ãŒãæèš/åæåãã«å転ãããããšãã§ããŸãã
æ¬èšäºã§ã¯DOæäœã§ã¹ãããã³ã°ã¢ãŒã¿ãŒãå転ãããæ¹æ³ãšStepperã©ã€ãã©ãªã䜿çšããŠå転ãããæ¹æ³ã§åäœç¢ºèªããŠããŸãã
Arduinoã¹ã¿ãŒã¿ãŒãããã«ä»å±ããŠããã¹ãããã³ã°ã¢ãŒã¿ãŒïŒ28BYJ-48-W01ïŒåã³ãã©ã€ããŒåºæ¿ãæ¥ç¶ããŠåäœç¢ºèªãè¡ããŸãã
Arduino UNOïŒä»¥äžArduinoãšããŸããïŒã察象ãšããŸããArduinoã®ã©ã€ãã©ãªã䜿çšããŠåäœç¢ºèªããããšããŸãšããŠããŸãã
Arduinoã§åŠã¹ããã€ã³ã³ã®ãœããéçºãšæšæºã©ã€ãã©ãªã®äœ¿ãæ¹
ã¹ãããã³ã°ã¢ãŒã¿ãŒãæäœãã
ã¹ãããã³ã°ã¢ãŒã¿ãŒã¯å転æ°ãå¶åŸ¡ãããã©ã€ããŒãšã»ããã§äœ¿çšããŸããç£æ¥çšã§ãã«ãã³ã³ãã€ãŒãæ°Žéã調æŽããåŒã®ééã«äœ¿çšãããŠããçšéã¯æ§ã ã§ãã
ã¹ãããã³ã°ã¢ãŒã¿ãŒã®å±ç£æ¹æ³ã¯é»æµãå¢å¹ ããŠå±ç£ãã黿µåãšãã©ã€ããŒã«é»å§å€ãäžããŠã¢ãŒã¿ãŒã®é床ã調æŽããé»å§åããããŸãã
28BYJ-48-W01ã¯ãŠãããŒã©æ¹åŒã§å·»ç·ã«å¯ŸããŠäžæ¹åã®é»æµãæµããŠèµ·åãã黿µåã§ããã¢ãŒã¿ãŒã®å·»ç·ã®é»æµã«ããå±ç£ããŸããã黿µããã¿ãŒã³ãåãæ¿ããŠå転ç£çãçºçãããããšã§è»žïŒããŒã¿ãŒïŒãå転ãããä»çµã¿ã§ãã
ã¢ãŒã¿ãŒã®èµ·åæ¹æ³
ãŠãããŒã©æ¹åŒã§ã®èµ·åæ¹æ³ã¯ã1çžå±ç£ã2çžå±ç£ã1-2çžå±ç£ã«ããå±ç£ã«ãã£ãŠèµ·åããŸãããããã®å±ç£æ¹åŒã®ç¹åŸŽã«ã€ããŠä»¥äžã«ãŸãšããŠããŸãã
| å±ç£æ¹åŒ | ç¹åŸŽ |
|---|---|
| 1çžå±ç£(Full step) | 1çžãã€é ã«å±ç£ããŠããããæ¶è²»é»æµã¯å°ãªããªããŸãããã ãåçžã«åãæ¿ããéã«æ¯åãçºçãããããªããŸãã |
| 2çžå±ç£(Full step) | 2çžãã€åãæ¿ããããåºåãã«ã¯ã倧ãããªããŸããæ¶è²»é»æµãå¢ããŸãã1çžå±ç£ãããæ¯åãæããããããæ»ãããªåããšãªãã |
| 1-2çžå±ç£(Half step) | 1å±ç£ãš2çžå±ç£ã亀äºã«ç¹°ãè¿ãæ¹åŒãã¢ãŒã¿ãŒã®ã¹ãããè§ã®åè§£èœãåºæ¬ã¹ãããã®1/2ã«ãªããŸããã2çžå±ç£ãããããã«æ»ãããªåããšãªãã |
æ¬èšäºã§ã¯ããŒã¿ã·ãŒãã«èšèŒãããŠããå±ç£æ¹åŒã§ãã1-2çžå±ç£ã®æ¹æ³ã§ã¹ãããã³ã°ã¢ãŒã¿ãŒãé§åããŸãã

ã¹ãããã³ã°ã¢ãŒã¿ãŒã®1ã¹ãããã®æäœã¯1ãã«ã¹ã®å ¥åã§è¡ããŸãããã®ããåšæ³¢æ°ã®åäœã§HzãŸãã¯ppsã§èšèŒãããŠããŸãã
ã¹ãããã³ã°ã¢ãŒã¿ãŒãèµ·åããå Žåã¯ç¹æ§æ²ç·ã«åŸã£ãŠèµ·åããããšãæšå¥šãããŸããã¢ãŒã¿ãŒã忢ããŠããç¶æ ããæ¥éãªå ¥ååšæ³¢æ°ã§èµ·åãããšã¹ã«ãŒã€ã³ã°ç¹æ§ããå€ããŠè»žãå転ããªãåæå€ãã®åé¡ãçºçããããšããããŸãã
ã¢ãŒã¿ãŒãèµ·åã¯å¹çãããã«ã¯ãåããªããé«éå転ã«é·ç§»ãããããšãæšå¥šãããããã¹ã«ãŒé åå ïŒèµ€ç·ãšéç·å ã®é åïŒã«ç¹æ§ãåãŸãããã«ã¹ãããåšæ³¢æ°ãå¶åŸ¡ããŸãã
ã¹ã¿ãŒãã£ã³ã°ç¹æ§ã¯ã¹ãããæ°ãå ¥åãã«ã¹ãš1察1ã«å¯Ÿå¿ããŠèµ·åã§ããæå€§ã®ãã«ã¯ãçºçã§ããé¢ä¿ã瀺ããŠããŸãã
ã¹ã«ãŒã€ã³ã°ç¹æ§ã¯ã¹ã¿ãŒãã£ã³ã°ç¹æ§ç¯å²ä»¥å ã§èµ·åããŠåæå転ããŠããã¢ãŒã¿ãŒã®å ¥åãã«ã¹ã®åšæ³¢æ°ãåŸã ã«å¢å ããå Žåãã¹ã¿ãŒãã£ã³ã°ç¹æ§ä»¥äžã®å ¥ååšæ³¢æ°ã«1察1ã«å¯Ÿå¿ã§ããæå€§ãã«ã¯ãšå ¥åãã«ã¹ã®é¢ä¿ã瀺ããŠããŸãã
ã¹ã«ãŒé åã¯èªèµ·åé åããå ¥åãã«ã¹ã®åšæ³¢æ°ãå¢å ããããããã¯è² è·ãã«ã¯ãå¢å ããããšããã¢ãŒã¿ãŒãå ¥åãã«ã¹ãšåæãä¿ã£ãŠå¿çã§ããé åã§ãã
èªèµ·åé åã¯ç¡è² è·ç¶æ ã§ãå ¥åãã«ã¹ã«åæããŠèªèµ·åãå¯èœãªé åã§ãããã®é åããå ¥åãã«ã¹ã®åšæ³¢æ°ããããŠèµ·åããããšã§ãã«ã¯ãé«ãåŸãªããé«éå転ã«ç§»ãããšãã§ããŸãã
28BYJ-48-W01ã®ããŒã¿ã·ãŒãã§ã¯Max starting frequencyã500HzãMax response frequencyã1000ppsãšèšèŒãããŠããŸããç¡è² è·ç¶æ ã§500ppsïŒ2msïŒã§èµ·åããŠåšæ³¢æ°ãäžããå Žå1000ppsïŒ1msïŒçšåºŠãŸã§ã¯å®å®ã«åäœãããããšãã§ããŸããè² è·ãããå Žåã¯é«ãã«ã¯ã§èµ·åããããã«500pps以äžã®å ¥ååšæ³¢æ°ã§èµ·åããŠåŸã ã«å ¥ååšæ³¢æ°ããããŠå¶åŸ¡ããŸãã
PRïŒæè¡ç³»ã®éä¿¡æè²è¬åº§ãªãJTEX
å±ç£ã®ãã¿ãŒã³ãçæãã

28BYJ-48-W01ã®ããŒã¿ã·ãŒãã«èšèŒãããŠããã¹ãããæ°ã«ããå¶åŸ¡ã¯1-2å±ç£æ¹åŒã§ããArduinoã®DOãå¢å¹ ããä¿¡å·ã§å±ç£ãã¿ãŒã³ãäœãããšã§å転ãããããšãã§ããŸããããŒã¿ã·ãŒããåŒçšããŠå¶åŸ¡ã«å¿ èŠãªäºé ãäžå¿ã«èª¬æããŸãã
ïŒïŒ4極ã®å±ç£ã§1çžå±ç£ãš2çžå±ç£ãåãæ¿ããŠå±ç£ãã¿ãŒã³ãäœããŸããïŒèšå·ã¯DOãLOWãèšå·ããªãå Žæã«ã€ããŠã¯HIGHã«ããŸããïŒãã8ã¹ãããã®ãã¿ãŒã³ãDOã§å¶åŸ¡ããããšã§å転ç£çãçæãã¢ãŒã¿ãŒãå転ãããŸããã¹ãããæ°ïŒïœ8ãDOã®ãã¿ãŒã³ãåãæ¿ããŠå±ç£ããäŸã¯ä»¥äžã®éããšãªããŸãã
/* ã¹ãããã³ã°ã¢ãŒã¿ãŒã®å±ç£ */
bool StepMove(uint8_t no, bool posi){
bool ret = false;
switch(no){
case 0: //0111
digitalWrite(PIN_STP_IN4,LOW);
digitalWrite(PIN_STP_IN3,HIGH);
digitalWrite(PIN_STP_IN2,HIGH);
digitalWrite(PIN_STP_IN1,HIGH);
if(posi){
ret = true;
}
break;
case 1: //0011
digitalWrite(PIN_STP_IN4,LOW);
digitalWrite(PIN_STP_IN3,LOW);
digitalWrite(PIN_STP_IN2,HIGH);
digitalWrite(PIN_STP_IN1,HIGH);
break;
case 2: //1011
digitalWrite(PIN_STP_IN4,HIGH);
digitalWrite(PIN_STP_IN3,LOW);
digitalWrite(PIN_STP_IN2,HIGH);
digitalWrite(PIN_STP_IN1,HIGH);
break;
case 3: //1001
digitalWrite(PIN_STP_IN4,HIGH);
digitalWrite(PIN_STP_IN3,LOW);
digitalWrite(PIN_STP_IN2,LOW);
digitalWrite(PIN_STP_IN1,HIGH);
break;
case 4: //1101
digitalWrite(PIN_STP_IN4,HIGH);
digitalWrite(PIN_STP_IN3,HIGH);
digitalWrite(PIN_STP_IN2,LOW);
digitalWrite(PIN_STP_IN1,HIGH);
break;
case 5: //1100
digitalWrite(PIN_STP_IN4,HIGH);
digitalWrite(PIN_STP_IN3,HIGH);
digitalWrite(PIN_STP_IN2,LOW);
digitalWrite(PIN_STP_IN1,LOW);
break;
case 6: //1110
digitalWrite(PIN_STP_IN4,HIGH);
digitalWrite(PIN_STP_IN3,HIGH);
digitalWrite(PIN_STP_IN2,HIGH);
digitalWrite(PIN_STP_IN1,LOW);
break;
case 7: //0110
digitalWrite(PIN_STP_IN4,LOW);
digitalWrite(PIN_STP_IN3,HIGH);
digitalWrite(PIN_STP_IN2,HIGH);
digitalWrite(PIN_STP_IN1,LOW);
if(posi == false){
ret = true;
}
break;
}
return ret;
}
以äžã®èª¬æã§ã¯ãŠãŒã¶ãŒãã¹ãããã³ã°ã¢ãŒã¿ãŒã®è»žåŽãèŠãæãåºæºã«ããŠå転æ¹åãæ±ºããŠããŸããåæèšåãã®å Žåã¯ã¹ãããæ°1ïœ8ãæèšåãã®å Žåã¯ã¹ãããæ°8ïœ1ã1ã»ãããšããŸãã
å±ç£ãã¿ãŒã³ãåãæ¿ããStepMove()颿°ãå®è£ ããŸãã第1åŒæ°ã¯ã¹ãããã®çªå·ãæå®ããŸããåæèšåšãã®å Žåã¯0ãã7ã®é ã§æå®ããŸããæèšåãã®å Žåã¯7ãã0ã®é ã§æå®ããŸãã
第2åŒæ°ã¯å転æ¹åãæå®ããŸããtrue(1)ãæå®ãããšæèšåãã®å±ç£ãã¿ãŒã³ã§ã®æçµã¹ãããã®å€æããŸãã
ïŒïŒFrequency of light pull outã¯Max response frequencyã«çžåœããŸããïŒïŒMax starting frequencyïŒæå€§å¿çåšæ³¢æ°ïŒã®éã«ã¹ã«ãŒé åïŒã¢ãŒã¿ãŒãå ¥åä¿¡å·ã«å¿çã§ããé åïŒããããããã®åºéã®ç¯å²å ã§ã®ãã«ã¹ïŒåšæ³¢æ°ïŒã調æŽããŸãã
stepfreq_p = 10000; //åšæ³¢æ°ã®åæå€
if(posi){
now_p = micros() - oldtime_p;
if ( now_p >= stepfreq_p ){
oldtime_p = micros();
if( StepMove(7- mng_p.md++, true)){//å±ç£ãã¿ãŒã³ã®çæ
if(++mng_p.stepcnt >= 2 ){ //ïŒã»ãããåäžåšæ³¢æ°ã§ç¹°ãè¿ã
posi = false;
if(stepfreq_p <= 1000){
stepfreq_p = 1000;
}
else{
stepfreq_p -= 1000; //åšæ³¢æ°ã®æŽæ°
}
}
else{
mng_p.md = 0;
}
}
}
}
åæå€ã10000usïŒ100HzïŒããå±ç£ãã¿ãŒã³ãåãæ¿ããŸããmicros()颿°ã§ååŸããusçµéæéãšååã®åŠçæéãšã®å·®ã«ãã£ãŠå€å®ããŠåŠçãè¡ããŸããå·®ãæ¯èŒå€ä»¥äžã«ãªã£ãå Žåãªå±ç£ã®ãã¿ãŒã³ã®åãæ¿ããè¡ããŸããå·®ã10000ã®å Žåã¯10000usçµéããããšã«ãªããã100Hzæ¯ã®åŠçã®ã¿ã€ãã³ã°ã«ãªããŸãã
ã»ãããçµäºããããšã«æ¯èŒå€ãäœãããããšã§ãåšæ³¢æ°ãé«ãããŠãããŸããäŸã§ã¯2ã»ããæ¯ã«æ¯èŒå€ã倿ŽããŠããŸãã
ã¢ãŒã¿ãŒé§åæã¯èªèµ·åé åã§ãã«ã¯ãå€ãåŸããã100ppsã§ã¹ã¿ãŒããæå€§ã§1000ppsãŸã§åšæ³¢æ°ãé«ãããªããå転ãããŠããŸãã
ã©ã€ãã©ãªã䜿çšãã
Arduinoç°å¢ã§ã¯æšæºã©ã€ãã©ãªã§ã¹ãããã³ã°ã¢ãŒã¿ãŒãæäœããStepperã©ã€ãã©ãªãå®è£ ãããŠããŸããStepperã©ã€ãã©ãªã䜿çšããã«ããã£ãŠå¿ èŠãªäºé ã«ã€ããŠèª¬æããŸããæŒãããŠããå¿ èŠãããé ç®ã¯ä»¥äžã®ïŒç¹ã§ãã
- ïŒåéã®åœããå転æ°
- å±ç£æ¹åŒã«å¯Ÿãã1å転ã«å¿ èŠãªã¹ãããæ°
- å転ã«å¿ èŠãªã¹ãããæ°ïŒä»»æã®å€ïŒ
ïŒïŒãšïŒïŒã¯äœ¿çšããã¢ãŒã¿ãŒã®ä»æ§ã«åãããŠæå®ããŸãã28BYJ48-W01ã¯å±ç£æ¹åŒãšããŠ1-2çžå±ç£ïŒHalf stepïŒãèšèŒãããŠããã¹ãããè§ã5.625/64ïŒStep angleïŒã«ãªã£ãŠããŸããããã¯1-2å±ç£æ¹åŒã®8ã¹ãããïŒ1ã»ããïŒãïŒåïŒ64÷8ïŒç¹°ãè¿ããš5.625床å転ããŸãã
ç¡è² è·ç¶æ ã§ã¯æå€§ã§1msïŒ1000ppsïŒã§ã¹ããããåãæ¿ããããšãèæ ®ãããš5.625床å転ããããŸã§ã®çµéæéã¯çŽ64msã«ãªããŸããã®ã¢æ¯ã®1/64ãèæ ®ãããš1åšã«å¿ èŠãªç§æ°ã¯64msÃ64=4096msïŒçŽ4ç§ïŒãšãªãã1ååœããã§ã¯15å転ãšãªããŸãã
1å転ã«å¿ èŠãªã¹ãããæ°ã¯ã5.625床ã§64ã¹ãããå¿ èŠã§ããããšã®ã¢æ¯ã1/64ã§ããããšãã64Ã64=4096ã¹ãããã«ãªããŸãã
ã©ã€ãã©ãªã®åæå
#include <Stepper.h>
Stepper myStepper(2048, PIN_STP_IN1, PIN_STP_IN3, PIN_STP_IN2, PIN_STP_IN4);
void setup() {
myStepper.setSpeed(15);
}
Stepperã©ã€ãã©ãªã䜿çšããããã«Stepper.hãã€ã³ã¯ã«ãŒãããŸããStepperã¯ã©ã¹ã®å€æ°ãmyStepper()ã§ã€ã³ã¹ã¿ã³ã¹åããŸããåŒæ°ã«äœ¿çšããã¹ãããã³ã°ã¢ãŒã¿ãŒã®å転æ å ±ãå±ç£ãã¿ãŒã³ãäœãDOãã³ãæå®ããŸãã
第1åŒæ°ã«ã¹ãããã³ã°ã¢ãŒã¿ãŒã®ïŒå転åœããã®ã¹ãããæ°ãæå®ããŸãã28BYJ48-W01ã®ïŒå転åœããã®ã¹ãããæ°ã¯2048ã«ãªããŸãã第2åŒæ°ãã第5åŒæ°ãŸã§ã¯å±ç£ã«äœ¿çšããDOãã³ãæå®ããŸãã
Stepperã¯ã©ã¹ã®setSpeed()颿°ã§1ååœããã®å転é床ãæå®ããŸãã28BYJ48-W01ã®ïŒååœããã®å転æ°ã¯ç¡è² è·ç¶æ ã§15åãªã®ã§åŒæ°ã«15ãæå®ããŠããŸããå転é床ãé ãããå Žåã¯15以äžã®å€ãæå®ããŸããã¹ãããã³ã°ã¢ãŒã¿ãŒã®ã¹ã«ãŒé åãè¶ ãããããªé床ãæå®ããå Žåãåæå€ãïŒè±èª¿ïŒã®ããå転ããªããªããŸãã
ã¹ãããæ°ãæå®ããŠå転ããã
myStepper.step(512); //æèšåãã®å Žå
myStepper.step(-512);ã//åæèšåãã®å Žå
Stepperã¯ã©ã¹ã®step()颿°ã§ã¹ãããã³ã°ã¢ãŒã¿ãŒãæäœããã¹ãããæ°ãæå®ããŸããåŒæ°ã«ã¹ãããæ°ãæå®ããŸãã28BYJ48-W01ã®å Žå2048ãæå®ãããš1å転ããŸããæ£ã®å€ãæå®ãããšæèšåãã«å転ããè² ã®å€ãæå®ãããšåæèšåãã«å転ããŸãã
äŸã§ã¯90床å転ãããããæå€§å€ã®2048ã4ã§å²ã£ã512ãæå®ããŠããŸãã
ã©ã€ãã©ãªã®äœ¿çšäŸ
以äžã¯ãStepperã©ã€ãã©ãªã®äœ¿çšäŸã§ããã³ã³ãã€ã«ããŠåäœããŠããŸãããã©ã€ãã©ãªã®æŽæ°ã«ããåäœããªããªãããšããããŸãã
#include <MsTimer2.h>
#include <Stepper.h>
#define PIN_STP_IN1 8
#define PIN_STP_IN2 9
#define PIN_STP_IN3 10
#define PIN_STP_IN4 11
#define PIN_DO1 4
#define PIN_DO2 5
#define PIN_DI1 6
#define PIN_DI2 7
#define TIME_OFF -1 //ã¿ã€ããŒã䜿çšããªãå Žå
#define TIME_UP 0 //ã¿ã€ã ã¢ãã
#define LED_OFF 100
#define DI_MAX 2
#define DI_FILT_MAX 4 //DIãã£ã«ã¿ã®ãµã³ããªã³ã°æ°
#define TIME_FILTER_MAX 1 //ããŒã¹ã¿ã€ãã«ãŠã³ãå€
#define CNT_INIT_MAX 10 //10msÃ10 = 100ms
const int stepsPerRevolution = 2048; //1å転ã®ã¹ãããæ°
typedef struct{
uint8_t wp;
uint8_t buf[DI_MAX][DI_FILT_MAX];
uint8_t di[DI_MAX];
}DIFILT_TYP;
Stepper myStepper(stepsPerRevolution, PIN_STP_IN1, PIN_STP_IN3, PIN_STP_IN2, PIN_STP_IN4);
bool posi;
bool neg;
DIFILT_TYP difilt;
int16_t timdifilt; //DIãã£ã«ã¿èµ·å
uint8_t CntInit; //åæåæã®ã¿äœ¿çš
int16_t timstepoff = TIME_OFF;
/*ãããã¿ã€ãå®£èš */
void mainTimer(void);
void mainApp(void);
bool StepMove(uint8_t no, bool posi);
void DiFilter(void);
void setup() {
Serial.begin(9600);
myStepper.setSpeed(15); //éåºŠã®æå®
pinMode(PIN_DI1,INPUT_PULLUP);
pinMode(PIN_DI2,INPUT_PULLUP);
pinMode(PIN_DO1,OUTPUT);
pinMode(PIN_DO2,OUTPUT);
CntInit = CNT_INIT_MAX;
while(CntInit > 0){ //0ã«ãªããŸã§ãã£ã«ã¿ã宿œ
DiFilter(); //DIãã£ã«ã¿åŠç
delay(10); //10msé
å»¶ãããŠDIãã£ã«ã¿åŠç
CntInit--;
timdifilt = TIME_UP;
}
MsTimer2::set(10, mainTimer); // 10ms period
MsTimer2::start();
}
void loop() {
mainApp();
}
/* ã¿ã€ã管ç */
void mainTimer(void){
if( timdifilt > TIME_UP ){
--timdifilt;
}
if( timstepoff > TIME_UP ){
--timstepoff;
}
//ã¹ãããã³ã°ã¢ãŒã¿ãŒã®æäœäžã¯
//åŠçãå æãããããå²ã蟌ã¿å
ã§DIãã£ã«ã¿ãåŠçãã
DiFilter();
}
/* ã¡ã€ã³åŠç */
void mainApp(void){
if(difilt.di[0] == LOW ){
if( neg == false){
Serial.println("nown");
neg = true;
}
}
else{
neg = false;
digitalWrite(PIN_DO1,LOW);
}
if(difilt.di[1] == LOW ){
if(posi == false){
Serial.println("nowp");
posi = true;
}
}
else{
posi = false;
digitalWrite(PIN_DO2,LOW);
}
if(neg){
neg = false;
timstepoff = LED_OFF;
digitalWrite(PIN_DO1,HIGH);
myStepper.step(-512);
}
if(posi){
posi = false;
timstepoff = LED_OFF;
digitalWrite(PIN_DO2,HIGH);
myStepper.step(512);
}
if( timstepoff == TIME_UP ){
timstepoff = TIME_OFF;
//ã³ã€ã«ã«é»æµãæµããç¶ããã®ãé²ã
digitalWrite(PIN_STP_IN1, LOW);
digitalWrite(PIN_STP_IN2, LOW);
digitalWrite(PIN_STP_IN3, LOW);
digitalWrite(PIN_STP_IN4, LOW);
}
}
/* DiFilter function add */
void DiFilter(void){
uint8_t i;
if( timdifilt == TIME_UP ){
timdifilt = TIME_FILTER_MAX;
difilt.buf[0][difilt.wp] = digitalRead(PIN_DI1);
difilt.buf[1][difilt.wp] = digitalRead(PIN_DI2);
for(i=0; i < DI_MAX; i++){
if( difilt.buf[i][0] == difilt.buf[i][1] &&
difilt.buf[i][1] == difilt.buf[i][2] &&
difilt.buf[i][2] == difilt.buf[i][3] ){ //4åäžèŽã確èª
difilt.di[i] = difilt.buf[i][0];
}
}
if( ++difilt.wp >= DI_FILT_MAX ){
difilt.wp = 0;
}
}
}
åäœç¢ºèªã§äœ¿çšããŠããåè·¯å³ãšåæ§ã®ãã®ã§åäœããŸããSW1ãæŒããšæèšåãã«90床å転ããSW2ãæŒããšåæèšåãã«90床ã«å転ããŸãã
ã¹ãããã³ã°ã¢ãŒã¿ãŒãæäœããŠããéã¯åŠçãå æããããã¡ã€ã³åŠçãé å»¶ãããã¡ãªããã¯ãããŸãããææ©ãå®è£ ã§ããããšãã¹ãããè§ãæ£ç¢ºã«å¶åŸ¡ã§ããã¡ãªããããããŸãã
åäœç¢ºèª

Arduinoã§ã¹ãããã³ã°ã¢ãŒã¿ãŒãèµ·åããå Žåãå¢å¹ åºæ¿ã䜿çšããŠDOã®åºå黿µãå¢å¹ ããŠã¹ãããã³ã°ã¢ãŒã¿ãŒãå±ç£ããŸããå¢å¹ åºæ¿ã¯ã¹ãããã³ã°ã¢ãŒã¿ãŒãšã»ããã«ãªã£ãŠããããšãå€ãããã©ã³ãžã¹ã¿ã¢ã¬ã€ïŒULN2003APGãªã©ïŒãå®è£ ãããŠããArduinoã®DOããã©ã³ãžã¹ã¿ã¢ã¬ã€ã®å ¥åããŠå¢å¹ ããŸãã
Arduinoã®é»æºã®ã¿ã§ã¯ã¹ãããã³ã°ã¢ãŒã¿ãŒçšã®æ¶è²»é»æµãäŸçµŠã§ããªãããå€éšããDC5Vãæ¥ç¶ããŠããŸããArduinoã®é»æºãšã¹ãããã³ã°ã¢ãŒã¿ãŒã®GNDïŒãŒïŒãå ±éã«æ¥ç¶ãè¡ããŸããåœèšäºã§ã¯é»æºã¢ããã¿ãŒïŒAD-D50P100:ç§æé»åïŒã䜿çšããŠããŸãã
黿ºãONããSW1ãé·æŒããããšã¹ãããã³ã°ã¢ãŒã¿ãŒã¯æèšåãå転ãå§ããLED1ãç¹ç¯/æ¶ç¯ããŸããSW2ãé·æŒããããšåæèšåãã«å転ãå§ããLED2ãç¹ç¯/æ¶ç¯ããŸããã¹ãããã³ã°ã¢ãŒã¿ãŒã®èµ·åæã¯ç·©ããã«å転ããé·æŒãããã«ã€ããŠå転é床ãéããªãäžå®é床ã«ãªãããšã確èªã§ããŸããããŸãã¢ãŒã¿ãŒãïŒåšãããŸã§ã®æéãæž¬å®ãããšçŽïŒç§ãšãªã£ãŠããããšã確èªã§ããŸããã
ãœãŒã¹ã³ãŒãå šäœ
ãœãŒã¹ã³ãŒãã¯èšäºäœææç¹ã«ãããŠåäœç¢ºèªã§ããŠããŸããã䜿çšããŠããã©ã€ãã©ãªã®æŽæ°ã«ããåäœãä¿èšŒã§ããªããªãå¯èœæ§ããããŸãããŸãããœãŒã¹ã³ãŒãã䜿çšããããšã«ãã£ãŠçããäžå©çãªã©ã®äžåã®è²¬ä»»ãè² ããããŸããåèè³æãšããŠã䜿ããã ããã
#include <MsTimer2.h>
#define MICRO_SEC 2000
#define STEP_START_FREQ 10000
#define PIN_STP_IN1 8
#define PIN_STP_IN2 9
#define PIN_STP_IN3 10
#define PIN_STP_IN4 11
#define PIN_DO1 4
#define PIN_DO2 5
#define PIN_DI1 6
#define PIN_DI2 7
#define TIME_OFF -1 //ã¿ã€ããŒã䜿çšããªãå Žå
#define TIME_UP 0 //ã¿ã€ã ã¢ãã
#define LED_WAIT 20
#define STEP_OFF 100
#define STEP_START_FREQ 10000
#define STEP_CUT 1000
#define STEP_MAX 2
#define DI_MAX 2
#define DI_FILT_MAX 4 //DIãã£ã«ã¿ã®ãµã³ããªã³ã°æ°
#define TIME_FILTER_MAX 1 //ããŒã¹ã¿ã€ãã«ãŠã³ãå€
#define CNT_INIT_MAX 10 //10msÃ10 = 100ms
typedef struct{
uint8_t wp;
uint8_t buf[DI_MAX][DI_FILT_MAX];
uint8_t di[DI_MAX];
}DIFILT_TYP;
typedef struct{
uint8_t md;
uint8_t stepcnt;
}STEP_CNT;
uint32_t oldtime_n;
uint32_t oldtime_p;
bool posi;
bool neg;
STEP_CNT mng_p;
STEP_CNT mng_n;
uint16_t stepfreq_n;
uint16_t stepfreq_p;
DIFILT_TYP difilt;
int16_t timdifilt; //DIãã£ã«ã¿èµ·å
uint8_t CntInit; //åæåæã®ã¿äœ¿çš
int16_t timled1 = TIME_OFF;
int16_t timled2 = TIME_OFF;
int16_t timstepoff = TIME_OFF;
/*ãããã¿ã€ã宣èš*/
void mainTimer(void);
void mainApp(void);
bool StepMove(uint8_t no, bool posi);
void DiFilter(void);
void setup() {
Serial.begin(9600);
pinMode(PIN_DI1,INPUT_PULLUP);
pinMode(PIN_DI2,INPUT_PULLUP);
pinMode(PIN_DO1,OUTPUT);
pinMode(PIN_DO2,OUTPUT);
pinMode(PIN_STP_IN1, OUTPUT);
pinMode(PIN_STP_IN2, OUTPUT);
pinMode(PIN_STP_IN3, OUTPUT);
pinMode(PIN_STP_IN4, OUTPUT);
CntInit = CNT_INIT_MAX;
while(CntInit > 0){ //0ã«ãªããŸã§ãã£ã«ã¿ã宿œ
DiFilter(); //DIãã£ã«ã¿åŠç
delay(10); //10msé
å»¶ãããŠDIãã£ã«ã¿åŠç
CntInit--;
timdifilt = TIME_UP;
}
MsTimer2::set(10, mainTimer); // 10ms period
MsTimer2::start();
}
void loop() {
mainApp();
DiFilter();
}
/* ã¿ã€ã管ç */
void mainTimer(void){
if( timled1 > TIME_UP ){
--timled1;
}
if( timled2 > TIME_UP ){
--timled2;
}
if( timdifilt > TIME_UP ){
--timdifilt;
}
if( timstepoff > TIME_UP ){
--timstepoff;
}
}
/* ã¡ã€ã³åŠç */
void mainApp(void){
uint32_t now_n,now_p;
if(difilt.di[0] == LOW ){
if( neg == false){
Serial.println("nown");
neg = true;
mng_n.md = 0;
mng_n.stepcnt = 0;
oldtime_n = micros();
}
}
else{
neg = false;
timled1 = LED_WAIT;
stepfreq_n = STEP_START_FREQ;
digitalWrite(PIN_DO1,LOW);
}
if(difilt.di[1] == LOW ){
if(posi == false){
Serial.println("nowp");
posi = true;
mng_p.md = 0;
mng_p.stepcnt = 0;
oldtime_p = micros();
}
}
else{
posi = false;
timled2 = LED_WAIT;
stepfreq_p = STEP_START_FREQ;
digitalWrite(PIN_DO2,LOW);
}
if(neg){ //åæèšåã
now_n = micros() - oldtime_n;
if ( now_n >= stepfreq_n ){
oldtime_n = micros();
timstepoff = STEP_OFF;
if( StepMove(mng_n.md++, false)){
if(++mng_n.stepcnt >= STEP_MAX){
neg = false;
if(stepfreq_n <= STEP_CUT){
stepfreq_n = STEP_CUT;
}
else{
stepfreq_n -= STEP_CUT;
}
}
else{
mng_n.md = 0;
}
}
}
}
if(posi){ //æèšåã
now_p = micros() - oldtime_p;
if ( now_p >= stepfreq_p ){
oldtime_p = micros();
timstepoff = STEP_OFF;
if( StepMove(7- mng_p.md++, true)){
if(++mng_p.stepcnt >= STEP_MAX){
posi = false;
if(stepfreq_p <= STEP_CUT){
stepfreq_p = STEP_CUT;
}
else{
stepfreq_p -= STEP_CUT;
}
}
else{
mng_p.md = 0;
}
}
}
}
if( timled1 == TIME_UP ){
timled1 = LED_WAIT;
digitalWrite(PIN_DO1,!digitalRead(PIN_DO1));
}
if( timled2 == TIME_UP ){
timled2 = LED_WAIT;
digitalWrite(PIN_DO2,!digitalRead(PIN_DO2));
}
if( timstepoff == TIME_UP){
timstepoff = TIME_OFF;
digitalWrite(PIN_STP_IN1,LOW);
digitalWrite(PIN_STP_IN2,LOW);
digitalWrite(PIN_STP_IN3,LOW);
digitalWrite(PIN_STP_IN4,LOW);
}
}
/* ã¹ãããã³ã°ã¢ãŒã¿ãŒã®å±ç£ */
bool StepMove(uint8_t no, bool posi){
bool ret = false;
//Serial.println(no);
switch(no){
case 0: //0111
digitalWrite(PIN_STP_IN4,LOW);
digitalWrite(PIN_STP_IN3,HIGH);
digitalWrite(PIN_STP_IN2,HIGH);
digitalWrite(PIN_STP_IN1,HIGH);
if(posi){
ret = true;
}
break;
case 1: //0011
digitalWrite(PIN_STP_IN4,LOW);
digitalWrite(PIN_STP_IN3,LOW);
digitalWrite(PIN_STP_IN2,HIGH);
digitalWrite(PIN_STP_IN1,HIGH);
break;
case 2: //1011
digitalWrite(PIN_STP_IN4,HIGH);
digitalWrite(PIN_STP_IN3,LOW);
digitalWrite(PIN_STP_IN2,HIGH);
digitalWrite(PIN_STP_IN1,HIGH);
break;
case 3: //1001
digitalWrite(PIN_STP_IN4,HIGH);
digitalWrite(PIN_STP_IN3,LOW);
digitalWrite(PIN_STP_IN2,LOW);
digitalWrite(PIN_STP_IN1,HIGH);
break;
case 4: //1101
digitalWrite(PIN_STP_IN4,HIGH);
digitalWrite(PIN_STP_IN3,HIGH);
digitalWrite(PIN_STP_IN2,LOW);
digitalWrite(PIN_STP_IN1,HIGH);
break;
case 5: //1100
digitalWrite(PIN_STP_IN4,HIGH);
digitalWrite(PIN_STP_IN3,HIGH);
digitalWrite(PIN_STP_IN2,LOW);
digitalWrite(PIN_STP_IN1,LOW);
break;
case 6: //1110
digitalWrite(PIN_STP_IN4,HIGH);
digitalWrite(PIN_STP_IN3,HIGH);
digitalWrite(PIN_STP_IN2,HIGH);
digitalWrite(PIN_STP_IN1,LOW);
break;
case 7: //0110
digitalWrite(PIN_STP_IN4,LOW);
digitalWrite(PIN_STP_IN3,HIGH);
digitalWrite(PIN_STP_IN2,HIGH);
digitalWrite(PIN_STP_IN1,LOW);
if(posi == false){
ret = true;
}
break;
}
//delayMicroseconds(1000); //1000以äžã§å転é床ã調æŽãã
return ret;
}
/* DiFilter function add */
void DiFilter(void){
uint8_t i;
if( timdifilt == TIME_UP ){
timdifilt = TIME_FILTER_MAX;
difilt.buf[0][difilt.wp] = digitalRead(PIN_DI1);
difilt.buf[1][difilt.wp] = digitalRead(PIN_DI2);
for(i=0; i < DI_MAX; i++){
if( difilt.buf[i][0] == difilt.buf[i][1] &&
difilt.buf[i][1] == difilt.buf[i][2] &&
difilt.buf[i][2] == difilt.buf[i][3] ){ //4åäžèŽã確èª
difilt.di[i] = difilt.buf[i][0];
}
}
if( ++difilt.wp >= DI_FILT_MAX ){
difilt.wp = 0;
}
}
}
é¢é£ãªã³ã¯
PICãã€ã³ã³ã䜿ã£ãŠãã€ã³ã³ã®ã¬ãžã¹ã¿ã®èšå®ãMPLAB X IDEã®ãã©ã°ã€ã³ã§ããMCCã䜿çšããŠåäœç¢ºèªããããšã«ã€ããŠãŸãšããŠããŸãã
PICãã€ã³ã³ïŒPIC12F675ïŒã§å®çŸã§ããæ©èœãšè§£èª¬ãªã³ã¯ãŸãšã
PICãã€ã³ã³ïŒPIC16F1827ïŒã§å®çŸã§ããæ©èœãšè§£èª¬ãªã³ã¯ãŸãšã
æåŸãŸã§ãèªãã§ããã ãããããšãããããŸããã

