関空に飛行機を撮りにいきました(^ω^)
高校の修学旅行で一度訪れたことがあり今回は8年ぶりです。
さすが国際空港というだけあって色んな国の色んな機体を見る事ができて楽しかったです。
全て展望施設のスカイビューから撮りました。
ここからだとかなり焦点距離の長い望遠レンズ(400mm以上?)を使わないと駐機場やタキシングを大きく撮るのが厳しい気がしました。
手持ちが200mmのズームレンズしかありませんでしたが離陸で頭上を飛んでいく飛行機の写真が撮れました。


















Flucardはカード内のコントロール画像をカメラのプレビュー画面から消去することでWiFiを起動させたり、写真をサーバーにアップロードさせたりします。

出荷状態では↓こんな感じの画像が4つ入ってます。


こういうのは自分でオリジナルのものを使用すると増々楽しくなりそうです(´∀`)
ということで以下のキャラ構成でボーカロイドのコントロール画像をつくってみました。

WiFiサーバー起動・・・ミク
写真アップロード・・・ルカ
Flucardから写真を受信・・・リン
      〃   送信・・・レン

画像はモアイ部様から拝借して加工しました<(_ _)>

手持ちのカメラ(Nikon D7000とCASIO EXILIM EX-Z1200)で試したところうまくいきました。













2012/04/27
吹き出し内のコメントを(柔らかい表現に?)変更しました。





英語バージョン追加しました。



ダウンロード
ボーカロイドコントロールピクチャ
Vocaloid control pictures for English

Flucardのルートフォルダにコピーして電源を入れ、しばらく待つとインストールされます。

カスタムのコントロールピクチャをFlucardに入れるのは危険を伴うので必ず自己責任でお願いします。
autorun.shスクリプトでのコピー方法も考えてみましたがうまくいかない場合があるのでtelnetやsshでログインしてLinuxコマンドでコピー操作が行える方のみ対象です。

やり方としてはコントロールピクチャをSDカードの自分のわかる場所に置いておき、
/mnt/mtd/config/にコントロールピクチャをコピーすればOKです。
あと最後は必ずsyncコマンドを実行してください!!
これを忘れて電源を切ると変な画像ができてしまったり、最悪コントロールピクチャが現れません。


☆4月26日更新☆
JUNさんがコントロールピクチャのインストールスクリプトを書いてくださいました<(_ _)>
http://junichi.dyndns.org/phpBB3/viewtopic.php?f=12&t=1090


カスタムのコントロールピクチャをつくる
普通にパソコンでつくったJPEG画像をFlucardに入れてデジカメで表示させてみてもうまくいきません。
調べてみるとJPEGの量子化テーブルがパソコンとカメラでは違うことがわかりました。
FlucardのサイトにあるNikon用のコントロール画像からこの量子化テーブルを失敬してエンコードしたところデジカメでうまく表示されました。

パソコンでつくった画像をデジカメ上で表示できる画像に変換するスクリプト書きました。
入力画像は任意のサイズのものを出力できるよう変更しました。
(Dai ISHIJIMA氏のppmtocamediaソースを参考させていただきました<(_ _)>)
ppm2dcim

スクリプト実行に必要なものはUNIX環境、perl、libjpeg、netpbmです。

・JPEGイメージを書き出す方法
djpeg src_img.jpg | ppm2dcim > dst_img.jpg

・1024x768にリサイズして書き出す方法
djpeg src_img.jpg | pnmscale -width 1024 -height 768 | ppm2dcim > dst_img.jpg


書き出した画像は以下の名前に変更してコピーしてください。
WiFiサーバー起動・・・config.JPG
写真アップロード・・・upload.JPG
Flucardから写真を受信・・・receiver_control.JPG
      〃   送信・・・sender_control.JPG

Flucardを先々月購入して中身をいろいろと調べてみたらARMでLinuxを動かしてることがわかりました。
本来とはちょっと違った使い方なので真似される方は自己責任でお願いします<(_ _)>


・telnetでログイン
なんとflucardのWiFiアクセスポイントに接続してtelnetでログインできちゃいます。
ただしファームウェアヴァージョンが新しいものはtelnetが無効にされているみたいなので試される方はダウングレードしてみてください。
ver3.58でtelnetdが起動しているのを確認しました。

ターミナルから
telnet 192.168.1.1または
telnet flu.card
でログイン。

ご覧のとおりLinuxで動いています。

CPUはARM9で5TEJというアーキテクチャのものが使われているようです。
#cat /proc/cpuinfo
Processor    : ARM926EJ-S rev 5 (v5l)
BogoMIPS    : 200.29
Features    : swp half fastmult edsp java
CPU implementer    : 0x41
CPU architecture: 5TEJ
CPU variant    : 0x0
CPU part    : 0x926
CPU revision    : 5

Hardware    : KeyASIC Ka2000 EVM
Revision    : 0000
Serial        : 0000000000000000


・Flucardで自作プログラムをコンパイルしてみる
CPUアーキテクチャが分かったら自作のプログラムをコンパイルして動かしてみたい衝動に駆られますよね(^_^;A

まずはコンパイラの入手&インストール。
ARM用のgccコンパイラで商用のSourcery CodeBenchというものがあります。
無料で使えるLite Editionでも十分なのでこれを使います。
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
のARM processorsの欄にあるDownload the GNU/Linux Releaseをクリックします。
するとメールアドレスとパスワードを入力する画面がでるので適宜入力してGet Lite!をクリック。
入力したメールアドレスにダウンロード先のアドレスが送られてくるのでそれをクリック。
一番上にある最新のDownload Sourcery CodeBench Lite 2011.09-70をクリック。
適宜使ってるOSに合わせて一覧からダウンロード。
ダ ウンロードしてインストールしたらarm-none-linux-gbueabi-xxxといった開発に必要なコマンドが一式出来上がるので実行パスを通 しておく。(他は知りませんがLinuxの場合は自動でパスを通してくれました。ログインしなおすと適用されてます。)

お決まりのHello Worldを表示してみる。

#include <stdio.h>
int main()
{
   printf("Hello World!!\n");
   return 0;
}
↑これをエディタでhello_world.cと保存して
arm-none-linux-gnueabi-gcc -static -o hello_world hello_world.c
と打ち込んでコンパイルします。
よくわかりませんが-staticオプションを付けないとダイナミックリンクになってしまい、実行時にライブラリを要求してしまいエラーになるので必ずスタティックでビルドします。
バイナリが出来上がったらFlucardにアップロードするかFlucardにコピーします。

・Webページからアップロードする場合

アップロードしたファイルはFlucard内の/DCIM/122_TREKというフォルダに保存されます。

・Flucardにカードリーダー等からコピーする場合
/DCIM/122_TREKというフォルダにhello_worldをコピーするだけです。

実行するにはtelnetでログインして
telnet 192.168.1.1
cd /mnt/sd/DCIM/122_TREK
./hello_world
とするとHello World!!が表示されれば成功です。

コンパイルしたhello_world実行バイナリはスタティックビルドのためかHello World!!と表示するだけなのに640KB以上もあります。
stripしても500KBくらいなのでSDカードにコピーしておいて実行パスにシンボリックリンクしたほうが良いです。
/mnt/mtdにマウントされているNORフラッシュメモリは1MBで残りが7割ほど空いてますがここに保存するのは危険です。
WiFiアクセスポイントのコンフィグファイルがあるのでここを弄るのはできるだけ避けましょう。

・パスの通った場所に自作プログラムをシンボリックリンクを張る場合
ln -s /mnt/sd/DCIM/122_TREK/hello_world /usr/bin/hello_world
↑こうするとどこからでもhello_worldを実行できます。

しかし、ルートシステムは書き換え不可の領域にマウントされているようで電源を切ってしまったらせっかく張ったシンボリックリンクが消えてしまいます。
そこでFlucardをアップデートする時に実行されるautorun.shスクリプトにリンク情報を書いておき、いつ起動してもリンクが切れないようにしておくという回避策をとりました。

↓autorun.shの中身
#!/bin/sh
ln -s /mnt/sd/DCIM/122_TREK/hello_world /usr/bin/hello_world
sleep 1

これをFlucardのルートに置いておき消さないようにしておけばいつ起動してもリンク状態は保ったままを維持することができます。

・CGI経由で自作プログラムを実行してみる
FlucardのLinuxシステム内の/www/cgi-binはCGIプログラムを実行するバイナリが置かれている場所です。
ここに自分で作ったプログラムをリンクすればインタラクティブで面白いことができそうです。
今度はCGI経由でブラウザにHello World!!を表示するプログラムを作ってみます。

#inlude <stdio.h>
int main()
{
   printf("content-type: text/html\n\n");
   printf("<html><body>\n");
   printf("Hello World!!\n");
   printf("</body></html>\n");
   return 0;
}
↑さっきのhello_world.cを改造してヘッダとHTMLタグを埋め込みます。
arm-none-linux-gnueabi-gcc -static -o hello_world hello_world.c

さっきと同じように122_TREKフォルダにhello_worldをコピーしておきます。
今度はこれを
ln -s /mnt/sd/DCIM/122_TREK/hello_world /www/cgi-bin/hello_world
として/www/cgi-bin/内にシンボリックリンクを張ります。

そしてブラウザからflu.card/cgi-bin/hello_worldにアクセスすると

CGI経由でブラウザからHello World!!を表示することができました。


Un-CGIをつかってスクリプトで書いて見る
Hello World!!が表示できたのでPOSTメソッドのフォームを使ったCGIプログラムができればもっと面白いものができそうです。
しかしブラウザからPOSTメソッドで入力されたデータをC言語で取り出すのはちょっとややこしいので
(perlやphpであれば文字列操作に強力なのですが..)
ややこしい部分を一手に引き受けてくれるUn-CGIをFlucard向けにコンパイルしてみました。
以下の例は入力フォームに名前と年齢とコメントを入力してCGIスクリプトでHTMLに書き出すものです。

入力フォーム(form.html)のソース
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>コメント入力</title>
</head>
<body>
<form method=POST action="cgi-bin/uncgi/myscript">
あなたのお名前
<input type=text size=30 name=name>
<p>
年齢<br>
<select name=age multiple>
<option> 0~20歳未満
<option> 20~50歳未満
<option> 50歳以上
</select>
<p>
コメント
<br>
<textarea name=_comments rows=10 cols=60></textarea><br>
<p>
<input type=submit value="送信する">
</form>
</body>
</html>


CGIスクリプト(myscript)
#!/bin/sh
echo 'Content-type: text/html; charset=UTF-8'
echo ''
echo '<html>'
echo '<head>'
echo '<title>コメント</title>'
echo '<meta http-equiv="content-type" content="text/html; charset=UTF-8">'
echo '</head>'
echo "$WWW_name さん (年齢:$WWW_age)からのコメントです。"
echo '<br>'
echo "$WWW_comments"
echo '</body></html>'




Un-CGIのおかげでbashスクリプトでこんなに簡単にインタラクティブなWebが作れました。
Un-CGIはフォームの各パーツの名前を$WWW_hogeといった形式の変数でCGIに渡してくれます。


以上でいままでやったことをまとめてみました。
私にはセンスがないのでFlucardで何か面白いものを作ってくださる方がいればいいなと思って書きました。(他力本願w)


Flucardのコントロールピクチャも変更できるよ!(詳しくは画像をクリック)



☆2012/4/20更新☆
・rubyのsocket.soが生成されてなかったためsocketライブラリが使用できない不具合を解消しました。

deploy_20120420.zip


☆2012/4/11更新☆

osakanataroさんが
autorun.shの動作をDCIM/122_TREK/fluconfig.txtの内容を編集することで変えられるスクリプトを書いてくださいました<(_ _)>

http://blog.osakana.net/sw/flucard/flucard-autorun-20120411.zip


☆2012/4/10更新☆
・rubyが動くようになりました。

deploy_20120410.zip

ファームウェアヴァージョンが新しいもの(3.62以上?)はtelnetd機能が無効化されているようなので以下のコマンドをautorun.shに追加しました。
killall telnetd
sleep 1

mount -t devpts /dev/pts
/mnt/sd/DCIM/122_TREK/busybox telnetd -l /bin/sh &
sleep 1

しかしtelnetログインすると当方の環境ではログイン直後にコネクションが落ちてしまいました。
調べてみると、
 __getpagesize: Assertion `_rtld_global_ro._dl_pagesize != 0' failed.
という謎のメッセージが・・・。
とりあえずsshログインはできるようです。


☆2012/4/9更新☆
・perlが動くようになりました。

・dropbearによるsshログインができるようになりました。(scp, sftpも使えます。)
ssh 192.168.1.1
password
でログインできます。
autorun.shのdropbear -A -N root -C admin -U 0 -G 0でsshdを起動しています。
パスワードは-Cオプションのadminを書き換えると変更できます。

また、公開鍵暗号を使ってパスワードなしで認証ログインすることもできます。
-クライアント側で公開鍵を作りFlucardに転送-
ssh-keygen -t rsa -f ~/.ssh
scp ~/.ssh/id_rsa.pub 192.168.1.1:/etc/dropbear/authorized_keys

-Flucard側の操作-
killall dropbear
dropbear -A -N root -C '-' -U 0 -G 0 -R /etc/dropbear/authorized_keys -s

-認証ログイン-
ssh 192.168.1.1 または
ssh -i ~/.ssh/id_rsa 192.168.1.1

deploy_20120409.zip



☆2012/4/6更新☆
・フル機能のbusyboxをコンパイルして載せました。
122_TREK/busyboxから適当に追加したいコマンドを引き出してください。

・実行バイナリの動的リンクに対応しました。
自作バイナリをstaticでコンパイルしなくても動くようになります。
122_TREK/lib内にあるシェアードライブラリをFlucardの/libにシンボリックリンクしています。
↓動的リンクでコンパイルしたバイナリの依存ライブラリの確認方法
arm-none-linux-gnueabi-readelf -a hoge | grep NEEDED

・PHPが使えるようになりました。
122_TREK/etc/php.ini           phpコンフィグファイル
122_TREK/www/php/info.php        phpのinfo()
122_TREK/www/php/exif_thumbnail.php  JPEGのEXIFサムネイル表示テスト

・FTPが常時使えるようになりました。
put/getできます。

deploy_20120406.zip


タカラトミーのおかしなグレフルチューチュー買ってみました(^ω^)

パッケージの女の子可愛い (*´∪`*a゙



↑中に入ってたもの。
替え刃(大)が付いています。出荷状態では本体に小がついていました。(写真は大に付け替えたものです。)
グレープフルーツの直径8.5センチ未満は小でそれ以上だと大が良いそうです。



分解してみた。最初ちょっと戸惑ったけど馴れたらすぐに分解できる。



ではさっそくグレープフルーツを準備。



ヘタ取りでグリグリと根元まで刺しちゃいます。これは結構力がいるので小さい子供にはちょっと大変かも。



ヘタ取りの柄が二股になってるのでヘタを挟んでひっこぬく。



取れた(^ω^)



そしてヒゲオヤジ装着シャキ━━ヾ(`・ω・´)ノ━━ン
かわいいwwwしかしこのオヤジノリノリである。



そしてひたすらグルグル回す。するとヒゲオヤジの帽子のてっぺんの白いポッチがどんどんさがってきます。



ぐるぐる回し続けて100回目に達するとてっぺんのポッチが元通りツライチになるのでこれでかき混ぜ完了。



ヒゲオヤジをひっこぬいて中をのぞいてみると見事ジュースになってます!



ストローさしてグレフルチューチュー(^з^)-☆
美味しかったです!!これは正真正銘の100%グレープジュースです!!
思ったよりサラサラのジュースがいっぱい出来てて驚きました。

これはすっごく簡単なのでオススメです(^ω^)


以前よりマイコン液晶で使うフォントを美しく表示してみたかったのでアンチエイリアスについて調べてみました。

S2GPうにフォント
48ピクセルのフォントを4x4でオーバーサンプリングして12ピクセルで表示しています。

去年マイコンにFreeTypeというフォント表示ライブラリを移植しました。
どうしてもTTFやOTFといったアウトラインフォントをマイコン液晶で表示してみたかったのです。
ところがSTM32規模のマイコンには重い処理であったり、大量のメモリを消費するので外付けのSRAMを増設しないといけないものでした。この規模だとやはりビットマップでないと厳しいものがあります。

しかしネットで手に入るマイコン液晶に適したビットマップフォントはそれほど種類が多いわけではなく選択肢が限られてくるので自分でTrueTypeやOpenTypeのフォントをビットマップ形式のものに変換できたらいいなと思っていました。
ありがたいことにそういったツールがありました。

OpenType to BDF Converter(otf2bdf)
http://sofia.nmsu.edu/~mleisher/Software/otf2bdf/
↑TrueTypeやOpenTypeフォントをBDF形式に変換するツール

bdftopcf
http://xjman.dsl.gr.jp/man/man1/bdftopcf.1x.html
http://sourceforge.jp/projects/sfnet_mywolfe/downloads/trunk/bdftopcf-1.0.3.tar.bz2/
↑BDF形式をPCF形式に変換するツール

手順としては、
TTFまたはOTFフォントをotf2bdfを使って一度UnicodeのBDFに変換し、
bdftopcfでBDFからPCFを書き出す。

BDF形式はASCII文字列で構成されているためマイコンで読むには少し不都合なのでバイナリ形式のPCFを使うことにしました。

X11のPCFビットマップフォントファイルのフォーマット
http://fontforge.sourceforge.net/ja/pcf-format.html
↑PCFファイルの読込みはこちらのページが参考になりました。

無事PCFファイルが読み込めるようになったので本題のアンチエイリアスについて。

アンチエイリアスが簡単にできる方法はないかなぁ?と思いぐぐってみるとオーバーサンプリング法というものをみつけました。

どんなものかというとビットマップデータを4x4ピクセルとか8x8ピクセルのサブピクセルで分割し、その中に入っているドットの数で色に濃淡をつけるというものです。

上の画像の例だと8x8のサブピクセルに赤枠で囲まれた部分のドット数を数えてその枠一個分の濃淡レベルを割り出します。(例 9ドットあったら濃淡レベルは9/64)
元のビットマップデータが48x48ピクセルならばこれを上下左右36回サンプリングを繰り返し、それぞれの枠の濃淡レベルから色をつけると縮小されて6x6ピクセルのアンチエイリアスがかかったデータができあがります。
この方法は元のビットマップデータを縮小することで効果を得るため、実際に表示したい大きさより数倍のビットマップフォントを用意します。

下の画像は実際にLCDに描画したものをマイコンからXMODEMで転送して拡大したものです。
LCDはQVGAでRGB565の16ビット色表現です。




元のフォントのビットマップサイズは48x48で、一度内蔵RAMの2次元配列に展開して4x4のサブピクセルでオーバーサンプリングしました。
なので濃淡色は16階調で文字の大きさは12pxです。
結果うまくアンチエイリアスがかかっているようです(^ω^)


いくつかのフォントを表示してみた↓




Osakaフォント



T1号



高速道路ゴシックJA



あくびん

手書き文字がかわいいです(*´ω`*)
なかなか綺麗にアンチエイリアスがかかったのと思ったり高速で描画できたのでどんどん使っていきたいとおもいます(`・ω・´)ゞ

ファイラ画面と音楽再生画面にもつかってみた♪

ひま字



S2G 殴り書き