twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル BeagleBone Black でサーボを制御する方法

BeagleBone Black でサーボを制御する方法

原文はこちらです。

servocity gearbox

サーボモーター (日本語Wikipedia)  は、指定角度まで回転させ、抵抗に逆らってその位置を保つ機能を持っています。この機能により、DIY カメラのパン・チルト システムを構築したり、模型飛行機を風の抵抗力に逆らって飛ばしたりする場合、およびロボット開発において一定角度に維持することが必要な個所に使用することができます。本文献では、Linux が動作する BeagleBone Black とサーボモーターを接続し、制御する方法を学びます。
トルク (日本語Wikipedia) 出力のサーボモーターは、BeagleBone Black が供給できる電圧より高い電圧を要求します。そのため、外部電源が必要です。今回は、最低 6V で動作するサーボを使用し、ギア ボックスで回転数を下げ、トルクを得られるようにしました。
外部電源を使うため、BeagleBone Black とは 2 本のピンを使って接続します。制御用に PWM ピン (上図では、白線)、グラウンド ピンは、両電源のグラウンドが共通 (緑線) になるようにします。
BeagleBone Blackは、512M バイト RAM、2G バイトのフラッシュ メモリを搭載した 1GHz の ARM マシンです。大事なことは、2 列のピン ソケットを備えた 2 つのヘッダーを持ち、組み込みプロジェクトに応用可能だということです。一連の BeagleBone Black シリーズで、SPI からチップにアクセスする方法Linux GPIO を通して割り込みを取得する方法を学びました。
 

サーボモーターの原理

サーボモーターには、モーター自体、フィードバック機構、および制御回路が搭載されています。大半のサーボは、稼働範囲に制限があります。たとえば、90、180、360 度です。稼働範囲が限定されているため、モーターをどの角度位置に保持したいかを伝えることで、モーターを制御できます。つまり、稼働制限のないサーボは、回転を続けてしまいます。サーボのフィードバック機構は、サーボの現在位置 (回転角度) を検出するポテンショメーターです。120 度へ移動せよと指示すると、サーボは指定角度まで回転し、その角度で停止します。
サーボには、電源、グラウンド、信号の3 線を接続します。本文献では、Hitec HS-5685MH サーボを使用します。本 Hitec サーボでは、電源線は赤、グラウンド線は黒、信号線は黄です。トルク出力も充分で、6-7.4V の電源で動作します。HS-5685MH のロック、ストール時 (位置保持時) における電力は、6V 供給時で 2A を必要とします。
本サーボは大電力を必要とするので、Arduino や BeagleBone Black から直接電力を供給することは避けるべきです。私は Arudino/BeagleBone Black から独立した外部電源を使用し、BeagleBone Black/Arduino のグラウンドをサーボの電源と接続し、グラウンドを共通にしました。当たり前のことですが、サーボは定格外ですから、5V では動作しませんでした。6V を供給するとサーボはスムースに動作しました。大半のバッテリが、サーボが最大トルクを出力できる最大定格の 7.4V を供給できます。
サーボに回転角度を伝達する方式として、パルス幅変調(PWM) (日本語Wikipedia) を用います。PWM 制御では、20m 秒単位で時分割します。20m 秒のうち 1.5m 秒がハイ (高) 電圧、残りがロー (低) 電圧であるとき、今回使用した Hitec のサーボは、その回転範囲の中心付近に静止します。信号のハイ電圧期間が 1ms のときは、サーボは中心から若干移動します。同じように 2m 秒のとき、サーボはより大きく移動します。
サーボは、複数の角度範囲で動作可能です。Hitec HS-5686MH は 400 度の範囲で動作可能です。ここで、20ms のことを信号ピリオド、信号がハイの期間をデューティ期間と呼びます。
高トルクと引き換えに回転数 (RPM) は低くなります。上記のイメージは、サーボ用歯車ボックスにマウントされています。さらに、それが Actobotics アルミニウム チャネルにマウントされています。合金ギアを 1 回転させるために、サーボギアは何回転もさせる必要があります。
サーボ制御機構を簡素化するために、フィードバック機構をサーボから金属ギアに移動します。こうして金属ギアを 360 度回転させるために、サーボは何回転もする必要があります。360 度回転を何回もできるサーボを使う必要があるわけです。サーボには、ストッパーで 360 度回転できないようにしているものがあります。フィードバック機構を移動させたことで、サーボが理解する PWM と同じやり方で、金属ギアの移動角度を制御することができます。
 

Arduino を使って制御する

いままでと同様、まず Arduino を使ってハードウェア制御を練習し、つづいて Arduino を BeagleBone Black で置き換えます。いままでの説明では、ミリ秒 (ms) が単位でしたが、プログラム開発では、ミリ秒とマイクロ秒を混同しないようにマイクロ秒を使うほうが良いでしょう。以下のプログラムは、Hitec HS-5685MH サーボを 360 度回転させます。最初の 20ms (20,000 マイクロ秒) ブロックには、ハイ電圧期間が 800 マイクロ秒だけあります。これを 20,000 マイクロ秒中 2,400 マイクロ秒まで増加します。

void setup()
{
    pinMode(5, OUTPUT);
    digitalWrite(5, LOW);
}
int periodTimeSlice = 20 * 1000;
int minPulseTimeSlice = 800;
int maxPulseTimeSlice = 2400;
int TimeDelta = 1;
void loop()
{
    int c = minPulseTimeSlice;
    for( c = minPulseTimeSlice; c <= maxPulseTimeSlice; c += TimeDelta )
    {
        digitalWrite(5, HIGH);
        delayMicroseconds( c );
        digitalWrite(5, LOW);
        delayMicroseconds( periodTimeSlice - c );
    }  
    for( c = maxPulseTimeSlice; c >= minPulseTimeSlice; c -= TimeDelta )
    {
        digitalWrite(5, HIGH);
        delayMicroseconds( c );
        digitalWrite(5, LOW);
        delayMicroseconds( periodTimeSlice - c );
    }  
}

 Arduino のサーボ用ライブラリは、もっと使いやすいインタフェースを提供しています。上記のコードは、特定の PWM ハードウエアを前提とせずに低レベルで開発してあるので、PWM の出力がどうなるかわかりやすいものになっています。
 

Linux と BeagleBone Blackで制御する

HS-422 と BeagleBone Black を用いてテストを始めました。HS-422 は低電圧で動作するため、BeagleBone Black の 5V 出力を直接サーボに供給することにしました。最初、Kernelのドキュメントに書かれているように /sys/class/pwm を使おうとしましたが、見つからなかったので、/lib/firmware 内のデバイス ツリー オーバーレイを使うことにしました。
同一チップで制御している 2 つの PWM 出力の信号ピリオドを変更することはできません。ピリオド ファイルへの書き込み時に ”write error: Invalid argument” メッセージが出ます。書き込みエラーが出たら、他の PWM オーバーレイを停止して、PWM チップをひとつだけ使用します。本文献の最後に、オーバーレイ停止の方法を書いておきます。標準のピリオドは、500,000 ナノ秒 (0.5ミリ秒) でサーボ制御には短すぎます。
最初に考えたのは、第一 PWM チップに繋がるヘッダー 9 にあるピン 22 を使うことでした。しかし、このオーバーレイは SPI バスのオーバーレイとぶつかるため、下に示すように使用できませんでした。つまり、特定のピンが既にオーバーレイを使用しているため、デバイス ツリー オーバーレイが使用できないものがあります。ピン 9-16 の PWM 用のオーバーレイは、他とぶつからないで使用できます。
PWM 出力を許可する前に、デフォルト値の 1 つが動作状態になっていることに気をつけてください。まず始めに、pwm_test_P9_16 に素早く移動して、PWM 出力を禁止します。私は、dts ファイルを変更して、PWM インタフェースが出力を反転することなく非稼働状態から開始するよう、Linux カーネルに指示しました。しかし、これらのやり方では、デフォルト値を何ら変更できませんでした。

root@beaglebone:/lib/firmware# uname -a
Linux beaglebone 3.8.13 #1 SMP Thu Sep 12 10:27:06 CEST 2013 armv7l GNU/Linux
root@beaglebone:/lib/firmware# echo bone_pwm_P9_22 > /sys/devices/bone_capemgr*/slots
-bash: echo: write error: File exists
root@beaglebone:/lib/firmware# dmesg | tail
[ 4510.813900] bone-capemgr bone_capemgr.9: part_number 'bone_pwm_P9_22', version 'N/A'
[ 4510.814095] bone-capemgr bone_capemgr.9: slot #30: generic override
[ 4510.814353] bone-capemgr bone_capemgr.9: bone: Using override eeprom data at slot 30
[ 4510.814412] bone-capemgr bone_capemgr.9: slot #30: 'Override Board Name,00A0,Override Manuf,bone_pwm_P9_22'
[ 4510.818521] bone-capemgr bone_capemgr.9: slot #30: Requesting part number/version based 'bone_pwm_P9_22-00A0.dtbo
[ 4510.818589] bone-capemgr bone_capemgr.9: slot #30: Requesting firmware 'bone_pwm_P9_22-00A0.dtbo' for board-name 'Override Board Name', version '00A0'
[ 4510.818654] bone-capemgr bone_capemgr.9: slot #30: dtbo 'bone_pwm_P9_22-00A0.dtbo' loaded; converting to live tree
[ 4510.819308] bone-capemgr bone_capemgr.9: slot #30: bone_pwm_P9_22 conflict P9.22 (#9:BB-SPIDEV0)
[ 4510.828819] bone-capemgr bone_capemgr.9: slot #30: Failed verification
root@beaglebone:/lib/firmware# echo bone_pwm_P9_16 > /sys/devices/bone_capemgr*/slots
# cat /sys/devices/bone_capemgr*/slots    
 0: 54:PF--- 
 1: 55:PF--- 
 2: 56:PF--- 
 3: 57:PF--- 
 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
 5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
 6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
 7: ff:P-O-L Override Board Name,00A0,Override Manuf,cape-bone-iio
 8: ff:P-O-L Override Board Name,00A0,Override Manuf,am33xx_pwm
 9: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-SPIDEV0
10: ff:P-O-L Override Board Name,00A0,Override Manuf,gpio-P9.12
11: ff:P-O-L Override Board Name,00A0,Override Manuf,gpio-P9.15
12: ff:P-O-L Override Board Name,00A0,Override Manuf,gpio-P9.23
14: ff:P-O-L Override Board Name,00A0,Override Manuf,gpio-P9.26
15: ff:P-O-L Override Board Name,00A0,Override Manuf,gpio-P9.27
29: ff:P-O-L Override Board Name,00A0,Override Manuf,bone_pwm_P9_16

 pwm_test_P9_16 ディレクトリができたら、移動して、run ファイルに 0 をセットします。PWM に関する構成をしている間、出力を禁止します。下記では、ピリオドを 20m 秒、デューティを 1m 秒に設定しました。出力を再開すると、サーボは左側へ回転します。デューティを 2m 秒にすると、サーボは中心から右へ回転します。

root@beaglebone:# cd /sys/devices/ocp.3/pwm_test_P9_16.*
# echo 0 >run
# cat period 
500000
# cat duty 
0
# cat polarity 
1
# echo 0 > polarity 
# echo 20000000 > period 
# echo 1000000 > duty 
# echo 1 >run
# echo 2000000 > duty 
# echo 0 >run

 HS-422 をチャネルマウントサーボギアボックスに置き換えました。サーボを 6V の外部電源に接続、グラウンドを外部電源のグラウンドに接続しました。1m 秒から 2m 秒のパルスを使って、360 度の移動を行えることがわかりました。最短のパルスは 880,000 ナノ秒、最長 2,200,000 ナノ秒です。この範囲外の出力を与えると、サーボは一定位置に静止せずに、回転を継続します。
PWM 用のオーバーレイを削除するときは、まずスロット ファイルを確認します。削除したいスロット番号を確認して、-1* スロット番号をスロット ファイルに書き込みます。次に例を示します。

root@beaglebone:/lib/firmware# echo bone_pwm_P9_16 > /sys/devices/bone_capemgr*/slots
# cat /sys/devices/bone_capemgr*/slots    
 0: 54:PF--- 
 1: 55:PF--- 
 2: 56:PF--- 
 3: 57:PF--- 
 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
 5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
 6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
 7: ff:P-O-L Override Board Name,00A0,Override Manuf,cape-bone-iio
 8: ff:P-O-L Override Board Name,00A0,Override Manuf,am33xx_pwm
...
15: ff:P-O-L Override Board Name,00A0,Override Manuf,gpio-P9.27
29: ff:P-O-L Override Board Name,00A0,Override Manuf,bone_pwm_P9_16
root@beaglebone:/lib/firmware# echo -29 > /sys/devices/bone_capemgr*/slots

Beagle Bone Black では、ハードウエア制御の重要な部分にデバイス ツリーが関わっています。構成によって、ピンを複数の目的に使用可能な SoC では、デバイス オーバーレイを使うことによって、使用済みのピンを誤って別の目的に使用するという間違いを防げます。PWM ディレクトリが /sys/devices/ocp.3 に設定できれば、BeagleBone Black からサーボを制御することは、ファイルへの書き込みと同様簡単になります。今度は、Bonescript を利用して、ギア モーターを制御してロボットを動かしたいと思います。

 最後に、機材を提供くださった ServoCity に感謝します。

Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ

  1. Today's Linux 2018/01/10 2018年 1月 09日
  2. Today's Linux 2018/01/12 2018年 1月 11日
  3. Today's Linux 2018/01/15 2018年 1月 14日
  4. Today's Linux 2018/01/16 2018年 1月 15日
  5. Today's Linux 2018/01/17 2018年 1月 16日

Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!