Pi Pico をI2C経由でラズパイ4Bから制御してみる(メモ)


Picoは素のままではWi-FiもBluetoothも赤外線も使えません。制御するのにシリアル通信を使ってみます。

ラズパイ4Bをマスター、PicoをスレーブにしてI2Cインターフェースを使います。

こんな感じで、ヘッダーピンをジャンパーワイヤで結線します。

Lチカとサーボモータ制御をやってみます。

ZeroからPicoにMicroPythonの環境を作ることはできないようです(BOOTSEL + USB接続するとZeroがハードリセットされてしまいます)。ZeroからPicoを制御する場合は以下に記述したようにラズパイ3以上かWindowsやMacでMicroPython環境を作っておきます。最初にZeroとPicoを接続してZeroからPicoに給電するとリセットがかかりますが、起動後はPicoはI2Cデバイスとして認識されています。また、USBで接続すればThonnyからもPicoが見えます。ただ何かが走っているとBusyなので、事前にラズパイ4などでPicoはクリーンにしておく必要があります。

ZeroからPicoをコーディングするのに以下のようなヘンタイ的なやり方もあるようです。

ご参考までに。

スマホとRaspberry Pi Zero Wを使ってRaspberry Pi Picoを屋外でもコーディング

 


環境作り

ラズパイ4B側ではI2Cインターフェースを有効にしておきます。

Pico側ではMicroPythonをセットアップしておきます。

このページ参照

Pi PicoにMicroPythonをセットアップして実行してみる(メモ)

 


Picoをスレーブとして動作させましょう。

このページ参照

このコードを使わせていただきます。

i2cSlave.py

Lチカさせるコード

main.py

 


セットアップ

上記の2つのコードをPicoに書き込んで、ラズパイ4BとPicoをジャンパーワイヤで接続してPicoを再起動させます。

以前に何か作業をしていた場合は、まず、PicoのFlashメモリーをリセットしてスッピンにしておきます。

ここ参照

ラズパイ4BでThonny Python IDEを開いて、上記 i2cSlave.py Picoに書き込みます。

どこにSaveするか聞いてくるので、Pico側に保存

 

Newをクリックしてmain.pyも同様に保存しておきます。

こんな感じでコードはルートに保存されます。

 


ラズパイ4BとPicoをジャンパーワイヤで結線してPicoを起動させます

まず、MicroUSBケーブルは外しておきます。

結線はこんな感じ。

順番はまぁどうでもいいと思いますが、

GPIOのRx、Txをクロスで結線します()。

をGNDに結線して、最後にを5Vに結線します。

これでPicoに電力が供給されて起動します。起動後に自動でmain.pyが走りますので、うまくいってれば、LEDが3度点滅して信号待ちの状態になっているはずです。

 


ラズパイ4BからPicoのLED点滅を制御

main.pyのコードでI2Cアドレスを0x41と設定しています。

見てみましょう。

ラズパイ4Bでターミナルを起動して以下のコマンドを発行します。

Picoの main.pyが起動していればこうなります。

Python3を起動してox41からLチカの回数を送信してみます。

こんなコードです。

4回チカチカしてくれればOK。

現状のコードで送信できるのは 0~255 です。

256以上の数値は再び0からセットされます。

 


サーボモータを制御

MG90S マイクロ・サーボモータを使ってみます。

 

 

Picoとの結線 data送信には28番のpin(GP28)を使っています。

結線はI2Cとかぶらないようにしているだけなので以下のようなのでもOKです。この場合data線はGP2です。の電力供給用は上のでもいいです。

 

こうすると、単純に2つのサーボを使えますね。ただ、2個のサーボの電力をPicoだけから取るのは厳しいかも…。

 

 

基本コード

 

ラズパイ4Bをマスター、Picoをスレーブにしてやってみます。

スレーブ用のコードは上記と同じ

i2cSlave.py

 

サーボモータを制御するコード

main.py

 

Lチカの場合と同様にThonnyでPicoに書き込みます。

USBケーブルは外しておき、ラズパイ4Bとの結線は上記と同様で、これでPicoに電力供給します。main.pyが起動すれば、サーボモータが初期動作をするはずです。

サーボモータのような外部に電力供給する場合、十分な電力が供給できない場合があります。

ジャンパーワイヤによっては内部に抵抗が残っていることがあり、これが原因のようです。

そういう場合は、PicoはUSB接続して、ここから電力を供給する必要があります。

あるいは、Picoをバッテリに接続するか、モータの電源はPCA9685のような別ルートから供給するようにします。

 

シリアル通信用に結線されているので、ラズパイ4BのターミナルからPicoのI2Cアドレスが確認できます。

別ナーミナルからPythonを起動して信号を送ればモーターが回転します。

duty_u16の変数の範囲は1000ー4300ー7500ですので、変数は10~75の範囲で整数を送信します。

こんなコード

0から180度の範囲でジージー、ジージーと回転します。

bus.write_byteを連続して発行しなければならないことがあります。

bus.write_byte(ox41,43);bus.write_byte(ox41,43)

 

 


BOOTSELボタンを押しながらUSB接続してPicoをストレージデバイスとして認識させる場合、

ラズパイ4Bから5Vで電力供給している時はジャンパーワイヤを外しておきましょう。

そうでなければ認識してくれません。


PicoがBUSY(つまりmain.pyが実行中)で、Thonnyから実行ファイルが見れなくなった場合

 

Ctrl + C と書いてますが、Ctrl+D だそうです。

で、USBケーブルを抜き差し

 

STOPボタンを押すと回復します。

 

 


Appendix

Picoにカメラを接続して、ラズパイから物体検出なんかしてみようかな….とお考えなら、この方のブログを参照

【Raspberry Pi Pico】カメラを接続して機械学習プログラムを動かす【Tensorflow Lite】

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*