SyntaxHighlighter

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

2014年8月12日火曜日

新しい無線LANアダプタ

新しい無線LANアダプタが届いた。
【Amazon.co.jp限定】PLANEX 無線LAN子機 (USBアダプター型) 11n/g/b 300Mbps GW-USECO300A (FFP)
http://www.amazon.co.jp/dp/B00ESA34RO/

評判の通り、RasPiには差すだけで動いた。
動いたには動いたのだが、最初不安定すぎてハズレを引いたかと思った。
具体的には、RasPiに建てたhttpにまともに繋がらないのと、pingが100ms台(ロストあり)な
不安定な応答を示していた。

ただし、RasPiからPCに向かってpingを送り続けている間だけ改善する。
PCからルータやアクセスポイントは3ms程度の普通の応答を示す。

少し調べてみると、次の記事が見つかった。

Raspberry Pi Wifi GW-USValue-EZ 安定させる ハードウエアを改造する前に要確認 - ORBIT SPACE
http://www.orsx.net/blog/archives/4932

これを試したところ、状態が劇的に改善して、8ms台(ロストなし)になりました。
どうも、RasPi側からpingを送ると一時的に改善されていたのは、省電力モードが解かれるからとかそういうことだったらしい。

発熱は相変わらずするが、前ほどの酷い発熱ではない。
なにより時間経過で安定性が悪化しない。

2014年8月8日金曜日

発熱アダプタ(無線LAN機能付き)

Logitec 無線LANアダプタ 150Mbps 11n ブラック LAN-W150NU2AB

こいつが使い物にならない。


今までRasPi typeAは、用途がなかったのもあって短時間しか使っていなかったので

気づかなかったが、このアダプタ、通信状態が続くと

異常に発熱して不安定になる。


どうやら、SSH接続が突然不安定になるのも、apt-getに失敗するのも

これだったらしい。


ヒートシンクを貼り付けてみるも、風を当てないことには冷えないし、

いい加減嫌気がさしたので買い換えることにした。


どうやら、小型タイプはどのメーカーも軒並みダメらしいので

諦めてスティックタイプを買うことにした。

届いたら報告しようと思う。

とりあえずのデモ

こんな感じになりました。


やってみると、レスポンスがおもったより悪かったり、無線LANの発熱のヤバさ(というかそれで不安定になる)がわかったり、なんだり。
longPollによる通信量節約はうまくいってるようです。

RasPi型サーバースクリプト完成

ComputerCraft側からスイッチ入力を受け付けるための、ロングポーリングできるHTTPサーバー
とりあえず完成したのでコードを貼る。

おもいっきり自分用なので、再利用は考えていないしコードは汚い。

機能
 GETのみ(HTTP/0.9相当)の実装
 コントロールデモ用のページ (/)
 LEDのON,OFF操作(LED?1 LED?0)
 スイッチの取得(poll1 poll2)
 スイッチのロングポーリング的な取得(longpoll1 longpoll2)
 I2C-LCDへの表示機能 (lcd?message@message)
   →@で改行、URLデコードしていないので空白ダメ。代わりに_でも使っとけばいい。

という手抜き仕様。
しかも、system関数を使っていたり、バッファオーバーフローの危険性がそこかしこにあったり。

メニュー画面はこんな感じ。手抜き。
せめてjavascriptでデモできるようにしたかったけど、今はそこまで手がまわない。

いいんだ、Luaからアクセスするために作ったんだから。
間違っても、ネットに生で繋ぐとかアホなことはしないように。

ちなみに、こんな感じのロマンスイッチが繋がってます。



Lua側のスクリプトはまた今度。

Device::BCM2835

というわけで、自分用GPIOリスト
Perl版Device::BCM2835を使う場合は、この番号になるはず。
GPIOと書かれたところの番号しか、&Device::BCM2835::RPI_GPIO_P1_*で
指定できなくてエラーが出るはずです。

使う人がいる場合、自己責任で。
※I2CポートもGPIOですが、は、個人的に液晶をつないでいるのでなしにしました。

>引用:定数リストの一部 from search.cpan.org
RPI_GPIO_P1_03
RPI_GPIO_P1_05
RPI_GPIO_P1_07
RPI_GPIO_P1_08
RPI_GPIO_P1_10
RPI_GPIO_P1_11
RPI_GPIO_P1_12
RPI_GPIO_P1_13
RPI_GPIO_P1_15
RPI_GPIO_P1_16
RPI_GPIO_P1_18
RPI_GPIO_P1_19
RPI_GPIO_P1_21
RPI_GPIO_P1_22
RPI_GPIO_P1_23
RPI_GPIO_P1_24
RPI_GPIO_P1_26


ついでに使い方もまとめておこう。
なかなか探しても出力の例ばっかで、入力の見つけられなかったし。

PerlでDevice::BCM2835を使う場合。

*宣言
use Device::BCM2835;

*初期化
Device::BCM2835::init() || die "Could not init library";

*入力に設定(input)
Device::BCM2835::gpio_fsel(&Device::BCM2835::RPI_GPIO_P1_26, &Device::BCM2835::BCM2835_GPIO_FSEL_INPT);

*出力に設定(output)
Device::BCM2835::gpio_fsel(&Device::BCM2835::RPI_GPIO_P1_24, &Device::BCM2835::BCM2835_GPIO_FSEL_OUTP);

*プルアップ設定(Internal pullup enable)
Device::BCM2835::gpio_set_pud(&Device::BCM2835::RPI_GPIO_P1_26, &Device::BCM2835::BCM2835_GPIO_PUD_UP);

*プルダウン設定(Internal pulldown enable)
Device::BCM2835::gpio_set_pud(&Device::BCM2835::RPI_GPIO_P1_26, &Device::BCM2835::BCM2835_GPIO_PUD_DOWN);

*プル無効設定(Internal pullup disable)
Device::BCM2835::gpio_set_pud(&Device::BCM2835::RPI_GPIO_P1_26, &Device::BCM2835::BCM2835_GPIO_PUD_OFF);

*HIGH出力
Device::BCM2835::gpio_write(&Device::BCM2835::RPI_GPIO_P1_24, 1);
or
Device::BCM2835::gpio_write(&Device::BCM2835::RPI_GPIO_P1_24, HIGH);

*LOW出力
Device::BCM2835::gpio_write(&Device::BCM2835::RPI_GPIO_P1_24, 0);
or
Device::BCM2835::gpio_write(&Device::BCM2835::RPI_GPIO_P1_24, LOW);

*入力取得
$val = Device::BCM2835::gpio_lev(&Device::BCM2835::RPI_GPIO_P1_23);

*ミリセカント単位のディレイ
Device::BCM2835::delay(100);

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の番号一覧とかは全く関係なく

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

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

ハァ

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



2014年8月7日木曜日

車輪の再発明中

ちょっと特殊な用途で使うHTTPサーバープログラムが必要になったので
perlでソケット通信レベルで組むというちょっとアレなことをしている。

とりあえず、基礎的な通信と、マルチスレッド化まではできた。

特殊な用途というのは、ComputerCraftとRaspberryPiをHTTPで通信させて
LongPollingでリアルのスイッチの状態をMinecraftのレッドストーン回路に反映させようというもの。
LEDの光も同時にコントロールしたいので、マルチスレッドにした。

まだ途中なのと、動作確認も中途半端で、肝心の機能も実装していない。
もちろんのこと、(いないと思うが)使ったり参考にする場合は自己責任でお願いします。



主に参考にさせていただいているのが以下。

PerlでSocket通信 - はちゅにっき
http://hatyuki.hatenablog.jp/entry/20060608/1149771934

perlthrtut - Perl におけるスレッドのチュートリアル - perldoc.jp http://perldoc.jp/docs/perl/5.18.1/perlthrtut.pod