2017年09月26日

ESP32 + MicroPythonでLCDモジュールに文字を表示させてみた

MicroPythonが動作したので、次はデバイスを使ってみたいと思い、I2C接続のキャラクタ液晶をつないでみました。
使った液晶は、以前使っていた以下の記事のものです。

Arduino(10) aitendoの激安キャラクタ液晶をArduino Pro Mini(3.3V)に接続: 楽しくやろう。

接続の仕方はArduinoの場合と同じで、I2Cインタフェースですので基本的には3.3V、GND、SCL、SDAの4本の線をつなぎます。
SCLはIO21、SDAはIO22を使いました。
他に、この液晶モジュールではバックライト用の電源と、RESET端子を3.3Vに接続します。
バックライトは白色LEDですので、抵抗を入れます。
接続図は以下のようになります。
このESP32のfritzing用データはht_dekoさんのものを拝借しました。

SPLC792-ESP32.png


次にソフトウェアです。
この液晶はST7032iというコントローラが使われていますが、ちょっと調べた範囲ではMicropythonですぐ使えそうなドライバが見つからなかったので、データシートを見ながら書いてみました。
(あとから考えてみたら、別にMicropythonでなくとも、Raspberry Piにこのモジュールを接続してPythonで制御するコードでも使えたはずでしたが・・・)

データシートは型番で検索すればすぐ見つかります。初期化コードの例も(アセンブラですが)載っています。
コマンドのサマリと初期化コードのサンプルは以下のようになっています。
st7032-1.png
st7032-2.png
st7032-3.png


MicropythonのソースコードのESP32のフォルダの中にSSD1306のドライバが付属していたので、このコードを参考に、ST7032のドライバを見よう見まねで書いてみました。

micropython-esp32/ssd1306.py at esp32 ・ micropython/micropython-esp32 ・ GitHub

書いたドライバはこちらです。


エディタで作成したこのコードをMicroPythonで実行させるには、これまでのインタープリターモードのままでは不便です。

インタープリタの画面で「Ctrl-E」を入力します。
すると、以下のように「ペーストモード」になります。

paste-mode.png


この状態で、作成したコードをコピー&ペーストし、最後に「Ctrl-D」を入力するとインタープリタに戻ってきます。

paste-mode2.png


これで、ペーストしたコードは既に読み込み済みですので、インタープリタから実行することができます。
まずi2cオブジェクトを作ります。

===
>>> i2c = I2C(scl=Pin(21), sda=Pin(22), freq=100000)
>>>


これでLCDモジュールを呼び出せるはずなのですが、なぜかそのままLCDと通信しようとすると「ENODEV」エラーが出てしまうので、いったんこのi2cオブジェクトを使ってi2cバスをスキャンします。

>>> i2c.scan()
[9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119]
>>>


このスキャン結果も変(デバイスは1つしかつながってないはずなのに!)なのですが、プルアップの設定か何かがまずいのかもしれません。
ともかく、このi2cオブジェクトを使ってLCDオブジェクトを生成します。

>>> lcd = ST7032i(i2c)
>>>


この状態で、LCDの初期化が済んでいます。
あとは、文字を1文字ずつ(ASCIIコードで)送ると、文字が表示されました。

>>> lcd.write_data(65)
>>> lcd.write_data(66)
>>> lcd.write_data(67)
>>>


st7032-micropython.jpg


やはりPythonで書けるというのは楽ですね。
Arduinoだと直すたびにコンパイルしてバイナリを転送しなければならなかったので、試行錯誤のペースは格段に上がると思います。
ラベル:MicroPython
posted by boochow at 20:38| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
人気記事