Raspberry Pi のI2Cを使ってPICでスレーブを作ってみる。

Raspberry Pi 2

1番Pinから10番ピンまでを、Raspberry Piから引き出して接続。

I2Cは長いラインを想定していないので、私の場合は20cmで引き出している。

温度は前回作ったPHPを使いまわし、PICに時間と合わせて送る。PICの方はI2Cが2つあるので、もう1つで液晶に表示させている。

液晶は I2C接続小型キャラクタLCDモジュール(16x2行・3.3V/5V)ピッチ変換キット (AQM1602A-RN-GBW)

完成品がこちら。

CIMG1049

CIMG1060 CIMG1055

 

回路図

P1 V1.02

部品は全部秋月でお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 位はしたいのでマルチマスタで使うでしょうと。

で、I2Cラインにつながっているものが列挙されるが、この液晶は返事をしないので表示されない。動いているのか死んでいるのか困ったものでした。ラインにLEDを付けてあるので、データを送っていることは確認できるので、信じてやるしかありませんでした。

 

PICで完全にレジスタをいじるところから作っていていたので、気がついたのだが Raspberry Pi のコマンド

などというブロック転送をすると、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が即死するので、怖くてつなげません。

https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/Raspberry-Pi-B-Plus-V1.2-Schematics.pdf

ちなみに、Pi2の回路図はなかったので、別の製品で予想を立てるしかなかった。

どこに書いてあったか忘れましたが、I /O 1本は16mAつかえて、全体で50mA位だったような。ここを抑えておかないとぶっ壊れます。

とにかく、I/Oが壊れるのは怖いので、できるだけ7414とかのロジックICでBufferを付けるように心がける。(リセットで出力がぶつかるとか)

それに伴い、外部通信のRS485も絶縁している。

I2Cもシリアルラインも通信していないときは Hレベルなので、その状態でLEDやフォトカプラに電流が流れないようにしておく。

Raspberry Pi 2


PAGE TOP
Top