目次

新マルチプロセッサ構成

 過年度のマシンの制御は、次の3モードに分けていました。

 これまでのテストから、FPGA内部に5個程度の
 マイクロコントローラを入れられるとわかって
 います。

 モードごとに専用プロセッサを用意し、センサー
 情報を個別に処理し、マスタープロセッサが各々
 の出力パラメータを、モータ制御回路に渡す方式
 が最も簡単と判断しました。

 この方式を採用すると、必要なプロセッサは5個
 程度でよくなります。

 マルチプロセッサは、人間の大脳、小脳、延髄に
 区別された部位と似た構成になります。

 MCR_VCマシンは、小規模なロボットなので
 各部位を人間に似せて構成するのが、最も
 自然だと判断しました。

 Subsamption理論と同じ考え方です。

 各プロセッサが担当する機能を定義します。

 MASTER PROCESSOR
  スタートトリガー、スタートセンサーを利用し
  他のプロセッサが動作できるようにクロックを
  イネーブルにします。

  マイクロコンピュータに内蔵されるモジュール
  (PWM波形ジェネレータやA/D変換器)を、使う
  使わないは、対応レジスタで電源電圧を与える
  かどうかを指定します。プロセッサはクロック
  を与えて動かすので、クロックを制御すること
  で、該当プロセッサの動作を制御します。

  またSENSOR HANDLERが出力した情報から、NORMAL、CRANK、LANE
  のどのプロセッサを動かすのかを決めます。

 SENSOR HANDLER
  Bar Code ScannerあるいはGame Boy Cameraからの情報を
  入力し、センサーデータに変換します。
  センサーデータは、次のコードに対応させます。

         ALL_BLACK    0
         ALL_WHITE    1
         LEFT_WHITE   2
         RIGHT_WHITE  3
         CENTER       4
         TINY_RIGHT   5
         RIGHT        6
         BIG_RIGHT    7
         TINY_LEFT    8
         LEFT         9
         BIG_LEFT    10
         BOTH_WHITE  11
         ILLEAGAL    12

  センサーデータを、コードに対応させると
  4ビットまで情報圧縮できるので、移動に
  関係する判定を少なくできます。

 NORMAL PROCESSOR
  センサーデータを入力して、直線、曲線コースの移動で
  モータに与えるPWM波形のDUTY比を求めます。

  センサーデータは、13通りなので左右にテーブルを
  個別に割り当てても、26通りにしかならないです。

  実際に動かしてDUTY比を確定するので、テーブルを
  使わずに、センサーデータ対応の処理を記述します。

;++++++++++++++++++++++++
; sensor code
;++++++++++++++++++++++++
CONSTANT  ALL_BLACK,  00
CONSTANT  ALL_WHITE,  01
CONSTANT  LEFT_WHITE, 02
CONSTANT  RIGHT_WHITE,03
CONSTANT  CENTER,     04
CONSTANT  TINY_RIGHT, 05
CONSTANT  RIGHT,      06
CONSTANT  BIG_RIGHT,  07
CONSTANT  TINY_LEFT,  08
CONSTANT  LEFT,       09
CONSTANT  BIG_LEFT,   0A
CONSTANT  BOTH_WHITE, 0B
CONSTANT  ILLEAGAL,   0C

;++++++++++++++++++++++++
; I/O address
;++++++++++++++++++++++++
CONSTANT SENCODE, 00
CONSTANT PWMRIGHT,01
CONSTANT PWMLEFT, 02

;++++++++++++++++++++++++
; entry address 
;++++++++++++++++++++++++
  ADDRESS 000

;++++++++++++++++++++++++
; initialize
;++++++++++++++++++++++++
INIT:
  ; clear
  XOR    s0,s0
  LOAD   sD,s0
  ; PWM duty ratio
  LOAD   sA,20
  LOAD   sB,20

;++++++++++++++++++++++++
; main loop 
;++++++++++++++++++++++++
MAIN:
  CALL    GETS
  ; judge
  COMPARE s0,CENTER
  JUMP    NZ,MAIN0
  ; set duty
  LOAD    sA,20
  LOAD    sB,20
  JUMP    MAINX
  ; big left
MAIN0:
  COMPARE s0,BIG_LEFT
  JUMP    NZ,MAIN1
  ; set duty
  LOAD    sA,05
  LOAD    sB,25
  JUMP    MAINX
  ; left
MAIN1:
  COMPARE s0,LEFT
  JUMP    NZ,MAIN2
  ; set duty
  LOAD    sA,15
  LOAD    sB,25
  JUMP    MAINX
  ; tiny left
MAIN2:
  COMPARE s0,LEFT
  JUMP    NZ,MAIN3
  ; set duty
  LOAD    sA,20
  LOAD    sB,25
  JUMP    MAINX
  ; big right
MAIN3:
  COMPARE s0,BIG_RIGHT
  JUMP    NZ,MAIN4
  ; set duty
  LOAD    sA,25
  LOAD    sB,05
  JUMP    MAINX
  ; right
MAIN4:
  COMPARE s0,BIG_RIGHT
  JUMP    NZ,MAIN5
  ; set duty
  LOAD    sA,25
  LOAD    sB,15
  JUMP    MAINX
  ; tiny right
MAIN5:
  COMPARE s0,BIG_RIGHT
  JUMP    NZ,MAIN6
  ; set duty
  LOAD    sA,25
  LOAD    sB,20
  JUMP    MAINX
  ; all white
MAIN6:
  COMPARE s0,ALL_WHITE
  JUMP    NZ,MAIN7
  ; set duty
  LOAD    sA,15
  LOAD    sB,15
  JUMP    MAINX
  ; left white
MAIN7:
  COMPARE s0,LEFT_WHITE
  JUMP    NZ,MAIN8
  ; set duty
  LOAD    sA,25
  LOAD    sB,05
  JUMP    MAINX
  ; right white
MAIN8:
  COMPARE s0,RIGHT_WHITE
  JUMP    NZ,MAIN9
  ; set duty
  LOAD    sA,05
  LOAD    sB,25
  JUMP    MAINX
  ;
MAIN9:
  ;
MAINX:
  CALL   PUTS
  CALL   DELAY
  ;
  JUMP   MAIN

;+++++++++++++++++++
; store sensor code
;+++++++++++++++++++
GETS:
  INPUT s0,SENCODE
  RETURN

;++++++++++++++++++++
; impress duty ratio
;++++++++++++++++++++
PUTS:
  OUTPUT  sA,PWMRIGHT
  OUTPUT  sB,PWMLEFT
  RETURN

;++++++++++++++++++++
; impress duty ratio
;++++++++++++++++++++
DELAY:
  LOAD    sC,10
  ; loop
DELAY0:
  COMPARE sC,00
  JUMP    Z,DELAY1
  ;
  SUB     sC,01
  JUMP    DELAY0
  ;
DELAY1:
  ;
  RETURN

 CRANK  PROCESSOR
  CRANK MARKERの白線を検出後、低速で右か左の直角ラインに
  到達したなら旋回させます。
  センターラインを検出したなら、モータへの制御信号出力を
  を停止します。

  3分割した処理で記述します。

   ENT_STATEは、白線検出の処理で、NORMALモードからCRANKに
   切替わったとして、オーバーラップ時の動作を確保します。

   GO_BLACKは、ラインに沿ってスロー走行し、黒を検出する
   までの移動を担当します。途中で、左か右の片側白線情報
   を取得します。

   EXE_TURNは、旋回制御を担当します。

;++++++++++++++++++++++++
; sensor code
;++++++++++++++++++++++++
CONSTANT  ALL_BLACK,  00
CONSTANT  ALL_WHITE,  01
CONSTANT  LEFT_WHITE, 02
CONSTANT  RIGHT_WHITE,03
CONSTANT  CENTER,     04
CONSTANT  TINY_RIGHT, 05
CONSTANT  RIGHT,      06
CONSTANT  BIG_RIGHT,  07
CONSTANT  TINY_LEFT,  08
CONSTANT  LEFT,       09
CONSTANT  BIG_LEFT,   0A
CONSTANT  BOTH_WHITE, 0B
CONSTANT  ILLEAGAL,   0C

;++++++++++++++++++++++++
; I/O address
;++++++++++++++++++++++++
CONSTANT SENCODE, 00
CONSTANT PWMRIGHT,01
CONSTANT PWMLEFT, 02

;++++++++++++++++++++++++
; entry address 
;++++++++++++++++++++++++
  ADDRESS 000

;++++++++++++++++++++++++
; initialize
;++++++++++++++++++++++++
INIT:
  ; clear
  XOR    s0,s0
  LOAD   s1,s0
  LOAD   sE,s0
  ; PWM duty ratio
  LOAD   sA,20
  LOAD   sB,20

;++++++++++++++++++++++++
; main loop 
;++++++++++++++++++++++++
MAIN:
  CALL   ENT_STATE
  ; judge
  COMPARE s1,01
  JUMP   NZ,MAINX
  ; slow
  CALL   PUTS
  ; slow move to ALL_BLACK
  CALL   GO_BLACK
  ; turn 
  CALL   EXE_TURN
  ;
MAINX:
  ;
  JUMP   MAIN

;+++++++++++++++++++
; store sensor code
;+++++++++++++++++++
GETS:
  INPUT s0,SENCODE
  RETURN

;++++++++++++++++++++
; impress duty ratio
;++++++++++++++++++++
PUTS:
  OUTPUT  sA,PWMRIGHT
  OUTPUT  sB,PWMLEFT
  RETURN

;++++++++++++++++++++
; impress duty ratio
;++++++++++++++++++++
DELAY:
  LOAD    sC,10
  ; loop
DELAY0:
  COMPARE sC,00
  JUMP    Z,DELAY1
  ;
  SUB     sC,01
  JUMP    DELAY0
  ;
DELAY1:
  ;
  RETURN

;++++++++++++++++++++
; slow move
;++++++++++++++++++++
ENT_STATE:
  ; get sensor code
  CALL   GETS
  ;
ENT_STATE0:
  ; judge
  COMPARE s0,ALL_WHITE
  JUMP    Z,ENT_STATE1
  ; clear flag
  LOAD    s1,00
  CALL    DELAY
  CALL    GETS
  JUMP    ENT_STATE0
  ; set duty ratio
ENT_STATE1:
  LOAD    sA,10
  LOAD    sB,10
  CALL    PUTS
  CALL    DELAY
  ; set flag
  LOAD    s1,01
  ;
  RETURN

;++++++++++++++++++++++++
; slow move to ALL_BLACK
;++++++++++++++++++++++++
GO_BLACK:
  ; set duty ratio
  LOAD    sA,15
  LOAD    sB,15
  CALL    PUTS
  CALL    DELAY
  ; loop
GO_BLACK0:
  CALL    GETS
  ; jude pass line area
  COMPARE s0,ALL_BLACK
  JUMP    Z,GO_BLACKX
  ; judge
  COMPARE s0,CENTER
  JUMP    NZ,GO_BLACK1
  ; center
  LOAD    sA,15
  LOAD    sB,15
  JUMP    GO_BLACK9
  ; big left
GO_BLACK1:
  COMPARE s0,BIG_LEFT
  JUMP    NZ,GO_BLACK2
  ; set duty
  LOAD    sA,05
  LOAD    sB,15
  JUMP    GO_BLACK9
  ; left
GO_BLACK2:
  COMPARE s0,LEFT
  JUMP    NZ,GO_BLACK3
  ; set duty
  LOAD    sA,10
  LOAD    sB,15
  JUMP    GO_BLACK9
  ; tiny left
GO_BLACK3:
  COMPARE s0,TINY_LEFT
  JUMP    NZ,GO_BLACK4
  ; set duty
  LOAD    sA,12
  LOAD    sB,15
  JUMP    GO_BLACK9
  ; big right
GO_BLACK4:
  COMPARE s0,BIG_RIGHT
  JUMP    NZ,GO_BLACK5
  ; set duty
  LOAD    sA,15
  LOAD    sB,05
  JUMP    GO_BLACK9
  ; right
GO_BLACK5:
  COMPARE s0,RIGHT
  JUMP    NZ,GO_BLACK6
  ; set duty
  LOAD    sA,15
  LOAD    sB,10
  JUMP    GO_BLACK9
  ; tiny right
GO_BLACK6:
  COMPARE s0,TINY_RIGHT
  JUMP    NZ,GO_BLACK9
  ; set duty
  LOAD    sA,15
  LOAD    sB,12
  JUMP    GO_BLACK9
  ; right edge
GO_BLACK7:
  COMPARE s0,RIGHT_WHITE
  JUMP    NZ,GO_BLACK8
  ; set direction
  LOAD    sE,01
  JUMP    GO_BLACK9
  ; left edge
GO_BLACK8:
  COMPARE s0,LEFT_WHITE
  JUMP    NZ,GO_BLACK9
  ; set direction
  LOAD    sE,02
  ;
GO_BLACK9:
  CALL    PUTS
  CALL    DELAY
  JUMP    GO_BLACK0
  ;
GO_BLACKX:
  RETURN

;+++++++
; turn
;+++++++
EXE_TURN:
  ; ? RIGHT
  COMPARE sE,01
  JUMP    Z,EXE_TURN1
  ; ? LEFT
  JUMP    EXE_TURN2
  ; right
EXE_TURN1:
  LOAD    sA,10
  LOAD    sB,25
  JUMP    EXE_TURN3
  ; left
EXE_TURN2:
  LOAD    sA,25
  LOAD    sB,10
  ;
EXE_TURN3:
  CALL    PUTS
  ; loop
EXE_TURN4:
  CALL   GETS
  ; judge
  COMPARE s0,CENTER
  JUMP    NZ,EXE_TURN4
  ;
  LOAD    sA,10
  LOAD    sB,10
  CALL    PUTS
  CALL    DELAY
  ;
  RETURN

 LANE PROCESSOR
  LANE CHANGE MARKERの片側白線を検出後、低速で移動し
  ラインが切れたなら、コースを変更します。
  センターラインを検出したなら、モータへの制御信号出力を
  停止します。

  6分割した処理で記述します。

   ENT_STATEは、白線検出の処理で、NORMALモードからLANEに
   切替わったとして、オーバーラップ時の動作を確保します。

   GO_BLACKは、ラインに沿ってスロー走行し、黒を検出する
   までの移動を担当します。

   FIRST_TURNは、片側白線で指定されたレーン変更を担当します。

   GO_CENTERは、すべて黒のエリアを走行し、センターラインを
   検出するまでの移動を担当します。

   SECOND_TURNは、FIRST_TURNと反対方向の移動を担当します。

;++++++++++++++++++++++++
; sensor code
;++++++++++++++++++++++++
CONSTANT  ALL_BLACK,  00
CONSTANT  ALL_WHITE,  01
CONSTANT  LEFT_WHITE, 02
CONSTANT  RIGHT_WHITE,03
CONSTANT  CENTER,     04
CONSTANT  TINY_RIGHT, 05
CONSTANT  RIGHT,      06
CONSTANT  BIG_RIGHT,  07
CONSTANT  TINY_LEFT,  08
CONSTANT  LEFT,       09
CONSTANT  BIG_LEFT,   0A
CONSTANT  BOTH_WHITE, 0B
CONSTANT  ILLEAGAL,   0C

;++++++++++++++++++++++++
; I/O address
;++++++++++++++++++++++++
CONSTANT SENCODE, 00
CONSTANT PWMRIGHT,01
CONSTANT PWMLEFT, 02

;++++++++++++++++++++++++
; entry address 
;++++++++++++++++++++++++
  ADDRESS 000

;++++++++++++++++++++++++
; initialize
;++++++++++++++++++++++++
INIT:
  ; clear
  XOR    s0,s0
  LOAD   s1,s0
  LOAD   sE,s0
  LOAD   sF,sE
  ; PWM duty ratio
  LOAD   sA,20
  LOAD   sB,20

;++++++++++++++++++++++++
; main loop 
;++++++++++++++++++++++++
MAIN:
  CALL   ENT_STATE
  ; judge
  COMPARE s1,01
  JUMP   NZ,MAINX
  ; slow
  CALL   PUTS
  ; slow move to ALL_BLACK
  CALL   GO_BLACK
  ; turn 
  CALL   FIRST_TURN
  ; slow move to CENTER
  CALL   GO_CENTER
  ; turn 
  CALL   SECOND_TURN
  ; slow move to CENTER
  CALL   GO_CENTER
  ;
MAINX:
  ;
  JUMP   MAIN

;+++++++++++++++++++
; store sensor code
;+++++++++++++++++++
GETS:
  INPUT s0,SENCODE
  RETURN

;++++++++++++++++++++
; impress duty ratio
;++++++++++++++++++++
PUTS:
  OUTPUT  sA,PWMRIGHT
  OUTPUT  sB,PWMLEFT
  RETURN

;++++++++++++++++++++
; slow move
;++++++++++++++++++++
ENT_STATE:
  ; get sensor code
  CALL   GETS
  ; judge
  COMPARE s0,LEFT_WHITE
  JUMP   Z,ENT_STATE0
  ;
  COMPARE s0,RIGHT_WHITE
  JUMP   Z,ENT_STATE1
  ; clear flag
  LOAD   s1,00
  ; exit
  JUMP   ENT_STATE2
  ; LEFT_WHITE set directions
ENT_STATE0:
  LOAD   sE,02
  LOAD   sF,01
  ; set flag
  LOAD   s1,01
  JUMP   ENT_STATE2
  ; RIGHT_WHITE set directions
ENT_STATE1:
  LOAD   sE,01
  LOAD   sF,02
  ; set flag
  LOAD   s1,01
ENT_STATE2:
  ;
  RETURN

;++++++++++++++++++++++++
; slow move to ALL_BLACK
;++++++++++++++++++++++++
GO_BLACK:
  ; set duty ratio
  LOAD    sA,15
  LOAD    sB,15
  CALL    PUTS
  ; loop
GO_BLACK0:
  CALL    GETS
  ; jude pass line area
  COMPARE s0,ALL_BLACK
  JUMP    Z,GO_BLACKX
  ; judge
  COMPARE s0,CENTER
  JUMP    NZ,GO_BLACK1
  ; center
  LOAD    sA,15
  LOAD    sB,15
  JUMP    GO_BLACK7
  ; big left
GO_BLACK1:
  COMPARE s0,BIG_LEFT
  JUMP    NZ,GO_BLACK2
  ; set duty
  LOAD    sA,05
  LOAD    sB,15
  JUMP    GO_BLACK7
  ; left
GO_BLACK2:
  COMPARE s0,LEFT
  JUMP    NZ,GO_BLACK3
  ; set duty
  LOAD    sA,10
  LOAD    sB,15
  JUMP    GO_BLACK7
  ; tiny left
GO_BLACK3:
  COMPARE s0,TINY_LEFT
  JUMP    NZ,GO_BLACK4
  ; set duty
  LOAD    sA,12
  LOAD    sB,15
  JUMP    GO_BLACK7
  ; big right
GO_BLACK4:
  COMPARE s0,BIG_RIGHT
  JUMP    NZ,GO_BLACK5
  ; set duty
  LOAD    sA,15
  LOAD    sB,05
  JUMP    GO_BLACK7
  ; right
GO_BLACK5:
  COMPARE s0,RIGHT
  JUMP    NZ,GO_BLACK6
  ; set duty
  LOAD    sA,15
  LOAD    sB,10
  JUMP    GO_BLACK7
  ; tiny right
GO_BLACK6:
  COMPARE s0,TINY_RIGHT
  JUMP    NZ,GO_BLACK7
  ; set duty
  LOAD    sA,15
  LOAD    sB,12
  ;
GO_BLACK7:
  CALL    PUTS
  JUMP    GO_BLACK0
  ;
GO_BLACKX:
  RETURN

;+++++++++++++++++++
; turn at ALL_BLACK 
;+++++++++++++++++++
FIRST_TURN:
  ; ? RIGHT
  COMPARE sE,01
  JUMP    Z,FIRST_TURN1
  ; ? LEFT
  JUMP    FIRST_TURN2
  ; set right 
FIRST_TURN1:
  LOAD    sA,10
  LOAD    sB,15
  JUMP    FIRST_TURN3
  ; set left
FIRST_TURN2:
  LOAD    sA,15
  LOAD    sB,10
  ; impress
FIRST_TURN3:
  CALL    PUTS
  ; set counter
  LOAD    sC,10
  ; loop
FIRST_TURN4:
  COMPARE sC,00
  JUMP    FIRST_TURNX
  ;
  SUB     sC,01
  JUMP    FIRST_TURN4
  ;
FIRST_TURNX:
  RETURN

;++++++++++++++++++++
; move on BLACK area
;++++++++++++++++++++
GO_CENTER:
  ; set duty ratio
  LOAD    sA,15
  LOAD    sB,15
  CALL    PUTS
  ; loop
GO_CENTER0:
  CALL    GETS
  ; judge
  COMPARE s0,CENTER
  JUMP    NZ,GO_CENTER0
  ; set duty ratio
  LOAD    sA,10
  LOAD    sB,10
  CALL    PUTS
  ;
  RETURN

;++++++++++++++++
; turn at CENTER 
;++++++++++++++++
SECOND_TURN:
  ; ? RIGHT
  COMPARE sF,01
  JUMP    Z,SECOND_TURN1
  ; ? LEFT
  JUMP    SECOND_TURN2
  ; set right 
SECOND_TURN1:
  LOAD    sA,10
  LOAD    sB,15
  JUMP    SECOND_TURN3
  ; set left
SECOND_TURN2:
  LOAD    sA,15
  LOAD    sB,10
  ; impress
SECOND_TURN3:
  CALL    PUTS
  ; set counter
  LOAD    sC,10
  ; loop
SECOND_TURN4:
  COMPARE sC,00
  JUMP    SECOND_TURNX
  ;
  SUB     sC,01
  JUMP    SECOND_TURN4
  ;
SECOND_TURNX:
  ; judge direction
  RETURN

 MCR_VCの大会規定で、スタートから120秒以内にゴールに
 到達していることが要求されています。

 スタート後120秒をカウントし、システムをリセットする
 マイクロシーケンサを定義します。

 スタートトリガーは、MASTER PROCESSORに接続しているので
 このトリガーを使い、120秒カウンタを動かします。

 120秒カウンタのカウントアップフラグをチェックして
 フラグセットになったなら、NORMAL、CRANK、LANEの各
 プロセッサのクロックを停止し、リセットします。

 MASTER PROCESSORは、常時動作し、システム全体の動きを
 管理させます。


目次

inserted by FC2 system