今日のガラクタは、ランニングエレクトロニクスさんのSBDBT です。一見USBのAコネクタをブレッドボードに差すためのアダプタみたいですが、裏面(コネクタの反対側)にPIC24FJ64を搭載した小型のマイコン基板です。PICにプログラムすれば、USBデバイスが利用できるようになっていますが、買った状態ではじめからBluetooth SPPのファームを書き込んだ状態にしてくれてあって、USBのBluetoothアダプタを挿すだけで、Bluetooth - UART 変換アダプタになってしまうすぐれものです。
USBのBluetoothアダプタを挿してPCとペアリングして、マイコンのUARTに接続するだけで、マイコンがBluetooth接続で無線化できます。
今回は、MyARM基板で試してみました。これは便利!お気に入りアイテムになるかも。
実は、ビュートローバーARMに載せようと思ったんだけど、そっちはうまく動かなくて、あれ?っとおもって、回路図を見たら、エンコーダをつなぐための拡張ボードがUART端子を追加のモータドライブ回路のPWMポートとして使っていて、拡張ボードが原因か?ってなったんですが、ボードをとり外して試してもダメでした。壊したかな?ビュートローバー用のUARTのライブラリを使ったんだけど、ソフトの問題か?ライブラリを使わずに自分でUART入出力書いて試すか・・・しかたない。
2013年2月23日土曜日
2013年2月21日木曜日
Raspberry Pi のクロス開発環境 その2 デバッグ
前回はRaspberry Pi のクロス開発環境を構築しましたが、デバッグが出来ないとやっぱりダメでしょってことで、リモートデバッグを試してみました。
デバッグアイコンから「Debug Configurations...」を選んで・・・って思ったら、GDBを入れてなかったみたいです。
まず、GDBをインストールして、(ついでにeclipse-rseと表示があったのでインストールしましたが、これは前回プラグイン画面でインストールしているものとかぶっているかもしれません)
あらためて、「Debug Configurations...」で左側で「C/C++ Remote Application」を選択して、左上の新規作成ボタンを押します。右側に設定画面が表示されるので、「Main」タブで「Connectoin:」を前回作ったRaspberry Pi とのコネクションを選択して、「Search Project...」ボタンで該当プロジェクトを選択すると、「C/C++ Application:」とその下の「Remote Absolute File~」が設定されます。もし、設定されなかったり、違っているようなら、「Browse」ボタンで手動で設定します。
「Commands to execute before application」(実行前コマンド)に
sudo -i
chmod +x /home/pi/workspace/HelloRaspberryPi
gdbserver :2345 /home/pi/workspace/HelloRaspberryPi
のように、Raspberry Pi側の実行ファイルに実行権を与えて、gdbserverをポート2345で起動するようなコマンドを設定しておきます。パスの部分はプロジェクト名や実行ファイルの置き場で変わるので適宜変更して下さい。「Apply」ボタンを押して、「Debugger」タブに移ります。
「GDB debugger:」に
arm-linux-gnueabihf-gdb
を設定して「Apply」ボタンを押して設定を保存します。「Debug」ボタンを押すとデバッグパースティクティブに切り替わってデバッグが開始され、main関数の初めのところで停止した状態になるので、後は、ステップ実行や変数ウォッチを使ってデバッグができます。
それと、Raspberry Pi(ターゲット)側にGDB Serverが必要です。自分のRaspberry Pi環境にはすでにインストールされていましたが、されていない場合は、
sudo apt-get install gdbserver
で、インストールが必要だと思います。
sudo apt-get install gdbserver
で、インストールが必要だと思います。
Raspberry Pi のクロス開発環境構築
※2016/07/13 追記
Visual C++ for Linux Development という Visual Studio のプラグインで Raspberry Pi のリモートデバッグを行う方法をまとめてみました。よろしければ、そちらも御覧下さい。
Raspberry Pi はクロス開発しなくてすむところがいいとこの辺で書きましたが、今回はあえて、Raspberry Pi 用のクロス開発環境の構築を行なって見ることにしました。Raspberry Pi にVNCで接続して、Geanyエディタでビルド→デバッグ(ステップ実行、変数ウォッチ等)で十分満足な環境ですが、以前にRaspberry Pi上でEclipseを動かそうとしたら重すぎてダメだったので、外部のDebian端末などからEclipseでクロス開発はできないかと思ってGoogle先生に聞いてみました。すると、このようなサイトがあったので、これをほぼそのまま真似させていただく形で試してみました。別にEclipseが使いたいわけではないんですが、Raspberry Piをマイコンと考えるとクロス開発環境を構築することに自体に興味があり、もし上手く行ったとしても使うかどうかはわかりません。
と、いうわけで、ホスト側の環境はお試しということもあるので、VMWare Workstation 上に新たに用意したDebian 32bit環境です。"uname -a"すると、Linux Debian 2.6.32-5-686 と返ってきます。
Raspberry Pi用の Cross Compiling Toolchain をインストールします。
まず、手順に従ってgitをインストールします。コンソール(ターミナル)画面から
sudo apt-get install git
おっと、自ユーザをsudoファイルに追加していませんでした。スーパーユーザ端末を開いて
visudo
でsudoファイルに自ユーザを追加して、再度、sudo apt-get install git したところ、自分の環境では既にインストール済みのようでした。
64bit版のホストOSを使っている人は
sudo apt-get install ia32-libs
を入れる必要があるとのこと。自分は32bitなので、ここはパス。次にホームディレクトリ下に
mkdir raspberrypi
して、フォルダを作成して、移動します。
cd raspberrypi
Github から Raspbian's cross compiling toolchain を落としてきます。
sudo git clone git://github.com/raspberrypi/tools.git
ダウンロードには結構時間がかかりました。ダウンロード完了後、
cd tools/arm-bcm2708
に移動して、 ls で確認すると
arm-bcm2708-linux-gnueabi
arm-bcm2708hardfp-linux-gnueabi
gcc-linaro-arm-linux-gnueabihf-raspbian
というフォルダが作成されているはずです。
次にPATHを通します。
cd
でカレントディレクトリに戻って、
vi .bashrc
で .bashrc を編集します。ファイルの一番最後に以下の記述を追加します。
export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
変更を保存したら、同様に
vi .profile
で .profile を編集します。ファイルの一番最後に以下の記述を追加します。
export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
変更を保存します。
ここで一旦
sudo reboot
して、コンソールで
arm-linux-gnueabihf-gcc -v
とすると、gccのバージョンなどがつらつらと画面に表示されればOKです。
このあとのEclipse のセットアップは コピー元ネタのサイトでは apt-get してますが、自分は Debianの「システム」メニューから「システム」→「システム管理」→「Synaptic パッケージマネージャ」でセットアップすることにしました。eclipse で検索して、eclipse にチェックを入れると依存するパッケージも自動で選択されてインストール対象になるので、「適用」ボタンを押して、インストールを開始します。
これで、とりあえず Eclipse の外側(あと、Java開発環境かな)がインストールされるので、Eclipse の 「Help」メニュー → 「Insall New Software」を選択して、Install画面を表示して、「Work with」プルダウンで「--All Available Sites--」を選択すると、とりあえず、デフォルトでEclipseのダウンロードサイトが設定されているはずです。「Programming Languages」の下の「Eclipse C/C++ Development Tools」にチェックを入れて、「Next」ボタンで先に進んでインストールを行います。インストールが終わるとEclipseを再起動するか聞かれるので、再起動します。
Eclipse 上で 新しいC++ Project を作成します。メニューの「File」→「New」→「Others」を選択するか、ショートカットキーで Ctrl + N を押します。ウィザード画面が表示されるので、「C/C++」の下の「C++ Project」を選択して「Next」ボタンで進みます。
Project name を適宜入力して、「Hello world C++ Project」→「Linux GCC」を選択します。
「Next」ボタンで2つ進んで(必要ならBasic Settingに情報を入力して)、Select Configurations 画面の「Advanced settings...」ボタンを選択します。
プロジェクトのプロパティ画面が開くので、左側のツリーから「C/C++ General」→「Paths and Symbols」を選択して、「Configurateion:」を「All configrations」を選択し、「Include」タブを選択します。「Languages」で「C++ Source File」を選択して、「Add」ボタンを押します。
「Add directory path」ダイアログが表示されるので、「File system...」ボタンでディレクトリを選択して、「OK」ボタンを押します。
以下の5つのディレクトリを追加します。
「Apply」ボタンを押します。
次に、左側のツリーで「C/C++ Build」→「Settings」を選び、「Tool Settings」タブを選択、「GCC C++ Compiller」を選択して、「Command:」の部分を
arm-linux-gnueabihf-g++
に書き換えます。
同様に、「GCC C Compailer」の「Command:」の部分を
arm-linux-gnueabihf-gcc
「GCC C++ Linker」の「Command:」の部分を
arm-linux-gnueabihf-g++
「GCC Assembler」の「Command:」の部分を
arm-linux-gnueabihf-as
に書き換えて、「Apply」ボタン→「OK」ボタンで Addvanced setting を閉じます。「Finish」ボタンでC++ Projectウィザードを完了します。
"!!!Hello World!!!"を表示するプロジェクトが作成されるので、Project Explorer でプロジェクトを右クリックして「Clean Project」を選択すると、プロジェクトがクリーンアップされて、リビルドがかかります。プロジェクトのディレクトリの下のDebugフォルダの下にプロジェクト名の実行ファイルができます。自分は今回プロジェクト名を HelloRaspberryPi としたのでDebugフォルダに移動して、
./HelloRaspberryPi
と試しに実行してみたところ「バイナリファイルを実行できません」となりました。ここで、
file HelloRaspberryPi
とすると、
ELF 32-bit LSB executable, ARM, ~
と表示されました。どうやら、ARM CPU用の実行ファイルが生成されているようです。
次は、Raspberry Pi へのデプロイです。
Eclipse の メニューから「Window」→「Show View」→「Others]を選択します。
「Show View」に「Remote Systems」が表示されない場合は、 メニューの「Help」→「Insall New Software」から「General Purpose Tools」辺りに「Remote System Explorer~」なんとかというのがあるので、これをインストールして下さい。
追加された「Remote System Details」ビューで右クリックして表示されるプルダウンメニューから「
New Connection」を選択します。
「SSH Only」を選択して「Next」ボタンで進みます。
接続先のRaspberry Pi のIPアドレスを 「Host name:」に指定します。「Next」ボタンを数回押して設定を確認して(またはその場で)「Finish」ボタンを押して接続を作成します。
「Remote System Detail」ビューに接続が作成されるので、右クリックして表示されるプルダウンメニューから「Connect」を選択します。
ユーザ名とパスワードを聞かれるので、Raspberry Pi側のユーザ名とパスワードを入力します。デフォルトならユーザ名 pi でパスワードが raspberry です。
「Remote System Details]ビューの接続したRaspberry Pi の行を右クリックして表示される「Show in Remote Systems view」を選択すると、ローカルマシンと接続したリモートのRaspberry Pi の両方をファイル操作できるビューが表示されるので、これを使ってローカル側の実行ファイルをRaspberry Piの適当なフォルダにコピーします。また、同Propertiesでコピーしたファイルのパーミッションも操作できるので、実行可能にしておきます。
右クリックして「Launch Terminal」でターミナル接続も可能ですが、日本語が化けるのと、自分の環境では(Permissionを設定しても)上手く実行できなかったので、とりあえず、Tera Teramで別途実行してみました。
コピーしたディレクトリに移動して
./HelloRaspberryPi
で実行。
無事、Raspberry Pi 上で動作してくれることが確認できました。お疲れ様でした。
いや~、しかし、こちらの解説がなければ、とても自分では出来ません。大変参考になりました。基本的に、ここに記述した内容は全て こちらの手順を自分でやってみた際の写し(作業記録)です。感謝、感謝。
Visual C++ for Linux Development という Visual Studio のプラグインで Raspberry Pi のリモートデバッグを行う方法をまとめてみました。よろしければ、そちらも御覧下さい。
Raspberry Pi はクロス開発しなくてすむところがいいとこの辺で書きましたが、今回はあえて、Raspberry Pi 用のクロス開発環境の構築を行なって見ることにしました。Raspberry Pi にVNCで接続して、Geanyエディタでビルド→デバッグ(ステップ実行、変数ウォッチ等)で十分満足な環境ですが、以前にRaspberry Pi上でEclipseを動かそうとしたら重すぎてダメだったので、外部のDebian端末などからEclipseでクロス開発はできないかと思ってGoogle先生に聞いてみました。すると、このようなサイトがあったので、これをほぼそのまま真似させていただく形で試してみました。別にEclipseが使いたいわけではないんですが、Raspberry Piをマイコンと考えるとクロス開発環境を構築することに自体に興味があり、もし上手く行ったとしても使うかどうかはわかりません。
と、いうわけで、ホスト側の環境はお試しということもあるので、VMWare Workstation 上に新たに用意したDebian 32bit環境です。"uname -a"すると、Linux Debian 2.6.32-5-686 と返ってきます。
Raspberry Pi用の Cross Compiling Toolchain をインストールします。
まず、手順に従ってgitをインストールします。コンソール(ターミナル)画面から
sudo apt-get install git
おっと、自ユーザをsudoファイルに追加していませんでした。スーパーユーザ端末を開いて
visudo
でsudoファイルに自ユーザを追加して、再度、sudo apt-get install git したところ、自分の環境では既にインストール済みのようでした。
64bit版のホストOSを使っている人は
sudo apt-get install ia32-libs
を入れる必要があるとのこと。自分は32bitなので、ここはパス。次にホームディレクトリ下に
mkdir raspberrypi
して、フォルダを作成して、移動します。
cd raspberrypi
Github から Raspbian's cross compiling toolchain を落としてきます。
sudo git clone git://github.com/raspberrypi/tools.git
ダウンロードには結構時間がかかりました。ダウンロード完了後、
cd tools/arm-bcm2708
に移動して、 ls で確認すると
arm-bcm2708-linux-gnueabi
arm-bcm2708hardfp-linux-gnueabi
gcc-linaro-arm-linux-gnueabihf-raspbian
というフォルダが作成されているはずです。
次にPATHを通します。
cd
でカレントディレクトリに戻って、
vi .bashrc
で .bashrc を編集します。ファイルの一番最後に以下の記述を追加します。
export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
変更を保存したら、同様に
vi .profile
で .profile を編集します。ファイルの一番最後に以下の記述を追加します。
export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
変更を保存します。
ここで一旦
sudo reboot
して、コンソールで
arm-linux-gnueabihf-gcc -v
とすると、gccのバージョンなどがつらつらと画面に表示されればOKです。
このあとのEclipse のセットアップは コピー元ネタのサイトでは apt-get してますが、自分は Debianの「システム」メニューから「システム」→「システム管理」→「Synaptic パッケージマネージャ」でセットアップすることにしました。eclipse で検索して、eclipse にチェックを入れると依存するパッケージも自動で選択されてインストール対象になるので、「適用」ボタンを押して、インストールを開始します。
これで、とりあえず Eclipse の外側(あと、Java開発環境かな)がインストールされるので、Eclipse の 「Help」メニュー → 「Insall New Software」を選択して、Install画面を表示して、「Work with」プルダウンで「--All Available Sites--」を選択すると、とりあえず、デフォルトでEclipseのダウンロードサイトが設定されているはずです。「Programming Languages」の下の「Eclipse C/C++ Development Tools」にチェックを入れて、「Next」ボタンで先に進んでインストールを行います。インストールが終わるとEclipseを再起動するか聞かれるので、再起動します。
Eclipse 上で 新しいC++ Project を作成します。メニューの「File」→「New」→「Others」を選択するか、ショートカットキーで Ctrl + N を押します。ウィザード画面が表示されるので、「C/C++」の下の「C++ Project」を選択して「Next」ボタンで進みます。
Project name を適宜入力して、「Hello world C++ Project」→「Linux GCC」を選択します。
「Next」ボタンで2つ進んで(必要ならBasic Settingに情報を入力して)、Select Configurations 画面の「Advanced settings...」ボタンを選択します。
プロジェクトのプロパティ画面が開くので、左側のツリーから「C/C++ General」→「Paths and Symbols」を選択して、「Configurateion:」を「All configrations」を選択し、「Include」タブを選択します。「Languages」で「C++ Source File」を選択して、「Add」ボタンを押します。
「Add directory path」ダイアログが表示されるので、「File system...」ボタンでディレクトリを選択して、「OK」ボタンを押します。
以下の5つのディレクトリを追加します。
- /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/include
- /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/libc/usr/include
- /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/lib/gcc/arm-linux-gnueabihf/4.7.2/include-fixed
- /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/lib/gcc/arm-linux-gnueabihf/4.7.2/include
- /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/lib/gcc/arm-linux-gnueabihf/4.7.2/finclude
- /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/lib
- /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/libc/lib
- /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf
- /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/lib/gcc/arm-linux-gnueabihf/4.7.2
- /home/xxx/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/libexec/gcc/arm-linux-gnueabihf/4.7.2
「Apply」ボタンを押します。
次に、左側のツリーで「C/C++ Build」→「Settings」を選び、「Tool Settings」タブを選択、「GCC C++ Compiller」を選択して、「Command:」の部分を
arm-linux-gnueabihf-g++
に書き換えます。
同様に、「GCC C Compailer」の「Command:」の部分を
arm-linux-gnueabihf-gcc
「GCC C++ Linker」の「Command:」の部分を
arm-linux-gnueabihf-g++
「GCC Assembler」の「Command:」の部分を
arm-linux-gnueabihf-as
に書き換えて、「Apply」ボタン→「OK」ボタンで Addvanced setting を閉じます。「Finish」ボタンでC++ Projectウィザードを完了します。
"!!!Hello World!!!"を表示するプロジェクトが作成されるので、Project Explorer でプロジェクトを右クリックして「Clean Project」を選択すると、プロジェクトがクリーンアップされて、リビルドがかかります。プロジェクトのディレクトリの下のDebugフォルダの下にプロジェクト名の実行ファイルができます。自分は今回プロジェクト名を HelloRaspberryPi としたのでDebugフォルダに移動して、
./HelloRaspberryPi
と試しに実行してみたところ「バイナリファイルを実行できません」となりました。ここで、
file HelloRaspberryPi
とすると、
ELF 32-bit LSB executable, ARM, ~
と表示されました。どうやら、ARM CPU用の実行ファイルが生成されているようです。
次は、Raspberry Pi へのデプロイです。
Eclipse の メニューから「Window」→「Show View」→「Others]を選択します。
「Show View」に「Remote Systems」が表示されない場合は、 メニューの「Help」→「Insall New Software」から「General Purpose Tools」辺りに「Remote System Explorer~」なんとかというのがあるので、これをインストールして下さい。
追加された「Remote System Details」ビューで右クリックして表示されるプルダウンメニューから「
New Connection」を選択します。
「SSH Only」を選択して「Next」ボタンで進みます。
接続先のRaspberry Pi のIPアドレスを 「Host name:」に指定します。「Next」ボタンを数回押して設定を確認して(またはその場で)「Finish」ボタンを押して接続を作成します。
「Remote System Detail」ビューに接続が作成されるので、右クリックして表示されるプルダウンメニューから「Connect」を選択します。
ユーザ名とパスワードを聞かれるので、Raspberry Pi側のユーザ名とパスワードを入力します。デフォルトならユーザ名 pi でパスワードが raspberry です。
「Remote System Details]ビューの接続したRaspberry Pi の行を右クリックして表示される「Show in Remote Systems view」を選択すると、ローカルマシンと接続したリモートのRaspberry Pi の両方をファイル操作できるビューが表示されるので、これを使ってローカル側の実行ファイルをRaspberry Piの適当なフォルダにコピーします。また、同Propertiesでコピーしたファイルのパーミッションも操作できるので、実行可能にしておきます。
右クリックして「Launch Terminal」でターミナル接続も可能ですが、日本語が化けるのと、自分の環境では(Permissionを設定しても)上手く実行できなかったので、とりあえず、Tera Teramで別途実行してみました。
コピーしたディレクトリに移動して
./HelloRaspberryPi
で実行。
無事、Raspberry Pi 上で動作してくれることが確認できました。お疲れ様でした。
いや~、しかし、こちらの解説がなければ、とても自分では出来ません。大変参考になりました。基本的に、ここに記述した内容は全て こちらの手順を自分でやってみた際の写し(作業記録)です。感謝、感謝。
2013年2月17日日曜日
ビュートローバーARMにストリナのコンパスを載せてみた。
前回のビュートローバーARMにストリナのデジタルコンパスを載っけてみました。輪ゴムで固定してますが、まあ、それはおいておいて・・・。
ビューローバーARMに搭載されているCPUボードにはI2Cインタフェースがコネクタに引き出されているので、そこへ配線します。
あとは、ビュートローバーARMのLPCXpress用プロジェクトのIXBusというののサンプルをちょこっといじって、ストリナのコンパスの校正と値取得を行えるようにして、こんな感じ。
はじめに二周回転して、コンパスの校正を行い、その後、コンパスが磁北±10度くらいの範囲を向くように車輪を制御。下に敷いてあるダンボールごと回転させて向きを変えると、向きを元の方向に修正しようとして動きます。
今回のソースはこちらにあります。(Vstoneさんのサンプルに入っていたコードやLPCXpressoのサンプルコードも含まれてしまっているんだど・・・)
ビューローバーARMに搭載されているCPUボードにはI2Cインタフェースがコネクタに引き出されているので、そこへ配線します。
あとは、ビュートローバーARMのLPCXpress用プロジェクトのIXBusというののサンプルをちょこっといじって、ストリナのコンパスの校正と値取得を行えるようにして、こんな感じ。
はじめに二周回転して、コンパスの校正を行い、その後、コンパスが磁北±10度くらいの範囲を向くように車輪を制御。下に敷いてあるダンボールごと回転させて向きを変えると、向きを元の方向に修正しようとして動きます。
今回のソースはこちらにあります。(Vstoneさんのサンプルに入っていたコードやLPCXpressoのサンプルコードも含まれてしまっているんだど・・・)
2013年2月11日月曜日
Vstone ビュートローバー
本日のおもちゃは VstoneのビュートローバーARM です。中学や高校くらいの教材向けとしてのロボットだと思いますが、秋月で部品を探している時にたまたま目に入ったので、思わず買ってしまいました。
パッケージには対象年齢13才以上となっており、本体の組立に関してはドライバとニッパだけでできるように(モータ等はコネクタ付きケーブルがハンダ付けまで作成された状態で入っています)なっています。今回は折角なのでエンコーダのオプション(こちらは基板へのコネクタのハンダ付けが必要)も取り付けることにしました。
パッケージを開けるとこんな感じ、
左側の赤い基板がCPUボード、右上の白い穴あきのがユニバーサルプレートを丸い形にした本体ベース、他にモータ、ボールキャスタ、赤外線センサ等が入っていて、ネジ止めで組み立てられるようになっています。足回り(ギア)は我々(?)の強い味方、みんな大好き、タミヤの楽しい工作シリーズのダブルギアボックスが使われています。
まずは、ギアボックスを組み立てて、
エンコーダオプションを利用するためには、IO拡張基板を使用しますが、この基板にはコネクタのハンダ付けをします。
ギアボックス、タイヤ、ボールキャスタの足回りをベースに取り付けたところ。
赤外線センサ、エンコーダオプションをつけたところ。
エンコーダは両軸モータのシャフトに黒白のローター(2相でるように半分ずれた黒白模様がついています)を付けて、基板にある表面実装の赤外線センサで反射を読み取るようになっているみたいです。
このエンコーダオプションだけまた入手して、ダブルギアボックスと組み合わせて流用すればエンコーダ付きモーターが簡単に構成できそう。
基板、電池ボックスなんかを載せて、コネクタを配線して、組立完了。
さすが、Vstoneさんだけあって、よくできています。これなら、中学・高校の教材としてでも、だれでも組み立てられると思います。しかも、搭載されているCPUボードのVS-WRC103LVというのは、LPC1343をCPUとして採用しているので、開発環境はLPCXpressoでCでのプログラミングも使えて、我々大きなお友達にも十分楽しめる内容じゃないかと思います。
ソフトの方はビューとビルダー2というGUIでブロックチャートでプログラミングできる開発環境もついてくるのですが、自分はLPCXpressoでいきます。Vistonのサポートページからサンプルをダウンロードしてきて、これを書き換えて利用する予定です。
せっかくエンコーダをつけたので、ホイールオドメトリでのデッドレコニングを試してみようと思います。LPC1343なので、I2Cの電子コンパスやジャイロを載せてみるのもいいかも。(思うだけで終わることが多いんだけどねー。)
パッケージには対象年齢13才以上となっており、本体の組立に関してはドライバとニッパだけでできるように(モータ等はコネクタ付きケーブルがハンダ付けまで作成された状態で入っています)なっています。今回は折角なのでエンコーダのオプション(こちらは基板へのコネクタのハンダ付けが必要)も取り付けることにしました。
パッケージを開けるとこんな感じ、
左側の赤い基板がCPUボード、右上の白い穴あきのがユニバーサルプレートを丸い形にした本体ベース、他にモータ、ボールキャスタ、赤外線センサ等が入っていて、ネジ止めで組み立てられるようになっています。足回り(ギア)は我々(?)の強い味方、みんな大好き、タミヤの楽しい工作シリーズのダブルギアボックスが使われています。
まずは、ギアボックスを組み立てて、
エンコーダオプションを利用するためには、IO拡張基板を使用しますが、この基板にはコネクタのハンダ付けをします。
ギアボックス、タイヤ、ボールキャスタの足回りをベースに取り付けたところ。
赤外線センサ、エンコーダオプションをつけたところ。
エンコーダは両軸モータのシャフトに黒白のローター(2相でるように半分ずれた黒白模様がついています)を付けて、基板にある表面実装の赤外線センサで反射を読み取るようになっているみたいです。
このエンコーダオプションだけまた入手して、ダブルギアボックスと組み合わせて流用すればエンコーダ付きモーターが簡単に構成できそう。
基板、電池ボックスなんかを載せて、コネクタを配線して、組立完了。
さすが、Vstoneさんだけあって、よくできています。これなら、中学・高校の教材としてでも、だれでも組み立てられると思います。しかも、搭載されているCPUボードのVS-WRC103LVというのは、LPC1343をCPUとして採用しているので、開発環境はLPCXpressoでCでのプログラミングも使えて、我々大きなお友達にも十分楽しめる内容じゃないかと思います。
ソフトの方はビューとビルダー2というGUIでブロックチャートでプログラミングできる開発環境もついてくるのですが、自分はLPCXpressoでいきます。Vistonのサポートページからサンプルをダウンロードしてきて、これを書き換えて利用する予定です。
せっかくエンコーダをつけたので、ホイールオドメトリでのデッドレコニングを試してみようと思います。LPC1343なので、I2Cの電子コンパスやジャイロを載せてみるのもいいかも。(思うだけで終わることが多いんだけどねー。)
2013年2月5日火曜日
Raspberry Pi 無線LAN
今回は、Raspberry Pi の無線LAN化です。いまさら感はありますが、実は以前にDebianで動くUSBで無線LANのドングルでいけるだろうと試したことがあったんですが、/etc/network/interfaces を試行錯誤していじっているうちに有線LANまで繋がらなくなって、テレビとキーボードにつないで設定を元に戻したりと、面倒な思いをして諦めた経緯がありました。
で、昨年末に届いた新しいRaspberry Pi はUSB給電のポリスイッチが廃止されたのと(以前はUSBハブを間にかました)、最近のOSイメージではGUIの無線LAN設定ツールがデスクトップに用意されていたので、これなら、失敗しないだろうということで、試してみました。
GUIでの設定でも、設定ファイルでの設定でも Googleで「Raspberry Pi 無線LAN」で検索 してもらえば、色々な方がNow-Howや経験談を公開してくれていますので、それらを幾つか眺めて、参考にさせてもらいましたが、今回は(以前失敗した時と違って)GUIで簡単に設定できました。
使った無線LANのUSBアダプタは PLANEXのGW-USValue-EZ というやつです。何かの時に購入して、余っていたもので、以前、前述の失敗をしたものです。とりあえず、USBに直挿しして、lsusb してみると
ちゃんとデバイスが認識されています。GUIのデスクトップにある「WiFi Config」を使うと、
Windows なんかで設定しているような感覚でらくちん設定できます。自分の環境では、これだけで有線LANケーブルを外しても、無線LAN経由でリモート接続して使える状態になりました。
いや、簡単。以前、手間取って失敗したのは何だったんだろう。まあ、これで遅ればせながら、Raspberry Pi を線から解き放つことができたわけです。
モバイルバッテリで駆動させて、無線LANでリモート接続できることを確認。
で、昨年末に届いた新しいRaspberry Pi はUSB給電のポリスイッチが廃止されたのと(以前はUSBハブを間にかました)、最近のOSイメージではGUIの無線LAN設定ツールがデスクトップに用意されていたので、これなら、失敗しないだろうということで、試してみました。
GUIでの設定でも、設定ファイルでの設定でも Googleで「Raspberry Pi 無線LAN」で検索 してもらえば、色々な方がNow-Howや経験談を公開してくれていますので、それらを幾つか眺めて、参考にさせてもらいましたが、今回は(以前失敗した時と違って)GUIで簡単に設定できました。
使った無線LANのUSBアダプタは PLANEXのGW-USValue-EZ というやつです。何かの時に購入して、余っていたもので、以前、前述の失敗をしたものです。とりあえず、USBに直挿しして、lsusb してみると
ちゃんとデバイスが認識されています。GUIのデスクトップにある「WiFi Config」を使うと、
Windows なんかで設定しているような感覚でらくちん設定できます。自分の環境では、これだけで有線LANケーブルを外しても、無線LAN経由でリモート接続して使える状態になりました。
いや、簡単。以前、手間取って失敗したのは何だったんだろう。まあ、これで遅ればせながら、Raspberry Pi を線から解き放つことができたわけです。
モバイルバッテリで駆動させて、無線LANでリモート接続できることを確認。
2013年2月3日日曜日
Raspberry Pi で Grove I2c Motor Driver
前回の Grove I2C Motor Driver を Raspberry Pi で動かしてみました。この Grove I2C Motor Dirver はMotor Driverのボードに6V以上のモータ用電源を供給することで、ロジック用の電源もそこから生成(外部から供給でない)するので、3.3Vでは使えません。むしろ、自分の所で作った5Vを外部に供給するっていう、いらないんだけど・・・っていう仕様です。
そこで、3.3VのRaspbery Pi の IOと接続するために秋月のレベル変換モジュールを間にかませます。Motor Driver側はさっき余計だって言った5Vがちょうど使えます。この5VをVCC、あとはSDAとSCLとGNDを接続します。変換モジュールのOEを5Vに吊っておきます。Raspberry Pi がわも3.3VとSDA、SCL、GNDを接続して、実験開始。
Raspberry Pi 側の配線はこんなかんじですが、GPIOの端子に関しては、こちらがリファレンス。
で、まあ、動いたことは動いたんですが・・・
動くことは動くんですが、エラーが返ってきます。
ACKが帰ってこない(NAK応答)とかでしょうか。この辺は今度時間のあるときにバスアナというかロジアナを引っ張り出してきて調べてみようと思います。そういえば、以前、プルアップ抵抗を余計に付けたら動かなかったみたいなこともあったし、Arduinoと比べるとシビア(っていうか、Arduinoはプルアップ抵抗入れ忘れても動くし、デバイスに内蔵しているところに並列に余計に入れても駆動しちゃうような心の広さ?があるんだよね)なんでしょうか。
そこで、3.3VのRaspbery Pi の IOと接続するために秋月のレベル変換モジュールを間にかませます。Motor Driver側はさっき余計だって言った5Vがちょうど使えます。この5VをVCC、あとはSDAとSCLとGNDを接続します。変換モジュールのOEを5Vに吊っておきます。Raspberry Pi がわも3.3VとSDA、SCL、GNDを接続して、実験開始。
Raspberry Pi 側の配線はこんなかんじですが、GPIOの端子に関しては、こちらがリファレンス。
で、まあ、動いたことは動いたんですが・・・
動くことは動くんですが、エラーが返ってきます。
ACKが帰ってこない(NAK応答)とかでしょうか。この辺は今度時間のあるときにバスアナというかロジアナを引っ張り出してきて調べてみようと思います。そういえば、以前、プルアップ抵抗を余計に付けたら動かなかったみたいなこともあったし、Arduinoと比べるとシビア(っていうか、Arduinoはプルアップ抵抗入れ忘れても動くし、デバイスに内蔵しているところに並列に余計に入れても駆動しちゃうような心の広さ?があるんだよね)なんでしょうか。
#include <stdio.h> #include <stdlib.h> #include <linux/i2c-dev.h> #include <fcntl.h> #include <string.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <wiringPi.h> // Grove I2C MotorDriver レジスタ定義。 #define SET_PWM_AB (0x82) #define SET_FREQ (0x84) #define CHG_ADDR (0x83) #define CHANEL_SET (0xaa) #define MOTOR1_SPD (0xa1) #define MOTOR2_SPD (0xa5) // Grove I2C MotorDriver アドレス。 static unsigned char MOTOR_DRIVER_ADDRESS = 0x28; char *i2cFileName = "/dev/i2c-1"; // I2Cポートのファイル名。 //char *i2cFileName = "/dev/i2c-0"; // 初期ロットは i2c-0 だった。 // 関数プロトタイプ。 void setMotor(unsigned char motor_no, unsigned char direction, unsigned char speed); void setMotorSpeed(int motor_no, int speed); int main(int argc, char **argv) { printf("***** Grove I2C Motor Driver test *****\n"); // モータドライブテスト。 setMotorSpeed(1, 40); setMotorSpeed(2, -40); delay(10000); setMotorSpeed(1, 0); setMotorSpeed(2, 0); return 0; } void setMotor(unsigned char motor_no, unsigned char direction, unsigned char speed) { int fd; // ファイルディスクリプタ unsigned char buf[10]; int address = (int)MOTOR_DRIVER_ADDRESS; // デバイスアドレス。 // I2CポートをRead/Write属性でオープン。 if ((fd = open(i2cFileName, O_RDWR)) < 0) { printf("Failed to open i2c port\n"); exit(1); } // ポートオプションと通信先デバイスアドレスの設定。 if (ioctl(fd, I2C_SLAVE, address) < 0) { printf("Unable to get bus access to talk to slave\n"); exit(1); } // モータNo, 方向, 速さの順に送出。 buf[0] = motor_no; buf[1] = direction; buf[2] = speed; if ((write(fd, buf, 3)) != 3) { printf("Error writing to i2c slave\n"); // 現時点ではコマンドはMotorDriver側で処理されるが、 // エラーとなるので、エラー処理をコメントアウトしている。 // ACKが返っていない(NAKが返っている)? // 後日、バスアナで調査。 //close(fd); //exit(1); } close(fd); } void setMotorSpeed(int motor_no, int speed) { unsigned char spd; unsigned char dir; if ((motor_no < 1) && (motor_no > 2)) return; if (speed < 0) { dir = 2; spd = (unsigned char)(-speed); } else { dir = 1; spd = (unsigned char)speed; } if (motor_no == 1) { setMotor(MOTOR1_SPD, dir, spd); } else { setMotor(MOTOR2_SPD, dir, spd); } }
2013年2月2日土曜日
Grove I2C Motor Driver
今回のがらくたは seeedのGrove system の I2C Motor Driver です。seeedのGrove system は色々なセンサ等のモジュールがあって、面白いんですが、使われているコネクタが 2mm ピッチのモノなのがいただけません。専用シールドを使うか、変換ケーブル で2.54mmに変換してやらないといけないのがちょっと残念なんですが。で、この I2C Motor Driver は、モータドライバ(L298)とAtmelのマイコンがボード上に載っていて、外部からI2Cのコマンド送信でコントロールできるので、各種マイコンからモータを制御するのに便利かなと思い、試してみることにしました。しかし、仕様や回路図を見て気がついたのですが、このボードは5Vロジック専用のようで、mbedやRaspberry Pi等で使用するには5V-3.3V変換をかまさないとダメそうです。モータドライブ用電源とロジック電源は切り離されていて、5Vといいつつも3.3Vをロジックに供給しても、まあ、動くだろうと思っていたんですが、このボードはなんと、モータドライブ用に6V以上の電源を供給し、そこからロジック電源5Vを三端子で勝手に作って動くようになっているため、3.3V系とインタフェースするには変換が必要になります。
とりあえずは、5V動作のArduino Uno で動作確認。
#include <Arduino.h> #include <Wire.h> // Grove I2C MotorDriver レジスタ #define SET_PWM_AB 0x82 #define SET_FREQ 0x84 #define CHG_ADDR 0x83 #define CHANEL_SET 0xaa #define MOTOR1_SPD 0xa1 #define MOTOR2_SPD 0xa5 // Grove I2C MotorDriver アドレス static unsigned char MOTOR_DRIVER_ADDR = 0x28; // 通信終端文字コード定義。 static char CHAR_CR = 0x0d; static char CHAR_LF = 0x0a; // グローバル変数定義。 byte rcvChar; byte rcvBuf[64]; int rcvCnt; boolean isRcvCmd; void setMotor(unsigned char mortor_no, unsigned char direction, unsigned char speed) { Wire.beginTransmission(MOTOR_DRIVER_ADDR); Wire.write(mortor_no); Wire.write(direction); Wire.write(speed); Wire.endTransmission(); } void setMotorSpeed(int motor_no, int speed) { unsigned char spd; unsigned char dir; if(( motor_no < 1) && (motor_no > 2)) return; if (speed < 0) { dir = 2; spd = (unsigned char)(-speed); } else { dir = 1; spd = (unsigned char)speed; } if (motor_no == 1) { setMotor(MOTOR1_SPD, dir, spd); } else { setMotor(MOTOR2_SPD, dir, spd); } } void setup() { Serial.begin(115200); Wire.begin(); delayMicroseconds(10); Serial.println("Start..."); setMotorSpeed(1, 40); setMotorSpeed(2, -40); delay(10000); setMotorSpeed(1, 0); setMotorSpeed(2, 0); } void loop() { // シリアル受信処理。受信バッファにデータがあれば、 if (Serial.available() > 0) { /// 1文字読み込み。 rcvChar = Serial.read(); if (rcvCnt == 0 && rcvChar == 0x80) { rcvBuf[0] = rcvChar; for (int i = 1; i < 8; i++) { rcvBuf[i] = Serial.read(); rcvCnt++; } isRcvCmd = true; } } // シリアル受信処理、ここまで。 // コマンド処理部。 if (isRcvCmd) { isRcvCmd = false; rcvCnt = 0; int motor1_speed = 0; int motor2_speed = 0; byte V123 = rcvBuf[4]; byte V125 = rcvBuf[6]; motor1_speed = (64 - (int)V123) * 2; motor2_speed = (64 - (int)V125) * 2; setMotorSpeed(1, motor1_speed); setMotorSpeed(2, motor2_speed); } }