2012年11月11日

Raspberry Pi買ってみました!ネット接続とかOSカーネルビルドとかやってみた〜

僕もとうとう、Raspberry Pi(ラズベリーパイ)という小さくて安価なマイコンボードを買いました!!
このマイコンボード、日本では、RSコンポーネンツのRSオンラインで販売しています。
http://jp.rs-online.com/web/generalDisplay.html?id=raspberrypi

RPi.jpg

ただ、注文してから発送までの日数がかなりかかりました。僕のケースでは3ヶ月くらいかかりました。
特に急ぎではなかったので気長に待てましたが、何か目的があってすぐに欲しい場合、
この期間たたずっと待つのは結構辛いかも、ですね^^;

Raspberry Piは、RS以外にもFarnellという業者でも取り扱っていて、しかもこの業者だとすぐに発送されるという
何だか変な状況なのですが、残念ながらこちらの業者は日本への配送を行なっていないため、購入には手間が掛かりそうなようです。

日本で購入する場合でも、ケース付きであればすぐに発送してくれる業者もあるようで、そういうところで買うのが良いのかもしれませんね。
ご参考 : mobilehackerz 2012/10/25 ■ いつまでも届かないRaspberry Piは一手間かけると10日で新型が手に入る
http://blog.mobilehackerz.jp/2012/10/raspberry-pi10.html


さて、RSから届いたので早速少しいじってみましたので、メモっぽい内容ですが、本記事では、以下のような内容を書き出しています。
・イメージを書き込んでテレビに繋いで操作
・ピンヘッダに出ているUARTからシェル操作
・有線LAN、無線LAN、3G通信ドングルでネットワークに接続
・PC側からRaspberry Piのプログラムをビルドして実行
・Linuxカーネルをリビルドして、置き換える
といったことを実施してみます。

この記事では、Raspberry Piから外部のハードを叩くことは触れていません。Raspberry PiでGPIOとかを叩くあたりは、Interface 2012年12月号に詳しく載っているようでしたので良かったらどーぞー!



●SDカードにイメージを焼きこむ

ブートのイメージが付属していないRaspberry Piを購入していたので、早速手持ちのSDカードにイメージを焼きこみます。
ここからダウンロード出来ます。
http://www.raspberrypi.org/downloads

僕は、Raspberry Pi標準のディストリビューションの内、Raspbian "wheezy"を使用しています。
イメージファイルをダウンロードして、Macからddコマンドで焼きこみました。Linuxでも似たような手順だと思います。但し、of=の指定を誤ると大切なディスクを
消してしまうことになりますので、慎重に確認してから行いましょう。
  $ dd if=イメージファイル名.img of=/dev/diskN bs=1m

●電源を投入してみる

Raspberry PiにはHDMI端子、コンポジットビデオ出力端子が付いています。これをお手持ちのテレビやモニターに接続し、USB microBコネクタに5Vで必要な電流を供給
してやることでアッサリとブートしてくれました。

●シリアル・ポートからログインしてみる

コンソールは、/dev/ttyAMA0に出ています。以下のようにピンヘッダにRxDとTxDが出てますので、USBシリアル変換基板と接続します。
RPi_PINS.png

ボーレートは115200[bps]です。
3.3V系ですので、5V系のArduinoのシリアル変換を直結しないように注意です。
僕はPIC ADK Miniboardという自作基板の古いrevのボードにFTDI FT232RLだけ乗せまして、それを使用しました。
RPi_UART.jpg
秋月のFT232RL基板もオススメです。
http://akizukidenshi.com/catalog/g/gK-01977/
または、スイッチサイエンスのとか。
FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)
スイッチサイエンス
売り上げランキング: 9314

なお回路図上のピンヘッダ部のところはこんなかんじでした。SPIとかI2Cとか使いやすいように配列されているようです。
RPi_PIN_sch.png
あとSSHからのログインも最初から有効になってました。

●ネットワークに接続してみる
それでは、有線、WiFi、3Gでネットワークに接続してみます。

-有線LANを使用

初めからDHCPありの設定になってたので、イーサのケーブルを差し込むだけでネットに繋がりました。簡単〜

-無線LANを使用

無線LANのドングルにはいろいろなメーカーのチップが使用されているので、きちんと対応しているものを選別して使用するか、そうでない場合はデバドラを組み込む必要があります。
僕の場合は、昔PCをWiFi APに見立ててニンテンドーDSを繋ぐ為にバッファローのWLI-UC-GN(Ralink RT3070を使用してる模様)を持ってたので突っ込んだらアッサリ認識しました。

BUFFALO Wi-Fiゲーム対応USBコネクター WLI-UC-GNT
バッファロー (2009-12-26)
売り上げランキング: 9287
従って何も大した設定はしてませんw
WiFiDongle.jpg

RPi_with_WiFi.jpg

●3G通信を使用(USBドングルを使用して)

手持ちのイーモバイルの3G通信のドングルを使用しました。これは21Mbpsに対応したHuaweiのD31HWというものです。オークションとかで安く出てます。
ここにイーモバのポケットルーターで使用しているSIMを突っ込みました。

RPi_3G.jpg
Linuxカーネルの設定は、既にPPPありになっていますので特に、変更する内容はありません。
Huaweiのドングルは、PCに接続するとCD-ROMドライブとして認識し、インストーラーが出てくる便利設計になっているのですが、
Raspberry Piではこのインストーラーは当然不要です。
このドングルをモデムとして使用するためには、まずCD-ROMドライブとして認識している状態で、「とあるデータ列」をエンドポイントに送出し、
CD-ROM状態からモデム状態に遷移させる必要があるようなのですが、usb_modeswitchのドキュメントを見るとカーネルが新しいものでは、
特にモデムに遷移する動作が入っていることがあるそうで、今回もRaspberry Piでは特に特殊なコマンド操作無く、いきなりモデムとしてアクセス出来ました。
参考 : usb_modeswitchのkernel related issues
http://www.draisberghof.de/usb_modeswitch/

このドングルをモデムとして使用するためには、まずCD-ROMドライブとして認識している状態で、「とあるデータ列」をエンドポイントに送出し、
CD-ROM状態からモデム状態に遷移させる必要があるので、usb-modeswitchをセットアップします。

$ sudo apt-get install usb-modeswitch

ここでudevの再チェックをキックするか、Raspberry Piを再起動すると、/dev/ttyUSB*として認識するはずです。
(★2013/5/11修正追加)

PPP接続の設定は、wvdialを使用しました。まずはモジュールのインストールですがapt-getでサクッと行います。
 $ sudo apt-get install wvdial
次に設定ファイルを用意します。
以下のサイトを参考にさせていただきました。感謝!
http://coordinators.blog18.fc2.com/blog-entry-18.html

で、以下のような内容のファイルを/etc/wvdial.confとして保存します。
[Dialer Defaults]
Modem = /dev/ttyUSB0
Baud = 3600000
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2
Init3 =
Area Code =
Phone = *99***1#
Username = em
Password = em
Ask Password = 0
Dial Command = ATDT
Stupid Mode = 1
Compuserve = 0
Force Address =
Idle Seconds = 0
DialMessage1 =
DialMessage2 =
ISDN = 0
Auto DNS = 1
で、
 $ sudo wvdial &
とすれば3G回線にマイコンボードから繋がってくれました。


●テスト的にコード(ユーザー空間で実行するプロセス)をクロス環境でビルドしてみる
Raspberry Piのディストリビューションにはコンパイラ等も搭載していますが、PCのパフォーマンスを活かしてビルドしたいところです。
ここでは定番のSourcery g++ liteを使用しました。
以下のページから、ARM processor向けのGNU/Linux releaseを選択します。メールアドレスを入れるとすぐにダウンロードリンクが
入ったメールが届きますので、セットアップしてみて下さい。僕はUbuntuの64ビット版に入れてます。
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
こんなのを書いて、
// test.c
#include <stdio.h>

int main(void)
{
    printf("Hello,Raspberry-pi World\n");
}
 $ arm-none-gnueabi-gcc test.c -o test
などとすればRaspberry PiのLinux上で動くプロセスを生成してくれました。
その他いろいろビルドしてオープンソースのモジュールを導入してみたいと思います。後ほど。。

●Linuxカーネルをダウンロードし、ビルドして起動する

カーネルはgithubのraspberrypiに上がっているものを使用してみました。
https://github.com/raspberrypi/linux
まずはツールチェインのセットアップですが、上記の「テスト的にコード(ユーザー空間で実行するプロセス)をクロス環境でビルドしてみる」でセットアップしたGNU/Linux用のARM EABIの
ものをそのまま使用します。

0.PC側に必要なツールをセットアップ(初回だけ)
 $ apt-get install git gcc-arm-linux-gnueabi make ncurses-dev
1.ソースを入手
 $ git clone https://github.com/raspberrypi/linux.git
2.設定ファイルを整備
 $ cd linux
 $ cp arch/arm/configs/bcmrpi_cutdown_defconfig .config
 $
 $ make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
もしカーネルの設定変更したい場合、
 $ make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- menuconfig

3.ビルド
以下の-j8の8は環境に合わせて下さい。
 $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -k -j8
4.モジュールの書き出し
/tmp/modulesを一時書き出し先に使用しています。
 $ mkdir /tmp/modules
 $ make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
5.SDカードに書き出し
Raspbian "wheezy"を書き出したSDカードをLinuxのPCに接続しますと、2つのパーティションが見えます。
一つはブート用パーティションで、もう一つはルートファイル・システムです。
ブート用は2012/10/28にダウンロードした
イメージの場合、58メガバイトでした。なので大抵の場合、小さいパーティションがブート、もう一方がルートファイル・システム
になるのかなと思われます。

ではまず、ブート側パーティションにOSカーネルを入れます。
ここでは、githubから取り出し、ビルド後のLinuxカーネルツリーが./linuxに、そしてSDカードのブート側が/media/sd_bootに
マウントされているものとして記載します。
 $ cp ./linux/arch/arm/boot/Image /media/sd_boot/kernel.img

次に、モジュールもコピーします。
こちらはSDカードのルートファイルシステム側に入れます。
ルートファイルシステムが/media/sd_rootにマウントされているとしますと、

 $ cp -R /tmp/modules/* /media/sd_root/lib/modules
みたいな感じでいけると思います。
BUFFALO Wi-Fiゲーム対応USBコネクター WLI-UC-GNT
バッファロー (2009-12-26)
売り上げランキング: 9287
FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)
スイッチサイエンス
売り上げランキング: 9314
posted by いしいっち at 19:58| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2012年11月01日

蛍光表示管(VFDパネル)をAndroidから制御するライブラリを作ってみました

電気街のパーツショップでも購入できるVFDパネルという表示装置があります。昔は小型ゲーム機の表示板や、電卓の数字表示に使用されていたようですし、現在でも(液晶が多くなってきたものの)ビデオデッキの前面パネル表示部や、お店のレジの値段表示、銀行等の為替レート表示、ATMなどいろいろな所で活躍している表示装置の一種です。ノリタケ伊勢電子と双葉電子工業というところの製品が多く出回っているようです。

参考 : 蛍光表示管(Wikipedia)
http://ja.wikipedia.org/wiki/%E8%9B%8D%E5%85%89%E8%A1%A8%E7%A4%BA%E7%AE%A1

たまたま、僕が持っているVFDパネル SCK256X64-3101 はUSBのインターフェースを搭載していて、PCからの制御が出来る仕様です。
http://www.noritake-itron.jp/kit/module/sck_3000/index.html
ノリタケ伊勢電子のサイトから個人でも簡単に買えます。確か日本橋の共立電子にもいろいろ置いてありました。

13516949198931.jpg

13516949494552.jpg

そこで、Androidアプリから簡単に任意の表示制御できるようなコントロールライブラリ VFD_Driver を作成してみました。
VFD_demo.jpg

VFD_DriverはAndroidのUSBホストポートを使用してVFDパネルと通信を行うVFD_Driverクラスと、その上でコマンドを構築して制御を行うVFD_Communicationクラスとで構成されています。VFD_Driverクラスは、@ksksue氏作 FTDriver の実装をいろいろいただき、その上で実装しています(Special thanks!!)。

VFD_CommunicationクラスのAPIはノリタケ伊勢電子のサポートページで公開されているC++のサンプルAPIをほぼ踏襲しています。

ソースはこちらです。
https://github.com/yishii/Android_VFD_Driver

ビルドしたアプリはPlayストアにも上げました。ノリタケ伊勢電子のUSB接続のパネルであれば、同一型番でなくても動くかも?しれません。(未確認です)
https://play.google.com/store/apps/details?id=jp.yishii.vfdrivertest

API一覧はREADME.mdに入れました。関数毎にコメントで軽く説明入れましたが、詳しくは上記のノリタケ伊勢電子のC++サンプルAPIの説明書と多くは一致するかと思います。あとはソフトウェア開発ガイドのpdf(ダウンロード時要ログイン)があれば詳細なコマンドの振る舞いもわかります。
●ノリタケ伊勢電子 サポートソフト GU-3000シリーズ向け C++サンプルプログラム
http://www.noritake-itron.jp/cs/supportsoft/index.xml#GU-3000シリーズ向け


使用しているところの動画を撮影してみました。
Nexus 7のUSBホストに繋いで、アプリから表示をコントロールしているものです。

動画では、3つの画面のデモを行なっています。
一つはVFD内フォントを使用した文字列描画、もう一つはライン命令を使用したドローイング、最後にAndroidのBitmapからVFDの画面を更新する内容になります。
Android端末に別な画面を繋いで手軽に表示を制御したい場合などございましたら、良かったらご利用下さいませー。







iBUFFALO USB(microB to A)変換アダプター ブラック BSMPC11C01BK
バッファロー (2011-11-01)
売り上げランキング: 114


基礎から学ぶ 組み込みAndroid
坂本 俊之 出村 成和 渡邊 昌之
シーアンドアール研究所
売り上げランキング: 135065


BeagleBoard-xM
BeagleBoard-xM
posted with amazlet at 12.11.01
Circuitco Electronics LLC.
売り上げランキング: 48592
posted by いしいっち at 00:36| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。