2013年01月27日

Arduino Due+自作JTAGアダプタでスケッチのソースレベルデバッグしてみた

こんにちは。はやくArduino Dueで遊びたいのですがなんだかんだと他にやりたい事やらやらなければならない事やらあり、あまり時間がさけてなくて、遅々として進まない状況が続いています。

●JTAGアダプタを製作してみた

ところで、ツイッターにたまに書いていたのですが、年末のお休みを利用して、
Kamiki氏の回路 http://www.koka-in.org/~kensyu/handicraft/diary/20080926.html
ねむいさんの回路 http://nemuisan.blog.bai.ne.jp/?eid=155027
を参考に自分なりにJTAGのデバッグ回路を作っていたので、まずはこれを使ってみることにしました。
メインチップはFT2232Dです。

作成してみた回路図はこちら。Eagleで書いています。部品は秋月とチップワンストップで買えるものにしています。
jtag_sch.png

上記回路図のpdf版も置いときますね。
FT2232_JTAG_ADAPTER_20130127.pdf
いつものFusion PCBと、佐々木さんに教えていただいたDFRobotの2社にお試しで発注してみました。(安いのでお試し可能だったもので...)基板が必要以上の枚数(23枚)になって処分に困ってます。笑
あ、ねむいさんの作例同様、EEPROMを搭載し、Amontec JTAGkey相当のデバイスとして認識されるようにしています。DFRobotとFusionとでの比較(というほどのもんではありませんが)はまた別記事にまとめます。

・・・あ、そういえばこの基板、フリスクサイズに入れる予定だったの、忘れてた。

DFRobotから届いた基板はこちら。
P1130029resized.jpg

実装した後のボード。
P1130027resized.jpg

またこの話しはおいおい記事にさせていただくとして、Arduino Dueのデバッグについて書いていきます!

●Arduino Dueのデバッグポートについて

Arduino Dueのデバッグポートは以下のようになっています。

arduino_due_debugport.jpg
初めから、SWD(Serial Wire Debug)もJTAGもピンヘッダが実装されています。SWDはJTAGよりも少ないピンでデバッグ機能を提供します(SWDには、JTAGのバウンダリスキャン相当の機能提供はありません。まぁデバッガ繋ぎたいだけなのでそのような機能、特に必要でもありませんが)。
本ボードでは、10ピンの1.27mmピッチピンヘッダにJTAGが、そして4ピンの2.54mmピッチピンヘッダにSWDが出ています。今回はこのJTAG側を使用しています。
(後ほど、SWDを使用したデバッグも上記のデバッガ(+SWDアダプタ)でお試ししてみたいと思っています)

さて、JTAGデバッグに使用する1.27mmピッチピンヘッダですが、ストロベリー・リナックスで販売している、OlimexのARM-JTAG-20-10(630円)が便利です。シンプルな構成のピッチ変換基板です。
http://strawberry-linux.com/catalog/items?code=15079



このARM-JTAG-20-10と、JTAGアダプタの3.3V、GND、TMS、TCK、TDI、TDOを適当な線材で接続すればOKです。
jtag_connection.jpg

なお、Arduino Dueのデバッグ端子(だけじゃないけど)については武蔵野電波さんのピンアウトダイアグラムが便利です。
http://www.musashinodenpa.com/arduino/lib/Duepinout.pdf

●開発環境の整備

今回も、過去記事のSTM32F4-Discoveryで取り上げましたOpenOCDを使用します。過去記事ではLinux環境(Ubuntu 10.04LTS 64bit)でOpenOCDを使用していたので、自前ビルドのものを使用しましたが、今回はWindows8+Cygwin環境で使用しているので、「ねむいさんのぶろぐ」においてあるバイナリファイルをそのまま使用させて頂きました。
もちろんLinux環境からも使用出来ると思います(試してないけど)。

OpenOCDは、各デバッグI/Fやターゲットボード別にスクリプト言語 Tclで記述された処理を使用してデバッグします。Arduino Dueは「ATSAM3X8E」を使用しています。以下のように指定して起動すれば、ATSAM3X8E向け環境になるかなと思います。

Cygwinでの実行例。DOSプロンプトならWindows流のパス指定にしてください。

# ./openocd.exe -s ./tcl -f ./tcl/interface/jtagkey.cfg -f ./tcl/target/at91sam3ax_8x.cfg

OpenOCDでは、デフォルトはGDBServerのポートは3333、telnetインターフェースが4444になっています。
なので、TeraTerm等で4444番ポートに接続するだけで、OpenOCDの持つ各種コマンドインターフェースを利用できます。

例えば、上記の通りのコマンドライン指定でOpenOCDを起動してみます。OpenOCDを起動した時のログは以下のようになりました。


ishii_000@Win7tab /cygdrive/c/local/ocd
$ ./openocd.exe -s ./tcl -f ./tcl/interface/jtagkey.cfg -f ./tcl/target/at91sam3ax_8x.cfg
Open On-Chip Debugger 0.7.0-dev-00134-g48e01a4-dirty (2013-01-03-11:34)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 500 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
cortex_m3 reset_config sysresetreq
Info : clock speed 500 kHz
Info : JTAG tap: sam3.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Info : sam3.cpu: hardware has 6 breakpoints, 4 watchpoints

# 今気づいたけど僕のマシン名「WIN7TAB」だった。Win8タブレットなんたけど。あーあ。orz

次に、OpenOCDのAT91SAM3 INFOコマンドを実行してみます。(OpenOCDでは一部のターゲット向けにスペシャルコマンドがあるので)


> at91sam3 info
    CKGR_MOR: [0x400e0420] -> 0x00000000
            MOSCXTEN:     0 [0x0000] (main xtal enabled: NO)
            MOSCXTBY:     0 [0x0000] (main osc bypass: NO)
            MOSCRCEN:     0 [0x0000] (onchip RC-OSC enabled: NO)
             MOSCRCF:     0 [0x0000] (onchip RC-OSC freq: 4 MHz)
            MOSCXTST:     0 [0x0000] (startup clks, time= 0.000000 uSecs)
             MOSCSEL:     0 [0x0000] (mainosc source: internal RC)
               CFDEN:     0 [0x0000] (clock failure enabled: NO)
   CKGR_MCFR: [0x400e0424] -> 0x00000000
            MAINFRDY:     0 [0x0000] (main ready: NO)
               MAINF:     0 [0x0000] (0.000 Mhz (32.768khz slowclk)
  CKGR_PLLAR: [0x400e0428] -> 0x00000000
                DIVA:     0 [0x0000]
                MULA:     0 [0x0000]
        PLLA Freq: (Disabled,mula = 0)
   CKGR_UCKR: [0x400e041c] -> 0x00000000
    PMC_FSMR: [0x400e0470] -> 0x00000000
    PMC_FSPR: [0x400e0474] -> 0x00000000
     PMC_IMR: [0x400e046c] -> 0x00000000
    PMC_MCKR: [0x400e0430] -> 0x00000000
                 CSS:     0 [0x0000] slowclk (0.033 Mhz)
                PRES:     0 [0x0000] (selected clock)
                Result CPU Freq: 0.033
    PMC_PCK0: [0x400e0440] -> 0x000001ff
    PMC_PCK1: [0x400e0444] -> 0x000001ff
    PMC_PCK2: [0x400e0448] -> 0x000001ff
    PMC_PCSR: [0x400e0418] -> 0x00000000
    PMC_SCSR: [0x400e0408] -> 0x00000000
      PMC_SR: [0x400e0468] -> 0x00000000
 CHIPID_CIDR: [0x400e0740] -> 0x285e0a60
             Version:     0 [0x0000]
               EPROC:     3 [0x0003] cortex-m3
             NVPSIZE:    10 [0x000a] 512K bytes
            NVPSIZE2:     0 [0x0000] none
            SRAMSIZE:    14 [0x000e] 96K Bytes
                ARCH:   133 [0x0085] ATSAM3XxE Series (144-pin version)
              NVPTYP:     2 [0x0002] embedded flash memory
               EXTID:     0 [0x0000] (exists: NO)
CHIPID_CIDR2: [0x400e0940] -> 0x285e0a60
             Version:     0 [0x0000]
               EPROC:     3 [0x0003] cortex-m3
             NVPSIZE:    10 [0x000a] 512K bytes
            NVPSIZE2:     0 [0x0000] none
            SRAMSIZE:    14 [0x000e] 96K Bytes
                ARCH:   133 [0x0085] ATSAM3XxE Series (144-pin version)
              NVPTYP:     2 [0x0002] embedded flash memory
               EXTID:     0 [0x0000] (exists: NO)
 CHIPID_EXID: [0x400e0744] -> 0x00000000
CHIPID_EXID2: [0x400e0944] -> 0x00000000
   rc-osc: 0.000 MHz
  mainosc: 0.000 MHz
     plla: 0.000 MHz
 cpu-freq: 0.033 MHz
mclk-freq: 0.033 MHz
 UniqueId: 0x52323120 0x36303437 0x30303420 0x35313034

デバイスの諸元がいろいろ読み取れたみたいです。

●Arduinoスケッチを実機に書き込んで、ソースコードレベルデバッグを使用する

上述の通り、OpenOCDにはデフォルトポート番号3333でGDBサーバーとして振舞います。
ARM用のGDBクライアントが必要なのですが、実はArduino IDE内のARM用ツールチェイン(Sourcery g++ Liteのようです)にもgdbがちゃんと入ってます。だからこれを利用すればOKだと思います。
Windows版の場合のパスは、「arduino\hardware\tools\g++_arm_none_eabi\bin\arm-none-eabi-gdb.exe」です。

今回は、僕がたまたま自分のPCに別途インストールしてたSourcery g++ Lite(ARM EABI)があったんでそれ使いました(パス通してたんで。みたいな理由です^^;)。

gdbのフロントエンドには、InsightやEclipse+CDT、DDDなどいろいろありますが、定番の1つ、Emacsを使用してみました。その他環境でも別に差なく使用出来ると思います。。


1. ArduinoのスケッチをコンパイルしてArduino Dueマイコンボードに書き込む

Arduino Dueボード上についてる橙色のLED(デジタルピン13番)を500[ms]毎に明るい→暗い→明るい→暗いを繰り返す適当なサンプルコードを作りました。
loop関数が呼ばれる度、変数flagの値が0(false)と1(true)交互に変化します。

●BlinkPWM.ino
void setup()
{
}

boolean flag = false;

void loop()
{
  
  if(flag){
    analogWrite(13,40); // 暗い
  } else {
    analogWrite(13,255); // 明るい
  }
  
  flag = !flag;

  delay(500); // 500[ms]待つ
}

コンパイルすると、テンポラリディレクトリにバイナリを含むビルド関連生成物が吐き出されます。Arduino IDEの「ファイル」→「環境設定」の「より詳細な情報を表示する : コンパイル」のチェックボックスにはチェックを入れておきます。
(生成物のテンポラリ出力先のパスを確認する為)
スケッチビルドのログを見てみます。適当に最後のobjcopyしている行をコピーしたのが以下です。

C:\local\arduino/hardware/tools/g++_arm_none_eabi/bin/arm-none-eabi-objcopy -O binary c:\temp\build2226462045159247312.tmp/BlinkPWM.cpp.elf c:\temp\build2226462045159247312.tmp/BlinkPWM.cpp.bin 
上記では生成先は「c:\temp\build2226462045159247312.tmp」となったようです。

あ、、ところでデバッグする時はgccにデバッグオプション(-g)を付加しておく必要がありますが、Arduino IDEでは何故かデフォルト「-g」付きになっていますので、そのままでOKです(これは、AVRマイコン向けのビルド時も同じ)。
Arduino IDEで.ino(または.pde)のスケッチをビルドした後、ビルドエラーが出た時に該当行を抽出する時にデバッグ情報を使ってるのかなと思ってます。違ったらスミマセン。


んで、上記で調べた生成先のディレクトリ内のファイルはこんな感じでした。

C:\temp\build2226462045159247312.tmp>dir ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は DACD-C207 です C:\temp\build2226462045159247312.tmp のディレクトリ 2013/01/27 17:40 <DIR> . 2013/01/27 17:40 <DIR> .. 2013/01/27 17:39 252 BlinkPWM.cpp 2013/01/27 17:40 27,064 BlinkPWM.cpp.bin 2013/01/27 17:40 233,014 BlinkPWM.cpp.elf 2013/01/27 17:40 366,790 BlinkPWM.cpp.map 2013/01/27 17:39 4,456 BlinkPWM.cpp.o 2013/01/27 17:40 26,664 CDC.cpp.o 2013/01/27 17:40 417,598 core.a 2013/01/27 17:39 5,716 cortex_handlers.c.o 2013/01/27 17:39 2,272 cxxabi-compat.cpp.o 2013/01/27 17:40 23,664 HID.cpp.o 2013/01/27 17:39 2,064 hooks.c.o 2013/01/27 17:39 910 iar_calls_sam3.c.o 2013/01/27 17:40 14,620 IPAddress.cpp.o 2013/01/27 17:39 6,100 itoa.c.o 2013/01/27 17:40 4,676 main.cpp.o 2013/01/27 17:40 32,940 Print.cpp.o 2013/01/27 17:40 6,208 Reset.cpp.o 2013/01/27 17:40 4,780 RingBuffer.cpp.o 2013/01/27 17:40 25,008 Stream.cpp.o 2013/01/27 17:39 9,460 syscalls_sam3.c.o 2013/01/27 17:40 24,076 UARTClass.cpp.o 2013/01/27 17:40 24,568 USARTClass.cpp.o 2013/01/27 17:40 34,048 USBCore.cpp.o 2013/01/27 17:40 21,328 variant.cpp.o 2013/01/27 17:39 15,624 WInterrupts.c.o 2013/01/27 17:39 6,516 wiring.c.o 2013/01/27 17:39 22,836 wiring_analog.c.o 2013/01/27 17:39 10,040 wiring_digital.c.o 2013/01/27 17:40 9,112 wiring_pulse.cpp.o 2013/01/27 17:39 5,620 wiring_shift.c.o 2013/01/27 17:40 5,964 WMath.cpp.o 2013/01/27 17:40 63,628 WString.cpp.o 32 個のファイル 1,457,616 バイト 2 個のディレクトリ 17,473,040,384 バイトの空き領域 C:\temp\build2226462045159247312.tmp>

objdumpでソースコード付きの逆アセンブル表示ができますので、試してみます。

> arm-none-eabi-objdump -Sdl C:\temp\build2226462045159247312.tmp\BlinkPWM.cpp.elf

結果の内、メインのスケッチあたりの一部抜粋をしてみます。


00080198 :
setup():
C:\local\arduino/BlinkPWM.ino:3
void setup()
{
}
   80198:	4770      	bx	lr
	...

0008019c :
loop():
C:\local\arduino/BlinkPWM.ino:8

boolean flag = false;

void loop()
{
   8019c:	b510      	push	{r4, lr}
C:\local\arduino/BlinkPWM.ino:10
  
  if(flag){
   8019e:	4b0b      	ldr	r3, [pc, #44]	; (801cc )
   801a0:	781b      	ldrb	r3, [r3, #0]
   801a2:	b113      	cbz	r3, 801aa 
C:\local\arduino/BlinkPWM.ino:11
    analogWrite(13,40);
   801a4:	200d      	movs	r0, #13
   801a6:	2128      	movs	r1, #40	; 0x28
   801a8:	e001      	b.n	801ae 
みてみると、スケッチのBlinkPWM.inoのパスがC:\local\arduinoになっています。
これは僕のPCのArduino IDEインストール先です。
とはいえ、BlinkPWM.inoを保存してるパスはそこじゃありません。今回は、
手っ取り早く本パスにスケッチをコピっちゃいます。笑
> copy (path-to-store-sketch)BlinkPWM.ino C:\local\arduino

2. OpenOCDを起動する
Cygwinから起動してみました。別に素のDOSプロンプトでもいけるかと思います。

# ./openocd.exe -s ./tcl -f ./tcl/interface/jtagkey.cfg -f ./tcl/target/at91sam3ax_8x.cfg

3. Emacsを起動する
Windowsマシンにまだエディタをインストールしてなかったので、gnupack(emacs+cygwin)というパッケージをインストールしてみました。
http://sourceforge.jp/projects/gnupack/releases/
取り敢えず起動するなら、展開してemacs.exeを実行するだけです。

4. gdbを開始
Emacsから、「M-x gdb」としてGDBのモードを起動します。プロンプトが出ますので以下のように入力します。

Run gdb (like this): arm-none-eabi-gdb -i=mi C:\temp\build2226462045159247312.tmp\BlinkPWM.cpp.elf

5. ブレーク貼ってステップ実行してみる
loop関数とdelay関数にブレーク貼るなら、「b loop」と「b delay」など。
「p flag」とすれば、変数の値を確認できます。
ここではloopでブレークかかる度、flagの値が0と1、交互に切り替わる様子が確認できます。
ARMのレジスタを見るなら「i reg」とすればひと通り出ます。

スクリーンショットを撮ってみました。
左側がgdbのコマンド、右側がデバッグ中のソースコード(BlinkPWM.ino)です。loop関数のif文のところについてる赤いマーカーは、loop関数にブレークを張ったよって意味です。
結構視覚的にわかりやすいです。左側は、loopで止めた状態でARMのレジスタを表示してます。
もちろん、ArduinoのAPIの内部動作に至るまでステップ実行できるのでこまかく追いかけたい場合有効かなと思います。
emacs_ss.jpg


ところで、Arduinoはスレッド実行環境じゃないのにgdbがスレッド環境と誤判別したのか、
RMT ERROR : failed to get thread list.ウォーニングを吐きます。
まぁ動作に影響なさそうなので放っているのですが・・・設定とかできちんと回避できるんでしょうか。ご存知のかた、是非お教え下さい!

ではー!これから普通にDueを使います!笑

ARMでOS超入門 (ARMマイコン)
桑野 雅彦 岡田 好一 共著
CQ出版
売り上げランキング: 151,899
posted by いしいっち at 23:34| Comment(0) | TrackBack(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2013年01月15日

あけましておめでとうございます & Arduino Dueゲット!

あけまして、おめでとうございます。
本年もよろしくお願い致します!

最近は、積み基板を極力増やさないために、どうせ使用しないとわかる基板購入は控えようと思ったりしています。(部屋にある基板が大変な分量になってまして、しかも既に古いみたいなものばかりになりつつあり)
逆に言えば買うからには、ちゃんと使っていくぞという気持ちもありまして。まぁ、なんだかんだ多少積むでしょうけど。。。^^;

それはそれとして、僕もArduinoマイコンボードに手を染めてから既に2年経とうとしてるようで、時間の経つのってはやいです。その間にArduinoのボードもいくつか買いましたが、とうとうAVRマイコンではない純正のArduinoボードの「Arduino Due」を先日ゲットしました〜!わーい!もちろん使う気満々ですよ!
IMG_20130106_191210resized_.jpg

このボードはまだなかなか入手困難なところではあるようなのですが、デジキー(http://www.digikey.jp/)では買えるそうで、アンドロイドの会の吉田さんから声かけいただきまして、購入に便乗させていただき、年末にボードがゲット出来ました。
このボード、おおまかなハード構成としては、Google I/O 2012で公開されたADK2012のメインボードに近いと思います(僕も持ってないので、公開されている情報から、たぶん・・・)。

Arduino Dueのボード外観は、Arduino Megaに似ています。というわけで、過去の僕が購入したArduinoボードと並べて写真取ってみました。
左から、Arduino Due、Arduino Mega ADK、Arduino Leonardo、Arduino Uno、Arduino Duemilanove(互換ボード)です。

IMG_20130106_225155resized_.jpg

ArduinoマイコンボードってUSB-Bコネクタがフルサイズのものが多かったんですよね。一方、僕個人としては、フルサイズのコネクタを使った機器を最近あまり使ってない。だから、ケーブルもあまり持ってない。持ってても樹脂がかなり硬化してたり。
そんな中、Arduino LeonardoからのMicroUSBコネクタ採用は結構うれしかったです。

Arduinoマイコンボードの多くにはUSBポートが搭載されていまして、おおまかには以下の種類に大別できそうです。
(1)メインマイコンとUSBシリアル変換チップ(FTDI)の構成 : Arduino Duemilanove等
(2)メインマイコンとUSBシリアル変換チップ(AVRマイコン)の構成 : Arduino Uno、Arduino Mega、Arduino Mega ADK等
(3)メインマイコンだけの構成(メインマイコン搭載USB) : Arduino Leonardo


Dueは、上記の(2)と(3)の特徴を併せ持っています。更に、メインマイコン(ATSAM3X8E)はUSB On-the-Go(USBホスト&デバイス)を搭載している為、USBデバイス側のインターフェースを搭載した機器と接続することも出来ます。

BOARD_SIDE.jpg

上記はArduino DueのUSBコネクタがある側の写真です。左側が「NATIVE USB」、右側が「PROGRAMMING」となっていて、左側はメインマイコンであるATSAM3X8Eに接続されている側になります。

コネクタの形状を見ると、左側がMicroUSB-ABコネクタになっています。ここにUSBホスト変換ケーブルを接続することで、外部のUSBデバイスとやりとりする事に使用出来ます。コネクタ形状はMicroUSB-ABですが、USB-Aとの変換コネクタはMicroUSB-AでもBでも、使用できるようです。

例えば、これとか(Micro-BとUSB-A変換ケーブル)。

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


もちろん、以下のようなMicroUSB-AからUSB-A変換ケーブルも使用出来ます。



さて、今までのArduinoとArduino Dueがどう違うのか?というのは気になる点です。

まず大きく異なるのはメインCPUコアが異なることです。これまでのArduinoマイコンボードで使用されていたのはATMEL社のAVRという同社独自RISCコアでした。クロックは16[MHz]や8[MHz]など。
Dueで使用されているメインチップは同じくATMEL社のデバイスであるものの、CPUコアは32ビットのARM Cortex-M3です。CPUクロックは84[MHz]。96[KB]のRAMと512[KB]のFlash ROMを搭載します。
軽く比較しても、パフォーマンスは高くなっているはずでしょう。

その他、2chのDACやCAN BUSなど、いろいろ今までのArduinoよりもI/Fが増えていますが、これは少しずつ使っていきたいと思います。

開発環境 Arduino IDEは1.5でDueがサポートされ、ライブラリもいろいろ強化されています。タスク管理ライブラリのSchedulerクラスやAudioクラスなど。

ところで、デバッグ端子はAVRコアの頃はお馴染みの6ピンインターフェースでしたが、Dueでは、ARMコアになり、SWDとJTAGの端子が搭載されました。SWDはDIPピッチピンヘッダで、JTAGは1.27mmピッチピンヘッダです。
JTAGを使用してみようと思って、OLIMEXの変換アダプタをStrawberry-linuxで購入(630円)しましたが、
http://strawberry-linux.com/catalog/items?code=15079
なんとSWDコネクタと物理的に干渉して刺さりません!!なんだよーーー!!

刺さらないの図。(わかりにくいですけど)

IMG_20130106_181533resized_.jpg

そこで、DIPピッチのSWDのピンヘッダ(下の写真の赤く囲った部分)を一旦外して、樹脂を少し削ったものに実装しなおしてみます。

kakotta.jpeg

この基板はスルーホール基板で部品を外すのは、面倒です。下手なことをするとスルーホールを壊してしまいます。従ってハンダごてであまりいじらずサクッと外したいところです。本業でハンダ付けしてる方々はバキュームポンプが付いたコテでサクッと外すでしょうが、個人で遊んでる僕にはそのような機材もなく・・・と思ったら、和歌山のたろサさんが素敵なアイテムを紹介してくれました。それは、「はんだシュッ太郎」という機械です。

従来のはんだすいとり機と、ハンダゴテが融合した商品で、バキュームポンプが付いた専用機ほどではないにせよ、かなり手軽にハンダを溶かして吸い取ってくれます。しかもかなりリーズナブルなお値段(4千円台)です。

はんだシュッ太郎(はんだ吸取器) HSK-100
サンハヤト
売り上げランキング: 7,262


これ、僕も買ってみました。使ったら、ピンヘッダあっさり外れました。まぁ、ピンヘッダは普通のコテでも比較的苦労なく外せる部類の部品ですけどね。コテ先はこんな感じです。

IMG_20130106_181844resized_.jpg

IMG_20130106_181730resized_.jpg

外した後は、秋月で買ってたストックのピンヘッダを差し込みます。その前に、ピンヘッダの端の樹脂をニッパで切り取っておきます(写真のように)。

で、晴れて接続できるようになりましたー!
IMG_20130106_183511resized_.jpg

というわけで、Arduinoを浅く触っている状況ですけど、これからいろいろ記事に出来たらとおもいます。本年もよろしくお願い致します!

Arduino Leonardo(+Headers)
Arduino Leonardo(+Headers)
posted with amazlet at 13.01.17
GHEO SA
売り上げランキング: 43,094





posted by いしいっち at 01:55| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

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) | 日記 | このブログの読者になる | 更新情報をチェックする
×

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