Archive for the ‘Mac’ Category

eJackino を使って音に反応する回路を作る

6月 21, 2009

まずは Arduino から Mac OS X 用の IDE を取ってくる。このときのバージョンは arduino-0016-mac.zip だった。
ただし、最近リリースされた Leopard の Java の更新すると起動しなくなる。ここに書かれている通り 32bit モードを指定して動かす必要がある。

Arduino のページではいくつかのサンプルが公開されている。LED と抵抗があれば簡単に試せるものがあったりしてなかなか楽しい。
これらのサンプルに修正を加えて実験していたところ、どうもプログラムのアップロードがうまく行かないことがあった。エラーの表示を見ると Troubleshooting のページを見るようにとあるので確認してみる。どうやら digital pin の 0 番と 1 番にはアップロード中に何も繋いではいけないようだ。

サンプルを動かしてみて、大体感触を掴んだところで音に反応するものを作ってみることにした。電子工作はほとんどやったことがないが、高校生くらいまでに習う電気回路の基礎知識を思い出すことでとりあえずなんとかなった。以下の写真は eJackino とブレッドボードを使ってとりあえず作ってみた回路。

コンデンサマイクの出力を OP アンプで 100 倍程度に増幅して analog in に入力する。Analog in に入力された音の大きさを eJackino で読み取り、あるしきい値以上であったら LED を点灯させる。パンと大きな音を出すとそれに反応して LED が点灯するのが楽しい。(想定以外の動作をすることもあるけど)
OP アンプの組み方についてはデータシートに例が載っていることが多かったのであまり考えずそれを使ってしまえば良さそう。今回はコンデンサマイクの出力を単純に増幅したかっただけなので、OP アンプの基本的な使い方である非反転増幅器を使った。周辺の抵抗やコンデンサの容量は電子工作について書かれているページを検索してそれらを眺めて適当に決めてしまったが、とりあえずそれっぽく動く回路が出来てしまった。お手軽に楽しむことが目的なのでこれでいいかな。

Arduino というプラットフォームがあれば電子工作した回路をプログラム制御する段階に比較的簡単に持ってくることができる点に関心がいった。また、このようなプラットフォームが提供されることでソフト寄りの人もハードの世界に入って来るきっかけになるのではないかと感じた。

eJackino のブートローダを MacBook から書き込む

6月 8, 2009

昨日は eJakino (Arduino 互換ボード) のパーツ収集から組み立てまで行った。今日はブートローダの書き込みを行ってみる。

本に書かれている通り、まずは USB シリアル変換モジュールと ATmega168 を装着する。この 2 つで約 1500 円くらい。パーツ費用の大部分を占めている。
さていよいよ USB モジュールを MacBook に接続する。問題なく PWR LED が点灯。ケーブルには SheevaPlug に付属してきた USB ケーブルが使えた。
次に FTDI ドライバ (D2XX) のインストールだが、これはすでに OpenOCD を試したときに実施したので必要なし。MacBook からブートローダを書き換える方法は eJackino のページからたどれるここが参考になる。
USB シリアルドライバのモジュールをアンロードすれば D2XX のライブラリ経由で D2XX のサンプルが動作することを確認しておく。(このとき eJackino を MacBook に接続した状態で実施する)

avrdude の -p オプションで指定するパラメータ (AVR device の指定) は本に書かれている m168 に合わせる:

$ ./avrdude -C ./avrdude.conf -c diecimila -p m168 -B 4800

arduino-0015-win.zip にブートローダ (ATmegaBOOT_168_diecimila.hex) が含まれているので eJackino のページから落としてくる。ATmegaBOOT_168_diecimila.hex を avrdude のカレントディレクトリにコピーしておく。

ブートローダを書き込む:
$ ./avrdude -C avrdude.conf -c diecimila -p m168 -B 4800 -e
$ ./avrdude -C avrdude.conf -c diecimila -p m168 -B 4800 -U efuse:w:0x00:m -U hfuse:w:0xDD:m -U lfuse:w:0xFF:m
$ ./avrdude -C avrdude.conf -c diecimila -p m168 -D -U flash:w:ATmegaBOOT_168_diecimila.hex:a
$ ./avrdude -C avrdude.conf -c diecimila -p m168 -U lock:w:0x0F:m

ヒューズビットの確認:
$ ./avrdude -C avrdude.conf -c diecimila -p m168 -B 4800 -t
>>> r efuse
0000 00 |. |

avrdude> r hfuse
>>> r hfuse
0000 dd |. |

avrdude> r lfuse
>>> r lfuse
0000 ff |. |

avrdude> r lock
>>> r lock
0000 0f |. |

上記のように表示されていれば成功。
USB ケーブルを外し、ブートローダ書き込みケーブルも外す。その後、再度 USB ケーブルを MacBook に接続すると L に装着した LED が点滅を始める。
どうやら無事に完成したようだ。次は eJackino を動かすことを試してみよう。

Mac OS X 用 ARM クロスコンパイラで SheevaPlug のカーネルをコンパイルする

5月 31, 2009

Kernel.org で Linux カーネル 2.6.30-rc7 が公開されている。そこで SheevaPlug のカーネルを 2.6.30-rc7 にしてみる。
前回 2.6.30-rc5 のカーネルを SheevaPlug 用にコンパイルにしたときは Marvell が提供していた Linux 用クロスコンパイラを使った。Linux ホストには VMware の上で動作する CentOS5 を使っていたのでいろいろと多少不便を感じていた。また VMware の Linux を立ち上げただけで MacBook のファンがフル回転で回り続けることがあり結構気になる。
そこで Mac OS X 用の ARM クロスコンパイラを作成し、それを使って SheevaPlug のカーネルをコンパイルすることを考えてみた。

ところが、u-boot の mkimage を Mac OS X 上でコンパイルできなかったので、結局 uImage までの作成を全て Mac OS X 上で行うことはできなかった 😉
(仕方ないので zImage まで作って uImage への変換は Linux で行うことにした)

以下、その作業記録:

コンパイラやリンカは以下のバージョンのものを使用した:
– gcc-4.3.3.tar.bz2
– binutils-2.19.1.tar.bz2

MacPorts でコンパイルに必要なライブラリをインストール:
$ sudo port install gmp
$ sudo port install mpfr

(他にもコンパイルに必要なライブラリがあったかもしれない)

binutils のコンパイル:
$ binutils-2.19.1
$ mkdir build
$ cd build
$ ../configure –prefix=/opt/cross_arm/ –target=arm-none-linux-gnueabi –disable-nls
$ make
$ sudo make install

arm-none-linux-gnueabi-* を使えるようにパスを通しておく:

$ PATH=/opt/cross_arm/bin/:$PATH

gcc のコンパイル:

$ cd gcc-4.3.3
$ mkdir build
$ cd build
$ ../configure –target=arm-none-linux-gnueabi –prefix=/opt/cross_arm/ –disable-nls –enable-languages=c,c++ –without-headers –with-gmp=/opt/local/ –with-mpfr=/opt/local/
$ make all-gcc
$ sudo make install-gcc

SheevaPlug_Host_SWsupportPackageLinuxHost.zip に入っている gcc.tar.bz2 を展開する。この中に入っている libgcc.a を以下の場所にコピーする:

$ sudo cp LinuxHost/gcc/lib/gcc/arm-none-linux-gnueabi/4.2.1/libgcc.a /opt/cross_arm/lib/gcc/arm-none-linux-gnueabi/4.3.3/

Linux ホストにある /usr/include/elf.h を /opt/local/include/ にコピーする (インクルードパスに含まれているのであればここでなくても良い)。また elf.h の #include <features.h> をコメントアウトしておく。

Mac OS 版 mkimage を作成を試みた。ftp://ftp.denx.de/pub/u-boot/ から新しそうなものを取ってくる。ここを参考に mkimage を作成してみるが、エラーが出てコンパイルできなかった。とりあえず uImage 化は Linux で行うことにする。

Linux 2.6.30-rc7 の mv643xx_eth にはバグがあり、取ってきた rc7 のソースでは eth が起動しない。起動途中でネットワークインタフェースを立ち上げた場合には以下のメッセージ付近で停止してしまう:

* Loading hardware drivers… mv643xx_eth_port mv643xx_eth_port.0: coherent DMA mask is unset
net eth1: can’t allocate rx ring (2048 bytes)
kernel BUG at include/linux/netdevice.h:420!
Unable to handle kernel NULL pointer dereference at virtual address 00000000

Marvell が公開している orion git修正パッチが公開されているのでこれを kirkwood 用のソースに適用しておく。

Mac OS X 用クロスコンパイラを使い、以前書いた方法に従って Linux 2.6.30-rc7 をコンパイルする:

(省略)
mkimage が使えないので zImage までを作成:
$ make ARCH=arm CROSS_COMPILE=/opt/cross_arm/bin/arm-none-linux-gnueabi- zImage
(省略)

Linux の mkimage を使って uImage 化する:

$ mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n ‘Linux 2.6.30-rc7’ -d zImage uImage-2.6.30-rc7

カーネルモジュールのコンパイル:

$ make ARCH=arm CROSS_COMPILE=/opt/cross_arm/bin/arm-none-linux-gnueabi- modules

ERROR: “xt_rateest_lookup” [net/netfilter/xt_rateest.ko] undefined!
ERROR: “xt_rateest_put” [net/netfilter/xt_rateest.ko] undefined!

というエラーが出たが、もう一度モジュールをコンパイルしてみると次は出なくなった。

Mac OS X 用のクロスコンパイラから作成した Linux カーネルとモジュールを SheevaPlug にインストールして立ち上げる:

Marvell>> set bootcmd ‘mmcinit; ext2load mmc 0:1 0x800000 /uImage-2.6.30-rc7; bootm 0x800000’
Marvell>> saveenv
Marvell>> reset

dmesg の先頭にカーネルコンパイルに使った gcc のバージョンが記載されているので、今回作成したクロスコンパイラのバージョンと合っているか確認しておく。