BASIC4MCU | 질문게시판 | 답변 : master님 모터정지 및 회전 관련 문의드려요.
페이지 정보
작성자 master 작성일2019-01-14 14:12 조회6,150회 댓글0건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-01-14 오후 2:15:09// by Ok-Hyun Park//int CLK=9,DIR=6,ENA=5;int LATCH=4,SCLK=7,DATA=8;int SW1=A1,SW2=A2,SW3=A3;byte seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};byte dgt[]={0xF1,0xF2,0xF4,0xF8};unsigned long t1,t2;int Cnt=50,speed=100,d[4];//void Calc(int n){ d[0]=n/1000; d[1]=n/100%10; d[2]=n/10%10; d[3]=n%10; }//void Wr2Seg(byte s,byte v){digitalWrite(LATCH,0);shiftOut(DATA,SCLK,MSBFIRST,seg[v]);shiftOut(DATA,SCLK,MSBFIRST,dgt[s]);digitalWrite(LATCH,1);}//void Disp(){static byte c=0;Wr2Seg(c,d[c]); if(++c>3)c=0;digitalWrite(CLK,1); delayMicroseconds(1000-10*Cnt);digitalWrite(CLK,0); delayMicroseconds(1000-10*Cnt);}//void setup(){Serial.begin(9600);digitalWrite(DIR,1); digitalWrite(ENA,1);pinMode(CLK,OUTPUT); pinMode(DIR,OUTPUT); pinMode(ENA,OUTPUT);pinMode(LATCH,OUTPUT); pinMode(SCLK,OUTPUT); pinMode(DATA,OUTPUT);t2=millis();Calc(Cnt);}//void loop(){t1=millis();//if(!digitalRead(SW1)){if(t1-t2>200){ t2=t1; if(++Cnt>99)Cnt=100; Calc(Cnt); }}//if(!digitalRead(SW2)){if(t1-t2>200){ t2=t1; if(--Cnt<1)Cnt=1; Calc(Cnt); }}//if(!digitalRead(SW3)){ Cnt=0; Calc(Cnt); }//Disp();}
먼저 master님 감사인사드려요~코드를 보면서 배우고 또 배웁니다.
master님이 올려주신 것을 바탕으로 조금 수정했습니다.
1. 속도가 1부터 100까지 되도록 했구요.
2. 속도를 높이면 모터속도도 높아지도록 했습니다. 이런식으로요^^ delayMicroseconds(1000-10*Cnt);
작동 잘되는것을 확인했습니다.
기존 코드에서 버튼 3번을 누르면 모터가 정지되어야 하는데 낮은 속도로 계속 움직였습니다.
digitalWrite(CLK,1); delayMicroseconds(1000-10*Cnt);
digitalWrite(CLK,0); delayMicroseconds(1000-10*Cnt);이부분에서 digitalWrite(CLK,0);을 digitalWrite(CLK,1); 로 어떻게 바꿔야할 것 같은데 안되더라구요.
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-01-14 오후 2:16:56// by Ok-Hyun Park//int CLK=9,DIR=6,ENA=5;int LATCH=4,SCLK=7,DATA=8;int SW1=A1,SW2=A2,SW3=A3;byte seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};byte dgt[]={0xF1,0xF2,0xF4,0xF8};unsigned long t1,t2;int Cnt=50,speed=100,d[4];int mode=0;//void Calc(int n){ d[0]=n/1000; d[1]=n/100%10; d[2]=n/10%10; d[3]=n%10; }//void Wr2Seg(byte s,byte v){digitalWrite(LATCH,0);shiftOut(DATA,SCLK,MSBFIRST,seg[v]);shiftOut(DATA,SCLK,MSBFIRST,dgt[s]);digitalWrite(LATCH,1);}//void Disp(){static byte c=0;Wr2Seg(c,d[c]); if(++c>3)c=0;if(mode){digitalWrite(CLK,1); delayMicroseconds(1000-10*Cnt);digitalWrite(CLK,0); delayMicroseconds(1000-10*Cnt);}}//void setup(){Serial.begin(9600);digitalWrite(DIR,1); digitalWrite(ENA,1);pinMode(CLK,OUTPUT); pinMode(DIR,OUTPUT); pinMode(ENA,OUTPUT);pinMode(LATCH,OUTPUT); pinMode(SCLK,OUTPUT); pinMode(DATA,OUTPUT);t2=millis();Calc(Cnt);}//void loop(){t1=millis();//if(!digitalRead(SW1)){if(t1-t2>200){ t2=t1; if(++Cnt>99)Cnt=100; Calc(Cnt); mode=1; }}//if(!digitalRead(SW2)){if(t1-t2>200){ t2=t1; if(--Cnt<1)Cnt=1; Calc(Cnt); mode=1; }}//if(!digitalRead(SW3)){mode=0; }}//if(!digitalRead(SW3)){ Cnt=0; Calc(Cnt); }//Disp();}
mode 변수를 추가했습니다.
이 코드로 돌려보세요
그래서 모터 작동을 쉽게 하기 위해 버튼 4개로 아래와 같이 할려고 합니다.
1번은 속도업 SW1=A1
2번은 속도다운 SW2=A2
3번은 시작/정지 SW3=A3
4번은 방향 정/역 SW4=A4
1. 처음 전원을 켜면 모터가 돌아가는 것이 아니고 FND창에 숫자만 켜져있는 것입니다.
2. 이때 시작/정지 버튼을 누르면 모터가 움직입니다. 다시 누르면 모터가 멈추구요.
3. 방향4번을 누르면 모터의 회전이 바뀌구요. 다시 누르면 또 바뀌구요.
digitalWrite(DIR,0); 이것을 이용하면 될 것 같았는데
이것저것 해보았는데...한번만 바뀌고 다시 바뀌지 않더라구요. ㅜㅜ
댓글 0
조회수 6,150등록된 댓글이 없습니다.