見出し画像

Raspberry Pi PicoでPythonのお勉強 ~2~

Raspberry Pi PicoでBMP280から温度と気圧のデータが取れたので、MicroPythonでI2Cデバイスを制御するにはどうすればいいのかソースを見ていくことにします。

from machine import Pin, I2C
from time import sleep
from bme280 import BME280
i2c = I2C(0, sda = Pin(0), scl = Pin(1), freq = 40000)
bme = BME280(i2c = i2c)
print(bme.values)

用意されていたBME280用のモジュールを使ったので、実際のコードは上記ように数行しかありません。このうち2行目は恐らく不要だと思われます。

I2Cデバイスの制御に関する部分のみに注目しますと、I2Cを使うには1行目のようにmachineライブラリからI2Cクラスをインポートする必要があるようです(恐らくPinクラスも必須)。そして4行目でI2Cオブジェクトを生成し5行目でBME280モジュールのBME280クラスにI2Cオブジェクトを渡せばよい、ということみたいです。最後の6行目でBME280クラスから生成したオブジェクトのvalueメソッドを使って温度、気圧、湿度データの文字列を得てそれをコンソールに表示しています。

今回は下記の行について調べました。machineライブラリのI2CクラスからI2Cオブジェクトを生成している部分です。

i2c = I2C(0, sda = Pin(0), scl = Pin(1), freq = 40000)

MicroPythonのライブラリについては下記のページで調べることができるので、I2Cクラスについて調べてみました。

I2Cで検索すると
machine.I2C (Python class, in class I2C – a two-wire serial protocol)
とでてきたので、そちらの中身を見ると
class machine.I2C(id, *, scl, sda, freq=400000)
という記述がありました。4行目はこちらに従ってI2Cオブジェクトを生成していたみたいです。

ここで気になったのは見慣れないアスタリスク(*)だけの引数部分でした。これ調べてみると、アスタリスク以降で定義されている引数はキーワード引数(引数名=値)として渡さなければならないみたいです。なので4行目でもキーワード引数で渡しているのですね。Pythonで初めて見たような気がしますが、C系の言語では見ないので気になりました。

さて scl, sda, freq はすぐに想像できますが、idって何だろうと思って調べるとRaspberry Pi Picoでは2つのI2Cが使えるようで、その2つのうちどちらを使うか指定する必要があるようです。

Raspberry Pi PicoのPinout

上のPinout図を見るとI2C0とI2C1という記述があります。この0と1をidとして指定して、さらにI2C0のうちどこのピンを使うのかを指定しているみたいです。今回はPin(0)とPin(1)を指定していますが、物理的なピンの位置ではなくGPIOの番号で指定する必要があるようです。

I2Cクラスの使い方は分かったので、次回からはBME280モジュールの中身を見て実際のI2Cアクセスはどの様に記述しているか調べようと思います。

この記事が気に入ったらサポートをしてみませんか?