티스토리 뷰

반응형

다른 강의자료는 www.codingnow.co.kr/ 여기를 참고해주세요.!!

 

코딩나우

프로그래밍 교육및 개발의뢰 받습니다.

www.codingnow.co.kr

https://youtu.be/FH58gl8SjmI

 

 

 

 

 

 

C언어 기반인 아두이노를 파이썬 GUI를 사용하여 제어해보는 프로젝입니다.

여기서는 시리얼(serial) 통신을 사용합니다.

 

LED 제어 소스코드.zip
0.00MB

[1. C언어 - 아두이노]

아두이노 소스 트리는 다음과 같습니다.

아두이노의 스케치 파일 외에 src 폴더에 소스파일을 나누어 정리하였습니다.

아두이노 기본 예제소스인 blink 소스를 기반으로 작성이 되었습니다.

자세한 설명은 첨부된 동영상을 참고해주세요.

 

[회로]

강의 아두이노 소스코드 - Blink.ino

#include "src/global.h"
#include <SimpleTimer.h>

unsigned char isToggle = 0;
unsigned char isBlinking = 0;

SimpleTimer timer;

void sTimerCallback()
{
  isToggle = ~isToggle;
  Serial.print("LED : ");
  Serial.println(digitalRead(LED_BUILTIN));
}

void setup() 
{
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  // digitalWrite(LED_BUILTIN, LOW);
  timer.setInterval(1000, sTimerCallback);
}

void loop() 
{
  timer.run();
  switch (serialGet())
  {
    case 1: //ON
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.println("LED ON");
      isBlinking = 0;
      break;
    case 2: //OFF
      digitalWrite(LED_BUILTIN, LOW);
      Serial.println("LED OFF");
      isBlinking = 0;
      break;
    case 3: //Blinking
      digitalWrite(LED_BUILTIN, LOW);
      Serial.println("LED Blinking");
      isBlinking = 1;
      break;
  }

  if (isBlinking)
  {
    if (isToggle){
      digitalWrite(LED_BUILTIN, HIGH);
    }else{
      digitalWrite(LED_BUILTIN, LOW);
    }
  }
}

src/processSerial.cpp

#include "processSerial.h"
/* String Data Types
https://www.arduino.cc/reference/ko/language/variables/data-types/stringobject/
*/
String str = "";

unsigned char searchCMD(String str)
{
  if (str == "ON"){return 1;}
  if (str == "OFF"){return 2;}
  if (str == "BLINKING"){return 3;}
  return 0;
}

unsigned char serialGet(void) 
{
  unsigned char cmd = 0;
  while (Serial.available()) 
  {
    str += (char)Serial.read();
    if (str.indexOf('\n') > -1 )
    {
      // Serial.println(str);
      str.toUpperCase();//대문자변환
      str.replace("\n","");//enter 삭제
      cmd = searchCMD(str);
      str = "";
    }
  }
  return cmd;
}

src/global.h

#ifndef global_en_
#define global_en_

// #include <Arduino_DebugUtils.h>
#include <inttypes.h>
#include <Arduino.h>

#include "processSerial.h"

#endif

src/processSerial.h

#ifndef global_en_
#define global_en_

// #include <Arduino_DebugUtils.h>
#include <inttypes.h>
#include <Arduino.h>

#include "processSerial.h"

#endif

[2. 파이썬 -  LED 제어 GUI]

파이썬을 사용하여 간단한 아두이노 제어 GUI를 만들었습니다.

 

파이썬 실행결과

파이썬 LED 제어 GUI

아두이노와 시리얼 통신을 통해 제어 명령을 전달하게됩니다.

강의 파이썬 소스코드

import serial
import tkinter as tk

# pip install pyserial
# pip install serial
seri = serial.Serial(port='COM9',
                    baudrate=9600,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_ONE,
                    bytesize=serial.EIGHTBITS) 

# while True:
#     if seri.readable():
#         res = seri.readline()
#         print(res.decode()[:len(res)-1])
#         break
# seri.write(bytes('on\n', encoding='ascii'))

####################################################
## GUI 생성하기
####################################################
class LedControl():
    commads = ['ON', 'OFF', 'BLINKING']

    def __init__(self, seri):
        self.win = tk.Tk()
        self.win.title('[파이선] 아두이노 LED 제어')
        self.seri = seri
        for i, comm in enumerate(self.commads):##버튼을 만든다.
            bt = tk.Button(self.win,text=comm,
                width=40, height=10, 
                bg='gray', fg='black',
                command=lambda cmd=comm: self.button_click(cmd)
                )
            bt.grid(column=i, row=0)

    def button_click(self, value):
        print(value)
        comm = value+'\n'
        self.seri.write(bytes(comm, encoding='ascii'))
        # ser.write(comm.encode())

#class 를 생성하면서 GUI를 나타낸다.
btn = LedControl(seri)
btn.win.mainloop()
반응형