平石研究室

脳波を利用したハンドロボット制御に関する研究
S18174 橋本 昂典
１. はじめに本研究では，脳波を利用してハンドロボット制御を行う．被験者が手を動かしている間の脳波を計測し，その脳波データを機械学習の手法を用いて分類し，手の動きを判別する．その結果からハンドロボット制御を行い，どの程度行えるかを明らかにする．手の動きとは，以下の 4 種類の形へ手を動かすことである．全ての指を曲げた“ぐう”の形，親指のみを伸ばした形，人差し指と中指のみを伸ばした“ちょき”の形，全ての指を伸ばした“ぱあ”の形である．
本研究では，その準備段階としてハンドロボッ
トの環境構築と制御プログラムの作成を行った．
２. 開発環境と使用機材
本研究ではハードウェアとして Raspberry Pi 4を使用した．OS は Raspbian を使用した．使用
言語は python を用い，統合開発環境は Thonnyを使用した．
以下に紹介する機材は全て Hiwonder 社製の物である．ハンドロボットは uHandPi（図 1）を使用した．

御するための拡張ボードが Raspberry Pi 4 に取り付けられている．これを用いることにより，サーボモータを簡単に制御することができる．
３. デューティー比について
デューティー比とはパルス幅を周期で割った値であり，これを用いてサーボモータを制御する[1][2]．パルスの周期を“T”，パルスの High の時間を“H”とすると，デューティー比は次の式(1)のように求められる．
デューティー比[%] = ( H / T ) × 100(1)

３．１ デューティー比の計算
周波数は 50Hz としているため，周期を求めると，1/50 = 0.02[T]，つまり 20ms になる．サーボモータの制御パルス幅は 0.5ms ~ 2.5ms であるた
め [3] ， こ れ を デ ュ ー テ ィ ー 比 に 変 換 す る と
0.5/20×100 ~ 2.5/20×100 つまり 2.5% ~ 12.5%となり[4]，角度と対応させると，デューティー比が2.5%の−90°，12.5%の時 90°となる．それぞれの値とサーボモータの動きを図に表すと以下の（図2）ようになる[5]．

図2

サーボモータの動きと関係する値（上から角度，パルス幅，デューティー比）

また，ハンドロボットのサーボモータはプラス方向に動かすと指を伸ばし，マイナス方向に動かせば指を曲げる仕組みになっている．
図1

使用したハンドロボット

5 つのサーボモータが内蔵されており，指を別々に動かすことができる．また，サーボモータを制

３．２ 角度からデューティーへの計算プログラム内では動かす角度を 90°などと度数で示すが，この値をデューティー比へ変換する必要がある．角度からデューティー比を求めるには次の式(2)を用いる[4]．
デューティー比 = 2.5 + (12.5 − 2.5) *(回転する角度 + 90) / 180

(2)

つまり，
「デューティー比 = 最低値 + (最大値– 最低値) * (回転する角度 + 90) / 180」 となる．
この式を用い，回転する角度がデューティー比の2.5% ~ 12.5%の間のいくつに値するかを求める．
４. Python による実装
プログラムの概要について説明する．まず初期設定を記述し，それぞれの手の形を作る関数（ぐう，親指のみ伸ばした形，ちょき，ぱあ）を記述した．次にメインプログラムとなる while 文を記述した．本研究は準備段階であるため脳波ではなく，キーボード入力からハンドロボット制御を行う．そのため，while 文中に文字入力プログラムを記述した．そして，ある特定の文字が入力された場合，“ぐう”など，それぞれの手の形を作る関数を呼び出し，実行する処理を記述した．
以下に“ちょき”の形を作るプログラムの一部を示す．while 文の繰り返し処理，中指を伸ばす処理を記載し，それ以外は省略とした．
1

flag_choki = False

234#指を動かす while 文
while flag_choki == False:
flag_choki = True

5…省略…

6789101112#中指を伸ばす
if deg3 < deg_max:
deg3 += 1
duty3 = 2.5 + (12.5 −2.5)/180*(deg3+90)
Servo3.ChangeDutyCycle(duty3)
flag_choki = False

まず，繰り返し処理について説明する．1 行目
でブール値“flag_choki”を False とし，while 文に入った後，4 行目で True に変更する．7 行目の“deg3”は中指の角度を表し，同行の“deg_max”は指を伸ばした状態のサーボモータの角度である．指の角度を変更する必要がある場合，7 行目の if 文に入り，12 行目でブール値を False とする．これにより，3 行目からの while 文を抜けることはなく，指を動かす繰り返し処理を行う．
指の処理が終了し，“deg3”が“deg_max”と等しくなった時，7 行目の if 文に入らないため，ブール値は 4 行目に変更された True のままとなり，3 行目の while 文から抜ける．この時点で手の形を作る一連の処理の終了となる．
次に実際に指を動かすプログラムについて説明する．7 行目の時点で“deg3”に“deg_min”の値が入っていると仮定した場合，“deg3”は“deg_max”よりも小さいため，7 行目の if 文へ入る．8 行目はサーボモータをプラス方向に動かすため，“deg3”の値に 1 を足している．9，10 行目は式(2)を用いて，デューティー比を計算し，“duty3”に結果の値を代入している．11 行目では中指を動かすサーボモータのデューティー比を変更しており，この命令により，“duty3”で指定された角度へサーボモータを動かしている．そしてこれらの処理が繰り返し行われることにより，ハンドロボットの指を伸ばしている．
逆に指を曲げるプログラムは，7 行目の“deg_max”を“deg_min”に，8 行目の“+=”を“−=”へ変更するのみで概形は同じである．
５. おわりに本研究では，ハンドロボットをキーボードから制御するプログラムを作成した．今後は脳波からハンドロボットを制御するため，機械学習の手法を学び，脳波解析についての研究を進める．
６. 参考文献[1] 「【ラズパイ電子工作】サーボモータを動か す 方 法 ( 角 度 指 定 ) 」 電 機 設 計 人 .com,
2021.5.30 時点, https://denkisekkeijin.com/
raspberrypi/pi-servo-angle/[2] 「備忘録 研究の備忘録」,Seesaa BLOG,
2021.6.14 時点,http://hanmrabi.seesaa.net/article/439356627.html[3] 「lewansoul lfd-01 マイクロサーボ 9 G ミニサーボ with anti-lock 保護 for RC カーロボット(Pack of 5 ) 」,amazon.co.jp,2021.6.28
時点, https://www.amazon.co.jp/Lewan
Soul-LFD-01-Micro-Anti-LockProtection/dp/B07DLWSX9F[4] 「RaspberryPi でサーボモーター動作」，JellyWare,2021.6.14 時点,https://jellyware.
jp/kurage/raspi/servo.html[5] 「dotstudio, inc.」,PWM 制御,2021.6.14
時 点 , https://dotstud.io/docs/pulse-widthmodulation/