なんちゃってシリアル通信ができないか検討するなかで、
はたしてGPIOの速度はどのくらいなのかを調べたくなった。
まずは、ralinkのgpioコマンドの最小単位である100ms周期の点灯を
確認してみる。
ほとんど誤差なく100msだった。
すごいね。RT3050Fがすごいのか、使ったオシロの性能がアレなのか・・・。
次に、gpioコマンドでon-offを繰り返してみた。
うわー。遅い。遅すぎる。。。
780msって、これでデータを送ろうと思ったら、日が暮れてしまう。
なにか違う方法を考えなければ。
例えば、コンソール用のシリアル通信をなんとか使えないか考えよう。
と少し現実逃避して、久しぶりにPICマイコンで液晶表示をやってみた。
2015年2月22日日曜日
2015年2月16日月曜日
FON2405EのGPIOを使ってPICマイコンを操作する
少しづつ組み込みLinuxに慣れてきているような気がするけど、
まだまだやりたいことはある。
FONじゃないけど同じRT3050FのボードでUSBがあるものを使えるようにするとか。
一度にいろいろなことはできなので、少しづつ続けていこう。
土日で試したのは、
・OpwnWrtのビルド どうやって自分のボード用のファームを作成するのか
手順どおりにやると、欲しくもない違うボード用のファームが
たくさんできる・・・。1つでいいのよ。
・FON2405Eの追加書き換え 2台やって計3台 わーい!
・PICマイコンとの連携 GPIOを駆使してPICマイコンに接続
FONのGPIOのうち容易に取り出せるのは、
LED(GPIO11,12,14)そして、ボタン(GPIO10)の計4本
これだけあれば、なんちゃってシリアル通信ができそう。
そのための布石として、前にiModelaで基板から作った
7セグ表示マイコンを実験台にした。
http://continue-to-challenge.blogspot.jp/2014/12/imodelaeagle_13.html
そして、暫定で、
GPIO14 - RB4 カウントアップ・ダウン
GPIO11 - RB1 カウントスタート・ストップ
のように接続(したと思う)
操作系はこの前のWEBから〜を少し変えた。
FONは3.3VでPICは5Vで動かしているので、
FON→PICは大丈夫そうだけど、逆は配慮が必要。
今回は、FON→PICのみ
動かしているところはこんな感じ
まだまだやりたいことはある。
FONじゃないけど同じRT3050FのボードでUSBがあるものを使えるようにするとか。
一度にいろいろなことはできなので、少しづつ続けていこう。
土日で試したのは、
・OpwnWrtのビルド どうやって自分のボード用のファームを作成するのか
手順どおりにやると、欲しくもない違うボード用のファームが
たくさんできる・・・。1つでいいのよ。
・FON2405Eの追加書き換え 2台やって計3台 わーい!
・PICマイコンとの連携 GPIOを駆使してPICマイコンに接続
FONのGPIOのうち容易に取り出せるのは、
LED(GPIO11,12,14)そして、ボタン(GPIO10)の計4本
これだけあれば、なんちゃってシリアル通信ができそう。
そのための布石として、前にiModelaで基板から作った
7セグ表示マイコンを実験台にした。
http://continue-to-challenge.blogspot.jp/2014/12/imodelaeagle_13.html
そして、暫定で、
GPIO14 - RB4 カウントアップ・ダウン
GPIO11 - RB1 カウントスタート・ストップ
のように接続(したと思う)
操作系はこの前のWEBから〜を少し変えた。
FON→PICは大丈夫そうだけど、逆は配慮が必要。
今回は、FON→PICのみ
動かしているところはこんな感じ
2015年2月9日月曜日
FON2405EのLEDをWEBから制御する
やってみたかったことの1つ
web操作でFONのGPIOを制御すること。
ようやくできた。
制御方法はちょっとうさんくさいけど
Lighttpd+CGIで、gpioコマンドを叩いているだけ。。。
PHPとかPerlとかインストールしたいと思ったけど、
なにやらクロスコンパイルで挫折気味だったので、
CGIとしてシェルスクリプト(この場合何シェルっていうんだろう?bash?)を
持ちることにした。
Lighttpd.confに以下を追加・変更して
server.modules
= (
"mod_access",
"mod_cgi"
)
index-file.names
+= (
"index.xhtml",
"index.html", "index.htm", "default.htm",
"index.php","index.cgi"
)
cgi.assign
= (
".cgi"
=> ""
)
メインコンテンツとしてtest.cgiを作成する
#!/bin/sh
echo
"Content-type: text/html"
echo
NET_LED="OFF"
LAN_LED="OFF"
WPS_LED="OFF"
NET_LED=`echo
"$QUERY_STRING" | sed -n 's/^.*netled=\([^&]*\).*$/\1/p'
| sed "s/%20/ /g"`
LAN_LED=`echo
"$QUERY_STRING" | sed -n 's/^.*lanled=\([^&]*\).*$/\1/p'
| sed "s/%20/ /g"`
WPS_LED=`echo
"$QUERY_STRING" | sed -n 's/^.*wpsled=\([^&]*\).*$/\1/p'
| sed "s/%20/ /g"`
#
gpioname NET,LAN,WPS
#
mode off,on,fastbrink,slowbrink
echo
"<html><head><title>FON2405eのGPIOをWEBから操作する</title></head>"
echo
"<body>"
echo
"<h1>GPIOの制御(LEDの点消灯)</h1>"
echo
"<form method='get' action='test.cgi'>"
NET_LED_ON=""
NET_LED_FASTBRINK=""
NET_LED_SLOWBRINK=""
NET_LED_OFF=""
if
[ "$NET_LED" = "ON" ]; then
NET_LED_ON="checked"
gpio
l 12 0 1 0 0 0
elif
[ "$NET_LED" = "FASTBRINK" ]; then
NET_LED_FASTBRINK="checked"
gpio
l 12 1 1 4000 0 4000
elif
[ "$NET_LED" = "SLOWBRINK" ]; then
NET_LED_SLOWBRINK="checked"
gpio
l 12 5 5 4000 0 4000
else
NET_LED_OFF="checked"
gpio
l 12 1 0 0 0 0
fi
echo
"<p>NET-LED"
echo
"<input type='radio' name='netled' value='ON' $NET_LED_ON
>ON"
echo
"<input type='radio' name='netled' value='SLOWBRINK'
$NET_LED_SLOWBRINK >SlowBrink"
echo
"<input type='radio' name='netled' value='FASTBRINK'
$NET_LED_FASTBRINK >FastBrink"
echo
"<input type='radio' name='netled' value='OFF' $NET_LED_OFF
>OFF"
echo
"</p>"
LAN_LED_ON=""
LAN_LED_FASTBRINK=""
LAN_LED_SLOWBRINK=""
LAN_LED_OFF=""
if
[ "$LAN_LED" = "ON" ]; then
LAN_LED_ON="checked"
gpio
l 11 1 0 0 0 0
elif
[ "$LAN_LED" = "FASTBRINK" ]; then
LAN_LED_FASTBRINK="checked"
gpio
l 11 1 1 4000 0 4000
elif
[ "$LAN_LED" = "SLOWBRINK" ]; then
LAN_LED_SLOWBRINK="checked"
gpio
l 11 5 5 4000 0 4000
else
LAN_LED_OFF="checked"
gpio
l 11 0 1 0 0 0
fi
echo
"<p>LAN-LED"
echo
"<input type='radio' name='lanled' value='ON' $LAN_LED_ON
>ON"
echo
"<input type='radio' name='lanled' value='SLOWBRINK'
$LAN_LED_SLOWBRINK >SlowBrink"
echo
"<input type='radio' name='lanled' value='FASTBRINK'
$LAN_LED_FASTBRINK >FastBrink"
echo
"<input type='radio' name='lanled' value='OFF' $LAN_LED_OFF
>OFF"
echo
"</p>"
WPS_LED_ON=""
WPS_LED_FASTBRINK=""
WPS_LED_SLOWBRINK=""
WPS_LED_OFF=""
if
[ "$WPS_LED" = "ON" ]; then
WPS_LED_ON="checked"
gpio
l 14 1 0 0 0 0
elif
[ "$WPS_LED" = "FASTBRINK" ]; then
WPS_LED_FASTBRINK="checked"
gpio
l 14 1 1 4000 0 4000
elif
[ "$WPS_LED" = "SLOWBRINK" ]; then
WPS_LED_SLOWBRINK="checked"
gpio
l 14 5 5 4000 0 4000
else
WPS_LED_OFF="checked"
gpio
l 14 0 1 0 0 0
fi
echo
"<p>WPS-LED"
echo
"<input type='radio' name='wpsled' value='ON' $WPS_LED_ON
>ON"
echo
"<input type='radio' name='wpsled' value='SLOWBRINK'
$WPS_LED_SLOWBRINK >SlowBrink"
echo
"<input type='radio' name='wpsled' value='FASTBRINK'
$WPS_LED_FASTBRINK >FastBrink"
echo
"<input type='radio' name='wpsled' value='OFF' $WPS_LED_OFF
>OFF"
echo
"</p>"
echo
"<input type='submit' value='変更'>"
echo
"</form>"
echo
"</body></html>"
もうかっこ良くかけないものか。
でもシェルよくわかんないし、cgi作るもは初めてだし。。。
とりあえず、以下を参考にがんばった。
なんとか動くものになった。
2015年2月2日月曜日
FON2405EにLighttpdをインストールする
前回RalinkのSDKを使ってカスタムファームを導入してみた。
今回はいろいろなアプリケーションをインストールしてみようと思う。
その前に、毎回ファームを書き換えるのはめんどくさいので、NFSを使えるようにする
[Linux
Kernel Configuration]→[Networking]→[Networking options
--->]
→[]IP:Kernel level autoconfiguration
[Linux
Kernel Configuration]→[File systems]→[Network File Systems --->]
Provide
NFSv3とかチェック
[BusyBox
Configuration]→[Linux System Utilities]
[]
Support mounting NFS file systems
これで、
mount
-o nolock 10.10.10.3:/var/lib/tftpboot /mnt
とすれば、/mntに無限の可能性が広がるはず!
つぎに、webからGPIO制御したいなーという願望を持ちつつ、
SDKに付属のGOAHEADをさわろうとして、よくわからなくて。。。
Lighttpdをインストールしてみたいと思う。
1.ファームの再構築
pollってのが必要みたい
[Linux
Kernel Configuration]→[General setup]→[Configure standard kernel
feature]→[]Enable eventpoll supportにチェックを入れる
2.Lighttpdのクロスコンパイル
本体はここから取得。以下のようにしてクロスコンパイルを行う。
PATH="$PATH":/opt/buildroot-gcc342/bin
./configure
--host=mipsel-linux CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc
CFLAGS="-I/home/adeno/fongpio/sdk3301/RT288x_SDK/source/linux-2.6.21.x/include"
LDFLAGS="-L/home/adeno/fongpio/sdk3301/RT288x_SDK/source/linux-2.6.21.x/lib"
--without-pcre --without-zlib --without-bzip2 –disable-ipv6
–prefix=/home/adeno/lighttpd
make
make
install
without系のオプションは、configureやmakeしたときにエラーになったものを除くため
(あとで、1つづつ検証していこう)
その結果できたものを
NFSのディレクトリに保存しておく
lighttpd
・lib
・sbin
・share
3.FON側からマウント
mount
-o nolock 10.10.10.3:/var/lib/tftpboot/ /mnt
そして、
mkdir
/usr/local
mkdir
/usr/local/lib
mount
-o nolock 10.10.10.3:/var/lib/tftpboot/lighttpd/lib /usr/local/lib
4.設定ファイルの準備
NFSディレクトリに以下を作成
・data/www/htdocs コンテンツ保存先
・data/www/log ログ保存先
lighttpd.confの作成
以下を参考に
server.event-handler
= "linux-sysepoll" をコメントアウトして
server.event-handler
= "poll" を追加する
あとは適当に・・・やって、/mnt/lighttpd.confに保存。
5.Lighttpd起動!
/mnt/lighttpd/sbin/lightpd
-D -f /mnt/lighttpd.conf
これで、10.10.10.254:4080にアクセスすると
やったー!
次はこの環境の永続化を考えよう。
2015年2月1日日曜日
GW-USMicroNとWLI-UC-GNをラズベリーパイで使う
この前、リサイクルショップで、GW-USMicroNが300円で売られていた。
小さくて可愛いのでついつい買ってしまった。
以前から持っているWLI-UC-GNと同じくらいの大きさ!
この大きさはラズベリー・パイに丁度いいと思い、早速接続ー
結論から書くと、2つとも同じドライバーで使えたのだ。
ベンダーIDとプロダクトIDは以下の通り。
GW-USMicroN は2019 ed14
WLI-UC-GNは0411 015d
一時的に使うのであれば、
恒久的に使うのであれば、
/etc/udev/rules.d/99-wireless.rules
/etc/modprobe.d/wireless.conf
やっぱり、ラズベリー・パイは情報が多くていいね!
小さくて可愛いのでついつい買ってしまった。
以前から持っているWLI-UC-GNと同じくらいの大きさ!
この大きさはラズベリー・パイに丁度いいと思い、早速接続ー
結論から書くと、2つとも同じドライバーで使えたのだ。
ベンダーIDとプロダクトIDは以下の通り。
GW-USMicroN は2019 ed14
WLI-UC-GNは0411 015d
一時的に使うのであれば、
modprobe
rt2800usb
echo
2019 ed14 > /sys/bus/usb/drivers/rt2800usb/new_id
恒久的に使うのであれば、
/etc/udev/rules.d/99-wireless.rules
#
PLANEX GW-USMicroN
ACTION=="add",
SUBSYSTEM=="usb", ATTR{idVendor}=="2019",
ATTR{idProduct}=="ed14", RUN+="/sbin/modprobe -qba
rt2800usb"
#
BUFFALO WLI-UC-GN
ACTION=="add",
SUBSYSTEM=="usb", ATTR{idVendor}=="0411",
ATTR{idProduct}=="015d", RUN+="/sbin/modprobe -qba
rt2800usb"
/etc/modprobe.d/wireless.conf
#
PLANEX GW-USMicroN
install
rt2800usb /sbin/modprobe --ignore-install rt2800usb $CMDLINE_OPTS;
/bin/echo "2019 ed14" >
/sys/bus/usb/drivers/rt2800usb/new_id
#
BUFFALO WLI-UC-GN
install
rt2800usb /sbin/modprobe --ignore-install rt2800usb $CMDLINE_OPTS;
/bin/echo "0411 015d" >
/sys/bus/usb/drivers/rt2800usb/new_id
やっぱり、ラズベリー・パイは情報が多くていいね!
----------------------------
ちなみに、前書いたGPIOの制御、ネットで調べたら使い方が書いてあった。
処理中(0.2s点灯、0.1s消灯を繰り返す)
gpio
l <gpio> 2 1 4000 0 4000
エラー(0.1s点灯、0.1s消灯を繰り返す)
gpio
l <gpio> 1 1 4000 0 4000
ふーん。使えるかも!
登録:
投稿 (Atom)