舞鶴技術研究会ホームページへ
2002年7月11日


1チップマイコンPICの勉強会
〜アーキテクチャの理解からロボットランサーの設計製作まで〜
by 舞鶴技術研究会 情報システム部門「ものづくりプロジェクト:PIC&AVRによる1チップマイコン応用技術」

第4回:ロボットランサーの設計と製作(2)ソフト編

情報システム分科会幹事 舞鶴工業高等専門学校 電子制御工学科 町田秀和
連絡先 E-mail machida@maizuru-ct.ac.jp 電話 0773-62-8957
 assisted by the 舞鶴工業高等専門学校 電子制御研究会同好会

テキスト CQ出版社、トランジスタ技術別冊、ECB No.4 PICマイコンを使おう



目次



本文

  1. はじめに(1回目)
  2. ワン・ボード・マイコン(1回目)
     2.1 ワン・ボード・マイコン(1回目)
     2.2 原始的なワンチップ・マイコン(1回目)
     2.3 最近のワンチップ・マイコン(1回目)
  3. ロボットランサー(1回目)
  4. PICのアーキテクチャ(2回目)
     4.1 ワンチップマイコンとは(2回目)
     4.2 レジスタ(2回目)
  5. PICのプログラミング(2回目)
     5.1 命令(2回目)
     5.2 アセンブラMPLABの使い方(2回目)
  6. プログラミング演習(2回目)
     6.1 条件付ループ(2回目)
     6.2 サブルーチン(2回目)
  7. 入出力(2回目)
  8. ロボットランサーの設計製作(ハード編)
     8.1 写真集(3回目)
     8.2 回路図(3回目)
     8.3 部品表(3回目)


  9. ロボットランサーの設計製作(ソフト編)



    1. 運転戦略

       さて、ここでは左の動画のように「どのようにしてライン上をトレース」 するかという、いわゆる戦略を下図のように考える。

       センサは車体前部(フロント)の左右のライン・センサ(ライン上(白)だと1、ライン外(黒) だと0)、駆動系は車体後部(リアドライブ)の左右の独立したモータである。モータは 左右それぞれ、正転(前進)、逆転(後進)、停止(ブレーキ)、空転(フリー)できる。

      すなわち、

      1. ・両センサがライン上にあるときは、そのまま前進する。
      2. ・右側のセンサがラインから外れた場合は、左側に曲がる。
      3. ・左側のセンサがラインから外れた場合は、右側に曲がる。
      4. ・両センサがラインから外れた場合は、それ以前に ラインから外れていた側の反対側に曲がる。







       これで本当に良いのかは、やはりテストを繰り返さねばならないだろう。 うまくいくはずなのではあるが、決してそううまくはいかない。 そしてそれを克服するというのが、「物作り」の楽しさではないだろうか?


    2. プログラム

       以下に、トレースカー部のプログラムを示します。製作者は3Sの藤井君です。
      「えっ」と思うくらい短いプログラムですよね。ハード(PICマイコン)が優れていると ソフトの負担が少ないという好例です。

       見所は、ラベルTABLEの「ADDWF PCL」命令によるWレジスタの値によるテーブル・ジャンプ、 および、Wレジスタに値を入れてサブルーチンから値を返す「RETLW B'01101010'」 などでしょう。かなり高級な技です。しかしC言語の文法をよく理解していればこういう 発想が有効だということもすぐに思い浮かぶのではないでしょうか?
      参照用のPICの命令一覧はここにあります。


      ;********************************************************
      ; TRACE.ASM	2002/6	T.Fujii
      ;********************************************************
      ; トレースカーのプログラム
      ;********************************************************
      ; RB0,OUT	左LED1の赤=ライン外      フ       
      ; RB1,OUT	左LED1の緑=ライン内     リ 正 逆 停
      ; RB2,OUT	右LED2の赤=ライン外      ー 転 転 止=ブレーキ
      ; RB3,OUT	右LED2の緑=ライン内      ↓ ↓ ↓ ↓
      ; RB4,OUT	左モータードライバ1ピン1= 0  0  1  1
      ; RB5,OUT	左モータードライバ1ピン2= 0  1  0  1
      ; RB6,OUT	右モータードライバ2ピン1= 0  0  1  1
      ; RB7,OUT	右モータードライバ2ピン2= 0  1  0  1
      ; RA0,IN	左フォトトランジスタ1= 1でライン上(白:反射あり)
      ; RA1,IN	右フォトトランジスタ2= 0でライン外(黒:反射なし)
      ; RA2,OUT	N.C
      ; RA3,OUT 	N.C
      ; RA4,OUT	N.C
      ;***************************************************
      
      
      	list p=16f84a
      	#include
      
      	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
      
      	RADIX DEC
      
      	CBLOCK 0CH
      		TEMP		
      	ENDC
      
      	ORG 00H
      	CALL	SETUP		;初期化サブルーチンコール:PortA,PortBの入出力方向の決定
      MAINLOOP			;メインループ
      	CALL	SETUP		;  不要
      	MOVFW	PORTA		;  WレジスタにPortAの値を入力する。(アセンブラ拡張命令)
      	IORLW	00H		;  Wレジスタに関するフラグを立てるための
      	BTFSS	STATUS,Z	;  Wレジスタの内容が0(コースオフ)だったら、スキップする。
      	MOVWF	TEMP		;   コースオフしていなければ「以前の値」としてTEMPに保存する。
      	ANDLW	B'00000011'	;  Wレジスタの第0および1ビットをマスクする。(他を0とする)
      	CALL	TABLE		;  現在の状態判定用サブルーチンを呼ぶ。
      	MOVWF	PORTB		;  サブルーチンから戻り値であるWレジスタの値をPortBに出力する。
      	GOTO	MAINLOOP	;  無限ループ
      TABLE				;状態判定用サブルーチン
      	ADDWF	PCL		; テーブル・ジャンプ:Wレジスタの値に対応した分スキップする。
      	GOTO	OUTOF_LINE	;  00→完全に外れたとき、アウト・オブ・ライン処理に移る。
      	RETLW	B'01110110'	;  01→右センサだけ白,左に外れてる   それぞれの場合の、
      	RETLW	B'11101001'	;  10→左センサ白、右に外れてる      モータ、LEDの出力値を
      	RETLW	B'01101010'	;  11→両センサ白、ライン上にある     Wレジスタに入れて戻る。
      OUTOF_LINE			;アウト・オブ・ライン処理
      	BTFSC	TEMP,0		;  TEMPのbit0が0(左センサ白、右に外れてる)だったらスキップ
      	RETLW	B'01110101'	;  前回右センサだけ白だったとき
      	RETLW	B'11100101'	;  前回左センサだけ白だったとき	
      SETUP				;初期化サブルーチン:PortA,PortBの入出力方向の決定
      	BSF 	STATUS,RP0	;  レジスタ・ファイルをバンク1に切り替える。
      	MOVLW	B'00000011'	;  PortAのbit0,1を入力に設定する。
      	MOVWF	TRISA		;    に設定する。
      	MOVLW	B'00000000'	;  PortBの全bitを出力に設定する。
      	MOVWF	TRISB		;    に設定する。
      	BCF	STATUS,RP0	;  レジスタ・ファイルをバンク0に切り替える(戻す)。
      	RETURN			;  サブルーチンから戻る。
      
      	END