이 블로그는 Web 환경을 이용한 원격 제어 기술에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 WiFi Module과 Raspberry Pi, Raspberry Pi Pico, ATmega128 보드, Arduino Mega 보드(ATmega2560)를 사용 합니다.

microPython-thonny

MicroPython Basic - Thonny
MicroPython의 이해와 개발 환경 - Thonny IDE


  • MicroPython 은?
    • MicroPython은 마이크로 컨트롤러에서 효율적으로 실행되도록 Python 3의 기능을 일부 제한한 간결한 프로그래밍 언어이다.

      자주 사용하지 않는 표준 라이브러리의 일부 기능을 제거하여 마이크로 컨트롤러에 최적화하였다.

      MicroPython은 인터프리터 언어이기 때문에 컴파일러 언어(c, c++ 등)에 비교하여 실행 속도는 느리지만 대화형 REPL(read-eval-print loop)을 사용하여 번거로운 컴파일 및 업로드 단계 없이 코드를 즉시 실행하고 결과를 볼 수 있기 때문에 프로그램 개발과 유지가 용이하고 프로그램 언어를 배우기 쉽다.

      참고자료: "mPython help documentation" , "MicroPython documentation"

      MicroPython을 사용하기 위하여는 개발보드에 Firmware가 설치되어 있어야 한다. Firmware는 MicroPython을 사용하기 전에 한번만 설치하면 된다.

      참고자료: "Firmware flashing tool과 Firmware 설치"

  • Thonny IDE를 이용하여 Firmware 설치하기
    • Thonny IDE가 아직 설치되지 않은 경우에는 아래 "Thonny IDE 설치하기"를 참고하여 Thonny IDE를 설치한다.

      Firmware는 MicroPython을 사용하기전에 한번만 설치하면된다. 만약 이미 설치되어 있는 경우에는 다시 설치할 필요가 없다.

    • Thonny IDE 실행을 위하여 필요한 준비
      • PC의 USB Port에 개발보드를 연결하기 위하여는 개발보드의 종류에 따라 USB-serial 변환 칩을 확인하여 드라이버를 설치 하여야 한다. NodeMCU ESP8266, Nodemcu ESP-32S 개발보드는 CP2102 칩을 사용하기 때문에 CP2102 드라이버를 설치 하여야 한다. 최신 버전의 OS에는 USB-serial 변환 칩의 드라이버가 이미 내장되어 있을 수도 있다.
      • 참고자료: NodeMCU ESP8266 개발보드 사용을 위한 준비

        참고자료: NodeMCU ESP32 사용을 위한 준비

    • Firmware binary file download 하기
    • MicroPython firmware(Binary file) 설치 하기
      • Thonny IDE의 설치와 실행은 아래 "Thonny IDE를 개발 도구로 이용하기"를 참고하기 바람.

      • Thonny 4.1.1 버전 이전의 IDE를 사용하는 경우
        • Thonny IDE에서 "도구 -> 옵션... -> 인터프리터"를 선택하여 인터프리터 창을 Open 한다.
        • 인터프리터 창에서 우측 아래 "펌웨어 설치 혹은 업데이트"를 클릭하면 하면 Firmware installer 창이 열린다.
        • Firmware installer 창 예

        • PC -> 제어판 -> 장치관리자 -> 포트(COM & LPT) 에서 개발보드의 COM Port 번호를 확인하여 Port를 선택한다.
        • "Browse.." 버튼을 클릭하면 탐색기 창이 열린다. 탐색기에서 설치할 firmware binary file을 선택하고 "열기) 버튼을 클릭 한다.
        • Flash mode 설정
          • NodeMCU board(ESP8266)인 경우에는 "Dual I/O(dio)"를 선택한다.
          • NodeMCU board(ESP32)인 경우에는 "From image file(keep)를 선택한다.
        • Erase flash before installing를 체크 한다.
        • "설치" 버튼을 클릭하면 좌측에 진행 상태를 표시하는 창과 메세지가 출력된다.
        • 진행 상태 창에 "Serial port COM*" 진행 메세지가 출력된 다음 잠시(1초 정도) GPIO0 pin을 Low 상태(개발 보드에 있는 BOOT SW를 잠시 누름)로 하여야 한다.
        • 설치가 종료 메세지(Done!)를 확인하고 "닫기" 버튼을 클릭한다.
        • 주: Thonny IDE를 이용한 firmware 설치에 문제가 있는 경우 "esptool.py Flashing tool"을 사용하여 설치하기 바람.

      • Thonny 4.1.1 버전 IDE를 사용하는 경우
        • Thonny IDE에서 "도구 -> 옵션"을 클릭하여 옵션 창을 열고 옵션 창에서 "인터프리터"를 선택하여 "인터프리터 창"을 Open 한다.
        • "인터프리터 창"에서 아래 예와 같이 Interpreter를 선택(예: MicroPython (ESP32))하고, 포트(이 예에서는 <포트 검출 자동으로 시도하기>를 선택하였음)를 선택하고 "Install or update MicroPython (esptool)"을 클릭하면 "Install MicroPython (esptool)" 창이 열린다.


          인터프리터 창 예

        • Firmware installer 창(Install MicroPython (esptool)" 창에서 "Target port"를 선택하고, "Erase all flash before installing"을 체크하고, "MicroPython family", "variant", "version"을 선택하고 "설치"를 클릭하면 Firmware 다운로딩과 설치가 진행된다.

        • Firmware installer 창(Install MicroPython (esptool) 설정 예

        • "설치" 버튼을 클릭하면 좌측 아래에 진행 상태를 표시하는 창과 메세지가 출력된다.
        • 진행 상태 창에 "Serial port COM*" 진행 메세지가 출력된 다음 잠시(2초 정도) GPIO0 pin을 Low 상태(개발 보드에 있는 BOOT SW를 잠시 누름)로 하여야 한다.
        • 설치가 종료 메세지(Done!)를 확인하고 "닫기" 버튼을 클릭한다.
        • 주: Thonny IDE를 이용한 firmware 설치에 문제가 있는 경우 "esptool.py Flashing tool"을 사용하여 설치하기 바람.

        • Firmware 설치가 정상적으로 완료되고 "Firmware installer 창"과 "인터프리터 창"을 종료하면 Thonny IDE의 Python shell 창에 MicroPython prompt( >>> )가 출력된다.

  • MicroPython 시작 프로그램
    • MicroPython이 설치된 보드의 전원을 켜거나 재시작(Reset) 하면 MicroPython은 파일 시스템의 루트에서 boot.py 와 main.py를 순차적으로 찾아 만약 이 파일이 있으면 이 파일을 먼저 실행 한다.

    • boot.py와 main.py
      • boot.py
        • 이 파일은 전원을 켜거나 재시작(Reset) 시 가장 먼저 실행된다.
        • 일반적으로 부딩 시 보드를 초기화 할 필요가 있는 경우 사용 할 수 있다. 보드 초기화는 main.py 에서도 가능하기 때문에 일반적인 사용자는 이 파일을 수정할 필요가 없다.
        • MicroPython IDE를 사용하는 경우, 메세지 창에 Prompt( >>> )가 출력된 상태에서 "MicroPython 장치에서 Load 하기"를 실행(아래 "자주 사용하는 Thonny IDE 메뉴와 도구 모음"의 "MicroPython 장치에서 Load 하기"를 참고요)하면 ESP에 있는 파일 이름이 출력된다. 여기에 boot.py 파일이 있는 경우 "boot.py" 파일을 열면(Load) boot.py의 내용이 MicroPython IDE 편집 창에 출력된다. 필요한 경우 boot.py의 내용을 편집한 다음 ESP에 저장한다.
      • main.py
        • 이 파일이 있으면 boot.py 실행 이후에 자동으로 실행된다.
        • 일반적으로 전원을 켜거나 재시작(Reset) 할 때 실행하여야 하는 모든 기본 스크립트를 포함 한다.
        • 전원을 켜거나 재시작(Reset) 할 때 자동으로 실행하여야 파일이 없는 경우 이 파일은 없어도 된다.
        • 개발이 완료된 프로그램을 전원을 켜거나 재시작(Reset) 시 자동으로 실행하고자 하는 경우, 개발 완료된 프로그램의 이름을 main.py로 변경하여 "MicroPython 장치"의 루트에 저장한다.

        주: boot.py 또는 main.py 파일이 설치된 경우 전원을 켜거나 재시작(Reset)하면 이 프로그램이 자동으로 실행되기 때문에 개발도구(Thonny IDE)에서 REPL 명령을 실행할 수 없다. REPL 명령을 실행하기 위하여 boot.py 또는 main.py 파일을 삭제하려는 경우 Thonny IDE에서 Ctrl + c 를 입력하여 실행중인 프로그램을 강제로 정지한 다음 원하는 파일을 삭제한다.


  • Thonny IDE를 개발 도구로 이용하기
    • Thonny IDE는 Raspberry Pi 보드와 함께 사용되는 Raspbian OS에 기본적으로 설치되는 Python 개발 Tool 이다.

      또한 Thonny IDE에는 ESP8266, ESP32, Raspberry Pi Pico 개발 보드를 위한 기능이 포함되어 있기 때문에 MicroPython를 이용한 장치 개발에 유용한 Tool 이다.

    • Thonny IDE 설치하기
      • Thonny IDE Download
        • "https://thonny.org/"에서 최신 버전을 Download 한다.
        • Download한 Thonny(thonny-Version번호.exe) .exe를 실행하여 Thonny IDE를 설치한다.
      • Thonny IDE를 실행 한다.

    • Thonny IDE 실행 하기
    • Thonny IDE 실행 예

      • Thonny IDE 실행하면 위와 같은 Thonny IDE 창이 열린다.
      • Script 편집 창: 이 창에서 프로그램( .py)을 편집한다. 하나 이상의 파일을 열 수 있으며 각 파일은 새 Tab으로 열린다.
      • Python shell 창: 이 곳에 Python shell command를 입력하고 실행할 수 있다. 또한 실행 결과(Upload error, syntax errors 등)와 Print 문의 실행 결과가 이곳 출력된다.

    • MicroPython Built-In Modules 확인 하기
      • MicroPython firmware 버전에 따라 Default로 설치되어 있는 Module(Built-In Modules)이 다를 수 있기 때문에 Firmware에 설치되어 있는 Modules을 확인하는 것이 필요하다.

      • Thonny IDE의 Python shell 창에서 아래와 같은 명령으로 Firmware에 설치되어 있는 Modules을 확인한다.
      • help("modules")


        MicroPython Built-In Modules의 출력 예


    • MicroPython 프로그래밍 편집과 실행 예
      • 1초 간격으로 개발 보드의 LED가 점멸하는 프로그램 예
      • 
        from machine import Pin
        from time import sleep_ms
        
        # NodeMCU 보드는 GPIO2를 LED Pin으로 사용한다.
        led = Pin(2, Pin.OUT)
        
        # LED를 점멸하는 무한 Loop
        while True:
          # NodeMCU ESP8266 보드는 LED Pin이 High일 때 Off 되고 Low일 때 On 됨.
          # NodeMCU ESP32 보드는 LED Pin이 High일 때 On 되고 Low일 때 Off 됨.
          # 기타 보드는 다른 GPIO Pin을 LED Pin으로 사용할 수 있으니 확인이 필요하다.
          led.value(1)   # LED(pin2)-> High. ESP8266 -> Off, ESP32 -> On
          sleep_ms(500)  # Sleep for 500 milliseconds
          led.value(0)   # LED(pin2)-> Low. ESP8266 -> On, ESP32 -> Off
          sleep_ms(500)  # Sleep for 500 milliseconds
              
      • Thonny IDE에서 "도구 -> 옵션... -> 인터프리터"를 선택하여 인터프리터 창을 Open 한다.
      • 인터프리터 창에서 "Thonny 실행에 사용할 장치"를 선택한다. 이 예에서는 MicroPython (ESP32 or ESP8266)를 선택한다.
      • 인터프리터 창에서 "포트 혹은 WebREPL"에서 개발 보드가 사용하는 COM포트(Window를 사용하는 경우 장치괸리자에서 확인)를 선택한다.
      • 인터프리터 창의 확인 버튼을 클릭한다.
      • Python shell 창에 동작 결과를 보여주는 메세지와 MicroPython prompt( >>> )가 출력되었는지 확인한다.
      • 위 프로그램을 Script 편집 창에 입력 한다. 시간 절약을 위하여 위 프로그램을 복사하여 붙여 놓기 하는 것이 편리하다.
      • Script 편집 창의 Script를 File name "blinking_led.py"로 이 컴퓨터에 저장한다.
      • 주: Script 편집 창의 Script는 "이 컴퓨터" 또는 "MicroPython 개발 장치"에 저장(Upload)할 수 있다.

      • "실행 -> 현재 스크립트 실행"을 클릭하면 스크립트가 개발보드에 전송되고,
      • 스크립트가 실행되어 개발 보드의 LED가 1Sec 간격으로 점멸 한다.
      • "Stop" 버튼을 클릭하면 프로그램 실행이 중지된다.
    • 자주 사용하는 Thonny IDE 메뉴와 도구 모음
      • 개발보드 사용 환경 설정하기
        • Thonny IDE에서 "도구 -> 옵션... -> 인터프리터"를 선택하여 인터프리터 창을 Open 한다.
        • 인터프리터 창에서 "Thonny 실행에 사용할 장치"를 선택한다. 이 예에서는 MicroPython (ESP32 or ESP8266)를 선택한다.
        • 인터프리터 창에서 "포트 혹은 WebREPL"에서 개발 보드가 사용하는 COM포트(Window를 사용하는 경우 장치괸리자에서 확인)를 선택한다.
        • 인터프리터 창의 확인 버튼을 클릭한다.
        • Python shell 창에서 동작 결과를 보여주는 메세지와 MicroPython prompt( >>> )의 출력을 확인한다.
      • 프로그램 작성 하기
        • Script 편집 창에서 직접 Script를 편집(작성)하기
        • Script 편집 창에서 일반 Text editor의 기능을 실행할 수 있기 때문에 직접 Script를 작성하고 편집할 수 있다.

        • 이미 작성된 Script를 편집 창에 Load하여 편집하기
          • 파일 메뉴(열기 or 저장)를 실행할 때 열리는 "장치 선택 창" 예

          • 이 컴퓨터에서 Load 하기
            • "파일 -> 열기"를 실행하면 파일이 있는 장치(PC or MicroPython 장치)를 선택할 수 있는 장치 선택 창이 열린다.
            • 장치 선택 창에서 편집할 프로그램이 위치한 장치(이 컴퓨터)를 선택하면 파일 탐색창이 열린다.
            • 탐색기 창에서 파일을 선택하고 "열기" 버튼을 클릭하면 파일이 Load 된다.
            • Load 한 파일을 편집기의 편집 기능을 사용하여 편집한다.
          • MicroPython 장치에서 Load 하기
            • "파일 -> 열기"를 실행하면 파일이 있는 장치(PC or MicroPython 장치)를 선택할 수 있는 장치 선택 창이 열린다.
            • 장치 선택 창에서 편집할 프로그램이 위치한 장치(MicroPython 장치)를 선택하면 파일 탐색창이 열린다.
            • 탐색기 창에서 파일을 선택하고 "확인" 버튼을 클릭하면 파일이 Load 된다.
            • 주: MicroPython 장치에서 Load한 파일은 편집창에 표시되는 파일 이름이 Square brackets(예: [File name.py]) 내에 표시된다.

            • Load 한 파일을 편집기의 편집 기능을 사용하여 편집한다.
        • 작성된 Script를 저장(또는 Upload)하기
          • "파일" 메뉴를 클릭하면 아래와 같은 기능을 실행할 수 있다.

          • 저장: 현재 선택된 편집 창의 파일을 이 파일이 저장된 위치(PC or MicroPython 장치)에 저장한다. 현재 선택된 편집 창의 내용이 변경된 경우에만 실행할 수 있다.
          • 주: "MicroPython 장치"의 파일(Square brackets(예: [File name.py]) 내에 파일 이름이 표시 됨)을 편집하여 저장하는 것은 Upload 동작에 해당된다.

          • 모든 파일 저장하기: 편집 창의 모든 파일을 저장한다.
          • ...(으)로 저장: 현재 선택된 편집 창의 파일을 "이 컴퓨터" 또는 "MicroPython 장치"에 저장(다른 이름으로)한다.
          • 주: "이 컴퓨터의 파일"을 "MicroPython 장치"에 다른 이름으로 저장하는 것은 Upload 동작에 해당된다.

          • 복사본 저장: 현재 선택된 편집 창의 파일의 복사본을 "이 컴퓨터" 또는 "MicroPython 장치"에 저장(동일한 이름 또는 다른 이름으로)한다.
          • 주: "이 컴퓨터의 파일"을 "MicroPython 장치"에 파일을 저장하는 것은 Upload 동작에 해당된다.

          • Move / rename: "이 컴퓨터"에 저장된 파일을 Rename 한다.
        • 파일 삭제하기
          • 아래 "파일" 메뉴를 사용하여 파일을 삭제할 수 있다.

          • 파일 삭제는 "...(으)로 저장", "복사본 저장", "열기" 명령을 실행하면 열리는 탐색기 창에서 실행할 수 있다.
          • 위 명령중 하나를 실행하고 "이 컴퓨터" 또는 "MicroPython 장치"를 선택하면 탐색기 창이 열린다.
          • "MicroPython 장치"를 선택한 경우에는 "Thonny에서 열기", "삭제", "새로운 디렉토리...", "속성들" 메뉴 창이 열리고,

            "이 컴퓨터"를 선택한 경우에는 원도우 탐색기 창이 열린다.

          • 탐색기 창에서 마우스의 좌측 버튼으로 파일을 선택하고 마우스의 우측 버튼을 클릭하면 탐색기 메뉴를 실행할 수 있다.
          • "MicroPython 장치"를 선택한 경우 탐색기 메뉴 창에서 "삭제"를 실행(확인 메세지 창에서 "예"를 클릭)하고 탐색기 창에서 "취소" 버튼을 클릭한다. 만약 확인 버튼을 클릭하면 선택한 동작이 다시 실행되어 삭제한 파일이 다시 저장될 수도 있다.
      • 프로그램 실행 하기
        • 현재 선택된 편집 창의 파일을 직접 실행하기
          • "실행 -> 현재 스크립트 실행"을 실행하거나 Toolbar의 실행 Icon을 클릭 한다.
          • 현재 선택된 편집 창의 파일이 "이 컴퓨터"에 있는 파일인 경우에는 REPL(read-eval-print loop)로 실행하고,
          • 현재 선택된 편집 창의 파일이 "MicroPython 장치"에 있는 파일인 경우에는 "MicroPython 장치"에 저장(Upload)된 파일이 실행된다.
        • MicroPython 장치에 Upload 하여 실행하기
          • 현재 선택된 편집 창의 파일을 "MicroPython 장치"에 저장(Upload)한다.
          • 주: "MicroPython 장치"에 저장(Upload)한 파일은 편집창에 표시되는 파일 이름이 Square brackets(예: [File name.py]) 내에 표시된다.

          • "실행 -> 현재 스크립트 실행"을 실행하거나 Toolbar의 "실행" Icon을 클릭 한다.
          • 전원이 인가될 때 자동으로 실행하고자 하는 경우에는 파일 이름을 main.py로 변경하여 저장한다.
        • 실행 중인 프로그램 정지하기
          • REPL(read-eval-print loop)로 실행 중인 경우에는 Toolbar의 "Stop" Icon을 클릭 한다.
          • MicroPython 장치에서 실행 중인 경우에는 키보드에서 Ctrl + c 를 입력한다.
    • 자주 사용하는 유용한 도구 프로그램 예
      • Hard reset 실행하기
        • "새 편집 창" 열기를 실행하고 아래와 같은 스크립트을 입력한 다음 파일 이름 "hard-reset.py"로 저장한다.
        • import machine

          machine.reset()

        • Toolbar의 실행 Icon을 클릭하면 Hard reset이 실행된다.
      • Soft reset 실행하기
        • "새 편집 창" 열기를 실행하고 아래와 같은 스크립트을 입력한 다음 파일 이름 "soft-reset.py"로 저장한다.
        • import machine

          machine.soft_reset()

        • Toolbar의 실행 Icon을 클릭하면 Soft reset이 실행된다.
      • 개발보드의 Disk와 메모리(RAM) 상태(사용할 수 있는 용량)를 출력하는 프로그램
        • "새 편집 창" 열기를 실행하고 아래 프로그램을 복사하여 파일 이름 "free-disk-memory.py"로 저장한다.
        • Toolbar의 실행 Icon을 클릭하면 프로그램이 실행되고 Disk(Flash memory)와 메모리(RAM)의 상태가 출력된다.

  • 프로그램 개발 시 main.py에 무한 loop 가 포함된 경우
    • main.py에 무한 loop 가 포함된 경우 보드의 전원을 켜거나 재시작(Reset)을 실행하면 main.py 가 자동으로 실행되고, 무한 loop 가 실행되기 때문에 "Ctrl-C" 기능이 없는 개발 도구에서는 보드에 접근할 수 없게 된다. 개발 단계에서 이 문제를 피하기 위하여 일반적으로 개발보드에 내장되어 있는 GPIO0 Button Switch를 이용하여 스크립트를 실행을 종료할 수 있다.

      주: Thonny IDE에서는 Toolbar의 "Stop" Icon을 클릭하거나 키보드에서 "Ctrl-C"버튼을 사용하여 무한 loop 가 포함된 프로그램을 정지할 수 있다.

    • 개발 시 무한 loop 가 포함된 main.py 문제 해결 예
      • 이 프로그램은 LED(GPIO2) 가 1초 간격으로 무한히 점멸하는 프로그램이다. 이 프로그램은 Button SW(GPIO0)를 이용하여 무한 loop를 종료 시키는 예 이다.

        
        from machine import Pin
        from sys import exit
        from time import sleep_ms
        
        # NodeMCU 보드는 GPIO0을 SW input pin으로 사용한다.
        button = Pin(0, Pin.IN, Pin.PULL_UP)
        # NodeMCU 보드는 GPIO2를 LED Pin으로 사용한다.
        led = Pin(2, Pin.OUT)
        
        # LED를 점멸하는 무한 Loop
        while True:
          # 만약 button(GPIO0)가 눌린 상태이면 "Dropping to REPL" 메세지를 출력하고
          # 프로그램을 종료한다.
          if button.value() == 0:
              print("Dropping to REPL")
              exit()
          # NodeMCU ESP8266 보드는 LED Pin이 High일 때 Off 되고 Low일 때 On 됨.
          # NodeMCU ESP32 보드는 LED Pin이 High일 때 On 되고 Low일 때 Off 됨.
          # 기타 보드는 다른 GPIO Pin을 LED Pin으로 사용할 수 있으니 확인이 필요하다.
          led.value(1)   # LED(pin2)-> High. ESP8266 -> Off, ESP32 -> On
          sleep_ms(500)  # Sleep for 500 milliseconds
          led.value(0)   # LED(pin2)-> Low. ESP8266 -> On, ESP32 -> Off
          sleep_ms(500)  # Sleep for 500 milliseconds
            
      • 실험 방법
        • Thonny IDE의 편집 창에 위Code를 복사하여 blinking_led_sw.py로 저장한다. blinking_led_sw.py를 "...(으)로 저장" 하기를 이용하여 main.py 이름으로 "MicroPython 장치"에 저장한다. 이 파일을 실행(Reset SW를 사용)한다.
        • 이 코드(main.py)가 보드에 다운로드되면 main.py 이기 때문에 전원을 켜거나 재시작(Reset)을 실행하면 자동으로 시작된다. 이 프로그램 내의 무한 루프는 메세지 등을 출력하지 않기 때문에 프로그램의 종료 여부는 터미널 프로그램 창(또는 Thonny IDE의 Shell 창)에 Prompt( >>> ) 가 표시되는 것으로 확인할 수 있다.
        • 개발보드의 GPIO0 Button SW를 0.5초(utime.sleep 시간이 0.5초 임) 이상 누르면 프로그램이 종료 된다.
        • 프로그램이 종료되면 Python Prompt(>>>) 가 표시되고, 다시 명령창에서 REPL(read-eval-print loop) 명령을 실행할 수 있다.
        • 개발보드의 Reset SW를 누르면 프로그램이 다시 시작(main.py 이기 때문에 자동으로 시작됨)되어 LED 가 점멸한다.
        • 주의: 터미널 프로그램에서 개발보드에 접속하는 경우 Thonny IDE와 사용하는 COM Port 가 같기 때문에 두 프로그램을 동시에 사용할 수 없다.


  • MicroPython의 이해와 개발 환경 관련 페이지 보기