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 |
クリックして出てきたLibとexamplesフォルダをCIRCUITPYドライブへドラッグします。解凍しながらコピーされます。時間がかかります。1.5Mバイトほどの容量で、空きは6.5Mバイトです。
現時点で使えるライブラリのすべてがコピーできました。Tinket M0マイコン・ボードのように、必要なライブラリだけコピーして使うというのに比べ、とても便利にプログラミングできます。
●OLEDに文字を表示
Trinket M0マイコン・ボードでOLEDディスプレイを利用しようとするとメモリが足りないようでした。Grand Centralに下記の接続をしました。プルアップ抵抗はつけていません。Trinket 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です。