개발환경
- 하드웨어 : 라즈베리파이, 센스햇
- GUI 라이브러리 : PySide2 (라즈베리파이), PySide6 (윈도우)
- IDE : Thony Python IDE (라즈베리파이), Pycharm + QtDesigner (윈도우)
- VNC Viewer
요구사항
센스햇 각각의 LED를 제어하고, LED의 색깔을 R/G/B로 나누어 조절할 수 있도록 제작
개발과정
1. 윈도우 -> 라즈베리파이
윈도우에서 ui를 만들고 py 파일로 ui convert(uic)를 하고, 라즈베리파이에 전달해서 py파일을 수정 & 추가하여 개발하였다.
처음부터 라즈베리파이에서 진행하고자 했지만, 해당 라즈베리파이에 PySide2 까지만 릴리즈 되었고 uic 컴파일러가 다운되지 않았기 때문에 불가피하게 윈도우에서 GUI 제작 후 라즈베리파이에서 py 파일을 제작하는 방향으로 진행하였다.
2. 위젯의 전체적인 형태
센스햇의 LED 가 8*8 모양은 8*8 table 을 이용했고,
slider 세개를 이용해서 RGB값을 제어하도록 만들었다.
3. table 위젯 속성
rowCount와 columnCount 를 8 로 맞추어 8*8 테이블을 만들어 줬다
NoEditTriggers를 True로 두어서 편집을 금지하도록 설정해둔다.
SelectionMode = SingleSelection 으로, 각각 선택할 수 있도록 한다.
verticalHeaderVisible = false
horizontalHeaderVisible = false
해서 상단과 좌측에 행/열의 숫자가 뜨지 않도록 조정해준다.
horizontalHeaderDefaultSectionSize는 조절해보니까 36이 제일 최적의 크기였다.
4. slider 위젯 속성
RGB는 0~255까지 조절되기 때문에 minimum = 0 , maximum = 255로 설정한다.
5. pushbutton 2개 추가
Flash와 Clear버튼을 추가하여 모든 LED를 한번에 키고 끌 수 있는 기능을 추가하였다.
Qt Designer
몇가지 시그널과 슬롯을 생성하여 연결해주었다.
코드
from PySide2.QtWidgets import *
from sensehat2_ui import Ui_MainWindow
from sense_hat import SenseHat
from time import sleep
class MyApp(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
Ui_MainWindow.setupUi(self,self)
self.main()
def main(self):
self.sense=SenseHat() # 센스햇 생성
# 시작시 r g b 0으로 셋팅
self.r=0
self.g=0
self.b=0
def flash(self): # 모든 LED 현재 rgb 색으로 덮기
for y in range(8):
for x in range(8):
self.sense.set_pixel(x,y,self.r,self.g,self.b)
def clear(self): # 모든 LED 초기화
for y in range(8):
for x in range(8):
self.sense.set_pixel(x,y,0,0,0)
def rslide(self, v):
self.r = v;
def gslide(self, v):
self.g = v;
def bslide(self, v):
self.b = v;
def click(self,x,y): # 클릭시 해당 픽셀 현재 rbg색으로 덮기
self.sense.set_pixel(y,x,self.r,self.g,self.b)
app = QApplication()
win = MyApp()
win.show()
app.exec_()
결과물
깔쌈한 센스햇 GUI툴 제작 완성~~~ 희희
'임베디드' 카테고리의 다른 글
[리눅스] virtual machine에 ubuntu깔고 원격접속터미널 연결하기 (0) | 2022.05.12 |
---|---|
[GUI] Qt와 QtDesingner 소개 (0) | 2022.05.03 |
[펌웨어] CubeIDE로 내부/외부 LED 켜기 (0) | 2022.05.02 |
[리눅스] 랜덤함수 rand(), srand(), time() (0) | 2022.04.30 |
[리눅스] 시그널 신호 보내기, WDT(Watchdog Timer) (0) | 2022.04.29 |