2015年5月5日火曜日

BeagleBone Black モーター制御

初モーターです。


使用した部品

・タミヤ:ツインモーターギアボックス
・タミヤ:ユニバーサルプレート(2枚セット)
 ⇒ 3階建てにしたので、同じものをもう1つ購入した
・タミヤ:トラック&ホイールセット
・モータードライバ:TA7291P x 2
・エネループ単三4本(モーター用、VS接続)
・電解コンデンサ:10uF(容量はTA7291Pマニュアル通り)
・モーターの両端に0.1uFを追加したほうがいい

回路図

・モーター1個につき、GPIOを2つ、PWMを1つ使用
 ⇒ GPIO(IN)にPWMを使う方法もあるが、PWMの数に制限があるのでVrefにPWMを使う
・図はモーター1個分、同じものをもう1個分必要
・モーター電源は2つのモーター共通でエネループ4本(約4.8V)を使用
・図のUSBシリアル変換はモーターとは関係ない



mjpg-streamer


・BBBの制御は mjpg-streamer を改造して使う
・mjpg-streamer は下記の r182 が最新、だと思う
 ⇒ http://sourceforge.net/projects/mjpg-streamer/

・www 下の stream_simple.html を HTML5化、jQueryMobile を使って改造して使用する
・mjpg-streamer には UI からコマンドを送る仕組みが用意されてるのでそれを使う
・jQueryMobile で使用する部品は、ボタンとチルトパン用のスライダー
・スマホ、タブレットでは onmousedown、onmouseup の代わりに、ontouchstart、ontouchend を使う
・具体的には、output_httpプラグインにモーター、サーボの制御を書く
・ボタンやスライダーを操作したとき、マルチスレッドでコマンドがたくさん送られてくるので排他制御を入れること
 ⇒ スライダーをドラッグするとたくさんのコマンドが送られてきてスムーズに動かない(小刻みに右左に動く)
 ⇒ 排他制御中は、現在の値と設定中の角度へのコマンドは無視するようにすると落ち着いた
・カメラは手持ちの Webcam Pro 9000 をばらして、カメラマウンタにゴムで仮止め
 ⇒ ほんとはカメラモジュールを使いたかったけど、高いし、配線が多くなる。。
 ⇒ RaspberryPi ならカメラモジュールあるけど、PWMを4つ使う(モーターに2つ、サーボに2つ)のに、1ポートしかないのが致命的、SoftPWMもあるらしいけど、10us単位の精度は出ないはず
 ⇒ USB接続のカメラモジュールで安くてHDなものがあれば。。


感想

・モーターは特に苦労もなく、簡単に回る回る
・キャタピラが1番苦労した、、絨毯の上を走行してると、曲がろうとするとすぐにキャタピラが外れる
 ⇒ フローリングしかまともに走らない
・ユニバーサルプレートの下段に、ツインギアボックスとエネループ4本の電池ボックスを載せた
 ⇒ 電池ボックスの穴とプレートの穴が微妙に合わず、プレートの穴をヤスリで削って調整
・モータードライバのブレッドボードが場所を取るので基板化が必要
・残りはUSBハブ(セルフパワー)の電源をモバイル電源から取るようにすれば一通り完成
・その後は、測距、加速度、ジャイロなどのセンサーを載せたり、OpenCVで自律走行させたりの予定



参考にしたサイト

http://nonbirikousaku.blog.fc2.com/blog-category-3.html

2015年5月4日月曜日

BeagleBone Black サーボ制御

初サーボ。



サーボスペック

・Tower Pro製 マイクロサーボ SG90
・SG90サーボ用 ミニ2軸 カメラマウント A838

茶色の線:GND
 ⇒ BBBのGNDを接続
赤色の線:5V(4.8~5V)
 ⇒ BBBの5Vを接続
橙色の線:制御線
 ⇒ BBBのPWMを接続

周期:20ms(50Hz)
H期間:500us~2400us
 ⇒ H期間の時間で0度から180度ぐらいでサーボが動作する

課題

・モーター制御のVref(速度制御)にPWMをモータ毎に1つずつ使う(計2個使用)
・サーボをモーターと同時に使用する場合、さらにPWMが2つ(チルトとパン)必要(計4個使用)
・BBBにはPWMは8チャネル?あるが、独立して周期、デューティが設定できるのは5つ
 ⇒ eCAP0、eCAP2、eHRPWM0、eHRPWM1、eHRPWM2
 ⇒ eHRPWMのAとBは同時に使うと周期を動的には変更できない
 ⇒ 普通に使うと、500us でしか使えない
・このうち、eCAP2とeHRPWM2はシステムを変更しないと使えない(uEnv.txtの変更だけ)
 ⇒ 普通に使えるPWMは3つなので、足りない
・モーター速度制御のVrefに使用するPWMは同じ周期でよい
・チルトとパンで使用するPWMの周期は同じでよい
 ⇒ まずは周期の初期値を変更する方法を探してみる

Device Tree

・デバイスツリーとは?については他のサイト参照。。
・今回使用したファイルは、bone_pwm_P9_16-00A0.dtbo
・デバイスツリーのソースファイルはカーネルをビルドしたツリーの arch/arm/boot/dts にシステム全体のものが入っていて、個別の機能は firmware/capes に入ってる
・bone_pwm_P9_16-00A0.dts を見てみると、fragment@0 にマルチプレクサの設定で、0x06 になっている
 ⇒ モード6(ehrpwm1B_mux1)、出力、プルダウン有効
・fragment@1 に初期値?の設定がある
 ⇒ compatible = "pwm_test"; の行が、カーネルドライバと紐付けされるキーワード
・カーネルソースは、drivers/pwm/pwm_test.c で、読んでみると、pwm_test_probe() で、この初期値を読み込んでいるっぽい
 ⇒ enabled は run のこと、duty はそのままの意味
 ⇒ 正論理or負論理は何やら難しい感じで、
 fragment@1:pwms = <&ehrpwm1 1 500000 1>;
 ドライバ:if (args.args_count >= 3 && (args.args[2] & (1 << 0)) != 0) が真だと負論理っぽい
 ⇒ たぶん、500000 は周期(500us)なので、その後ろの 1 が負論理ということっぽい
 ⇒ 周期の前の 1 は使われてない?
 ⇒ というわけで、pwms = <&ehrpwm1 1 20000000 0>; とすれば、周期20ms、正論理になるはず
・ついでに、PWM出力をデフォルトオフにしておく(enabled を 0 にする)
・dts のコンパイルは dtc で行うが、Ubuntu とかで、apt-get でインストールされる dtc ではなく、BBB専用?の dtc を使用する必要がある(普通の dtc では使えない -@ などのオプションがある)
 ⇒ scripts/dtc/dtc -O dtb -o bone_pwm_P9_16-00A0.dtbo -b 0 -@ bone_pwm_P9_16-00A0.dts
 ⇒ bone_pwm_P9_16-00A0.dtbo が生成される
・変更したdtboを適用する
 ⇒ BBBの/lib/firmwareに上記dtboをコピー
 ⇒ $ sudo su
 ⇒ # echo am33xx_pwm > /sys/devices/bone_capemgr.*/slots
 ⇒ # echo bone_pwm_P9_16 > /sys/devices/bone_capemgr.*/slots
 ⇒ あれ?反映されん。。
 https://jp.linux.com/Linux%20Jp/tutorial/418563-tutorial20140702
 上記サイトを見ると、やっぱり反映されないって書いてる、、
 ⇒ カーネルドライバの変更が必要と書いてる
 http://saadahmad.ca/using-pwm-on-the-beaglebone-black/
 https://randomlinuxhacks.wordpress.com/2014/09/16/changing-pwm-period-on-beaglebone-black/
 ⇒ カーネルドライバのソースをもう少し読む必要あり、カーネル3.18も同じ?
 ⇒ややこしくなってきたので、uEnv.txt を変更して、eCAP2とeHRPWM2を使えるようにしてみる

uEnv.txt

・場所:/boot/uboot/uEnv.txt
・eCAP2とeHRPWM2はシステムで予約されてる、というか、dtbの初期値で他のモードに設定されてて、動的に変更が禁止されてる
・uEnv.txt に HDMI(を含む McASP)を無効にするコードが書かれていてコメントアウトされている
 ⇒ #optargs=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN,BB-BONE-EMMC-2G
 ⇒ 上記のうち、eMMCは無効にせず、HDMIの2つを無効にする
 ⇒ optargs=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
 ⇒ 上記を追加して、再起動すると変更が有効になる、確認方法は、下記を変更前と後で比較すると何が変わったかが分かる
 # cat /sys/kernel/debug/pinctrl/44e10800.pinmux/pins

感想

・200us刻みで動かすと25度ぐらいずつ動く
・カメラのチルトとパンに使うには、動きが速すぎる
 ⇒ 最終的には10us単位で6msのウェイトを入れて動かした



参考にしたサイト

http://denshikousaku.net/control-servos-on-raspberry-pi-part1-rpio



2015年5月1日金曜日

BeagleBone Black

久々のブログ。
最近は、BeagleBone Black でいろいろ遊んでたので、覚書再開。



まずは、スペックと環境。

スペック

Rev C (eMMC 4GB)

ディストリビューション:Ubuntu14.04

http://elinux.org/BeagleBoardUbuntu

・インストール方法は上記サイトそのまま
・今はカーネル3.14のものしか公開されてないみたい
・古いイメージ(カーネル3.8)が欲しいんだけど、入手方法(イメージの作り方?)が不明

カーネルは3.8

http://elinux.org/Building_BBB_Kernel

カーネルイメージの作成方法


クロスコンパイラ取得
$ wget -c https://releases.linaro.org/14.04/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz
$ tar xf gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz
$ export CROSS_COMPILE=/home/kunimune/svn/bbb/download/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-
ソース取得
$ git clone https://github.com/beagleboard/kernel.git
$ cd kernel
バージョンを3.8に
$ git checkout 3.8
パッチ適用
$ ./patch.sh
コンフィグコピー
$ cp configs/beaglebone kernel/arch/arm/configs/beaglebone_defconf
ファームウェア取得
$ git clone git://arago-project.org/git/projects/am33x-cm3.git
ファームウェアをコピー
$ cp ../am33x-cm3/bin/am335x-pm-firmware.bin kernel/firmware/
カーネルビルド
$ make ARCH=arm beaglebone_defconfig
$ make ARCH=arm menuconfig
 ⇒ General setup → Local version に "-XXX" を付与
 ⇒ teeコマンドでログを取っていると失敗するので注意
$ make ARCH=arm uImage dtbs
 ⇒ arch/arm/boot の zImage をBBBにコピー、/boot/ubootにコピー
 ⇒ uEnv.txt を編集して、上記 zImage が起動するように書き換える

モジュールビルド
$ make ARCH=arm modules
$ make ARCH=arm INSTALL_MOD_PATH=../modules modules_install
ファームウェアビルド
$ make ARCH=arm firmware
$ make ARCH=arm INSTALL_MOD_PATH=../modules firmware_install
⇒ modulesディレクトリを固めてBBBにコピー、/lib/modulesに上書きコピー


ひとまず、以上です。