別シリーズにてPICマイコン搭載のSPIスレーブを実験。しかし実験用にSPIマスタを作るのがメンドかったので、「テキトー」にマスタ波形らしきものを作りPICマイコンにデータが届くことだけを確認しました。でもね、ちゃんとマスタを設えてそれなりにデータをいろいろ送ってみたいデス。そういう時こそMicroPythonがお楽。
※「MicroPython的午睡」投稿順 Indexはこちら
※Windows11上のThonny IDE 4.0.1 と ESP32 Devkit C に書き込んだMicroPython v1.19.1で動作確認しています。
別シリーズでPICマイコンのSPIスレーブを使ってみたのは以下記事です。PICマイコンにはSPIでもI2CにでもなるMSSPという周辺回路があり、そのうえMSSPはマスタにもスレーブにもなる変幻自在さなんであります。
PIC三昧(15) MSSP、SPI Slaveモードでデータを受信、PIC16F18855
上記の実験そのものはMicroChip社のMPLAB X IDEという開発環境でC言語でやっとります。通信相手のSPIマスタをこさえるのがメンドかったので、SPIの波形らしきものをAnalog Discovery2のデジタル波形パターンジェネレータを使って生成してテストしておりました。データを変えるにはイチイチ波形を編集しないとならないのでそれはそれでメンドイっす。
MicroPython ソフトウエアSPIバス
このところヘビーローテーションなESP32 DevkitCのMicroPythonですが、もしかするとSPIを使っていなかったかも。気をとりなおしてSPIを使ってみます。ESP32用のMicroPythonの場合、以下の2つを使用可能です。
-
- ソフトウエアSPI
- ハードウエアSPI
ハードウエアSPIの方が上限速度は速い(最大80MHz)のですが、最高速度を達成するためにはデフォルトピンを使わねばならんようです。一方ソフトウエアSPIは、ソフトウエアでビットバンギングできるピンであればどのピンでも差別なく動作するようです。
今回はテスト用とて、高速化を狙っているわけでないので、ソフトウエアSPIを使ってみることにいたします。ESP32版MicroPythonのSPIの使い方については以下の日本語ページに必要そうなことは皆書かれてます。
実験に使用したMicroPython スクリプト
さて、ダラダラと0から255までのデータをSPIホストからたれ流すだけの実験用スクリプトが以下に。
from machine import Pin, SoftSPI import time def main(): print("ESP32, SPI master.") ss = Pin(21, Pin.OUT) ss.value(1) spi = SoftSPI(baudrate=10000, polarity=0, phase=0, sck=Pin(32), mosi=Pin(22), miso=Pin(33)) dat = 0 while True: dat = 0 if dat >= 255 else dat + 1 ss.value(0) spi.write(dat.to_bytes(1, "big")) ss.value(1) time.sleep_ms(2000) if __name__ == "__main__": main()
相手のPICマイコン側のテストプログラムは、SPIスレーブに到来したデータ(1バイト)をこれまたダラダラと標準出力(USBシリアル)にたれ流すだけのもの。
ESP32 DevKitCとPIC16F18855をSPI接続
ESP32 DevKitC(MicroPythonが動作している)と、PIC16F18855の開発ボードを接続したところが以下に。接続は以下のとおり
-
- SCK ESP32側32番ピン -> PIC16F18855側 PortC 3番ピン
- MOSI ESP32側22番ピン -> PIC16F18855側 PortC 4番ピン
- MISO ESP32側33番ピン -> 接続せず
- SS ESP32側21番ピン -> PIC16F18855側 PortC 6番ピン
動作確認
PIC側は既にSlaveのプログラムが書き込まれて動作しているので、MicroPython上で上記のスクリプトを実行してみます。するとSPIを経由して、PICに渡ったデータが、PIC側のUSBシリアルを通じて、パソコンの仮想端末にダラダラと表示されてきます。こんな感じ。
ちゃんとデータが流れてきておるみたいです。でも接続メンドかった。グラウンド入れても4本だけだろ~