SSブログ

Pi 3のUARTが動かない [Raspberry Pi]

お客さんからのご無体な要求に応えるために、明日から久ぶりに工場に行く。そこで使うために急遽やっつけで、昨日と今日で回路の半田付けをしていた。まずショッキングな絵を見ていただこう....
0628microsd.jpg

こないだ買ったRaspberry Pi 3と、Microchip社のA/DとD/Aが乗っているサンハヤトの専用ユニバーサル基板と、さらにその左奥のアナログのオペアンプ回路とあとRS-485のトラシーバを半田付けしたユニバーサル基板がある。3段重ねにするためにサンハヤト基板には長めのピンヘッダがふたつ立っている。その絵の下に二つに割れたMicro SDカードが見える。鞄の中にぞんざいに放り込んで帰ってきたせいで、どこかに当たって真っ二つになったらしい。うちに帰ってきて出張したくをしていて気がついた。

しょぼしょぼする目で昨日丸一日と今日の午前中いっぱい半田付けしたので二つのユニバーサル基板は壊れないように気をつけて持って帰ってきたんだけど、小さなMicroSDカードはRaspberry Pi 3に挿したまま持って帰ってきた。それがいけなかった。フルバックアップは取ってなかったので、今から別のSDカードにNOOBSから入れ直す。悲しい。自業自得だけど。

ところで今日の午後半日ずっと悩んだことがあった。アナログからA/D、D/Aまわりはそれほど問題なしに動いた(例によってまたいっぱい間違って基板がヤニだらけになった)けど、RS-485がうんともすんとも言わない。これまでRaspberry Pi 2ではちゃんと動いた回路構成とソフトである。ずっとたどっていくとRaspberry Pi 3のUARTから信号が出ていないことがわかった.....

あれえ、おっかしいなあ、でも書いてちゃんと動いたコードに余計な手を入れてまた動かなくしてしまうことって僕はよくあるので、デバガで真面目に追っていくと、シリアルへのwrite()システムコールが0を返していた。

write()は指定されたディスクリプタにバイト列を書き出すシステムコールで、書いたバイト数を返すことになっている。書き出しが失敗したら-1が返される。0が返るということは、失敗してないのに書いてないということでそれはおかしいだろ。僕のコードは0が返ることを想定していなくて、全部書き終わらなかったら残りを書き出すというふうになっていたので、0が返ると無限ループになっていた。

僕のコードはちゃんと対応するように書き直すとして、write()が0を返すってなんだろう、と思ってぐぐっていたら、それ以前にそもそもRaspberry Pi 3ではUARTが使えない、ということを知った。新しく導入されたBluetoothに使われてしまってるらしい。ひでえ。

限られたARMコアのSoCで何かのハードを追加するには何かを犠牲にするしかない、ということは十分ありえる。しかしなんのアナウンスもなしで、その事実を知るためにはFORUMの深いところにたどり着かないといけない、というのは不親切である。せっかく基板のパターンやRaspbianのコア部分はタイトになってきてるのに、こういうところでなんか素人臭さが残ってる感じがしてしまう。「今度のPi 3はWiFiとBluetoothが内蔵だぜ!わお、なんてクールなんだ!」みたいなノリの裏で互換性を損なうというのは感心しない。

UARTに限らず、ちゃんとRelease Noteのページを作ってそこに必要な詳細へのリンクをまとめといてほしいなあ。僕は若い人たちみたいに時間がたっぷりあるわけじゃないんだし。いや、若い人たちにとっても、つまらないことに時間を費やする必要がないのでその方がいいだろう。

僕はRaspberry Piをヘッドレス(キーボードモニタなし)で、つまりリモートログインだけでしか使わない(いずれはユーザモードの普段使いではリモートログインもやめようと思っている)のでWiFi内蔵はありがたいけどBluetoothは使い道がない。そこでBluetoothを使わないようにして、もとのUARTをGPIOの8番10番に出せるようにした。

あまりちゃんとわかってないんだけど、Raspbianでは/boot/config.txtを書き換えることでDevice-Treeの構成を変更できるらしい。ブートの時に読み込むので書き間違ったりするとブートできなくなる。ブートできないともうモニタをキーボードをつないでリカバリモードで編集するか、SDカードを直接書き換えるしかなくなるので気をつけないといけない。

さて、それを今からやり直す。そんなもん覚えてへんがな。明日朝までに終わるかな。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。