Raspberry piとPICがつながった [Raspberry Pi]
(2013.09.13)
あれこれ試行錯誤を重ね、ようやくRaspberry piとPICが繋がりました。
PICとRaspberry piを繋げた
Raspberry piとPIC(I2Cスレーブ)間を接続して、wiringPiのツールを使って接続確認を行いました。
上手く動くか心配でしたが、呆気なく接続確認が済みました。しかし、順調に進んだのはここまででした。
JAVAからコマンドを送りLEDを点滅させることは出来ましたが、必ずしも想定した通りの動作になっていませんでした。そこで、JAVAのコマンド送信とRaspberry piのコマンド実行を同期させる機能(ope_sync)を組み込み、想定した通りの動作をきちんと行うようにしました。
そして、いよいよI2C通信に取り掛かります。
I2C送信(Raspberry pi ==> PIC)を試すと、”I2C Send”の文字列がPICの受信バッフに蓄えられ、正常に動作したことが確認できました。しかし、I2C受信(Raspberry pi <== PIC)がなかなか上手く動きません。
PIC側のログを調べてみると、送信要求を正しく処理しているのですが、Raspberry piのFIFOから読み出したデータには変なコードが混じっています。PIC側はループ・バックテストに使用していたものだったので正しく動作していると考え(<==これが誤り)、bcm2835ライブラリの使い方(もしくはライブラリそのもの)に問題があると思い込んでしまいました。マニュアルを何度も見直し、ライブラリのコードも調べましたが、問題点は見つかりません。リターン・ステータスは”正常終了”なのに、クロックストレッチのタイムアウト時間を0x40から0x4000に変更してみたりもしました。(<==結果は何も変わらない)
思いつくことは全てやり尽くし、ギブアップ寸前まで追い込まれたところで、念のためにPICがSSPBUFに書き込んだデータのログを取ってみると・・・
『あれ~?』
『FIFOから読み出した通りのデータを書いてる!』
『・・・・・あっ!』
テストに使ったPICのI2C通信はデリミタや送信バイト数などを伴う書式化されたデータを送受する仕様であったことを思い出しました。その書式に基づくデータを送信していたのです。受信データもその書式に従わなければならないのですが、受信バッファを直に覗いたのでフォーマット・エラーを起こしたことことに気づきませんでした。
PICのプログラムを書き換えて、ようやくI2Cの送受ができるようになりました。
初めてやるときゃ、こんなもの(見当違いの所を深掘り)です。
やれやれ
あれこれ試行錯誤を重ね、ようやくRaspberry piとPICが繋がりました。
PICとRaspberry piを繋げた
Raspberry piとPIC(I2Cスレーブ)間を接続して、wiringPiのツールを使って接続確認を行いました。
$ sudo apt-get install libi2c-dev $ gpio load i2c $ i2cdetect 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: 30 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
上手く動くか心配でしたが、呆気なく接続確認が済みました。しかし、順調に進んだのはここまででした。
JAVAからコマンドを送りLEDを点滅させることは出来ましたが、必ずしも想定した通りの動作になっていませんでした。そこで、JAVAのコマンド送信とRaspberry piのコマンド実行を同期させる機能(ope_sync)を組み込み、想定した通りの動作をきちんと行うようにしました。
$ ./run.sh bcm_interface start bcm2835_for_java start Receive Hello child! <== これがReplyの後に表示されていた Reply Nice to meet you. (ここで5秒間LEDが点滅する) ope_sync O.K. <== 同期処理で点滅終了を待ち合わせる Close bcm2835_for_java Close bcm_interface
そして、いよいよI2C通信に取り掛かります。
I2C送信(Raspberry pi ==> PIC)を試すと、”I2C Send”の文字列がPICの受信バッフに蓄えられ、正常に動作したことが確認できました。しかし、I2C受信(Raspberry pi <== PIC)がなかなか上手く動きません。
PIC側のログを調べてみると、送信要求を正しく処理しているのですが、Raspberry piのFIFOから読み出したデータには変なコードが混じっています。PIC側はループ・バックテストに使用していたものだったので正しく動作していると考え(<==これが誤り)、bcm2835ライブラリの使い方(もしくはライブラリそのもの)に問題があると思い込んでしまいました。マニュアルを何度も見直し、ライブラリのコードも調べましたが、問題点は見つかりません。リターン・ステータスは”正常終了”なのに、クロックストレッチのタイムアウト時間を0x40から0x4000に変更してみたりもしました。(<==結果は何も変わらない)
思いつくことは全てやり尽くし、ギブアップ寸前まで追い込まれたところで、念のためにPICがSSPBUFに書き込んだデータのログを取ってみると・・・
『あれ~?』
『FIFOから読み出した通りのデータを書いてる!』
『・・・・・あっ!』
テストに使ったPICのI2C通信はデリミタや送信バイト数などを伴う書式化されたデータを送受する仕様であったことを思い出しました。その書式に基づくデータを送信していたのです。受信データもその書式に従わなければならないのですが、受信バッファを直に覗いたのでフォーマット・エラーを起こしたことことに気づきませんでした。
PICのプログラムを書き換えて、ようやくI2Cの送受ができるようになりました。
$ ./run.sh bcm_interface start bcm2835_for_java start Receive Hello child! Reply Nice to meet you. ope_sync O.K. bi_bcm2835_i2c_write = 0 bi_rec_buff:0x09 0x53 0x45 0x4e 0x44 0x20 0x44 0x41 0x54 0x41 I2C receive=SEND DATA Close bcm2835_for_java Close bcm_interface
初めてやるときゃ、こんなもの(見当違いの所を深掘り)です。
やれやれ
|
|
|
こんにちは。
piーpic開通、おめでとうございます。おつかれ様です。
picは型番は何を使われていますでしょうか?
私はI2C通信を 5-3.3レベルコンバータ 秋月電子を使って
RsapPi(master)ーPIC18f2580(slave)
で通信を試みてます。
何故かPIC ID SSPADDのセットした値に対し、Rsapapi側で受信されるのはビットシフトした値になってしまいます。
ex. Raspapiで sudo i2cdetct -y 1で受信されるのは
0x10が0x08 や 0x20が0x10にビットシフトされる
勝手なお願いになりますが、貴殿の試行された情報を提供いただけると幸いです。
by estima (2013-09-14 12:05)
estima様コメント有難うございます。
今回はPIC16F1938を使いました。
>Raspi側で受信されるのはビットシフトした値に
i2cdetectの表示は7bitアドレスの値域(つまり0x00..0x7f)に対応したものになっているようです。一方、PICはSSPADDレジのADD<7:1>に7bitアドレスを設定するので、1bit左シフトした値をI2Cアドレスとして設定することになります。
私の場合も、PIC側の設定は0x60で、i2cdetectの表示は0x30です。
by broadbeans (2013-09-14 16:14)
こんにちは。
早い解答ありがとうございました。
あっていることがわかり安心しました。
私のやっているのは、以下のようなものです。
youtube
http://www.youtube.com/all_comments?v=N26DxwQ5iw0
PIC18F2580+MCP2551で自動車のCAN通信を記録する装置です。
SDカード記録やGPS受信などで走行中のCAN通信(速度、回転数、アクセル開度、・・。)それをGoogleMAPに表示させるものです。
それで飽きてしまったので、Raspberrypi+Pythonでカーナビの入力へAV出力でつなげてグラフ表示など画面表示できないかを考えて遊んでます。
これで少し進みそうです。
重ねてありがとうございました。
javaのブログも読まさせていただき、参考にします。
by estima (2013-09-14 19:21)
estima様
youtube拝見しました。実用性の高いものを手掛けていらっしゃるようですね。
開発を進めているbcm_interface(仮称)は、ネット上に類例が見つからなかった(私の調べ方が悪いのかもしれませんが)ので、自分で作ることにしました。共有ライブラリを読み出すことが出来ればJAVA以外の言語でも利用出来るので、公開した暁にはお試し頂ければ幸いです。
(<==人柱募集中です)
by broadbeans (2013-09-15 12:25)