サーボスペック
・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のウェイトを入れて動かした
0 件のコメント:
コメントを投稿