KR260とゲームコントローラを使って、DCモータを制御してみました。
ワイヤレスで遠隔からKR260のロボットを制御できるようになりました。
Pyhtonでロボットのアクチュエータを動かす旨を紹介します
KR260のロボットをゲームコントローラから制御する
ゲームコントローラからKR260のロボットを動かしてみました。
将来は自動制御しますが、アクチュエータの動作確認用のテストを行っています。
ワイヤレスのゲームコントローラーを使うことで遠隔制御しています。
DCモータをロボットのアクチュエータとして使用しています
自作のモータドライバ基板に、KR260のPWMやGPIOを送ることで制御しています。
ゲームコントローラーのスティックを動かすことで、ロボットカーのタイヤを動かしています。
PWMによりモータ回転数を制御をしています。
ボタンを押すことで、GPIOからロボットアームの動かしています。
プログラム・コントローラの詳細について紹介していきます。
ワイヤレス ゲームコントローラー
ワイヤレスのゲームコントローラーを使いました。
エレコム ワイヤレス ゲームパッド JC-U4113SBK です。
PC用ですが、KR260にも問題なく使えました。
inputsのインストール
今回KR260のPYNQ、つまりPythonで制御していきます。
ゲームコントローラーのライブラリはinputsを使用しました。
ディスプレイ・GUIがない状態でも動かせるようにしたいためです。
1 |
pip install inputs |
実際に動かしたプログラム(.ipynb)は下記のGitHubに置いています。
この記事では、inputsに関連する箇所をメインに紹介します。
最初にゲームコントローラがいるかを確認させています。
1 2 3 4 5 6 7 |
from inputs import devices # Retrieve the gamepad device gamepads = devices.gamepads print(gamepads) if not gamepads: raise ValueError("No gamepad found.") |
ロボットのタイヤモータ箇所です。
コントローラのスティックの押し込み量で、PWMの出力を制御できるようにしました。
押し込み量を8つのセグメントに分割して、正転反転・PWMの出力を切り替えています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#Left(B)-motor_set def control_motor_based_on_joy_ly(joy_ly): # Control motor based on joy_ly value divided into 8 segments if 0 <= joy_ly < 32: # Segment 1 set_motor_B_pwm(99, 'forward') elif 32 <= joy_ly < 64: # Segment 2 set_motor_B_pwm(50, 'forward') elif 64 <= joy_ly < 96: # Segment 3 set_motor_B_pwm(10, 'forward') elif 96 <= joy_ly < 128: # Segment 4 set_motor_B_pwm(0, 'coast') # Consider this as neutral or coast elif 128 <= joy_ly < 160: # Segment 5 set_motor_B_pwm(0, 'coast') # Consider this as neutral or coast elif 160 <= joy_ly < 192: # Segment 6 set_motor_B_pwm(10, 'reverse') elif 192 <= joy_ly < 224: # Segment 7 set_motor_B_pwm(50, 'reverse') elif 224 <= joy_ly <= 255: # Segment 8 set_motor_B_pwm(99, 'reverse') |
ロボットのアーム箇所です。
KR260に設定した、GPIOのレジスタを叩いてモータを動かしています。
指定の時間分GPIOをONするようにしています。
1 2 3 4 |
def control_motor_based_on_arm_f(h_time): gpio_out.write(0x27,mask) #arm_forward time.sleep(h_time) # Wait gpio_out.write(0x07,mask) #arm_free |
実際にコントローラからモータ制御したメインプログラム箇所です。
コントローラの入力に反応して、タイヤの左右両モータ、アームのモータに制御指示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
from inputs import get_gamepad # Loop to monitor joystick input and control the motor based on it try: while True: events = get_gamepad() for event in events: if event.ev_type == 'Absolute' and event.code == 'ABS_Y': #Left(B)-motor print(event.state) print(event.code) joy_ly = int(event.state) control_motor_based_on_joy_ly(joy_ly) elif event.ev_type == 'Absolute' and event.code == 'ABS_Z': #Right(A)-motor print(event.state) print(event.code) joy_ry = int(event.state) control_motor_based_on_joy_ry(joy_ry) elif event.code == 'BTN_C': print(event.code) control_motor_based_on_arm_f(0.3) elif event.code == 'BTN_EAST': print(event.code) control_motor_based_on_arm_r(0.3) except KeyboardInterrupt: gpio_out.write(0x00,mask) #Blue_led_off + 2*motor_driver_disenable print("Exiting program.") |
LEDをゲームコントローラから制御する
最初からモータ制御するのが不安だったため、LEDでテストしました。
またLEDだとPWMのdutyが見えて、制御できているか確認しやすいためです。
動画で紹介しています。スティックの押し込みでLEDのPWMが変わることが分かります。
KR260のPMODコネクタに接続したのは自作のLED基板です。
下記GitHubで紹介しています。
https://github.com/iotengineer22/PCB-KV260-PMOD-TEST
KR260のPYNQで動かしています。
GPIOやPWMを実装したFPGAの.bitファイルをロードして実行しています。
スティックの押し込み量でLEDの輝度(PWM)を制御できています。
左側のLED基板でPWMを確認しています。
ボタンを押すことで、GPIOのLEDも制御できています。
右側のLED基板でGPIOを確認しています。
モータをゲームコントローラから制御する
LEDで動作確認出来ましたので、モータ制御を行います。
タイヤのギアボックスやアームの機構については下記記事を参照ください。

DCモータを制御する際に使用した、自作のモータドライバ基板のデータは下記です。
https://github.com/iotengineer22/PCB-DRV8833-TEST
冒頭でも紹介しましたが、動画でも紹介しています。
使用しているプログラム、読み込んでいる.bitファイルはLEDの時と一緒です。
今回はLEDではなく、(モータドライバ経由で)DCモータを制御します。
左スティックを上下させて、左のタイヤモータをPWMで制御させています。
右スティックでも同様に、右のタイヤモータを制御しています。
ボタンを押すことで、アームのDCモータも制御できていることが分かります。
まとめ
KR260とゲームコントローラを使って、DCモータを制御してみました。
ワイヤレスで遠隔からKR260のロボットを制御できるようになりました。
今回のKR260で実施した内容は、下記記事で紹介したテストの一部です。

コメント