8. PWM 이용한 서보모터 제어.


먼저 서보모터의 개요이다. 사진처럼, -90에서 +90까지 움직이는데 필요한 duty 시간이 나와있다.


주기가 2ms, 20ms, 40ms 상관없이 high 시그널이 0.6ms동안 오면 -90인 것이다.

따라서 이렇게 하기 위해서 코드를 수정해보면.


RANGE가 1000이었을 때 실제 100ms 였으니까. 6이면 0.6ms 이겠구나.


많이 고칠 것도 없다.

 39             while(1)  //infinite loop
 40             {
 41             softPwmWrite (ledMap [1], 6);  // value=는 없고 그냥 0.6ms 일 뿐이다
 42             delay (50) ;
 43             }

여태껏 values[]를 배열형태로 값을 정해놨었는데 그냥 6하면 0.6ms duty값을 줄 수 있다.



0.6 밀리세크!!!


원래는 빵판에 서보모터까지 세팅해놓고 실험하려 했으나 라즈베리파이에 보호회로가 없어서 위험할 수 도 있다는 염려에 나중에 하기로 했다 +_+;;; 

왜 위험한건지는 아직 그냥 느낌... 참고자료->(http://cafe.naver.com/openrt/224)


완성된 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
 
 #include <wiringPi.h>
 #include <softPwm.h>
 
 #define RANGE      500    //이렇게 하면 주기가 50ms이다.
 #define NUM_LEDS   12
 
 int ledMap [NUM_LEDS] = { 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13 } ;
 
 int values [NUM_LEDS] = { 0, 17, 32, 50, 67, 85, 100, 85, 67, 50, 32, 17 } ; //이건 듀티비!!!
 
 int main ()
 {
     int i ;
     char buf [80] ;   // buffer
 
     if (wiringPiSetup () == -1)
         {
           fprintf (stdout, "oops: %s\n", strerror (errno)) ;
           return 1 ;
         }
 
     for (i = 0 ; i < NUM_LEDS ; ++i)
         {
           softPwmCreate (ledMap [i], 0, RANGE) ;
           printf ("%3d, %3d, %3d\n", i, ledMap [i], values [i]) ;
         }
 
 ///////////////////////////////////////////////////////////////step1//
 
       fgets (buf, 80, stdin) ; ////////////////////act as scanf(put in anyth
 
             // Bring all up one by one
 
            while(1)  //infinite loop
             {
             softPwmWrite (ledMap [1], 6);  // value=는 없고 그냥 0.6ms 일 뿐이다
             delay (50) ;
             }
}


설정

트랙백

댓글