이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi Pico, Raspberry Pi, WiFi 모듈을 사용 합니다.

pi-pico-basic

Raspberry Pi Pico Basic
Raspberry Pi Pico Basic


  • Raspberry Pi Pico 개요
    • RP2040 Microcontroller 요약
    • RP2040은 Raspberry Pi의 새로운 microcontroller로 중요한 특징은 아래와 같다.

      • Dual-core 32-bit ARM Cortex-M0+
      • Runs at 48MHz, but can be overclocked to 133MHz
      • 30 GPIO pins (26 exposed)
      • 8 Programmable I/O (PIO) state machines
      • Can support USB Host or Device mode
    • Raspberry Pi Pico 요약
      • Raspberry Pi Pico의 부품과 핀 배열
        • Raspberry Pi Pico 앞면

          Raspberry Pi Pico 뒷면

      • Raspberry Pi Pico W의 부품과 핀 배열
        • Raspberry Pi Pico W 앞면

          Raspberry Pi Pico W 뒷면

      • Raspberry Pi Pico와 Pi Pico W는 RP2040 microcontroller를 사용한 MCU로 중요한 특징은 아래와 같다.
        • RP2040 microcontroller chip designed by Raspberry Pi in the UK
        • Dual-core Arm Cortex-M0+ processor, flexible clock running up to 133 MHz
        • 264KB on-chip SRAM, and 2MB of on-board flash storage
        • 26 multifunction GPIO pins, including 3 analogue inputs
        • 2 × UART, 2 × SPI controllers, 2 × I2C controllers, 16 × PWM channels
        • USB 1.1 Host and Device support
        • Drag-and-drop programming using mass storage over USB
        • 8 × Programmable I/O (PIO) state machines for custom peripheral support
        • Accurate clock and timer on-chip: Single 64-bit counter
        • Temperature sensor
        • Accelerated integer and floating-point libraries on-chip
        • Supported input power 1.8–5.5V DC
        • Low-power sleep and dormant modes
      • Raspberry Pi Pico W는 Pi Pico에 Infineon CYW43439를 사용하여 아래와 같은 2.4GHz wireless interfaces(802.11n) 기능을 추가하였다.
        • Wireless (802.11n), single-band (2.4 GHz)
        • WPA3
        • Soft access point supporting up to four clients

  • Raspberry Pi Pico Pinout
    • Raspberry Pi Pico Pinout

      Raspberry Pi Pico W Pinout

    • GPIO Pins
      • RP2040에는 2개의 뱅크로 분할된 36개의 다기능 GPIO(범용 Input/Output) 핀이 있다. 일반적으로 QSPI bank의 핀(QSPI_SS, QSPI_SCLK 및 QSPI_SD0 ~ QSPI_SD3)은 외부 플래시 장치에서 코드를 실행하는 데 사용하고, 일반 사용자는 User bank(GPIO0 to GPIO29)의 핀을 사용할 수 있다.
      • Raspberry Pi Pico는 RP2040 마이크로 컨트롤러에서 사용할 수 있는 User bank(GPIO0 to GPIO29)의 핀 가운데 Raspberry Pi Pico 보드 핀에 연결된 26개(GP0 - GP22 까지와 GP26, GP27, GP28번)의 핀을 사용할 수 있다. GP23, GP24, GP25, GP29 핀은 Pi Pico 보드의 핀에 연결되지 않았기 때문에 사용할 수 없다.
      • GP22(GP22 핀은 Input/Output Port로만 사용함)를 제외한 다른 GPIO 핀은 프로그램 설정으로 미리 설정된 다른 목적(UART, ADC, SPI, I2C)으로 사용할 수 있다. 그러나 동시에 다른 기능으로 설정할 수는 없다.
      • GPIO Interrupts
      • GPIO 핀이 Digital input port로 설정된 경우 아래와 같이 4종류의 외부 Interrupt 기능을 설정할 수 있다.

        • Level high
        • Level Low
        • Positive edge ( transition from active low to active high)
        • Negative edge ( transition from active high to active low)
    • Pi Pico ADC Pins
      • RP2040는 4개의 12비트 SAR(Successive-approximation-register) 기반 아날로그 - 디지털 변환기를 지원한다. 그러나 외부로는 3개(GP29는 Pi Pico 보드의 핀에 연결되지 않음)는 의 아날로그 핀만 연결되어 있다.
      • 네 번째 아날로그 채널((GP29)은 내부 온도 센서에 연결되어 있다. 따라서 MCU의 온도를 측정하고자 하는 경우에는 ADC4의 아날로그 값을 읽어 직접 사용할 수 있다.
      • A/D 변환은 DMA 모드에서 폴링(Polling), 인터럽트 및 FIFO 기능을 수행할 수 있다.
      • ADC Module에 사용하는 GPIO 핀
        • ADC0: GP26
        • ADC1: GP27
        • ADC2: GP28
    • UART Pins
      • RP2040에는 별도의 32×8 Tx(8-bit wide, 32 location deep) 및 32×12 Rx(12-bit wide, 32 location deep) FIFO가 있는 두 개의 동일한 UART 주변 장치가 포함되어 있다.
      • UART Module에 사용하는 GPIO 핀
        • UART0-TX: GP0/GP12/GP16
        • UART0-RX: GP1/GP13/GP17
        • UART1-TX: GP4/GP8
        • UART1-RX: GP5/GP9
    • I2C Pins
      • RP2040 칩에는 2개의 I2C 컨트롤러가 있다. 두 I2C 컨트롤러 모두 Raspberry Pi Pico의 GPIO 핀을 통해 액세스할 수 있다.
      • I2C Controller에 사용하는 GPIO 핀
        • I2C0 – SDA: GP0/GP4/GP8/GP12/GP16/GP20
        • I2C0 – SCL: GP1/GP5/GP9/GP13/GP17/GP21
        • I2C1 – SDA: GP2/GP6/GP10/GP14/GP18/GP26
        • I2C1 – SCL: GP3/GP7/GP11/GP15/GP19/GP27
    • SPI Pins
      • RP2040 칩은 2개의 SPI 주변기기를 지원한다. 두 SPI 모듈 핀 모두 Raspberry Pi Pico의 GPIO 핀을 통해 액세스할 수 있다.
      • SPI Controller에 사용하는 GPIO 핀
        • SPI0_RX: GP0/GP4/GP16
        • SPI0_TX: GP3/GP7/GP19
        • SPI0_CLK: GP2/GP6/GP18
        • SPI0_CSn: GP1/GP5/GP17
        • SPI1_RX: GP8/GP12/
        • SPI1_TX: GP11/GP15/
        • SPI1_CLK: GP10/GP14/
        • SPI1_CSn: GP9/GP13/
    • PWM Pins
      • RP2040 Microcontroller에는 8개의 PWM 블록이 포함되어 있으며 각 PWM 블록은 2개의 PWM 신호를 제공한다. 따라서 Raspberry Pi Pico에서는 총 16개의 PWM 신호 출력을 사용할 수 있다.
      • PWM Pins: 모든 GPIO 핀은 PWM 신호 출력하도록 구성할 수 있다.
    • Raspberry Pi Pico와 Raspberry Pi Pico W에서 사용하는 GPIO Pin의 차이
      • Raspberry Pi Pico와 Raspberry Pi Pico W에서 사용하는 GPIO Pin의 차이
      • Function Pi Pico Pi Pico W
        On-board LED GPIO25 WL_GPIO0
        Power Supply PS GPIO23 WL_GPIO1
        VBUS sense GPIO24 WL_GPIO2

      • On-board LED
        • Raspberry Pi Pico는 GPIO25를 On-board LED 제어에 사용한다.
        • 주: Raspberry Pi Pico W에서 GPIO25는 Wireless module과 SPI 통신에 사용한다.

        • Raspberry Pi Pico W는 WL_GPIO0(Infineon CYW43439의 GPIO0)를 On-board LED 제어에 사용한다.
        • 주: Raspberry Pi Pico에서 On-board LED를 사용하는 프로그램을 Raspberry Pi Pico W에서 사용하고자 하는 경우 주의를 요한다. Raspberry Pi Pico과 Raspberry Pi Pico W는 다른 MicroPython firmware를 사용하여야 되고, C 프로그램에서는 별도의 함수를 사용하여야 함.

          주: MicroPython firmware를 사용하는 경우에는 Firmware를 최신 버전으로 업그레이드 하고 led Pin을 정의하는 함수에서 GPIO 번호를 "LED"(예: Pin("LED", Pin.OUT) )로 설정하면 Raspberry Pi Pico와 Raspberry Pi Pico W 보드 모두에서 프로그램 변경 없이 On-board LED를 제어할 수 있다.

          주: On-board LED를 제외한 Raspberry Pi Pico와 Raspberry Pi Pico W 보드의 핀(40개)은 동일하기 때문에 보드 핀(40개)을 사용하는 Raspberry Pi Pico 프로그램을 Raspberry Pi Pico W에서 사용할 수 있다.

      • Power Supply PS
        • Raspberry Pi Pico는 GPIO23을 사용한다.
        • Raspberry Pi Pico W는 WL_GPIO1(Infineon CYW43439의 GPIO1)를 사용한다.
      • VBUS sense
        • Raspberry Pi Pico는 GPIO24을 사용한다.
        • Raspberry Pi Pico W는 WL_GPIO2(Infineon CYW43439의 GPIO2)를 사용한다.

        주: Power Supply PS와 VBUS sense는 일반적인 프로그램에서는 잘 사용하지 않기 때문에 Raspberry Pi Pico와 Raspberry Pi Pico W 프로그램의 호환성에는 대부분의 경우 문제가 발생하지 않는다.

        주: Raspberry Pi Pico W의 GPIO23(WL_ON), GPIO24(WL_D), GPIO25(WL_CS)는 Infineon CYW43439의 제어와 SPI 통신에 사용한다.


  • On-chip timer
    • RP2040의 시스템 타이머는 시스템에 Microsecond 타임베이스를 제공하고 이 타임베이스를 기반으로 인터럽트를 생성한다.

    • RP2040 Timer의 중요 기능
      • Microsecond에 1씩 증가하는 단일 64비트 카운터
      • 이 카운터(32Bits x 2)는 32비트 버스를 시용하여 한 쌍의 래칭 레지스터에서 읽을 수 있다.
      • 4개의 알람 Rg: 64비트 카운터의 하위 32비트와 Alarm registers(32비드) 일치 시 IRQ가 발생한다.
      • 64비트 카운터는 실제로 오버플로 가 발생하지 않기(1 uSec Clock 사용 시 수 천년 동안) 때문에 완전하고 효과적인 Timer로 사용할 수 있다.
    • Counter
    • RP2040의 Timer counter는 64-bit(32-bit Rg 2개로 구성됨) counter 이다. 그러나 RP2040는 32-bit data bus를 사용하기 때문에 32-bit Rg를 2번 액세스(Read/Write)하여야 한다.

      • RP2040의 64-bit Timer counter의 액세스(Read/Write)는 아래와 같은 Rg 이름으로 실행된다.
        • Write operation: TIMEHW(63:32 Bits), TIMELW(31:0 Bits)
        • Read operation: TIMEHR(63:32 Bits), TIMELR(31:0 Bits)

        주: 64-bit counter 값을 Read 하는 경우 먼저 하위 Rg(TIMELR)을 Read한 다음 상위 Rg(TIMEHR)를 Read 하여야 한다. 하위 Rg을 Read 하면 상위 Rg 값은 상위 Rg를 Read 할 때까지 변동하지 않도록 Latche Rg에 Latching 된다. Write 동작도 Latche Rg를 이용하여 64-bit counter가 동시에 Update 된다.

    • Alarms
    • Timer에는 4개의 알람이 있으며 각 알람에 대해 별도의 인터럽트를 출력한다. 알람 인터럽트는 64비트 카운터의 하위 32비트와 Alarm Rg(32비트)가 일치할 때 발생한다. 이는 향후 최대 232 Microseconds에서 알람 인터럽트가 발생할 수 있음을 의미한다

      • 최대 알람 인터럽트 발생 지연 시간을 초와 분으로 표시하면 아래와 같다.
        • 232 ÷ 106: ~4295 seconds
        • 4295 ÷ 60: ~72 minutes

  • Programmable I/O (PIO) state machines
    • PIO(Programmable Input/Output block)를 사용하면 추가 하드웨어 인터페이스 또는 새로운 유형의 인터페이스를 만들 수 있다.

    • PIO state machines 개요
    • PIO block diagram.

      • PIO는 프로세서와 같이 프로그래밍(독립적으로 순차 프로그램을 실행하여 GPIO를 조작하고 데이터를 전송할 수 있음)할 수 있다.
      • 각각 4개의 State machines이 있는 2개의 PIO 블록이 있다.
      • 이 블록은 GPIO를 조작하고 데이터를 전송하기 위해 순차적 프로그램을 독립적으로 실행할 수 있다.
      • 범용 프로세서와 달리 PIO 상태 머신은 정확한 타이밍 및 특정 기능을 갖는 하드웨어와 긴밀하게 통합되어 있고 IO 기능에 전문화되어 있다.
      • 각 State machines에 구현된 중요 기능
        • Two 32-bit shift registers – either direction, any shift count
        • Two 32-bit scratch registers
        • 4×32-bit bus FIFO in each direction (TX/RX), reconfigurable as 8×32 in a single direction
        • Fractional clock divider (16 integer, 8 fractional bits)
        • Flexible GPIO mapping
        • DMA interface, sustained throughput up to 1 word per clock from system DMA
        • IRQ flag set/clear/status
      • PIO는 아래 하드웨어 인터페이스를 포함하여 기타 다양한 IO 표준을 구현할 수 있는 다용도 하드웨어 인터페이스 이다.
      • PIO로 구현할 수 있는 하드웨어 인터페이스 예

        • I2C(Inter Integrated Cricuit)
        • 3-pin I2S(Intergrated Interchip Sound)
        • SDIO(Secure Digital I/O)
        • SPI(Serial Peripheral Interface), DSPI, QSPI
        • UART((Universal asynchronous receiver/transmitter)
        • DPI(Dots Per Inch) or VGA(via resistor DAC)
      • 각 State machine은 SPI 또는 I2C 컨트롤러와 같은 표준 직렬 인터페이스 블록과 거의 동일한 실리콘 영역을 차지한다. 그러나 PIO State machines은 다양한 인터페이스를 구현하기 위해 동적으로 구성 및 재구성될 수 있다.
      • CPLD(Complex Programmable Logic Device)와 같은 로직 구성이 아닌 소프트웨어로 State machine을 프로그래밍 가능하게 하면 동일한 비용과 전력 범위에서 더 다양한 하드웨어 인터페이스를 구현할 수 있다. 이것은 또한 PIO 라이브러리에서 미리 만들어진 인터페이스를 사용하는 대신 직접 프로그래밍하여 PIO의 완전한 유연성을 활용하려는 사람들에게 보다 효과적으로 하드웨어 인터페이스를 구현할 수 있게 한다.
      • PIO는 각 상태 머신 내부에 신중하게 선택된 고정 기능 하드웨어 세트를 이용하여 고성능의 하드웨어 인터페이스를 유연하게 구현할 수 있게 한다.
      • 상태 머신의 입력 및 출력은 최대 32개의 GPIO(RP2040의 경우 30개의 GPIO로 제한됨)에 매핑되며 모든 상태 머신은 모든 GPIO에 독립적이고 동시에 액세스할 수 있다. 예를 들어, 표준 UART 코드는 TX, RX, CTS 및 RTS가 임의의 GPIO 4개을 사용하도록 할 수 있다. 동일하게 I2C는 SDA 및 SCL에 대하여 임의의 GPIO을 사용하도록 할 수 있다.

  • Raspberry Pi Pico 개발 환경
    • BOOTSEL Button - USB 저장 장치 모드
    • Firmware 또는 프로그램을 Pi Pico 개발 보드에 Upload하기 위하여는 Pi Pico 개발 보드를 USB 저장 장치 모드로 설정하여야 한다.

      BOOTSEL button

      • BOOTSEL button을 누른 상태에서 USB Plug를 삽입하기
        • Pi Pico 보드에는 전원 스위치가 없기 때문에 USB 케이블의 단자를 Pi Pico 보드의 소켓에 삽입할 때(전원이 처음 공급될 때) Pi Pico의 동작(Reset)이 시작된다. BOOTSEL button을 누른 상태에서 USB Plug를 삽입(Reset)하면 Pi Pico 개발 보드가 USB 저장 장치 모드로 설정된다.
      • Firmware 또는 프로그램을 Pi Pico 개발 보드에 Upload하기
        • BOOTSEL button을 누른 상태에서 USB Plug를 삽입하고(USB 저장 장치 모드),
        • Windows 파일 탐색기(Explorer)에서 Pi Pico 가 USB 저장 장치로 인식되었는지 확인한다. 정상적으로 USB 저장 장치로 설정된 경우 Pi Pico 개발 보드는 USB 저장 장치(RPI-RP2)로 표시 된다.
        • Firmware 또는 프로그램을 USB 저장 장치(RPI-RP2)로 복사한다.
        • 주: Raspberry Pi Pico와 Raspberry Pi Pico W는 다른 MicroPython firmware를 사용하여야 한다.

        • Firmware 또는 프로그램의 복사가 종료되면 Pi Pico의 USB 저장 장치 모드가 종료되고 자동으로 Firmware 또는 프로그램이 시작된다. Firmware 또는 프로그램이 시작되면 Pi Pico 보드의 USB 저장 장치 모드는 종료된다.
        • 주: 이 방법은 프로그램을 Upload 할 때마다 USB 케이블 단자를 분리하고 다시 삽입하여야 하는 불편함이 있다. 이 문제를 피하기 위하여 Pin30(RUN)과 GND Pin 사이에 Push button switch(Reset button)을 설치하는 방법을 설명한다.

      • Pi Pico 보드에 Reset 버튼 추가하기
      • 실행 Code를 Pi Pico에 Load 하기 위하여는 개발용 컴퓨터에 Pi Pico 가 USB 저장 장치로 인식(BOOTSEL button을 누른 상태에서 Pi Pico를 시작)되어야 한다. USB 케이블의 단자를 Pi Pico 보드의 소켓에 분리하거나 삽입하지 않고, 이 동작을 용이하게 하기 위하여 Pi Pico 보드에 Reset 버튼 추가한다.

        • Reset 버튼 회로: Pi Pico 보드의 Pin30(RUN)와 GND Pin 사이에 Push button switch(Reset button)을 설치한다.
        • 브레드보드(Breadboard)에 Reset button을 설치한 예

        • Reset button과 BOOTSEL button을 이용하여 Pi Pico 가 USB 저장 장치로 인식하도록 하기
          • BOOTSEL button을 누른 상태에서 Reset button을 누른다.
          • 약 1초 정도 경과 후 먼저 Reset button을 개방한 다음 BOOTSEL button을 개방한다.
          • Windows 파일 탐색기(Explorer)에서 Pi Pico 가 USB 저장 장치로 인식되었는지 확인한다. USB 저장 장치 이름이 "RPI-RP2"로 표시 된다.
          • Firmware 또는 프로그램을 Pi Pico에 Upload 하고 실행한다.

    • MicroPython 개발 환경
      • MicroPython은 Pi Pico 보드의 개발 언어로 사용하기에 적합한 언어이다.

        C++을 사용하기 위한 환경은 Linux 개발 환경에 친숙하지 않은 개발자인 경우 사용하기 어렵고, 또한 반듯이 C++을 사용하여야 할 이유(속도, 메모리 등 자원, 효율성 등)도 없기 때문에 MicroPython을 사용하는 것도 좋은 선택일 수 있다.

      • MicroPython을 개발 언어로 사용하기
        • Pi Pico 보드를 USB 저장 장치 모드로 설정하고,
        • Pi Pico 보드에 MicroPython Firmware를 복사하면 Firmware가 실행되어 Pi Pico 보드에서 MicroPython Scripts(REPL (read-eval-print loop) 모드)를 실행할 수 있다.
        • 주: Raspberry Pi Pico와 Raspberry Pi Pico W는 다른 MicroPython firmware를 사용하여야 한다.

          주: MicroPython firmware 설치는 "MicroPython의 이해와 개발 환경 - Thonny IDE"를 참고하기 바람.

        • Pi Pico 보드의 USB 단자는 USB-serial로 동작하여 PC의 장치관리자에서 Pi Pico 보드의 COM Port 번호를 확인하고,
        • 모니터 프로그램을 사용하여 바로 MicroPython Scripts를 실행할 수 있다.
        • 현 상태에서 Text editor(예: Notepad++)와 File 관리 Tool(예: Adafruit MicroPython tool)를 사용하면 별도의 개발도구 없이도 MicroPython 프로그램 개발이 가능하다.
        • 주: 아래에 소개하는 개발 도구 3가지 중 본인에게 적합한 Tool를 선택하여 사용하면 조금더 편리하게 MicroPython 프로그램을 개발할 수 있다.

      • Thonny MicroPython IDE
        • https://thonny.org/에서 Download하여 설치 한다.
        • Raspberry Pi Pico의 Documentation "Raspberry Pi Pico Python SDK"에서 Thonny MicroPython IDE를 기본 개발 도구로 사용한다.
        • Thonny에는 ESP8266, ESP32, Raspberry Pi Pico 개발 보드를 위한 기능이 포함되어 있기 때문에 MicroPython를 이용한 장치 개발에 유용한 Tool 이다.
        • 참고자료: MicroPython의 이해와 개발 환경 - Thonny IDE

      • ESPlorer-MT-Build를 개발 도구로 이용하기
      • ESPlorer IDE 개발 환경은 Lua 프로그램 언어와 MicroPython를 위한 개발 환경이다. 그러나 Lua에 중점을 두고 개발되었기 때문에 MicroPython 개발 Tool로 사용하기에는 부족(기능이 부족하고 일부 명령이 정상 동작하지 않음)하다.

      • uPyCraft IDE
      • https://github.com/DFRobot/uPyCraft/에서 Download하여 설치 한다.


    • c, c++ 개발 환경
      • Raspberry Pi Pico는 C, C++, Aassembly 프로그래밍에 GNU Arm Embedded Toolchain(32-bit Arm Cortex-A, Arm Cortex-M, Arm Cortex-R processor families를 Target으로 함)을 사용한다.

      • ARM GCC 개발환경 - Developer Command 창((관리자: Developer Command prompt for VS 2019)) 이용하기
        • 아래 Toolchain을 설치하여야 한다.
          • ARM GCC compiler: C, C++, Aassembly 언어를 위한 compiler
          • CMake: Project 관리 Tool로 CMakeLists.txt로 부터 Makefile을 생성한다.
          • CMakeLists.txt: CMake 언어로 기술된 cmake 입력 파일로 Project의 각종 파라메터(Source files 등)를 설정하여 Build process의 Flow를 기술하고 있다.

          • Build Tools for Visual Studio 2019: Visual Studio 프로젝트를 빌드할 수 있는 Tool. 이 Tool을 설치하면 Project build에 사용하는 DOS Command 창("관리자: Developer Command prompt for VS 2019")이 함께 설치된다.
          • Git: 컴퓨터 파일의 변경 사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템이다.
        • Developer Command 창을 사용하여 c(c++) Project 실행하기
          • Windows 파일 탐색기(Explorer)를 이용하여 필요한 폴더와 파일을 탐색하고 새 폴더와 파일을 만든다.
          • Text editor(예: Notepad++)를 이용하여 Source files과 CMakeLists.txt 파일을 작성한다.
          • "Developer Command prompt for VS 2019" 창에서 cmake 명령과 nmake 명령을 이용하여 Project를 Build 한다.

          참고자료: Project를 생성하고 Build 하기 - "Developer Command prompt for VS 2019 창" 이용

      • ARM GCC 개발환경 - Visual Studio Code 이용하기
      • ARM GCC 개발환경 - Arduino IDE 이용하기

  • Raspberry Pi Pico Basic 관련 페이지 보기