I2C通信で遊ぶ
I2C通信で遊んでみたいと思い、約30年ぶりにマイコンに触れる。約30年前の当時とはハードウェアもソフトウェアも大きく変わった。2021年に発表されたRP2040というマイコンと、最近流行りのPythonのマイコン版であるMicroPythonというプログラミング言語を使い、新鮮な気持ちでマイコン遊戯に取り組むことにした。
I2Cモジュール
マイコンを入手し開発環境も揃ったが、I2Cで通信する相手を準備する必要がある。
Electric Dollar Storeで3種類の I2Cモジュールを選んだ。
Electric Dollar Storeで公開されているサンプルプログラムを利用して、I2Cモジュールの使い方とMicroPythonの学習を始めることにした。
I2Cモジュール基板
3種類のI2Cモジュールを、一緒に購入したI2Cモジュール基板に取り付けた。この基板には3つまでI2Cモジュールを載せられる。
RP2040-TinyとI2Cモジュール基板をジャンパーケーブルで接続した。写真左の赤外線リモコンはI2Cモジュールと同じ販売サイトで購入したもの。
開発環境はTonnyを使うことにした。Tonnyのシェルウィンドウで、I2CモジュールのI2Cアドレスを確認した。
>>> from machine import Pin, I2C
>>> i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000)
>>> addr = i2c.scan()
>>> print( "address is :" + str(addr) )
address is :[20, 48, 96]
>>> print("address is :[0x{:x}, 0x{:x}, 0x{:x}]".format(*addr))
address is :[0x14, 0x30, 0x60]
0x14 → DIG2
0x30 → BEEP
0x60 → REMOTE
I2Cモジュールの試行
やりたいこと
受信した赤外線リモコンのボタン名をTonnyのシェルウィンドウに表示する。
リモコンのコードを7セグメントLEDに表示する。
圧電スピーカーで音階を鳴らす。(リモコンボタン1〜9がドレミ〜に対応)
プログラミング
I2Cモジュールの販売サイトに公開されてるサンプルプログラムのクラス関数がそのまま使えるので、拡張ライブラリ(EDS.py)としてまとめ、自作プログラムから利用することにした。
初めて、MicroPythonでコードを書いたが、拡張ライブラリを利用することでやりたいことが簡単に実現できた。
from machine import Pin, I2C
import EDS
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000)
rem = EDS.Remote(i2c)
dig = EDS.Dig2(i2c)
bee = EDS.Beep(i2c)
name = ["CH-", "CH", "CH+", "PREV", "NEXT", "PLAY/PAUSE", "VOL+", "VOL-", "EQ", "0", "100+", "200+", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
code = [0x70, 0x63, 0x6e, 0x3c, 0x3e, 0x20, 0x2d, 0x2b, 0x3d, 0x30, 0x25, 0x26, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39]
midi = [21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 71, 72, 74, 65, 67, 69, 60, 62, 64]
while True:
c = rem.code()
if c is not None:
print(name[code.index(c)])
dig.hex(c)
bee.beep(255, midi[code.index(c)])
MicroPython
MicroPythonでコードを書くのは今回が初めてだったが、数年前にPythonを少しかじった経験があることと、ネットに豊富な情報があるため、スムーズにコーディングすることができた。
各I2CモジュールのサンプルプログラムはMicroPythonで書かれているので、MicroPythonの学習を兼ね、関数の中身を理解しながらコメントを追加したり、必要な関数を追加したりして自分の拡張ライブラリとして作り直した。
あとがき
初めてI2C通信で遊んだが、MicroPythonでハードウェアが抽象化されているため、肝心のI2C通信をしている感覚は味わえなかった。そのため、マイコン遊戯に昔のようなワクワク感は感じることができなかった。しかし、MicroPythonは思い付いたことが簡単に実現できる手軽さを感じた。