年末年始と、久々に電子ネタやろうと思って、ネットサーフィンしてたんですが、
RPi1114FDH Raspberry Pi 電源制御モジュール
が面白いな、って思ったので、購入して手持ちのRaspberry pi につけて遊んでいたんですが、苦労させられたので、備忘録としてメモしておきます。
これは、「Raspberry Pi電源制御」というお題目のモジュールなので、Raspberry Pi のためのものという感じもしますが、私にとっては、Raspberry Pi にのっけられるマイコンモジュールと思って買ってみました。
Raspberry Pi の上に載せられる大きさの小さな基板には、lpc1114という結構高機能だけど、ミニマルなマイコンが搭載されていて、Raspberry Piからコマンド一発でプログラムを書き込み出来るし、i2c が接続されているし、シリアルも接続されているし、LEDもついている、ということで、まさにRaspberry Pi が母艦のarduinoみたいな使い方ができる評価ボードと思います。
lpc1114 をプログラミングするには、mbed がとっても手っ取り早い、ということで早速、モジュールの添付プログラムをダウンロードしてきて、コンパイルと、lpc1114に書き込みができることを確かめたのち、i2cを使ったRaspberry Pi(RPi)との通信を実験してみると、RPi からlpc1114へのマルチバイト送信はできるのだけど、lpc1114からRPi へのマルチバイト送信がどうやってもできない。サポートサイトには、デジタルポートの読み込みができる例が記載されているけど、できないし。一体どうやって実行したんだろ?って感じです。
これは、lpc1114 mbed 側のi2cサポートと、RPi側のi2cサポートの内容のミスマッチでできないって感じ。少なくともPython,やシェルコマンドでは回避法が見つからない。丸1日程度Webを調べまくったけどダメなので、とりあえずあきらめ?
下記は、2方向の通信に使えるPythonやmbed プログラムの書き方まとめ。
1. slave (mbed) -> master (raspberry pi)方向
slave: write(buf,number_of_bytes)
master: read_byte(addr)
slaveからの2byte 目以降の読み出しはできない(master が読み出しをしないので)
2byte 以上読み込みの場合は, raspberry pi 側でread_word_data()などでできそうな気がするが、その場合は、mbed側で一度Write Addressed が立って、そっちの処理をした後にRead Addressed がかかるにも関わらずmbed側がRPi 側が期待したような形でデータを送りかえさないので、failしちゃう。
2. master (raspberry pi) -> slave (mbed) 方向
master: write_block_data(addr,cmd,array of bytes)
slave: read(buf,number_of_max_bytes)で読める。
3. その他
また、書き込み、読み出しのコマンドの間はRPi 側で少し時間をあける(0.035sec程度?)必要がある。これより短いインターバルだと、IOErrorが出た。mbed slave側は、とにかくstateを見て、レスポンスするようなプログラムを書く。
チラシの裏状態だけど、解決してないからしょうがない。
1バイトの読み出しはできるので、プログラムが書けないことはないけど、非同期シリアルで通信した方が楽かも。うーん。
ロジアナで波形を観察したり、他のi2cデバイスをRPiにつないで動作を確認したところ、どうも主な問題はmbed slave側にあるような気がするので、1/3 朝起きた後、lpc1114のドキュメントをみていろいろ試してみたけど、あまり進歩せず。mbed のクラスライブラリを使うやり方では打開は無理っぽくて、lpc1114のi2cコントローラーを直接いじるプログラムに変えれば打開できるかもしれないけど、ちょっと荷が重い。