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



0 件のコメント:

コメントを投稿