目次

予備マシン

 昨年は、大会2カ月前にモータベースの取付け部分に
 亀裂が発生して、メカを交換しました。今回は予備の
 マシンを用意し、緊急時対応ができるようにします。



 予備マシンには、mugen2012のシャーシを使います。
 前輪サーボモータ、後輪DCモータなので中間処理の
 ラッパー関数を用意すれば、2つのパルスモータに
 よる移動制御とほぼ同じにできます。

 制御には、H8/3052FOne+CPLD(XC9572)を使います。
 マイコン、CPLDともに25MHzで動作させます。



 センサーには、GameBoyCameraを利用。
 構成ブロック図は、以下です。



 H8では、GameBoyCameraの処理コードを記述した
 過去の資産があるので、新規作成は、VHDLコード
 だけになります。

 2種類のモータの回転をテストするために、Pythonで
 スクリプトを書いていきます。

 GUIの動作確認用スクリプトから。

from Tkinter import *
import tkMessageBox
import serial

root = Tk()
root.option_add('*font', ('FixedSys', 10))

colsvm = 0
rowsvm = 0
coldcm = 0
rowdcm = 3
colspnm = 0
rowspnm = 5

smv = IntVar()
smv.set(0)
dcv = IntVar()
dcv.set(0)

#-----------------
# define command 
#-----------------
def cmdSMD():
  xsmv = smv.get() - 1
  if xsmv < -90 :
    xsmv = -90
  smv.set(xsmv)

def cmdSMC():
  smv.set(0)

def cmdSMI():
  xsmv = smv.get() + 1
  if xsmv > 90 :
    xsmv = 90
  smv.set(xsmv)

def cmdDCZ():
  dcv.set(0)

def cmdDCD():
  xdcv = dcv.get() -1 
  if xdcv < 0 :
    xdcv = 0
  dcv.set(xdcv)

def cmdSMSend():
  tkMessageBox.showinfo('showinfo','SM send button clicked !')

def cmdDCI():
  xdcv = dcv.get() + 1
  if xdcv > 99 :
    xdcv = 99
  dcv.set(xdcv)

def cmdDCSend():
  tkMessageBox.showinfo('showinfo','DC send button clicked !')

def GBCCmdSend():
  # get command 
  xcmd = spnMenu.get()
  # judge
  if xcmd == 'reset' :
    tkMessageBox.showinfo('showinfo','RESET')
  if xcmd == 'init' :
    tkMessageBox.showinfo('showinfo','INIT')
  if xcmd == 'get' :
    tkMessageBox.showinfo('showinfo','GET')

###############
# define label
###############
lblSVMOTOR = Label( root , text = "Servo Motor" )
lblHRSP    = Label( root , text = "------------" )
lblDCMOTOR = Label( root , text = "DC Motor" )

lblSVMOTOR.grid( column = colsvm , row = rowsvm )
lblHRSP.grid( column = colsvm , row = rowsvm+2 )
lblDCMOTOR.grid( column = coldcm , row = rowdcm )

################
# define button
################
btnExit = Button( root , text = "Exit" , command = sys.exit )
btnExit.grid( column = 4 , row = 10 )

btnSMD = Button( root , text = "decrement" , command = cmdSMD )
btnSMD.grid( column = colsvm , row = rowsvm+1 )
btnSMC = Button( root , text = "center" , command = cmdSMC )
btnSMC.grid( column = colsvm+1 , row = rowsvm+1 )
btnSMI = Button( root , text = "increment" , command = cmdSMI )
btnSMI.grid( column = colsvm+2 , row = rowsvm+1 )
btnSMSend = Button( root , text = "SM send" , command = cmdSMSend )
btnSMSend.grid( column = colsvm+3 , row = rowsvm )

btnDCD = Button( root , text = "decrement" , command = cmdDCD )
btnDCD.grid( column = coldcm , row = rowdcm+1 )
btnDCZ = Button( root , text = "zero" , command = cmdDCZ )
btnDCZ.grid( column = coldcm+1 , row = rowdcm+1 )
btnDCI = Button( root , text = "increment" , command = cmdDCI )
btnDCI.grid( column = coldcm+2 , row = rowdcm+1 )
btnDCSend = Button( root , text = "DC send" , command = cmdDCSend )
btnDCSend.grid( column = coldcm+3 , row = rowdcm )

btnGBCCmdSend = Button( root , text = "CMD send" , command = GBCCmdSend )
btnGBCCmdSend.grid( column = colspnm+1 , row = rowspnm )

###############
# define entry
###############
entSVMOTOR = Entry( textvariable = smv , width = 10 )
entDCMOTOR = Entry( textvariable = dcv , width = 10 )
entSVMOTOR.grid( column = colsvm+1 , row = rowsvm )
entDCMOTOR.grid( column = coldcm+1 , row = rowdcm )

#################
# define spinbox
#################
mlist = ('reset','init','get')
spnMenu = Spinbox( root , value = mlist , width = 10 , state = 'readonly' )
spnMenu.grid( column = colspnm , row = rowspnm )

###############
root.mainloop()

 GUIとしては、次のようになります。



 シリアルインタフェースで、マイコンかFPGAに
 コマンド転送します。

 サーボモータは、角度の-90から+90を入力できるようにし
 増減とゼロクリアボタンを用意しました。

 増減ボタンでは、範囲外になった場合
 下限値と上限値を設定します。
 角度からパルス幅に換算し、「SM send」ボタンで送信。

 DCモータでは、0から99までを設定できるようにします。
 増減とゼロクリアボタンを用意しました。

 増減ボタンでは、範囲外になった場合
 下限値と上限値を設定します。
 「DC send」ボタンで送信。

 Game Boy Cameraを動かすためのコマンドも
 扱えるようにしてあります。

 コマンドは、RESET、INIT、GETの3種に限定。
 コマンドは、スピンボックスから選びます。

 ここまでは、シリアル送受信処理を実装していません。

 シリアル送受信処理は、コマンドごとに用意して
 対応します。



 もう1台、予備マシンを用意しました。



 このメカは、JICA研修で利用したDCモータを使い
 モータがある側を前方とします。

 バッテリーを載せるため、料理で利用する俎板と似た構造に。



 DCモータのベースと他ブロックを載せるベースを
 締結するために、ビスを使っています。このビス
 の分だけ、バッテリーを載せている板を浮かせる
 必要があり、この形状にしました。



 バッテリーを載せている板の前後にストッパーが
 あっても、左右には抑えが効かないので、左右に
 もストッパーを用意します。



 バッテリーホルダーの裏面に両面テープをつけて
 板に貼り付けました。





 移動する場合、前後左右にバッテリーを載せている板が
 動くこともありません。バッテリーは、自重で下方向に
 力が働くことになり、安定しました。

 バッテリーの上には、JICA研修のために設計、開発した
 制御基板を配置します。



 小さな基板で動かしたいので、Arduino互換基板を利用します。



 制御基板は、ArduinoのPWM信号を利用できるように
 10ピンワイヤーに次のように配線を入れ替えました。
  1. +5V
  2. red LED
  3. LEFT PWM
  4. RIGHT PWM
  5. start trigger
  6. green LED
  7. DIRECTION
  8. (TxD)
  9. (RxD)
  10. GND
 AVRチップでは、PORTDに相当する配線に入れ替えました。  制御基板を実装できるように、ポリジョントで  ポストを作って建てます。  天板をアクリル板で作り被せます。  蝶ナットでアクリル板を固定。  アクリル板を載せたので、CPU基板、FPGA基板を  分割して実装できるようになりました。
目次

inserted by FC2 system