티스토리 뷰

[아두이노 -> 파이썬 시리얼 통신  알아보기]

2018/10/18 - [===[프로그래밍]===/Arduino] - [아두이노 → 파이썬] 시리얼 통신으로 문자열 보내는 방법



#

이번에는 저번 글과 반대로 파이썬의 코드를 통해 아두이노에게 문자열 등의 원하는 값을 전송하는 방법을 알아보겠습니다 .개인적으로는 파이썬에서 아두이노로 보내는 쪽이 좀 더 까다롭다고 생각합니다. 



파이썬 코드는 간단합니다. 포트와 보드레이트를 맞춰주시고, 원하시는 문자열을 전송하기만 하면 됩니다. 저는 Q12345678이라는 값을 보내보겠습니다.


# 파이썬 코드 :


import serial
print('serial ' + serial.__version__)

# Set a PORT Number & baud rate
PORT = 'COM7'
BaudRate = 9600

ARD= serial.Serial(PORT,BaudRate)

A=1234
B=5678

A=str(A)
B=str(B)
Trans="Q" + A + B
Trans= Trans.encode('utf-8')


while (True):
    ARD.write(Trans)  # Q12345678 전송



아두이노 코드를 보겠습니다. Serial.read()는 여러 입력이 한 번에 들어와도 마지막 문자 하나만을 반환합니다. 따라서 while문과 String.concat() 함수를 이용해서 들어오는 입력 문자들을 이어 붙여 하나의 문자열로 만들어줍니다. 그리고 저는 보낸 입력 Q12345678에서 첫 문자가 Q인지를 먼저 확인하고 나머지 12345678을 각각 변수에 저장하겠습니다. 이때는 String.substring() 함수를 이용할 것 이구요. 첫 문자 뿐 아니라 글자 수도 검사해서 올바른 입력만을 받도록 해보겠습니다.

atoi() 함수는 int로 데이터타입을 바꿔주는 함수입니다. 따라서 문자 1234를 숫자 1234로 바꾸는 역할을 합니다.

올바른 값을 받았는지는 LED를 통해 확인해볼 예정입니다.

 

# 아두이노 코드

/***********************************
  파이썬,아두이노 시리얼 통신
                     <둠선생 연구실>
************************************/
String sig;
char Ard1[5]={0};
char Ard2[5]={0};
char check[1];
int value_1=0;
int value_2=0;

void setup()
{
  Serial.begin(9600);
  pinMode(7,OUTPUT); // LED 연결
}

void loop()
{ 
  /* 문자열로 저장*/
  while(Serial.available()) 
   {
     char wait = Serial.read();
     sig.concat(wait);
   } 
  
    /* 입력 문자열 슬라이싱 */
    sig.substring(0,1).toCharArray(check,2);

    if(check[0] == 'Q')
      {
      if (sig.length()==9)
        {
          sig.substring(1,5).toCharArray(Ard1,5);
          sig.substring(5,9).toCharArray(Ard2,5);
          value_1 = atoi(Ard1);
          value_2 = atoi(Ard2);
          sig = "";
        }
       else if (sig.length()>9)
        {sig = "";}
       }
     else if (check[0] != 'Q')
      {sig = "";}

     /* 수신 확인*/
    if(value_1 == 1234 && value_2 == 5678)
      {
        digitalWrite(7,HIGH);
      }
}


파이썬과 통신 중 일 때에는 시리얼 모니터를 사용할 수 없습니다만, 정상적인 동작을 하는 지 먼저 시리얼 모니터와 Serial.print() 함수로 파이썬 입력이 아닌 직접 값을 입력해서 출력이 어떻게 나오는 지 확인을 해보면 다음과 같이 나옵니다.


실행 결과 :



이제 준비가 다 되었습니다. 아두이노 코드를 업로드 하고, 파이썬에서 코드를 실행시켜 주시면 됩니다


실행 결과 :




댓글
반응형
«   2024/05   »
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
글 보관함