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) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック