ラズパイPicoの次の一歩
どうも、じぇいかわさきです。
昨日は、新規に手に入れたRaspberry pi Picoについて、初期の初期であるLチカをするところまでやってみました。
まあこれは、プログラミング言語を覚える時に、最初に表示させる”Hello World"のようなものですね。
Arduinoの時も、Raspberry pi3の時も、最初に動作確認を行ったのはこのLチカでした。
今朝も早い時間からつつきまわしています。分からないことばかりなのが、逆に楽しいですよね。
さて、今回はもう少しススメて手持ちのOLEDで表示させてみようと思いました。
OLEDの表示はI2Cという方式で表示させるので、今までArduinoでやってきた方式と違い、最初からの勉強になります。
I2Cっていうのは
I2C(アイ・スクエアド・シー、アイ・アイ・シー)はフィリップス社で開発されたシリアルバスである。低速な周辺機器をマザーボードへ接続したり、組み込みシステム、携帯電話などで使われている。
引用:ウィキペディア
シリアル通信バスのことで、これは同じI2Cのインターフェースを持つパーツを、直列に接続することができるスグレモノ。
各パーツには固有の識別用アドレスが有るので、そのアドレスを指定することで同じバス上をいろんな信号を同時に転送できるんですよね。
という事で、I2Cを使ったOLEDをRaspberry pi Picoにつないでみる。
Raspberry pi Picoのピンアサイン
Raspberry pi Picoのピンアサインはこの様になっています。
よく見ると、GPI/Oバスは1番ピンから割り振られていますが、今回使うI2CのインターフェースはI2C0とI2C1がたくさん割り振られていますので、今回はI2C0の一番最初である1番ピンと2番ピンを使用します。
接続はこんな感じになりますね。
ケーブルはVCC,GND,SDL,SDAの全部で4本のみです。
それでは最初に、このOLEDに何か表示させましょう。
最初の表示はお馴染みのアレ
Raspberry pi Picoに最初に表示させたのは、単純な文字です。おなじみのHello Worldから始まっています。
ネットで調べながら、I2Cのコードの書き方を学び、OLEDに表示させてみました。
コードは至ってシンプルなコードです。
import machine
import ssd1306
import time
sda = machine.Pin(0)
scl = machine.Pin(1)
i2c = machine.I2C(0,sda=sda, scl=scl, freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
oled.text("Hello World", 0, 5)
oled.show()
time.sleep(2)
oled.text("This is my first ", 0, 15)
oled.text("OLED operation", 0, 25)
oled.show()
time.sleep(2)
oled.text("Success program !", 0, 35)
oled.show()
oled.text("I am happy", 0, 55)
oled.show()
全くの素人のおじさんがたった数行のコードでOLEDに文字を表示させることができるなんて、最高ですね。
チョット残念なのは、OLEDの走査の関係で表示が上半分が表示されていないように見えることですね。
スマホのカメラではこれが限界かな。
もう少し何かできないだろうか?
まあOLEDへ表示するのは、初心者の初心者レベルの内容だと思いますので、もう少し何かできないのかって考え、ネットを探してみました。
どうやらRaspberry pi Picoには温度センサーが内蔵されているようなので、この温度センサーを使って現在の温度を表示させることを考えました。
こちらも走査の関係で表示が下半分が表示されていないように見える。
公式ドキュメントがあるので、それを使わせてもらいました。
コードはこちらです
import machine
import ssd1306
import time
import utime
sda = machine.Pin(0)
scl = machine.Pin(1)
i2c = machine.I2C(0,sda=sda, scl=scl, freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65536)
while True:
reading = sensor_temp.read_u16() * conversion_factor
temperature = 27 - (reading - 0.706)/0.001721
#print(temperature)
oled.fill(0)
oled.text("Now Temp", 30, 25)
oled.text(str(temperature)+" deg C", 10, 35)
oled.show()
utime.sleep(1)
こんな感じで、OLEDに現在の温度を表示することが可能になりました。
ただ、コードを見ていてアレ?って思ったのは、ADC(4)ってピンにはアサインされていない部分なんだなってことと、Raspberry pi PicoのADCの入力解像度は12ビットと聞いていましたが、コード上では16ビットで計算しているんですよね。
解像度の部分で、電源の3.3Vを65536で割っているのですが、この65536って16ピットの事だと思うんです。12ビットであれば4096で割るのではないでしょうか?
不思議だよな。実際に4096で割ると表示はマイナス表示になりました。ということはどういう事?
考えてること間違っているのかな?まだわからないことばかりだ。
次にやるべきことは?
今は、mac上のThonnyで書いたプログラムをRaspberry pi Picoに流し込んで動かしています。
従って、macから切り離すと電源が供給されていてもプログラムは動作しません。
どうやらRaspberry pi Pico単体でプログラムを動作させるためには、UF2というファイル形式のバイナリーファイルを書き込む必要があるようです。
現状はMicroPythionを書き込んで動かしていると同じように、単体動作させるにはどうやらUF2に変換する必要があるようですね。
C/C++を使うとできるらしいのですが、MicroPythonではできないのでしょうか?
次にやるべきことは、UF2ファイルをどうしたら作れるのかを調べることですね。
それ以外には、外部センサー動作を習得することでしょうか。
プログラミングは、アレ?動かないなってなると、アッと言う間に時間が過ぎ去っていきますね。
だから楽しいのかもしれませんが。
もっと頑張ろっと。