한번 삭제 됐다가 알바한테 찌질대서 다시 살려낸 게시물.
지금 또 짤릴까 걱정되서 짤방은 그냥..
(물론 개념없는 듣보잡 찌질이가 신고한걸 무개념 먹튀알바가 확인없이 날린거였겠지만
그래도 바꿨다.)
그리고 인간적으로 관심 1g 좀.. 맆흘수가 어째..
유리한과 함께하는 AVR로 임베디드 개념쌔우기 - #9. 돌아라~
벌써 9번째 강좌 되시겠다.
별로 올린것도 없는데 9번째 강좌라니..
감동이다.
오늘 진도는 모터에 관한 내용이다. 로봇을 만들때는 필수지.
자, 흔히 MCU로 제어하는 모터는 크게 세가지.
DC모터, 스테핑모터, 서보모터 가 있겠다.

<DC기어모터>

<스테핑모터>

<서보모터>
(사진출처 : 엘레파츠)
사진을 보면 대충 감이 오나?
dc모터는 그냥 미니카에 들어가던 모터. 일명 문방구 모터 되시겠다.
사진에 있는건 기어를 달아놔서 속도는 느려도 힘은 작살인 기어모터 되시겠다.
dc모터의 선은 두가닥이다. 말안해도 알겠지? 전원을 어느 라인에 걸어주느냐에 따라서
회전 방향이 바뀐다.
주의할점은 io포트에 다이렉트로 엮으면 역기전류때문에 칩이 뒈질수가 있다.
포토커플러나 TR, FET같은걸로 전원단을 분리해주는게 좋다.
(간단하게 io포트 출력으로 스위치를 껐다 켰다 하듯이 조절하라는거다.)
이건 스테핑모터도 마찬가지다.
스테핑모터를 보자면 좀 묵직하게 생겼다.
뭐하는 놈인고 하니 나름 정확한 각도제어가 가능 하시겠다.
선을 보면 6가닥으로 되어있다. 전원/접지를 제외하면 남는핀은 네개.
신호선이 네가닥 되시겠다.
A, B, /A, /B 로 표현하는데.. 번갈아가면서 신호를 주면 돌아간다.
뭐 구동방법은 몇가지가 있긴한데.. 용어는 기억이 안난다.ㅋ
하여간.. 간단히 알아보자.
A B /A /B 순으로 나간다.
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
이렇게 주는 방법이 있지만 좀 부드럽지 못하다는 단점이 있지.
그래서 나온 방식이
1 1 0 0
0 1 1 0
0 0 1 1
1 0 0 1
이런 방식이나
1 0 0 0
1 1 0 0
0 1 0 0
0 1 1 0
0 0 1 0
0 0 1 1
0 0 0 1
1 0 0 1
같은 방식이 있겠고..
1 1 0 0
1 1 1 0
0 1 1 0
0 1 1 1
0 0 1 1
1 0 1 1
1 0 0 1
1 1 0 1
이라던지..
뭐 맘에 드는 방법으로 써라.
간단하게 소스 나가신다.
1 2 3 /* 초단순 스텝모터 드라이빙 함수 4 * Step Moter == PORTD 5 * A - 0x01 PD0 6 * B - 0x02 PD1 7 * /A - 0x04 PD2 8 * /B - 0x08 PD3 9 */ 10 11 12 #define MOT_PORT PORTD 13 #define FORWARD 1 14 #define BACKWARD -1 15 16 void Step_Mot(char Direction,int Delay_Time) 17 { 18 static signed char Mot_Step=0; 19 20 if(Direction==FORWARD) 21 ++Mot_Step; 22 else if(Direction==BACKWARD) 23 --Mot_Step; 24 else return; 25 26 if(Mot_Step==-1) 27 MOT_Step=3; 28 if(Mot_Step==4) 29 Mot_Step=0; 30 31 MOT_PORT=1<<Mot_Step; 32 delay_ms(Delay_Time); 33 34 return; 35 } 36 |
지금 대충 만들어서 잘 돌아갈지는 장담 못한다.
뭐 이런식으로 돌리면 된다는걸 말해주는것 뿐이다.
딜레이는 필수로 줘야되는데, 안주면 뭐 안돈다. 속도생각해서 알맞게 주도록 하고..
저놈 사용하려면 for(i=0;i<1000;++i) Step_mot(FORWARD,100); 형태로 루프 돌려야 된다. ㅇㅋ?
A -> B - > /A -> /B 까지 한사이클을 돌면 1.8도가 움직이는거야.
180도를 움직이고 싶다면 100번 사이클을 돌려주면 되는거지. 저 함수의 경우에는 100*4 번 돌리면 될테고. ㅇㅋ?
추가하자면, 따로 IC칩을 쓰면 알아서 신호를 돌려주는 놈도 있다. 전류값에 따라 알아서 신호를 준다더라. 써본적 없으니 패스.
자, 이제 서보모터 한개 남았다.
어디다 쓰는 놈이냐? -90~+90도 까지 180도 밖에 안움직인다.
디지털 도어락에도 사용되고
로봇 관절에 사용된다. 자동차 와이퍼도 서보모터 쓰던가?
원운동이지만 직선운동도 가능하게 할수 있다.
이놈은 선이 세개다.
역시 전원 1 접지 1 한개는 신호선.
근데 디지털 신호가 아니라 아날로그 신호다.
(물론 디지털 서보나 rs-232나 485를 지원하는 서보도 있다더라. 써본적 없으니 역시 패스.)
20ms 주기로 0.7~2.3m 까지 PWM 신호를 주면 -90~+90 까지 움직인덴다.
(PWM개념은 초반 강좌에 있을꺼다.)
지금은 테스트할 방법이 없으니
역시 발로 짠 소스를 보자.
1 2 // 비트 토글 3 #define ServoOn PORTD|=0x01; 4 #define ServoOff PORTD&=~0x01; 5 6 ISR(TIMER0_OVF_vect) 7 { 8 static unsigned int cnt; 9 TCNT0 = 0x00; //계산하기 귀찮아. 하여간 100us. 10 if(cnt<200) 11 cnt++; 12 else cnt=0; 13 if(Servo<cnt) 14 ServoOn; 15 else ServoOff; 16 } 17 |
주기는 알아서 100us로 맞춰라. 자세한 내용은 강좌 중 delay 부분에 있다.
100us * 200은 20ms 되시겠고..
0.7~2.3이라고 했으니 서보모터를 움직이고 싶을때 Serv0 값을 7~23 까지 주고싶은데로 주면
-90~+90까지 움직이겠지?
오늘 강좌는 이것으로 끝이다.
사족을 붙이자면 dc모터 속도제어도 PWM 방식으로 가능하다.
스텝은 딜레이 따라 속도가 달라지고
서보는 속도조절 그딴거 업ㅂ다
다들 즐거운 하루 되시라
난 휴가 마지막 날이다..ㅠㅠ
그리고 캐생키들
관심좀..ㅠㅠ 굽신굽신
뻘글도 맆흘이 두자린데 이건뭐..
다음번 강좌는 뭘로할까?
초음파센서나 할까?
adc도 해야되나..?
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.