본문 바로가기
전자공학/MCU

[아두이노] Serial 통신2

by 17Hyuk 2022. 5. 7.

이번에는 응용으로 LED를 제어해볼 예정이다.

 

준비물은

아두이노, LED 8개가 필요하다. (LED 개수는 본인이 알맞게 사용하기)

 

 

나는 이런식으로 2번부터 9번까지 포트를 연결했다.

여기서는 조금 아쉬운 부분이 있는데 포트를 0부터 7까지 사용하면 좋아겠지만 0,1 번 포트의 경우

rx, tx 포트이기 때문에 2번 포트부터 사용을 하게 됐다. 이부분은 각자 적절히 수정하면 좋을 것 같다.

우선 우리가 구현할 목표이다.

 

 

이런식으로 4글자씩 끊어서 000~999 * 10ms 동안 키도록 할 예정이다.

나는 LED가 8개 이므로 우리는 32개의 문자열이 필요하게 된다.

따라서 LED번호는 4i (0, 4, 8, ... , 28) 작동시간은 123, 567... 이런식으로 (i+1), (i+2), (i+3)이 된다.

 

파이썬

import serial

# input값을 길이 32로 만들어줌
def len32(tx):
    return str(tx) + ''.join(list('!' for i in range(32-len(tx))))


py_serial = serial.Serial(
    port='COM4',    #본인에게 맞는 포트 설정해주기
    baudrate=9600,
)

serial_flag = 0     # 무한입력방지

while True:
    # readline : '\n' 기준으로 값을 읽어옴
    if py_serial.readable():
        rx = py_serial.readline()[:-1].decode()
        print(rx)
        if rx[0:9] == "Complete!":
            serial_flag = 0

    if serial_flag==0 :
        tx = len32(input('파이썬 : '))
        py_serial.write(tx.encode())
        serial_flag = 1

 

아두이노

void setup() {
  pinMode(2, OUTPUT);pinMode(3, OUTPUT);pinMode(4, OUTPUT);pinMode(5, OUTPUT);  
  pinMode(6, OUTPUT);pinMode(7, OUTPUT);pinMode(8, OUTPUT);pinMode(9, OUTPUT);
  
  Serial.begin(9600);
  
}


void loop() {
  Serial.print("Serial Start!\n");
  
  while(Serial.available()==0){
  }

  String rx = Serial.readString();
  
  for(int i=0; i<8; i++){
    if(rx[4*i]=='!'){continue;}
    char led = rx[4*i]-'0'+2;   //문자 -> 숫자 (+2는 내가 핀을 2번부터 시작하기 때문)
    int opt = 10*(100*(rx[4*i+1]-'0')+10*(rx[4*i+2]-'0')+1*(rx[4*i+3]-'0'));  //operating time

    //시리얼 메세지
    char msg[40];
    sprintf(msg, "%d번 LED %d ms", led-2, opt);    //메세지는 -2 해줘야 정확하게 출력
    Serial.println(msg);

    //LED 작동
    digitalWrite(led, HIGH);
    delay(opt);
    digitalWrite(led, LOW);
  };

  Serial.print("Complete!\n");

}

 

설명

파이썬에서 def len32(tx): 는 별의미는 없고 '1234' -> '1234!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 이런식으로 만들어주는 코드이다.

'!' 의미는 아두이노 코드를 보면 if(rx[4*i]=='!'){continue;} 라고 써져있다. 즉, LED를 키지 말라고 하는 것 이다.

py_serial 은 각자 알맞는 값을 넣어주면 된다.
 
아두이노에서는 while(Serial.available()==0){} 의 의미는 입력을 받을 때 까지 무한루프라는 의미이다.
그후 opt 즉 작동시간을 만들어 준후 '123' -> 123 이런식으로 LED를 키는 코드이다.

 

'전자공학 > MCU' 카테고리의 다른 글

[EPS32] TCP통신1  (0) 2022.06.17
[아두이노] 아두이노간 Serial 통신1  (0) 2022.05.08
[아두이노]Serial 통신3-1  (0) 2022.05.08
[아두이노]Serial 통신3 (Flask 활용)  (0) 2022.05.08
[아두이노] Serial 통신1  (0) 2022.05.07

댓글