반응형

예전 PLC와 컴퓨터 python을 연결할 때 아두이노로 대신 테스트 했다.

아두이노가 PLC역할을 하고,

Python은 PC로 돌리게 된다.

 

컴퓨터와 아두이노간의 연결하는 코드이다.

아두이노에 스위치를 달고 LED를 달고 테스트

아두이노의 시리얼 포트로 115200 비트로 통신한다.

 

아두이노에서 ready신호를 보내면, PC의 python코드가 작동하고

PC에서 1번 (합격), 2번 (불합격) 신호를 보내면

아두이노에서 그에 맞는 동작을 하는 코드이다.

 

아두이노 코드

const int buttonPin1 = 8;      //  8 번핀 스위치 입력 테스트 (PLC의 ready신호)
char LEDpin1 = 12;    //  OK LED 포트 설정
char LEDpin2 = 13;    //  NG

int flag = 0;
int NGflag = 0;
int OKflag = 0;

// LED확인용 함수.
void OK(void)
{
    digitalWrite(LEDpin1, HIGH);
    digitalWrite(LEDpin2, LOW);
}
void NG(void)
{
    digitalWrite(LEDpin2, HIGH);
    digitalWrite(LEDpin1, LOW);
}


void setup() {
  Serial.begin(115200);              //  시리얼 통신의 시작, 보레이트 입력
  pinMode(buttonPin1, INPUT_PULLUP);  //  스위치 내부풀업저항 입력포트로 셋팅.
  
  pinMode(LEDpin1, OUTPUT);           //  OK, NG LED 출력포트 지정.
  pinMode(LEDpin2, OUTPUT);
}

void loop() {
  char c = Serial.read();           //  PC로부터온 값을 읽음.
  int buttonValue1 = digitalRead(8); //  8번 핀에서 읽음.
  
  if(buttonValue1 == LOW )           //  스위치가 눌릴때 ready신호를 보냄. (PLC -> PC)
  {
    flag = 1;
  }
  if(flag == 1)
  {
      Serial.println("ready");      //  준비가 되었다고 PC에 신호를 보냄.
      delay(500);
      flag = 0;
  }

  // 아스키코드 0x31 들어올때, OK
  if( c == '1')
  {
      OKflag = 1;
  }

  // 아스키코드 0x32 들어올때, NG
  else if( c == '2')
  {
      NGflag = 1;
  }

  

  if(OKflag == 1)
  {
    OK();
    OKflag = 0;
  }
  if(NGflag == 1)
  {
    NG();
    NGflag = 0;
  }

}

 

반응형

 

파이썬 코드

import serial

ser = serial.Serial(
    port='COM3',
    baudrate=115200,
    parity=serial.PARITY_NONE,\
    stopbits=serial.STOPBITS_ONE,\
    bytesize=serial.EIGHTBITS,\
)


while True:
    if ser.readable():
        res = ser.readline()                 # 시리얼로 날라온 bytes 값이 저장됨.
        ready = res.decode()[:len(res)-2]    # bytes를 decode 해서 str로 변환, 자동으로 포함되어있는 개행을 제거하기 위해 [:len(res)-2] 를 추가함 : 즉, \r\n 을 제거함.

        print(ready)        # 아두이노(PLC)에서 날라온 프로토콜.

        judge = input()             # 유저가 입력 '1' 또는 '2' 테스트 하기 위해.

        OK = chr(0x31)              # '1' 일때 OK
        NG = chr(0x32)              # '2' 일때 NG

        # 프로토콜을 받고 판독 시작.
        if ready == 'ready':
            if judge == OK:

                OK = OK.encode()     # OK일때 char 를 bytes로 인코딩
                ser.write(OK)        # 아스키코드 0x31 전송

            elif judge == NG:

                NG = NG.encode()     # NG일때 아스키코드 0x32 전송
                ser.write(NG)
            else:
                pass

 

반응형

'Arduino' 카테고리의 다른 글

Arduino Uno로 인체 감지 쓰레기통 만들기  (0) 2019.09.27
반응형

뚜껑이 있는 쓰레기통을 직접 손으로 열고 닫기 귀찮아서...

근처에 가면 열리는 쓰레기통을 만들어 보았다.

 

회로도

 

모듈들을 직접 그려보았지만... 그림이 이상하다.

휴지통 커버

준비물은 

 -> 아두이노, 서보 모터, 인체감지센서, 점프선

     그외 옷걸이 철사를 위 사진과 같이 잘라서 만들었고 글루건으로 모터를 붙여줬다.

 

처음 아두이노를 PC에 연결하고 테스트했을때 전류가 부족해 문을 열지 못해서,

모터 전원은 외부에서 입력받도록 바꿨다.

센서가 싸구려라서.. 잘 인식이 안되는건 함정

 

외부입력 전원과 아두이노 GND만 연결시켜주면 된다~ 

 

완성된 영상:

https://youtu.be/C8M6aDDAeYE

반응형

'Arduino' 카테고리의 다른 글

아두이노 파이썬 연결, 아두이노 파이썬 통신  (0) 2020.09.17
1

+ Recent posts