UART小咄

この記事はKMC Advent Calendar 2018における21日目の記事です。きのう20日は、tronさん(id:tron_kmc)による今年も今年を振り返るでした。

tron-factory.hatenablog.com


今回は、マイコンのよくあるインタフェイスUARTで苦労した話をつらつらと書きます。マイコンクラブなので。

はじめに

しばらく前に、Wio NodeにI2CのUART(SC16IS750)つかってCO2センサMH-Z19Bをつないで観測するバラックを組みました。
www2.hatenadiary.jp

で、その後しばらくして「PM2.5も観測したいなぁ」と思いたち、AliExpressで見つけたPMS5003というセンサを買いました。

こいつもUARTで通信するので、CO2センサと併用するにはいくつかの手段が考えられます。

  1. UARTふたつ積んだSC16IS752買って使う
  2. I2Cアドレス変えたSC16IS750をI2Cバスに並列
  3. 4052使ってUART切り替える

SC16IS752を買うとなるとまたAliExpressで一週間だなぁとか、上2つは配線ミスとか静電気等でチップ壊すぐらいしか失敗がなさそうな気がしたので、3つ目の「4052使って切り替える」をやってみることにしました。

気分としてはこんな回路を組めばいけるやろと思って秋月行って4052買ってきました。ON抵抗が74HCより割と大きい(倍ぐらい?)んだけど一番安かったのでTC4052BPです。事前にググって見つけたSparkfunの回路例がスイッチ指示ピンをプルダウンしただけなので、これでいけるかな。

f:id:W53SA:20181219034111p:plain

プログラムは、GPIO0.1をOUTPUTに設定してまず0,1両方LOWに落としてMH-Z19Bと会話し、次いでGPIO0をHIGHに上げてPMS5003と会話。あとはGPIO0をLOWにしてMH-Z19Bと会話のループ。2センサとの会話をを30秒ごとに行うようにしてみた。

結果。

動いたり動かなかったり。

ナンデー

調べてみる

で、プルアップとかプルダウン抵抗が足らんのやろと(後述する過去の失敗より)アタリをつけて「UART pullup」等でぐぐると、なんかTxDがオープンコレクタの場合があるらしい。

Highレベルを送信側と受信側で合わせる必要がないように、UARTではデバイス間を Pull-Up と オープン・ドレイン でつなぐことになっています。
http://xianzhi.sakura.ne.jp/UART.html

f:id:W53SA:20181220204850p:plain
FOMA UART インターフェイスを利用するための技術参考資料 第1.1版

まーじで。

また、RS232ドライバで有名なMAX232のデータシートを見てみると、確かにプルアップ抵抗が入ってる。
f:id:W53SA:20181220224715p:plain

でも、文中には「MAX220には、使用していないドライバ出力をローにするプルアップ抵抗がありません。」という記述があって、プルアップ抵抗はオープンコレクタ入力用でなくピンオープン時に出力をLOWに落とすためにあるのでは説が有力。でも、ピンオープン時にちゃんとGNDやVccに繋げよってシートに書いて終わることが多いから単なるピンオープン対策だけではない気もする・・・。

他にも調べると、FT230XがTxDとRxD両方にプルアップを入れる回路例を出してる
f:id:W53SA:20181221002034p:plain
し、そもそもデータシート冒頭1ページ目のFeaturesから「operates down to 1V8 with external pull ups. Tolerant of 5V input」って書いてある。

現実問題としてPMS5003やMH-Z19BのTxDにテスタ当てると3.3V出てるので、オープンコレクタ(ドレイン)でないとは思うのだけど、とりあえずセンサTxDをPull-upしたら安定して動き始めたんですね。。。

f:id:W53SA:20181221013146p:plain


pull-upはセンサTxDだけで大丈夫なのか???

他にも、センサRxD側をpull upしておけという記事をみつけたり。UART基本的にスタートビット0なので、4052で非選択側になってハイインピーダンスになった際にHIGHにしておかんとセンサがノイズ食うよね、という話。

that should work, you just have to connect to the RX inputs of the BTM222 Install pullup of several kOhm (10), so that the resting level of the Interface in unselected state is on plus.
UART multiplexen mit 74HC 4052 - Mikrocontroller.net (原文はドイ語でGoogleTranslateで英語にしたやつ)

たしかにそうなんだけど、今はTxDだけで動いてる。MAX232の如く、センサのRxD側にプルアップ抵抗が既に入っているのかもしれないなぁとテスタで電圧見てみると、MH-Z19BはRxDに3.3V出てきたけどPMS5003は0.8Vという微妙な電位(謎い)。

PMS5003のRxDだけpull-upが必要かなぁという気持ち(まだやってない)。ちなみにSC16IS750のRxDは起動直後3.3Vでした。

PMS5003との会話について

ほんとはこっちを書きたかったんだけど、4052をUARTでスイッチする段階でドはまりしてしまったのでこちらが薄口気味になってしまった。

まずつなぐことから始まるんですがこのセンサ、コネクタが1.25mmピッチで普通のコネクタが刺さらない。
github.com
Molex PICOBLADE Seriesというコネクタらしい。

センサ買ったら両方1.25mmピッチのメスメスケーブルがついてきたので片方のコネクタ切って2.54mmピッチのコネクタにしてもよさそうですが、もし替えが効かないとミスった時にやばいので、探すとaitendoの1.25/8P端子付きケーブルが刺さりました。
www.aitendo.com
やったぜ。

デフォルトだとアクティブモード(センサからデータが勝手に送られてくる)なので、取得リクエストに答える形のパッシブモードに切り替えて適当に読み出し。
github.com

で、校正という程ではないけど目黒区での公的測定結果を適当に眺めてグラフトレンドと似てるかなーとか適当に見ています。
f:id:W53SA:20181221122329p:plain
データはAmbientに流しています(超便利)。

おわりに

今回の話オチないんですよね。現代的タイトルだと「プルアップ・プルダウンには気をつけよう!本当は怖いHigh-Zの話」って感じですけど、High-Z(ハイインピーダンス状態)の話はあんまり出てない(4052の空きピンちゃんとpullupしたほうがよくね?ぐらいかな・・・)。ようやくアドベントカレンダーで純粋ポエム以外のことを書けたけど、電子工作ネタにしてはちょっと消化不良。ほんとはロジアナなどの計器を買って調べないとだめなんでしょうけど。

思えばKMC入って最初にやったのは電子錠の製作(これは2015年のアドベントカレンダー記事で書きました)でした。電子錠の話は部誌独習KMC vol.βにあるとおりで「コントローラ出力のpull down忘れにハマった」という経験があったので序盤からプルアップ・プルダウン周りかなという読みが今回ありました。

次回予告

明日22日はkataさんの「ゲームの話です」です。おたのしみに!