1. for문과 scanf를 이용한 문제.


참고자료 (http://blog.naver.com/fflash4/30150577724)


무한 루프를 이용하여 scanf() 함수로 두개의 정수를 사용자로부터 입력받아

두 정수의 합을 출력하는 프로그램을 제작 하세요


여기 숙제처럼 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main(){
    int a;
    int b;
    
    int i=0;
    int c=a+b;
 
    for(i; ;i=i+1){
    printf("정수 두개 입력 :");
    scanf("%d %d", &a, &b);
    
    printf("\n");
    printf("두 수의 합 : %d \n", c);
    }
    for(;;);
}


이렇게 적고 F5 하면, 아래 스샷과 같이 경고문이 나온다.


계속을 하면 실행은 되지만... 결과가



이런식으로 나온다...


하지만 int c를 지우고 printf 함수에 a+b 의 값을 받아오게 하면 잘된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main(){
    int a;
    int b;
    
    int i=0;
    
 
    for(i; ;i=i+1){
    printf("정수 두개 입력 :");
    scanf("%d %d", &a, &b);
    
    printf("\n");
    printf("두 수의 합 : %d \n", a+b);
    }
    for(;;);
}


원인이 뭘까??

설정

트랙백

댓글

1. vi 편집문제 -> vim 설치, vim 기본설정.

vi 편집기가 안됨.

chmod 777 '디렉토리 이름' 으로 권한을 바꿔주고

sudo vi로 실행했는데도 안됨.

아무래도 vim 설치가 안된듯하다.

원래는 검은색 배경의창이 새로 떠야되는데 뭔가 문제가 생긴듯.


방향키를 누르면 A B C D가 나오고

지워도 지워지지 않는다. Del 키는 입력가능.

이렇게 그냥 q!로 종료;;;


=========================================================================================================


이제부터 vim을 설치해보자.

참고자료(http://cafe.naver.com/pipc/431)

              http://blog.naver.com/chazzing?Redirect=Log&logNo=192251092


여기서 아래 스샷과 같이 sudo apt-get install vim 입력.

업그레이드가 안됫다고?

sudo apt-get update를 해봐도 안된다.


아... 아마도 vim 설치가 제대로 안된듯하다. 위에서 생긴 문제가 똑같이 일어난다.

그래서 http://blog.naver.com/gauya?Redirect=Log&logNo=110156473356 사이트 처럼 

sudo apt-get install vim-full을 적용했다.

아하. 원인을 알았다. 인터넷연결이 안되는구나.

이로써 결론은 노트북과 1:1 라즈베리 연결을 하면 인터넷이 안된다는 것.


그러면 인터넷을 연결할 수 있게 설정을 바꿔줘야 한다.




=========================================================================================================



그래서 설정을 모두 되돌리고 다시 vim설치를 하였다.


sudo apt-get install vim

sudo apt-get upgrade

sudo apt-get update

이제 인터넷 연결이 되어 있어서 정말 잘된다.


이제 vim 편집기 까지 정상적으로 작동이 잘 되나... 아래와 같이 코딩할 때 검은색으로 변하는게 안된다... 도대체 이유가 뭐지?

오른쪽처럼 색상이 검은색으로 나오고 색도 나오고 라인도 나오고... 해야될텐데.


이것의 문제는 간단하다 (http://cafe.naver.com/pipc/431)


Vim 편집기의 기본설정 문제인데 이 경우는 간단한 설정으로 변경이 가능하다.

sudo vim /etc/vim/vimrc 를 실행해서 vimrc 환경파일을 오픈



원본 파일을 이렇게 바꿔주면 코딩준비 완료! 한시름 덜었다...

'●프로젝트와 세미나 > C-language' 카테고리의 다른 글

4. 배열에 대한 궁금증.  (1) 2013.11.29
3. 함수나누기 void형 함수  (2) 2013.11.19
2. for문과 조건문  (0) 2013.11.17
1. for문과 scanf를 이용한 문제.  (0) 2013.11.15

설정

트랙백

댓글

라즈베리파이 이용 자동차 참고자료.

http://blog.naver.com/siam18/193752235

설정

트랙백

댓글

8-2. PWM 서보모터 DC등을 제어 위해 여러개 핀에 PWM 줘서 제대로 나오는지 확인하기.


설정

트랙백

댓글

10. 시리얼 통신 헤더파일(wiringSerial.h) 분석. 인터럽트처럼 동작할 수 있게 코드변환.

9에서 배운 것처럼 통신을 하면 되지만. 우리가 원하는 통신은,

자동차 방향이 가운데를 유지하다가 신호가 오면 좌우로 변환되고, 신호가 없으면 다시 가운데를 유지하도록 하는 것이다.


이렇게 하려면 if 등의 조건문이 필요한데... 일단 목표는 LED를 3개 놓고 평소에는 가운데를 입력 받다가 L 누르면 왼쪽 그리고 가만히 있으면 다시 가운데 불켜지고, R 누르면 오른쪽 켜지는 것을 구현하는 것이다.



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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <string.h>
#include <errno.h>
 
#include <wiringPi.h>
#include <softPwm.h>
#include <wiringSerial.h>
 
int main ()
{
  int fd ; //시리얼 통신 확인 변수
  int count ;
  unsigned int nextTime ;
 
  if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)  // 두번째 인자값이 보레이트 설정
  {   // fd가 -1이면 아래 처럼 unable 나온다.
    fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;                   
    return 1 ;
  }
 
  if (wiringPiSetup () == -1)
  {
    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
    return 1 ;
  }
 ////////////////////////////////////////////별거 아님////////////////////////////////////////////////
 
  nextTime = millis () + 300 ;
 
  while(1) 
  {
      scanf("%d", &count);  // 통신확인 안되서 임의로 테스트 해볼 수 있게 scanf
      fflush (stdout) ;
      serialPutchar (fd, count) ; // 데이터 전송해주는 함수
      nextTime += 300 ; //delay 역할?
    
       if(getchar == 1)  // 제일 왼쪽
       {
           softPwmWrite(ledMap[0], values[7]);
       }
    
       else if(getchar ==6)  // 제일 오른쪽
       {
           softPwmWrite(ledMap[7], values[7]);
       }
    
       else
       {
           softPwmWrite(ledMap[3], values[7]);   //빵판의 LED 3,4가 centre
           softPwmWrite(ledMap[4], values[7]);
       }
  
 //////////////////////////////////////////////////////////////////
    delay (3) ;
 
    while (serialDataAvail (fd)) // RX에 데이터 들어오는지 확인하는 함수
    {
      printf (" -> %3d", serialGetchar (fd)) ;  // RX 데이터 받는 함수
      fflush (stdout) ;
    }
  }
 
  printf ("\n") ;
  return 0 ;
}


설정

트랙백

댓글

9. 시리얼통신-라즈베리 통신하기-후에 블루투스로 통신

참고1 .http://embejide.tistory.com/40 (http://cafe.naver.com/pipc/2169)

          http://blog.naver.com/kimyosep0331/140194362360

참고2. http://cafe.naver.com/openrt/484


1. 일단 /boot/cmdline.txt 파일 백업하고 sudo cp cmdline.txt cmdline_backup.txt 를 입력    해서 원본을 복사한다.

~로 시작하는건 일종의 C드라이브 개념이고. "cd /"를 해야 더 상위인 root에 갈 수 있다.


2. 참고1 블로그에 있는 것처럼 cmdline.txt 내용을 지우면...

이상하게 에러가 난다.

원인은 read only이기 때문!  설정을 바꿔주기 위해 모드를 변경한다.

ls -al로 전체 파일 조건을 보고

sudo chmod 777 로 모든 권한을 조정한다.

그리고 텍스트파일 켜서 

삭제.                                                                                                  (출처 참고1).


3. 이제 cd .. -> etc경로 -> inittab파일을 수정한다.


맨 아래줄에 T0:23raspawn:/sbin/getty -L ttyAMA0 115200 vt100 이라고 적혀있는놈을 주석처리해준다.

저장하고 sudo reboot 명령어를 사용해서 라즈베리파이를 재부팅해준다.

#이 주석...                                                                                      (출처 참고1).


4. 자 이제 wiringPi/examples 폴더로 이동해서 make serialTest를 입력하고 serialTest를 컴파일한다. 컴파일을 완료하고 GPIO핀을 아래 그림처럼 연결하면 하드웨어도 준비 끝이다. 일단 루프백테스트를 하기위함이다. 루프백테스트는 rx핀과 tx핀을 연결하고 데이터를 보내고 읽는 테스트다. 즉 자기자신한테 데이터를 보내고 받는것이다.


 (출처 참고1).

sudo ./serialTest 를 입력해서 확인해본다.

serialTest.c 코드


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
44
45
46
47
48
49
50
#include <stdio.h>
#include <string.h>
#include <errno.h>
 
#include <wiringPi.h>
#include <wiringSerial.h>
 
int main ()
{
  int fd ; //시리얼 통신 확인 변수
  int count ;
  unsigned int nextTime ;
 
  if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)  // 두번째 인자값이 보레이트 설정
  {   // fd가 -1이면 아래 처럼 unable 나온다.
    fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;                   
    return 1 ;
  }
 
  if (wiringPiSetup () == -1)
  {
    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
    return 1 ;
  }
 
  nextTime = millis () + 300 ;   // millis() 함수는 값이 일정하게 증가하는 함수
 
  for (count = 0 ; count < 256 ; )   //
  {
    if (millis () > nextTime)
    {
      printf ("\nOut: %d: ", count) ;
      fflush (stdout) ;                //뭐하는 변수인지... fflush
      serialPutchar (fd, count) ; // 데이터 전송해주는 함수, count 값이 TX로 가나보다.
      nextTime += 300 ; //delay 역할?
      ++count ;
    }
 
    delay (3) ;
 
    while (serialDataAvail (fd))  // DataAvail은 Rx에 신호가 있을 때 실행됨.
    {
      printf (" -> %3d", serialGetchar (fd)) ;  // 데이터 받는 함수
      fflush (stdout) ;
    }
  }
 
  printf ("\n") ;
  return 0 ;
}

코드를 분석해보자!

26번줄의 millis() 함수는 어느 값에서 부터 일정하게 조금씩 증가하는 함수로 판명되었다. 

30~37번의 if문을 보면 millis()가 netxTime보다 커야 하는데 이것은 처음부터 불가능하므로 millis()함수가 일정하게 증가하는 것으로 볼 수 있고 이것이 +next값을 넘을 때마다 if문이 실행되는 것을 알 수있다. 또 +next가 되고 그것이 또 커지면 if문 실행.


 41~46번줄의 serialDataAvail 함수는 RX에 입력이 있을 때 1을 출력하는 함수로 판명되었다. 그래서 while문이 실행된거지. 확인을 위해 int a=0;을 선언하고 아래와 같이 코드를 작성.

결과는 아래처럼 나온다.





5. 이제 실행해보면! TX -> RX 출력이 보인다.

설정

트랙백

댓글

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) ;
             }
}


설정

트랙백

댓글

7.wiringPi를 이용한 PWM 실험.


지금 주기와 듀티비를 알아내는 것이 관건인데...

 1

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


위처럼 면, softPwmWrite (ledMap [1], values [6])를 했더니 (4편에 빵판사진 LED)

 두 번째 LED가 켜지고 주기는 매우 짧았다;;

1
2
3
4
5
 39             while(1)  //infinite loop
 40             {
 41             softPwmWrite (ledMap [1], values [6]);  // value=50
 42             delay (50) ;
 43             }


LED 는 위 배열에서 1값일거고...밸류가 듀티비인가..

     

보면 주기는 50ms

RANGE를 주파수라 생각하고 500 ㅡ> 주기는 20ms로 생각했는데 실제는 50ms

values는 여전히 듀티비(%)라 가정하고 다시 조정해보자.


values [3] (실제 50)으로 하니까 high인 폭이 더 짧아졌다. (duty비 맞는듯)

그리고 high가 너무 짧아서 LED도 더 어둡게 깜빡인다. 깜빡이는 속도는 같다.


다시 values [6] 해놓고 RANGE만 1000으로 바꿔보았다. LED가 더 느리게 깜빡인다.

 아하... 주기가 100ms가 되었다.


RANGE 1은 0.1ms이다.


자 그럼 위 오실로 사진을 보면 주기는 100ms이고 

RANGE 1000에 values [6](100)을 적용하면 전체주기의 10%만 high값이 출력된다.


만약 주기20ms를 맞추기 위해 RANGE 200, 그리고 values [6](100)을 적용하면

 10ms동안 high가 출력된다.



이제 PWM은 어느정도 완료된듯!


여기서 내가 주기 20ms를 꼭 맞추려고 하는 이유가 있다.

주기가 20ms 라는 것은 20ms 마다 한번씩 파형을 발생시키는 것인데

서보모터 입장에서 20ms 보다 주기가 짧으면 더 많이 모터가 움찔?거려야 하므로 뜨거워진다.

20ms 주기가 서보모터에겐 가장 이상적인 조건이라 한다.

설정

트랙백

댓글