SyntaxHighlighter

---SyntaxHighlighter ウィジェット---

2014年8月8日金曜日

PerlからRasPiのIOを叩く。

PerlからIOをプルアップ付きで操作したいと思ったら嵌ったの巻。

まず、特殊ファイルでのIOを使ってみるも、内臓プルアップができない。

注意:directionにhighを書き込むとプルアップという噂がありますが、
      どうみてもただの出力です。
80Ωとか、それプルアップじゃなくて単なる
      出力の内部抵抗です。電流オーバーしてますよね絶対。

      catでdirectionを読み出すとおもいっきりoutになってますし。壊れなくてよかった。

便利そうだしとWiringPi-Perlを入れようとするも、エラーだらけで萎えた。
使いものにならない。

結局、BCM2835関係を入れることに。
http://sai-lab.ddns.net/diary/10053.html

ここにしたがって、ドライバをダウンロードし、RasPiに転送し、
手順にしたがってmake等々行い
http://www.airspayce.com/mikem/bcm2835/

CPANでinstall Device::BCM2835して

OK。今までの苦労は何だったんだ。
LチカOK。

ところがどっこい。プルアップで地獄を見ることに。

資料が少ない。まぁ、ないというほど無くはない。
http://search.cpan.org/~mikem/Device-BCM2835-1.4/lib/Device/BCM2835.pm

プルアップについてはここ。
http://www.myu.ac.jp/~xkozima/lab/raspTutorial3.html

http://blog.e-photographer.net/?p=718&lang=ja

www.airspayce.com/mikem/bcm2835/group__gpio.html

どうもプルアップを有効にするために、クロックを一時的に供給する必要があるらしい。
イネーブル信号的な意味があるとか。よくわかりません。

原理的にはこうらしい。多分、レジスタにラッチさせるんだろうなぁ。
クロックって言うより本当にイネーブルなんだろう。
Device::BCM2835::gpio_pud(&Device::BCM2835::BCM2835_GPIO_PUD_UP); #クロック供給を開始
Device::BCM2835::delayMicroseconds(20); #クロック適用前ウェイト
Device::BCM2835::gpio_pudclk(&Device::BCM2835::RPI_GPIO_P1_11, 1);#プルアップクロック掛ける
Device::BCM2835::delayMicroseconds(20); #クロック適用後ウェイト
Device::BCM2835::gpio_pudclk(&Device::BCM2835::RPI_GPIO_P1_11, 0);#プルアップクロック止める
Device::BCM2835::delayMicroseconds(20); #クロック適用前ウェイト
Device::BCM2835::gpio_pud(&Device::BCM2835::BCM2835_GPIO_PUD_OFF); #クロック供給を開始
#Device::BCM2835::gpio_set_pud(&Device::BCM2835::RPI_GPIO_P1_11, &Device::BCM2835::BCM2835_GPIO_PUD_OFF); #戻す
Device::BCM2835::gpio_pud(&Device::BCM2835::BCM2835_GPIO_PUD_OFF); #クロック供給を停止

で、2時間悩んだ結果、プルアップが適用されない原因がわかりました。
というより、適用されるはずがなかった。

ピン番号の読み方を間違えていたのだから。

ここでの指定 RPI_GPIO_P1_11 なんかは、左上を1pとして、純粋なピン数を数えるものでした。
つまり、なんか出回ってるGPIOの番号一覧とか、BCMの番号一覧とかは全く関係なく

しかも、プルアップしてないときはなんとなく取得(ノイズで?)できてたので、さらに混乱してました。

そりゃ、プルアップに設定してテスター当てても電圧でないわけだ。
なんでこのポート存在するはずなのに定数にないのかなぁ、とか思ってたけど。

ハァ

てなわけで今日のソース。



0 件のコメント:

コメントを投稿