ちょこちょことブレッドボードの上に回路を組み、いろいろ実験するつもりで並べてあります。数が増え、小さなブレッドボードとは言え、段々収拾がつかなくなってきました。
何度も実験などに使えそうな回路は半田付けで固定するか
などと思い至りました。しかし、何種類もマイコンボードを仕入れているので、できれば「互換性」ある感じにしておきたい。そこで思いついたのが、
Arduinoシールド用のユニバーサル基板で作っておく
ということです。Arduinoシールドは、Arduinoボードの上に子亀的に載せる各種機能ボードですが、自作用にユニバーサル基板も出回っています。それを使えば、Arduinoピンヘッダの上に取り付けられて「かっこもよい」。なにせ、Arduino Uno、Nucleo-F072RB、Nucleo-F401REと現状3枚のマイコンボードがArduinoピンヘッダを「しょっている」のです。マイコンはそれぞれ異なりますが、その3枚に共通の実験ボードを作れるのではないか、などと考えたわけです。しかし、なかなかそうは問屋が卸さないことが判明しました。
※「鳥なき里のマイコン屋」投稿順Indexはこちら
まず、シリアル接続している(つまり自分であまり大したことをしないでもつながる)センサ類をインタフェースするボードを何種類か作っておこう、と考えました。対象にするのは
-
- UART(ハード的にはUSARTだったりするが同期式は使わず)
- I2C
- SPI
の3種類のシリアル・インタフェースです。その他にNucleoはCANにも対応しているのですが、そちらは後回しにして上記の3つについて、それぞれ互換をとる形にできるか否かを検討してみました。
UART
まずはUARTですが、最初から悲しいお知らせとなりました。確かに3つのボードのマイコンともUARTを搭載しており、その上同じArduino ピンヘッダ位置に出ているのです。具体的にはArduino名のDigital 0にRXが、Digital1にTXが。しかし、これを実験に使うのはほぼダメです。どのボードも
USBシリアル
としてボード上でハード結線されています。これ以上ソフトを書きこんでデバッグなどしない、というのであれば、この端子を使ってしまっても良いでしょうが、仮想COMポートと通信したければ見送りするしかありません。そして、Arduino UnoのATmega328PマイコンにはUARTが一つしか搭載されていません。よって、3枚に共通のUART実験用ボードを作るというのは却下。
一方、Nucelo側のSTのマイコンはシリアルポート(UART)を複数個積んでいます。
Nucleo-F072RBは4つ、Nucleo-F401REは3つ
使えます。STのチップはピン配置の互換性を高めるためだと思いますが、同一機能をいくつか別の端子から取り出すように選択することもできます。しかし、検討してみると結構キツイ。ST Morphoピンヘッダには全機能を取り出せるのですが、Arduino互換ピンヘッダには一部の機能しかでていません。例えば、ArduinoのピンヘッダでRXは取り出せるけれどTXが取り出せないUARTなどもあります。結論から言えば、
UART1(もしくはSerial1)
というインタフェースを使った場合のみ2枚のNucleoボードに共通のシールドを取り付けられます。Nucleo-F072RBであれば、Arduinoピンの範囲でSerial4を使うことも可能ですが、Nucleo-F401REにはそれはありません。Nucleo-F072RBのSerial3とNucleo-F401REのUART6はArduinoピンヘッダの範囲ではTX, RXがそろいません。
I2C
続いてI2Cです。ATMELでは、I2CではなくTWIと呼んでいるようです。こちらも結論からいうと
Digital側のコネクタの端のSCL, SDA端子を使えば3枚共通化できる
です。良かった。ただし、被せるシールド基板によってはこの2端子が無いタイプ(多分古いバージョンのArduino互換)があるので注意しないとなりません。この2端子にピン立てなければ、使える基板なのですが、この2ピン立てると刺さりません(体験済)。I2C使う場合は、上記の2端子が追加されているArduino Uno用のシールド基板が良いと思います。
でも、ArduinoのAnalog端子の端、A4とA5にもI2Cが出てる、そこ使えば共通化できるんじゃ?
Arduinoの場合、I2Cの実体は、Analog側のA4とA5に出ており、先に述べたDigital側のコネクタの端のSCL、SDAは同じ信号です。単に配線を引っ張っていっているだけなので注意しないとイケません。2つあるわけではないです。そして、Nucleoの方は、このボード端っこのアナログ端子にI2C機能はかぶさっていないのでした。残念。例によって
Nucleo-F072RBは2つ、Nucleo-F401REは3つ
I2Cを使えます。Nucleo-F072RBの場合、Arduinoのピンヘッダ範囲で使えるI2Cha先ほどの1つのみ。ところがNucleo-F401REは3つ全てが範囲内で使えるピンアサインになっています。I2Cを3セットも使う場合にはF401REは良いですが、Arduinoシールドの小さな基板に3セット分の周辺などは収まりますまい。
SPI
最後のSPIですが、結論からいうと
1対1接続であれば、3枚共通で使える端子が1チャンネル出ている
です。1対1接続というところがミソでNucleomの「スレーブセレクト」信号の位置が違う(Arduinoのアナログ側にでている)のです。クロックと入出力の3本セットだけなら同じ位置だということです。1対1接続ボードなら共通化できると。
例によってNucleo側は複数チャネルのSPIがあったりしますが、Arduinoピンヘッダ範囲では使えないです。
ボード3枚、ちょっとシリアルポートを確認しただけでも、このパズルのようなややこしさ。ま、これがマイコンですね。