micro:bitでUARTを基板エッジコネクタ端子に出して使う場合、どのピンを使えばよいのか。ちょっと調べてみた。
micro:bitでは、UARTをどのI/Oピンで使うのかは固定されていなくて、好きなI/OピンをUARTに設定して使用することができる。
結論から言うと、P0かP1かP2かP8のうち2つをUARTのTXとRXに設定して使うのがよい。
microPythonだと、次のようにUARTの初期化を書いて設定する。
uart.init(baudrate=9600, bits=8, parity=None, stop=1,tx=pin0,rx=pin1)
このようにtx=pin0,rx=pin1と書けば、UART送信用のTXはP0に設定され、受信用のRXはP1に設定される。
なぜP0,P1,P2,P8以外は使用できないのか、説明する。
micro:bitのCPU(nRF51822)は、ARM CPUと無線ICがワンチップになった統合チップを使用している。
このCPUのピンは、P0.0からP0.29まで30本のI/O用のピンがある。
そのうち10本のピンは基板エッジコネクタに出ていないので使用できない。
ちなみにCPUのピンの名前と、micro:bitのピン名とは対応していないので注意が必要だ。
例えば、
CPUのピンP0.3が、micro:bitのP0になっている。
CPUのピンP0.2が、micro:bitのP1になっている。
CPUのピンP0.1が、micro:bitのP2になっている。
CPUのピンP0.4が、micro:bitのP3になっている。
CPUのピンP0.5が、micro:bitのP4になっている。
CPUのピンP0.17が、micro:bitのP5になっている。
micro:bitのI/Oピンには、I2CやSPIのバス用に役割が決まっているピンがある。
I2Cのピンは、P19とP20と決まっている。
I2Cのバスにはmicro:bitの基板上の加速度センサーと電子コンパス用の磁気センサーが繋がっている。
そして、これらのピンにはプルアップ抵抗が接続されている。
このピンをUARTに使うのは避けるべきだろう。
同様に、SPIバス用にP13,P14,P15が決まっている。
SPIバスのSS信号用にP16を使うことが多いようだ。
なので、これらのピンもUARTに使うのは避けるべきだと思う。
SPIバスを使わないとしっかりと決めているならば、やむをえずP13~P16をUARTに使うのは可能。
あと、micro:bitのLEDマトリックス表示にI/Oピンが割り当てられている。
カラム用のCOL信号9本と、ロウ側のROW信号3本があり、基板エッジコネクタに出ているピンと出てないピンがある。
ROW信号側のピンは基板エッジコネクタに出ていない。
カラム側は、6本が基板エッジコネクタに出ていて、3本は出ていない。
P3がCOL1、P4がCOL2、P6がCOL9、P7がCOL8、P9がCOL7、P10がCOL3となっている。
しかし、これらの6本のピンはCPUに直結しておらず、LEDマトリクスの回路のLEDの電流制限用の220オームの抵抗がCPUと基板エッジコネクタとの間に存在している。
それに、自分がLED表示のプログラムを書いていなくても、システムがエラー時などにLED表示を使うので、これらのピンは不意に使われてしまうことがある。
なので、これらのピンをUARTに使うのは避けるべきだろう。
残りのピンのうちボタンA,ボタンBにつながっているP5とP11も、ボタンが押された時に電圧が変化してしまうので、UARTに使うのは無理と考えたほうがよいだろう。
P12は、こちらの基板端子図を見るとreservedみたいなことが書いてある。将来的なことを考えると避けておいたほうがよさそう。
結局そうして消去法で残ったI/Oピンが、P0,P1,P2,P8となる。
P0,P1,P2には弱いプルアップ抵抗として10Mオームで電源とつながっている。
このプルアップ回路は、P0~P2の3つの基板エッジコネクタをタッチ検出に使うためのものらしい。
片手でGNDピンに触れて、もう片方の手でP0,P1,P2に触れたときに電圧が変化するのを検出してボタン代わりに入力用に使うというものだそうだ。
あまり知られていないし、ほとんど使われていない機能なので、UARTの邪魔になることはないだろうと思う。
P0,P1,P2は基板エッジコネクタの幅が大きく、ねじ止め用の穴もあるので、実験用にクリップなどで信号をつなぎやすいというメリットがある。