TOPに戻る

CircuitPython 10行プログラミング Step5 (7) Raspberry Pi PicoのI2C ① OLEDディスプレイ

 I2Cが使えるライブラリが複数あります。最初は、実績のあるbusioモジュールを使います。

OLEDディスプレイの配線

OLEDボードの端子 Picoの端子(GPIO) 名称
GND GND GND
Vcc 3.3V 3V3(OUT)
SCL GP21 I2C0 SCL
SDA GP20 I2C0 SDA

I2Cscan

 利用できるI2Cバスは二つあります。そして、ピンの組み合わせは、

[GP1,GP0], [GP3,GP2], [GP5,GP4], [GP7,GP6], [GP9,GP8], [GP11,GP10], [GP13,GP12],[GP15,GP14], [GP17,GP16], [GP19,GP18], [GP21,GP20], [GP27,GP26]

があります。


from board import *
from busio import I2C

#[GP1,GP0], [GP3,GP2], [GP5,GP4], [GP7,GP6], [GP9,GP8], [GP11,GP10], [GP13,GP12],
#[GP15,GP14], [GP17,GP16], [GP19,GP18], [GP21,GP20], [GP27,GP26]

i2c = I2C(GP21, GP20)

while not i2c.try_lock():
    pass
print('addr 0x{0:x}'.format(i2c.scan()[0]))
i2c.deinit()

 実行結果です。0x3cを見つけてきました。

bitbangioモジュール

 busioモジュールは、Picoに内蔵されたI2Cモジュール(ハードウェア)を利用します。bitbangioモジュールでは、GPIOをソフトウェアでON/OFFさせ、SCL/SDA信号のタイミングを取ります。


from board import *
import bitbangio

#[GP1,GP0], [GP3,GP2], [GP5,GP4], [GP7,GP6], [GP9,GP8], [GP11,GP10], [GP13,GP12],
#[GP15,GP14], [GP17,GP16], [GP19,GP18], [GP21,GP20], [GP27,GP26]

i2c = bitbangio.I2C(GP21, GP20)
while not i2c.try_lock():
    pass
print('addr 0x{0:x}'.format(i2c.scan()[0]))
i2c.deinit()

 実行結果です。0x3cを見つけてきました。

OLEDに文字を出す

 アマゾン、Adafruitなどで小型のディスプレイにI2C接続のOLEDディスプレイがあり、多くがコントローラSSD1306を利用しています。

 最新のダウンロードしたCircuitPython のライブラリには、adafruit_ssd1306.mpyがあります。このライブラリとadafruit_framebuf.mpyライブラリを、CIRCUITPYドライブのlibフォルダにコピーします。

 すでに入っているのは、adafruit_bus_deviceフォルダとadafruit_registerフォルダです。

 このディスプレイで使うフォントは、ダウンロードしたexamplesの中にfont5x8.binがあるので、CIRCUITPYドライブのルートにコピーします。

 表示するのは、CPUの温度を2行目に表示します。また温度はあまり変化しないので、経過時間も1行目に表示します。


from board import *
import busio
import adafruit_ssd1306
import microcontroller
import time

i2c = busio.I2C(GP21, GP20)

display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3c)
print('start')
t0 = time.monotonic()
while 1:
    display.fill(0)
    txt = 'CPU Temp is ' + str(round(microcontroller.cpu.temperature,1)) + 'C'
    display.text(txt, 5, 10, 1)
    display.text(str(int(time.monotonic() - t0)),1,0,1)
    display.show()
    time.sleep(3.14)

◆テキスト関連のコマンド

  • fill(0) 黒色で塗りつぶす
  • text('World', 0, 10) 文字列を、x,y座標から描画する。四つ目の「1=白色」は省略可
  • invert(True) 白黒を反転する。Falseで戻す
  • show() 表示

◆図形関連のコマンド

  • pixel(0, 0, 1) x,y座標(左上が原点)と色(1は白色)でドットを描く
  • rect(0,0,120,60,1) 左上の座標x,y、右下の座標x,y、色で四角形を描画する
  • fill_rect() 塗りつぶす
  • line(100,40,110,50,1) xの始点、yの始点、xの終点、yの終点、色で直線を描画する
  • circle(24,40,20,1) 中心点のx、y、半径、色で円を描画する

連載 CircuitPython 10行プログラミング Step5

(1) Raspberry Pi Picoの準備と動作確認

(2) Raspberry Pi Picoのdigitalio

(3) Raspberry Pi Picoのmicrocontroller

(4) Raspberry Pi Picoのアナログ入力

(5) Raspberry Pi PicoのPWM出力

(6) Raspberry Pi PicoのI2S出力

(7) Raspberry Pi PicoのI2C ① OLEDディスプレイ

(8) Raspberry Pi PicoのI2C ② 温湿度センサ

(9) Raspberry Pi PicoのI2C ③ 気圧センサ

(10) Raspberry Pi PicoのSPI ① TFTディスプレイ


連載 CircuitPython 10行プログラミング Step4

(1) Adafruit Feather nRF52840 Senseの準備 (2) Lチカ (3) 搭載センサ (4) BLE①ペリフェラル (5) BLE②セントラル


連載 CircuitPython 10行プログラミング Step3

(1) Metro M4 Express AirLift (WiFi)の準備 (2) ロータリ・エンコーダ (3) eInk/ePaper (4) Wi-Fi その1 接続 (5) Wi-Fi その2 ソケット (6) Wi-Fi その3 電圧測定 (7) 気圧センサLPS25HB (8) サーミスタ


連載 CircuitPython 10行プログラミング Step2

(1) Grand Central M4 Expressの準備 (2) グラフィック・ディスプレイOLED (3) RTC DS3231 (4) モジュール/SDメモリ (5) 複合センサ BME680 (6) ロードセル+ADS1220 (7) サーボ・モータ① (8) サーボ・モータ② (9) I2S UDA1334A (10) D-Aコンバータ


連載 CircuitPython 10行プログラミング

(1) Trinket M0の準備 (2) ディジタルI/O (3) アナログ入出力 (4) I2C 温湿度センサSi7021 (5) SPI 熱電対+MAX31855 (6) UART 距離センサTFMini (7) 1-Wire 温度DS18B20 (8) ロータリ・エンコーダ (9) 7セグメントLED (10) FANコントロール (11) UART GPS (12) I2C Lチカ MCP23017