CircuitPython 10行プログラミング Step2 (2) OLED

 Grand Central M4 Expressマイコン・ボードとCircuitPythonでプログラムを作ります。執筆時点では安定版は3.xですが、4.0.0beta3をいれました。

  https://github.com/adafruit/circuitpython/releases/tag/4.0.0-beta.3

  adafruit-circuitpython-grandcentral_m4_express-pt_BR-4.0.0-beta.3.uf2

 Resetボタンを二度押しして、PCのエクスプローラ画面にブートローダのドライブGCM4BOOTを出します。そこへ、ダウンロードしたxxx.uf2をドラッグします。コピーの終了間際にGCM4BOOTドライブは消え、CIRCUITPYドライブに変わります。

 最新のライブラリをダウンロードします。

  https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases/tag/20190313

  adafruit-circuitpython-bundle-4.x-mpy-20190313.zip

 クリックして出てきたLibとexamplesフォルダをCIRCUITPYドライブへドラッグします。解凍しながらコピーされます。時間がかかります。1.5Mバイトほどの容量で、空きは6.5Mバイトです。
 現時点で使えるライブラリのすべてがコピーできました。Tinket M0マイコン・ボードのように、必要なライブラリだけコピーして使うというのに比べ、とても便利にプログラミングできます。

OLEDに文字を表示

 Tinket M0マイコン・ボードでOLEDディスプレイを利用しようとするとメモリが足りないようでした。Grand Centralに下記の接続をしました。プルアップ抵抗はつけていません。Tinket M0マイコン・ボードのとき、プルアップ抵抗を入れていないと、警告が出ました。Grand Centralボードでは、つないだだけで、信号が正しく届いているようです。もちろん、プルアップ抵抗は安定な通信には不可欠です。

OLED Grand Central
SCL 20(SCL)
SDA 21(SDA)
GND GND
VCC 3.3

 次のプログラムで文字が表示されることを確認しました。このプログラムは、CIRCUITPYドライブにmain.pyの名前で保存しました。同じ階層にフォントのfont5x8.binが必要です。examplesに入っているので、コピーします。

from board import *
from time import sleep
import busio
import adafruit_ssd1306

i2c = busio.I2C(SCL, SDA)
display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, addr=0x3c)

print("start")
display.fill(0)
display.text('hello world', 0, 0, 1)
display.show()
sleep(1)

 text()の引数は次の内容です。

  • 文字列
  • X 位置
  • Y 位置
  • 表示色(0= 黒、1= 白)

 fill(0)は、すべてのドットを黒色にする画面クリアの関数です。show()は、用意のできたデータを表示する関数です。X、Y位置もドット単位で指定します。ここで利用しているフォントは5×8ドットです。

アナログ入力のデータを表示

 次は、アナログ入力ポートのA0の電圧を表示するプログラムです。Grand Centralで使われているマイコンATSAMD51P20AのA-Dコンバータは12ビットの分解能があります。Tinket M0マイコン・ボードのマイコンは10ビットでした。どちらもCircuitPythonでは16ビットの分解能で結果が返ってきます。

from board import *
from time import sleep
import busio
import adafruit_ssd1306
from analogio import AnalogIn

i2c = busio.I2C(SCL, SDA)
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3c)
pin = AnalogIn(A0)
print("start")

while 1:
display.fill(0)
V = (pin.value / 65535 * 3.3)
print(V)
  display.text('A0pin=', 0, 0, 1)
display.text(str(round(V,3)) + 'Volts', 0, 10, 1)
display.show()
sleep(1)

 フォントのfont5x8.binは、組み込み用に容量を最小限にしていて、これ以外に大きなフォントは見つかりませんでした。OLEDなので、文字はくっきりしています。Voltsのsはいらないですね。

  display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, addr=0x3c)

と初期化すると、縦方向に間延びするので、文字が大きくなります。また、OLEDのスレーブ・アドレスが0x3cであれば省略できます。

  display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)

 市販のOLEDには、I2C専用とSPI専用、I2C+SPIモデルがあります。ライブラリはSPIにも対応していることが多いです。SPIは5~10MHzのデータ転送ができるので、I2Cより表示スピードが速いです。
 I2Cボードの裏側には、スレーブ・アドレスを選択できる製品があります。0x78は8ビット表示なので7ビットでは0x3cです。