임베디드

[GUI] Qt + SenseHat : 센스햇 조명등 GUI 어플리케이션 만들기

히똔 2022. 5. 5. 23:27
728x90
반응형

개발환경

- 하드웨어 : 라즈베리파이, 센스햇
- 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 

좌: 완성된 UI, 우: 시그널/슬롯 상태

몇가지 시그널과 슬롯을 생성하여 연결해주었다.

 

코드

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툴 제작 완성~~~ 희희

 

 

[GUI] Qt와 QtDesingner 소개

Qt - C++ 기반 GUI Application 개발시 가장 널리 쓰이는 프레임 워크 - 다른 플랫폼으로 포팅이 자유로움 (One framework. One codebase. Any platform. / Write once, compile anywhere) - 윈도우, 리눅스, 맥,..

asdfmelody.tistory.com

 

 

728x90
반응형