2021/03/21

STM32 펌웨어 - 02. GUI를 만들어 보자 - with Python Kivy

언어는 파이썬, 그래픽 라이브러리는 kivy를 사용한다.

  • Python : 3.6.4 32-bit
  • Kivy : v1.11.1


Phase 1. 첫번째 GUI 😆

kivy를 사용하는 기본 형태는 이런식이다.

from kivy.app import App
from kivy.uix.label import Label

class MQTTtest_GUIv001(App):
    def build(self):
        return Label(text = "MQTT-test GUI v001")

MQTTtest_GUIv001().run()

















 

 

Phase 2. 두번째 GUI

KV Language를 사용하여 GUI 디자인을 할 수 있다. Phase 1과 출력은 동일함.

이 후 소스는 MQTTtest_GUIv001.py와 MQTTtest_GUIv001.kv 파일 두개로 작성된다.


MQTTtest_GUIv001.py

###################################################
###################################################
#    MQTT-test GUI
#    -> ver 0.0.1
#    by JBE
#
#    since 2021-03-21
###################################################
###################################################

from kivy.app import App
from kivy.uix.label import Label
from kivy.lang import Builder

Builder.load_file('MQTTtest_GUIv001.kv')

class MQTTtest_GUIv001(App):
    def build(self):
        pass

MQTTtest_GUIv001().run()

 

MQTTtest_GUIv001.kv

Label:
    text : "MQTT-test GUI v001"


Phase 3. 세번째 GUI <- 가장 기본적인 구조

현재 연결된 com 포트를 검색해서 선택할 수 있다.

kv 파일에서 클래스 함수나 변수에 접근하는 방식, 초기자 사용법, kivy 버전 제한 등등...

기본적인 내용들이 포함되어 있다.


MQTTtest_GUIv001.py

###################################################
###################################################
#    MQTT-test GUI
#    -> ver 0.0.1
#    by JBE
#
#    since 2021-03-21
###################################################
###################################################
import kivy
kivy.require('1.11.1')

from kivy.app import App
from kivy.uix.label import Label
from kivy.lang import Builder
from kivy.uix.spinner import Spinner
from kivy.uix.floatlayout import FloatLayout

import serial
import serial.tools.list_ports

from kivy.config import Config
Config.set('graphics', 'width', '800')
Config.set('graphics', 'height', '600')
Config.set('graphics', 'resizable', 0)
Config.set('kivy', 'keyboard_mode', 'system')
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')
Config.write()

#Builder.load_file('MQTTtest_GUIv001.kv')

class MQTTtest_GUIv001(FloatLayout):
    available_port = []

    ser = serial.Serial()
    ser.baudrate = 115200
    ser.timeout = 1
    ser_con = False

    def __init__(self, **kwargs):
        super(MQTTtest_GUIv001, self).__init__(**kwargs)
        self.updateSerial_select()

    def updateSerial_select(self):
        self.available_port = []
        ports = list(serial.tools.list_ports.comports())
        for p in ports:
            self.available_port.append(p[0])

        self.ids.Serial_select.values = self.available_port

class MQTTtest_GUIv001App(App):
    def build(self):
        test = MQTTtest_GUIv001()
        return test

if __name__ == '__main__':
    MQTTtest_GUIv001App().run()


MQTTtest_GUIv001.kv

<MQTTtest_GUIv001>:
    FloatLayout:
        Spinner:
            id : Serial_select
            text_autoupdate : True
            sync_height : True
            values : root.available_port
            size_hint : None, None
            size : 60, 30
            pos : 5, 520
            on_press : root.updateSerial_select()  


실행하면 활성화된 com 포트를 검색해서 보여준다.











이제 host와 보드간의 통신 프로토콜을 정해야 할 타이밍이다.

그리고 파이썬 매우 재밌는듯 ㅋㅋㅋ

2021/03/16

STM32 펌웨어 - 01. MCU와 통신을 뚫어보자 - none GUI

UART 통신으로 MCU와 호스트의 데이터 송수신을 해보자.

PuTTY로 시리얼 접속하고, 숫자 전송만으로 펌웨어를 구동하게 만들것이다.

참고로 GUI 없이 CMD로만 제어하는 방식은 테스트 할때 매우 편하다.

- compiler : STM32CubeIDE(Version 1.6.0)

- firmware package : v1.8.3

 

순서

1. printf 활성화

2. 숫자 입력 함수

3. 메뉴 구성

4. 구동 테스트

 

1. printf 활성화

STM32CubeIDE에서 printf를 사용하려면 아래와 같이 소스를 추가해야 한다. 

1. main.c 

   - weak 속성의 __io_putchar 함수를 정의 














2. syscalls.c 파일 확인

   - syscalls.c 파일 없을 경우 복사해야함.


👆 여기까지 설정하면 printf를 사용 가능하다. float 출력을 원한다면 _printf_float 설정을 해야한다.




















 

 

* 주의할 점

printf 출력시 개행문자 \n을 넣어주지 않으면 버퍼에서 출력되지 않는다.

fflush(stdout)을 사용하면 버퍼를 즉시 출력해준다.

 

2. 숫자 입력 함수 

scanf 함수를 쓸 수도 있지만 따로 숫자 입력 코드를 만들어 쓰는걸 추천한다.















 

 

숫자만 입력해야 한다.


3. 메뉴 구성





















 

사용 방법은 심플하다. 

1\r\n 입력시 전체 메뉴 출력

2\r\n 입력시 버전 정보 출력

3\r\n 입력시 SSR On/Off

  - 0\r\n 입력시 SSR Off

  - 1\r\n 입력시 SSR On


4. 구동 테스트

자...돌려봅시다.


원하는 기능은 메뉴를 만들어서 추가하면 된다.

다음엔 GUI로 MCU를 제어해보자


2021/03/09

STM32CubeMX 사용법

STM32CubeIDE 툴 사용을 전제로 한다.

기본적인 사용법, 설정의 정확한 의미, 기타 팁 등에 대한 소소한 업데이트가 필요함.

since 2021-03-04

1. Pinout

  • 회로도의 설계대로 핀아웃을 설정한다.



















  • 8MHz 크리스탈과 RTC 사용시 System core의 RCC에서 HSE와 LSE를 Crystal/Ceramic Resonator로 선택 


 

 

 

 

 

  • GPIO는 System Core의 GPIO에서 설정 가능




 

 

 

 

 

 

 

  • UART/SPI/I2C 등의 통신 설정은 Connectivity에서 설정


 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. Clock Configutation

클럭 설정은 상당히 간편하다.

보드 사이즈가 작을 경우, 내부 클럭을 사용하자.
















 

3. Project Manager

사용할 IDE에 맞게 소스를 출력하도록 설정한다.

STM32CubeIDE를 사용할 예정이다.

Application Structure 설정은 Basic과 Advanced를 선택할 수 있다.

  • Basic : 미들웨어를 사용하지 않거나 하나만 사용할 경우
  • Advanced : 여러개의 미들웨어를 사용할 경우

Generate Under Root는 IDE 프로젝트 파일의 위치를 설정한다. 기본적으로 선택되어 있다.

Project Name은 실제 프로젝트 명 뒤에 v0.0.x 를 붙여서 이름짓도록 하자.

















4. Generate Code

모든 설정이 끝나면 아래 그림의 버튼을 누르면 코드가 생성된다.