Raspberry Pi のI2Cを使ってPICでスレーブを作ってみる。
1番Pinから10番ピンまでを、Raspberry Piから引き出して接続。
I2Cは長いラインを想定していないので、私の場合は20cmで引き出している。
温度は前回作ったPHPを使いまわし、PICに時間と合わせて送る。PICの方はI2Cが2つあるので、もう1つで液晶に表示させている。
液晶は I2C接続小型キャラクタLCDモジュール(16x2行・3.3V/5V)ピッチ変換キット (AQM1602A-RN-GBW)
完成品がこちら。
回路図
部品は全部秋月でおk。フォトカプラは違うか。フォトカプラ GaAlAs赤外LED+フォトIC TLP559でおkかと。9600bpsくらいなら、PC1と同じ部品でおk。
7414はこれ。6回路シュミットトリガインバータ SN74HC14N
このPICは2つのI2Cモジュールを持っていて、液晶のみ専用で繋いでいる。I2Cを1つだけにしてマルチマスタにしてもよいのだが、データ衝突が起きた時の処理がPICの方でまだ甘いのと、Raspberry Pi のコマンドが怪しいから。1つ1つ問題をつぶしていく途中な感じです。
いずれにしても、湿度センサーが Raspberry Piで動かないので、マルチマスタにするか液晶ラインに移動させてPICのレジスタを読ませるようにするかですが、Raspberry Piで i2cdetect 位はしたいのでマルチマスタで使うでしょうと。
sudo i2cdetect -y 1
で、I2Cラインにつながっているものが列挙されるが、この液晶は返事をしないので表示されない。動いているのか死んでいるのか困ったものでした。ラインにLEDを付けてあるので、データを送っていることは確認できるので、信じてやるしかありませんでした。
PICで完全にレジスタをいじるところから作っていていたので、気がついたのだが Raspberry Pi のコマンド
sudo i2cset -y 1 0x10 0x00 0x30 0x30 0x00 i
などというブロック転送をすると、Stopコンディションを送っていない様子。PICでブレークポイントを張っても入ってきません。「i2cget」の方は送っている様子。
これだから動かないデバイスが出る気がするのですが、そもそもこのコマンドはレジスタにデータを書き込む仕様なので、アドレスの後に直接コマンドを送ることができない。
他のHPを見ると Raspberry Pi で動いているデバイスは、レジスタを 0x00 などとして無害なデータを送り、その後のブロックデータで直接コマンドを送っている様だ?。送信だけならレジスタもデータも同じ扱いなので、ブロック転送は問題ないのかな。
↑ よくわからないので、デジタルオシロを買って調べてみます。
→ここのHPで説明されていた。Raspberry Pi で I2C の Repeated Start Condition を有効化
設定ファイルを書き換えると少しは良くなる様子。Stopコンディションについては触れられていないのでそこは謎。
温度大気圧センサーは完全にレジスタをいじるだけなので、簡単に動いた。
この回路図ではRS485ラインも作っている。GPIOの10Pinまでは、I2C / シリアルTXD,RXD / 単なる I/O が1本あるので、先頭の10本を引っ張り出せばおkなわけです。
電源は3.3Vを使わずに自前でRaspberry Piの5Vから作っている。Raspberry Piの回路図を見る限りでは3.3Vは2Aまで使えるように設計されているように見えますが、粗相をすると CPUが即死するので、怖くてつなげません。
ちなみに、Pi2の回路図はなかったので、別の製品で予想を立てるしかなかった。
どこに書いてあったか忘れましたが、I /O 1本は16mAつかえて、全体で50mA位だったような。ここを抑えておかないとぶっ壊れます。
とにかく、I/Oが壊れるのは怖いので、できるだけ7414とかのロジックICでBufferを付けるように心がける。(リセットで出力がぶつかるとか)
それに伴い、外部通信のRS485も絶縁している。
I2Cもシリアルラインも通信していないときは Hレベルなので、その状態でLEDやフォトカプラに電流が流れないようにしておく。
ディスカッション
コメント一覧
まだ、コメントがありません