« FusionPCBに2年ぶりに基板発注した | トップページ | 初めてのF1モデリング »

2020年2月28日 (金)

PIC 16F876Aで温湿度センサAM2320を読むのに苦戦

湿度制御機能がない安物加湿器で湿度制御するためのプリント基板をFusionPCBに発注し、届いたプリント基板にさっそく部品をはんだ付けした。

湿度制御する理由は、加湿しすぎて結露したこと、加湿を必要最小限にして水の補給頻度を少なくして楽をしたい、という2点。

最初はRasPi用に設計

PICに変更

Dsc05280

でもなぜか動作しない。ネットでググったりPICの仕様書を読んだりしてようやく原因が判明。16F876Aって、内部クロックもってなかったorz 普段16F88を使っているので、外部に振動子が必要なんて考えもしなかった。しょうがないので、セラミック発振子を半田付けした。

他にも結線ミスが2か所も見つかって、ジャンパーで修正。ベタグランドはすべてつながっているもんだという先入観からDRCエラー(GNDの未配線)を無視してた。KiCADの方がはるかに賢いのでエラーはちゃんとつぶそう。ケチらずにVIAをポチポチ打っておけばよかっただけの話。

Dsc05277

液晶に文字が表示されたけど、センサーにアクセスしたとたん i2c_start();でフリーズする。センサーにつながるポートSDAとSCL(C3とC4)をTRISで出力モードにすればフリーズしないけど返ってくる値が正しくない。PORT C3とC4は、手持ちの本では出力に、ウェブでは入力にしろと異なることが書いてある。スリープから起こして、仕様書に記載の時間ウェイトかけて読みだしても、返ってくるビットがすべて1(0xFFFF)なので、温度6553℃と湿度6553%となる。 太陽かよ。

Dsc05282

プログラムをあちこち修正しても一向に改善しないので、ハードウェアに問題があるとしか考えられない。Raspberry PiではうまくいっていたのにPICでうまくいかないので、16F876Aにプルアップ抵抗が内蔵されているかどうかはデータシートを見てもよくわからなかったけど、ポートC3、C4にプルアップ抵抗を追加してみることにした(AM2320のデータシートの通り)。 

Dsc05283

これで、TRISでポートC3とC4を入力モードにしてもフリーズしないし、センサーが返す値も正しくなった。ようやく動作した。Raspbrry Piではすぐに動いたのにPICでは苦戦した。

Dsc05284

やっと完成かと思ったら点灯しないLEDがある。「RA4 オープンドレイン」で検索したらビンゴ。

RA4は初心者がよくやるミスの典型例らしい。2年前にも16F88ではRA5が入力専用を知らずに間違えてるし、ちゃんとPICごとにデータシートを確認しないといけない。LEDはあきらめようかとも思ったけど、1kΩでプルアップして順方向電圧が3VあるGaN系のLEDを使ってみたらうまくいった。ここで順方向電圧が1.7Vの従来のLEDを使うとまた予想外の動作(出力がHighでも電圧降下が2ボルト弱でポートはLow状態と誤認識)をするらしい。

最後に、Timer0のルーチン、経過時間を測定すると10%も遅い。なんで?セラミック発振子の誤差はそんなに大きくないはずなので、割り込み処理ルーチンでLEDをつけたり消したりするのに時間がかかっているのかな。ここはソフト的にカウント数を10%減らして無理やり合わせた。

追記:

ブレッドボードで動作確認もせずにいきなりプリント基板を発注してしまって、修正だらけだけどようやく完成した。完成したころには乾燥する季節は終わったかと思ったけど、今日は乾燥している。湿度制御機能がない加湿器でも加湿しすぎることなく適度な湿度をキープしてくれ快適な朝を迎えられる。

Dsc05285

« FusionPCBに2年ぶりに基板発注した | トップページ | 初めてのF1モデリング »

電子工作」カテゴリの記事

カテゴリー

フォト
無料ブログはココログ