티스토리 뷰
반응형
다른 강의자료는 www.codingnow.co.kr/ 여기를 참고해주세요.!!
C언어 기반인 아두이노를 파이썬 GUI를 사용하여 제어해보는 프로젝입니다.
여기서는 시리얼(serial) 통신을 사용합니다.
[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를 만들었습니다.
파이썬 실행결과
아두이노와 시리얼 통신을 통해 제어 명령을 전달하게됩니다.
강의 파이썬 소스코드
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()
반응형
'아두이노' 카테고리의 다른 글
(프로그래밍 언어 실무편) #아두이노와 파이썬을 활용하여 LED Matrix 제어하기 두번째 (슬라이드 기능 추가하기) (0) | 2021.06.03 |
---|---|
(프로그래밍 언어 실무편) #아두이노와 파이썬을 활용하여 LED Matrix 제어하기 (0) | 2021.05.27 |
(프로그래밍 언어 실무편) #아두이노와 파이썬을 활용하여 조이스틱 마우스 만들기 (0) | 2021.05.20 |
(프로그래밍 언어 실무편) #16진수와 bit 연산 왜 배우죠?? #python GUI를 활용하여#아두이노 #LED 제어하기 (0) | 2021.05.11 |
아두이노 개발 환경 구축하기 (0) | 2021.05.03 |