달력

5

« 2024/5 »

  • 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

제어 영상:

 



라즈베리 파이 ---데이터---> 아두이노:
라즈베리 파이가 아두이노와 시리얼 통신을 하기 위해서는 다음을 설치합니다.
sudo apt-get install python-serial python3-serial

라즈베리 파이는 "1500E" 라는 문자열을 보냄니다.
그러면 아두이노는 1500은 수로 바꾸어 인식하고, E를 인식하므로써 데이터 단위의 끝을 인식하게 됩니다.

E가 없으면 라즈베리 파이는 계속 데이터를 보내기 때문에 1500150015001500 이렇게 아두이노는 데이터를 받게 됨니다.
그러면 타이밍에 따라 인식하는 데이터가 5001이나 0051이 될 수 있습니다.
그렇기 때문에 E를 인식하는 순간, 여태까지 받은 데이터 1,5,0,0을 수치화 하여 변수에 저장하고 서보모터를 작동시키도록 한거임.


주의사항!:
서보모터의 VCC는 외부 서플라이로 연결해줘야 합니다!!
만먁 외부 전원 공급없이 라즈베리파이로 또는 아두이노로 전원을 받으면 라즈베리 파이가 갑자기 멈추거나 고장납니다~~
당연히 GND는 라즈베리, 아두이노, 서보모터가 공통이여야 하구요!


라즈베리 파이 파이썬 코드:
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
import RPi.GPIO as GPIO
import serial
import time
 
port = "/dev/ttyACM0"  //아두이노와 통신하기 위해서 포트를 설정한다.
serialToArduino = serial.Serial(port, 9600) // 9600으로 아두이노와 시리얼 통신을 한다.
 
//스위치 핀들을 입력 모드로 설정한다.
GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.IN)
GPIO.setup(25, GPIO.IN)
 
//아두이노에 보낼 변수들
message = "1500"
endMark = 'E'
 
print "Ready to communication!" //파일 시작을 알리는 글
 
while True:
 if(GPIO.input(25) == True): //25번 핀에 연결된 스위치를 누르면
  message = "500" 
 elif(GPIO.input(24) == True): //24번 핀에 연결된 스위치를 누르면
  message = "2500"
 else//아무것도 누르지 않으면
  message = "1500"  
 
 serialToArduino.writelines(message) //보내고 싶은 데이터를 보낸다.
 serialToArduino.write(endMark)//데이터의 마지막을 알린다.
  
 print(" sendind message: " + message + str(endMark) ) //사용자가 확인할 수 있도록 터미널 창에 뜨는 글
 time.sleep(.5)


아두이노 코드:
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
const int servo=2;
int pw=1500;
char char_value = 0;
int int_value = 0;
const char endMark = 'E';
 
void setup()
{
  Serial.begin(9600);
  pinMode(servo, OUTPUT);
}
 
void loop()
{
   if(Serial.available())
  {
    char_value = Serial.read();
    if(isDigit(char_value))
    {
      int_value = (int_value*10) + (char_value - '0'); //each successive number is multiplied by 10. 
      //for example, the value of the number 234 is 2*100 + 3*10 + 4.
    }
    else if(char_value == endMark)
    {
      pw = int_value; //storge the received value from RPi
      int_value = 0; //reset int_value to 0 ready for the next sequence of digits
     }
  }
  
  drive_servo(pw); //input the high pulse delay
}
 
void drive_servo(int val)
{
  //period is 20ms.
  digitalWrite(servo, HIGH);
  delayMicroseconds(pw);
  digitalWrite(servo, LOW);
  delayMicroseconds(20000-pw);
}

 


'라즈베리파이 > 아두이노' 카테고리의 다른 글

Serial To Arduino  (0) 2016.02.08
Serial From Arduino  (0) 2016.02.08
아두이노 설치  (0) 2016.02.08
:
Posted by youjin.A