NuttX for Raspberry Pi Pico로 SSD1306 OLED에 이미지 표시 (I2C 연결)

Raspberry Pi Pico의 SoC에 탑재된 주변 장치 중
  • UART (PrimeCell PL011)
  • I2C (Synopsis DW_apb_i2c)
  • SPI (PrimeCell PL022)

  • 는 소니 SPRESENSE와 동일한 IP를 사용합니다.
    따라서 NuttX for Raspberry Pi Pico에서 외부 장치를 사용할 수 있도록 SPRESENSE (cxd56) 용 드라이버를 바탕으로 RP2040 용 I2C 드라이버를 추가했습니다.

    I2C로 연결되는 장치로서 Raspberry Pi Pico의 MicroPython에서도 많은 이용 예가 있는 다음 OLED 디스플레이를 사용하여 이미지를 표시해 보겠습니다.

    연결



    Raspberry Pi Pico의 I2C0 및 전원에 SSD1306 OLED의 각 단자를 다음과 같이 연결합니다.


    SSD1306 OLED
    Pico 터미널
    Pico 핀 번호


    GND
    GND
    3, 38과 같은 GND 핀 중 하나

    VCC
    3V3
    36

    SDA
    GP4 (I2C0 SDA)
    6

    SCL
    GP5 (I2C0 SCL)
    7


    NuttX 빌드



    I2C 드라이버도 공식 리포지토리에 병합되었습니다.
    OLED 컨트롤러 SSD1306을 지원하는 구성으로 제공된 raspberrypi-pico:ssd1306를 지정하여 빌드합니다.
    $ git clone https://github.com/apache/incubator-nuttx.git nuttx
    $ git clone https://github.com/apache/incubator-nuttx-apps.git apps
    $ cd nuttx
    $ ./tools/configure.sh raspberrypi-pico:ssd1306
    $ make
    

    SSD1306이 연결되는 I2C0의 GPIO 핀 번호는 구성 파일 nuttx/boards/arm/rp2040/raspberrypi-pico/configs/ssd1306/defconfig의 다음 위치에서 지정됩니다.
    지정한 번호의 GPIO가 I2C인 SDA에, 그 다음 번호가 SCL에 사용됩니다. Raspberry Pi Pico의 핀 레이아웃 다이어그램에서 I2C0을 출력 할 수있는 GPIO 핀이면 다른 번호 1로 변경할 수 있습니다.
    CONFIG_RP2040_I2C0_GPIO=4
    

    시작



    NuttX를 시작하면/dev에 I2C 장치가 추가됩니다. 도움말을 보면 몇 가지 Builtin Apps가 추가되었습니다.
    
    NuttShell (NSH) NuttX-10.0.1
    nsh> ls -l /dev
    /dev:
     crw-rw-rw-       0 console
     crw-rw-rw-       0 i2c0
     crw-rw-rw-       0 null
     crw-rw-rw-       0 ttyS0
    
    nsh> help
    help usage:  help [-v] [<cmd>]
    
      .         cd        df        free      mkdir     printf    set       truncate
      [         cp        echo      help      mkrd      ps        sleep     uname
      ?         cmp       env       hexdump   mh        pwd       source    umount
      basename  dirname   exec      kill      mount     reboot    test      unset
      break     date      exit      ls        mv        rm        time      usleep
      cat       dd        false     mb        mw        rmdir     true      xd
    
    Builtin Apps:
      nxhello   sh        getprime  hello     nsh
      i2c       ostest    nx        nxdemo    nxlines
    nsh>
    

    i2c


    i2c 명령은 I2C 버스를 스캔하여 응답이 있는 장치를 표시하는 명령입니다.
    SSD1306의 주소인 3c에서 응답이 있음을 알 수 있습니다.
    nsh> i2c dev 00 7f
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    nsh>
    

    응 X



    NuttX에는 응 X이라는 그래픽 서브 시스템이 있습니다. 이 구성에서 SSD1306은 이미 NX에 연결되어 있으므로 NX에서 실행되는 다음 샘플 앱을 실행할 수 있습니다.

    nxhello



    다음과 같이 OLED에 메시지가 표시됩니다.



    nxlines



    직선이 화면 중앙에서 빙글빙글 돌립니다.

    nxdemo



    각종 묘화의 데모입니다. I2C 접속으로 통신 속도가 느린 일도 있어, 상당히 여유로운 표시입니다만.

    응 x



    NX로 실현되고 있는 윈도우 시스템의 데모입니다. 윈도우다운 것들이 표시되고 있는 것을 알 수 있습니다만, OLED가 흑백 표시이므로 지금 일단 잘 모르겠네요(웃음).




    지정할 수 있는 것은 0, 4, 8, 12, 16 ,20, 24, 28 의 어느 쪽인가가 됩니다. 

    좋은 웹페이지 즐겨찾기