Notes to self: PIC arduino

PIC,arduinoなど電子工作の備忘録

PICマイコンを利用した赤外線コントロール戦車の製作

2014年07月12日 | PICマイコン


今回、PICマイコンを使った赤外線リモコンによる戦車(?)を製作した。

この車は、赤外線送信機により前後進、左右旋回、左右の前後進を行うことができる。左右独立のキャタピラ・モータおよびギヤボックスの動力部、および制御基盤・バッテリで構成されており制御基盤では1個のPICマイコンで赤外線の受信と2個のモータドライバIC(東芝製TA7291P)を制御している。電源は9Vのバッテリと単3乾電池3個をそれぞれ制御回路とモータの動力とした。

 駆動部にはモータとキャタピラがセットになっている既製品を利用した。またモータはギヤセットと一体になっているものを購入した。


 

 

1)赤外線送信機について

   下図は赤外線送信機。試作とはいえ、かなり不細工.

  一個のPICマイコンを単三乾電池2個で駆動している。レギュレータも使って いない。赤外線LEDを点滅させるための出力と2個のモータをそれぞれ独立に前後進させるための入力スイッチを4個(図の赤と白、計4個、黒は予備)を PICマイコンへの入力スイッチとしている.

 

 

 

 

かなりひどい作り。。。

赤外線送信回路図と部品表を示す。

 

 2)赤外線受信回路について

受信回路ではPICマイコンのRA0入力ピンに赤外線受信モジュールを接続し、さらに 出力ピンにつながれたモータドライバICによってDCモータを回転させる。今回は左右のキャタピラを独立に動かすため2個の東芝製TA7291Pを使用し た。下図に赤外線受信回路図および部品表を示す。

 


PICマイコンを利用した赤外線コントロール戦車(送信プログラム)

2014年07月12日 | PICマイコン

以下にアセンブラソースリストを示す。

3-1)赤外線送信プログラム

 

;*************************************
; 赤外線送信プログラム
;*************************************
;                   LED-SEND.ASM
                    LIST         P=PIC16F84;
                    INCLUDE  P16F84.INC;
   
MEM_1          EQU        0CH
MEM_2          EQU        0DH
MEM_3          EQU        0EH
MEM_4          EQU        0FH
MEM_5          EQU        010H
                    ORG        0
;*****************************
;メインルーチン
;*****************************
MAIN   
                    BSF         STATUS,RP0
                    CLRF        TRISA
                    MOVLW    07FH
                    MOVWF    TRISB
                    BCF         OPTION_REG,7
                    BCF         STATUS,RP0
LOOP
                    BTFSC      PORTB,1
                    GOTO       B0
                    BTFSS      PORTB,2
                    GOTO       Label1
B0
                    BTFSC      PORTB,1
                    GOTO       B1
                    BTFSS      PORTB,5
                    GOTO       Label0
B1
                    BTFSC      PORTB,2
                    GOTO       B2
                    BTFSS      PORTB,6
                    GOTO       Label5
B2
                    BTFSS      PORTB,1
                    GOTO       Label3
                    BTFSS      PORTB,2
                    GOTO       Label7
                    BTFSC      PORTB,6
                    GOTO       B3
                    BTFSS      PORTB,5
                    GOTO       Label2
B3
                    BTFSS      PORTB,6
                    GOTO       Label6
                    BTFSS      PORTB,5
                    GOTO       Label4
                    GOTO       LOOP

;*****************************
; 送信ビット列 1 01 0001 10101
;*****************************
Label0
                    CALL        Bit1
                    CALL        Bit0
                    CALL        Bit1
                    CALL        Bit0
                    CALL        Bit0
                    CALL        Bit0
                    CALL        Bit1
                    CALL        Bit1
                    CALL        Bit0
                    CALL        Bit1
                    CALL        Bit0
                    CALL        Bit1
                    CALL        TIM20
                    GOTO       LOOP

 

;*****************************
; 送信ビット列 1 01 0010 10101
;*****************************
Label1
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      TIM20
                GOTO      LOOP

;*****************************
; 送信ビット列 1 01 0011 10101
;*****************************
Label2
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit0
                CALL      Bit1
                CALL      Bit1
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      TIM20
                GOTO      LOOP

;*****************************
; 送信ビット列 1 01 0100 10101
;*****************************
Label3
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      TIM20
                GOTO      LOOP

;*****************************
; 送信ビット列 1 01 0101 10101
;*****************************
Label4
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      TIM20
                GOTO      LOOP

;*****************************
; 送信ビット列 1 01 0110 10101
;*****************************
Label5
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
               CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      TIM20
                GOTO     LOOP

;*****************************
; 送信ビット列 1 01 0111 10101
;*****************************
Label6
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit1
                CALL      Bit1
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      TIM20
                GOTO      LOOP

;*****************************
; 送信ビット列 1 01 1000 10101
;*****************************
Label7
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit1
                CALL      Bit0
                CALL      Bit0
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      Bit0
                CALL      Bit1
                CALL      TIM20
                GOTO     LOOP

;*****************************
; 0 ビット送信
;*****************************
Bit0
               MOVLW     0FH
               MOVWF     PORTA
               MOVLW     030H
               MOVWF     MEM_4
LOOP1          CALL         TIM011
               DECFSZ     MEM_4,F
               GOTO         LOOP1
               RETURN

;*****************************
; 1 ビット送信
;*****************************
Bit1
              MOVLW    017H
              MOVWF    MEM_5
LOOP2         CLRF        PORTA
                   CALL        TIM011
                   MOVLW    0FH
                   MOVWF    PORTA
                   CALL        TIM011
                   DECFSZ    MEM_5
                   GOTO       LOOP2
                   RETURN

;*****************************
;11μs (クロック周波数 10MHz)
;*****************************
TIM011
                   MOVLW    08H
                   MOVWF    MEM_1
                   NOP
TIMLP1        DECFSZ    MEM_1,F
                   GOTO        TIMLP1
                   RETURN

;*****************************
;0.4ms (クロック周波数 10MHz)
;*****************************
TIM04
                   MOVLW    0F9H
                   MOVWF    MEM_2
TIMLP2         NOP
                   DECFSZ    MEM_2,F
                   GOTO        TIMLP2
                   RETURN

;*****************************
;20ms (クロック周波数 10MHz)
;*****************************
TIM20
                    MOVLW    032H
                    MOVWF    MEM_3
TIMLP3          CALL        TIM04
                    DECFSZ    MEM_3,F
                    GOTO        TIMLP3
                    RETURN
       
END

 



 


PICマイコンを利用した赤外線コントロール戦車(受信プログラム)

2014年07月12日 | PICマイコン

3-2)赤外線受信プログラム

 

;*************************************
; 赤外線受信プログラム
;*************************************
;                    LED-RECV.ASM
                     LIST    P=PIC16F84A;
                     INCLUDE    P16F84.INC;

 

MEM_1            EQU    0CH
MEM_2            EQU    0DH
MEM_3            EQU    0EH
MEM_4            EQU    0FH
                      ORG    0

 

;*****************************
;メインルーチン
;*****************************
MAIN   
                     BSF      STATUS,RP0
                     CLRF     TRISB
                     MOVLW    01H
                     MOVWF    TRISA
                     BCF       OPTION_REG,7
                     BCF      STATUS,RP0
LOOP
                     CLRF      PORTA
                     CLRF      PORTB
                     CLRF      MEM_4
                     BTFSC    PORTA,0

 

                     GOTO      LOOP
                     CALL      TIM04
                     BTFSC    PORTA,0

 

                     GOTO     LOOP
                     CALL      TIM02
                     CALL      TIM04
                     BTFSS    PORTA,0

 

                     GOTO     LOOP
                     CALL      TIM02
                     CALL      TIM04
                     BTFSC    PORTA,0

 

                     GOTO     LOOP
                     CALL     TIM02
                     CALL     TIM04
                     BTFSC    PORTA,0

 

                     GOTO    B0
                     BSF       MEM_4,3
B0
                     CALL     TIM02
                     CALL     TIM04
                     BTFSC   PORTA,0

 

                     GOTO    B1
                     BSF       MEM_4,2
B1
                     CALL     TIM02
                     CALL     TIM04
                     BTFSC   PORTA,0

 

                     GOTO    B2
                     BSF       MEM_4,1
B2
                     CALL     TIM02
                     CALL     TIM04
                     BTFSC   PORTA,0

 

                     GOTO    B3
                     BSF       MEM_4,0
B3
                     CALL     TIM02
                     CALL     TIM04
                     BTFSC   PORTA,0

 

                     GOTO    LOOP
                     CALL    TIM02
                     CALL    TIM04
                     BTFSS   PORTA,0

 

                     GOTO    LOOP
                     CALL    TIM02
                     CALL    TIM04
                     BTFSC    PORTA,0

 

                     GOTO    LOOP
                     CALL     TIM02
                     CALL     TIM04
                     BTFSS    PORTA,0

 

                     GOTO     LOOP
                     CALL     TIM02
                     CALL     TIM04
                     BTFSC    PORTA,0

 

                     GOTO     LOOP
                     DECFSZ  MEM_4,1
                     GOTO     C0
                     GOTO     Label0
C0
                     DECFSZ    MEM_4,1
                     GOTO       C1
                     GOTO       Label1
C1
                     DECFSZ    MEM_4,1
                     GOTO       C2
                     GOTO       Label2
C2
                     DECFSZ    MEM_4,1
                     GOTO       C3
                     GOTO       Label3
C3
                     DECFSZ    MEM_4,1
                     GOTO       C4
                     GOTO       Label4
C4
                     DECFSZ    MEM_4,1
                     GOTO       C5
                     GOTO       Label5
C5
                     DECFSZ    MEM_4,1
                     GOTO       C6
                     GOTO       Label6
C6
                     DECFSZ    MEM_4,1
                     GOTO       LOOP
                     GOTO       Label7

 

Label0
                     MOVLW    02H
                     MOVWF    PORTA

 

                     MOVLW    0AH
                     MOVWF    PORTB

 

                     CALL       TIM100
                     GOTO       LOOP
Label1
                     MOVLW    02H
                     MOVWF    PORTA

 

                     MOVLW    09H
                     MOVWF    PORTB

 

                     CALL       TIM100
                     GOTO       LOOP
Label2
                     MOVLW    02H
                     MOVWF    PORTA

 

                     MOVLW    06H
                     MOVWF    PORTB

 

                     CALL       TIM100
                     GOTO       LOOP
Label3
                     MOVLW    02H
                     MOVWF    PORTA

 

                     MOVLW    08H
                     MOVWF    PORTB

 

                     CALL       TIM100
                     GOTO       LOOP
Label4
                     MOVLW    02H
                     MOVWF    PORTA

 

                     MOVLW    02H
                     MOVWF    PORTB

 

                     CALL       TIM100
                     GOTO       LOOP
Label5
                     MOVLW    02H
                     MOVWF    PORTA

 

                     MOVLW    05H
                     MOVWF    PORTB

 

                     CALL       TIM100
                     GOTO       LOOP
Label6
                     MOVLW    02H
                     MOVWF    PORTA

 

                     MOVLW    04H
                     MOVWF    PORTB

 

                     CALL       TIM100
                     GOTO       LOOP
Label7
                     MOVLW    02H
                     MOVWF    PORTA

 

                     MOVLW    01H
                     MOVWF    PORTB

 

                     CALL       TIM100
                     GOTO       LOOP
;*****************************
;200μs
;*****************************
TIM02
                     MOVLW    07CH
                     MOVWF    MEM_1
TIMLP1          NOP
                     DECFSZ    MEM_1,F
                     GOTO    TIMLP1
                     RETURN
;*****************************
;400μs
;*****************************
TIM04
                      MOVLW    0F9H
                      MOVWF    MEM_2
TIMLP2           NOP
                      DECFSZ    MEM_2,F
                      GOTO      TIMLP2
                      RETURN
;*****************************
;0.1s
;*****************************
TIM100
                      MOVLW    0F9H
                      MOVWF    MEM_3
TIMLP3            CALL    TIM04
                      DECFSZ    MEM_3,F
                      GOTO       TIMLP3
                      RETURN
END

 


PIC16F84による赤外線送信回路について

2014年07月11日 | PICマイコン

 

図1、赤外線LED:TLN108(左)と赤外線受光モジュール:PL-IRM2121(右)

 今回行う赤外線通信の方法は、IrDAなどの規格に沿ったものでなくテレビのリモコンなどの簡素なものである.

  赤外線LEDは、発光波長950nmで近赤外線を発光する。ちなみに人間の可 視光は約380nm~約780nmであるため発光を肉眼で確認することはできない.一方、赤外線受信モジュールのほうはキャリア周波数38kHzで点滅する波長950nmの赤外線に反応するように作られている。

赤外線LEDを38KHzのキャリア周波数で600μSの間点滅させたり消灯させたりすることにより赤外線受信モジュールにビットデータを送信させることができる。またビット情報は、アクティブロウのため反転受信する。

 下図は送信波形と受信波形のビットイメージ図。

 

送受信フレームについて

  1 ビットと0ビットを送信する仕組みは前述の通りだが、これを12ビットひと塊のフレームとして送信することにより、受信側のデバイスを効率よく制 御する.まず先頭のスタートビット1ビットについては、データの最初を示している.次にデバイスコードの2ビットについては受信側の機器を識別制御するた めのビット列である.今回は01の固定であるが、2ビットあるため4台の受信機をコントロールできる.次にスイッチコード4ビットについては0000から 1111まで16通りのスイッチ操作が可能であるため、LEDの点滅やモータの回転制御などに割り当てる.

  最後のストップビットについては受信側でデータが一致しているかどうかの確認に使用する.一致していれば正しくデータの送受信がおこなわれたと判断し次の処理に移る. また、一致しなかった場合送受信が失敗と判断し、一連の処理を破棄し再びスタートビットの到着を待つ.

 リモコン送信プログラムフローチャート

 赤外線送信のテストプログラムを作成する.

 ボタン1を押すとスイッチコード0001をボタン2を押すとスイッチコード0010を送信するアセンブラプログラムを作成する.以下はそのフローチャート.

 赤外線送信アセンブラプログラム
上記フローチャートに基づく、スイッチコード0001と0010をボタン押下による送信プログラムを掲載する.


;*****************************
; 赤外線送信テストプログラム
;*****************************
    LIST    P=PIC16F84;
    INCLUDE    P16F84.INC;

 

MEM_1    EQU        0CH
MEM_2    EQU        0DH
MEM_3    EQU        0EH
MEM_4    EQU        0FH
MEM_5    EQU        010H
             ORG        0
             GOTO      START
;*****************************
;メインルーチン
;*****************************
START
             BSF         STATUS,RP0
             CLRF       TRISA
             MOVLW    07FH
             MOVWF    TRISB
             BCF         OPTION_REG,7
             BCF         STATUS,RP0

 LOOP
             BTFSS     PORTB,1
             GOTO      Bit0001
             BTFSS     PORTB,2
             GOTO      Bit0010
             GOTO      LOOP

 ;*****************************
; 送信ビット列 1 01 0001 10101
;*****************************
Bit0001
    CALL    Bit1
    CALL    Bit0
    CALL    Bit1
    CALL    Bit0
    CALL    Bit0
    CALL    Bit0
    CALL    Bit1
    CALL    Bit1
    CALL    Bit0
    CALL    Bit1
    CALL    Bit0
    CALL    Bit1
    CALL    TIM20
    GOTO    LOOP

 ;*****************************
; 送信ビット列 1 01 0010 10101
;*****************************
Bit0010
    CALL    Bit1
    CALL    Bit0
    CALL    Bit1
    CALL    Bit0
    CALL    Bit0
    CALL    Bit1
    CALL    Bit0
    CALL    Bit1
    CALL    Bit0
    CALL    Bit1
    CALL    Bit0
    CALL    Bit1
    CALL    TIM20
    GOTO    LOOP

 ;*****************************
; 0 ビットを作る
;*****************************
Bit0
              MOVLW     0FH
              MOVWF     PORTA
              MOVLW     030H
              MOVWF     MEM_4
LOOP1    CALL         TIM011
              DECFSZ    MEM_4,F
              GOTO       LOOP1
              RETURN

 ;*****************************
; 1 ビットを作る
;*****************************
Bit1
              MOVLW    017H
              MOVWF    MEM_5
LOOP2    CLRF        PORTA
              CALL        TIM011
              MOVLW    0FH
              MOVWF    PORTA
              CALL        TIM011
              DECFSZ    MEM_5
              GOTO       LOOP2
              RETURN

 ;*****************************
;11μsを作る (クロック周波数 10MHzの場合)
;*****************************
TIM011
               MOVLW     08H
               MOVWF     MEM_1
               NOP
TIMLP1     DECFSZ    MEM_1,F
               GOTO       TIMLP1
               RETURN

 ;*****************************
;0.4msを作る (クロック周波数 10MHzの場合)
;*****************************
TIM04
                MOVLW    0F9H
                MOVWF    MEM_2
TIMLP2      NOP
                DECFSZ    MEM_2,F
                GOTO       TIMLP2
                RETURN

 ;*****************************
;20msを作る (クロック周波数 10MHzの場合)
;*****************************
TIM20
                MOVLW     032H
                MOVWF     MEM_3
TIMLP3      CALL        TIM04
                DECFSZ    MEM_3,F
                GOTO       TIMLP3
                RETURN

                 END

 




PIC16F84を利用した赤外線受信回路について

2014年07月10日 | PICマイコン


1)赤外線受信プログラムのフローチャートを示す.


2)アセンブラプログラムを示す.

;*************************************
; 赤外線受信テストプログラム
; snagai4500
;*************************************
; LED-RECV.ASM
LIST P=PIC16F84A;
INCLUDE P16F84.INC;

MEM_1    EQU   0CH
MEM_2    EQU   0DH
MEM_3    EQU   0DH
MEM_4       EQU     0FH
ORG      0

;*****************************
;メインルーチン
;*****************************
MAIN

BSF      STATUS,RP0
CLRF     TRISB
MOVLW   01H
MOVWF   TRISA
BCF       OPTION_REG,7
BCF       STATUS,RP0

LOOP

CLRF     PORTA
CLRF      PORTB
CLRF         MEM_4
BTFSC       PORTA,0     ;スタートビット待ち
GOTO        LOOP

CALL         TIM04         ;400μs待って
BTFSC       PORTA,0     ;再度スタートビットを確認
GOTO        LOOP         ;じゃなかったらLOOPへ

CALL         TIM02
CALL         TIM04         ;600μs待って
BTFSS       PORTA,0     ;デバイスコード(1ビット目)確認1か?
GOTO        LOOP          ;NoならLOOPへ

CALL         TIM02
CALL         TIM04         ;600μs待って
BTFSC       PORTA,0     ;デバイスコード(2ビット目)確認0か?
GOTO        LOOP          ;NoならLOOPへ

CALL         TIM02
CALL         TIM04         ;600μs待って
BTFSC       PORTA,0     ;スイッチコード(1ビット目)確認0か?
GOTO        B0              ;No(1)ならB0へ
BSF           MEM_4,3     ;0ならMEM_4の3ビット目に1をセット


B0
CALL         TIM02
CALL         TIM04          ;600μs待って
BTFSC       PORTA,0      ;スイッチコード(2ビット目)確認0か?
GOTO        B1               ;No(1)ならB1へ
BSF           MEM_4,2      ;0ならMEM_4の2ビット目に1をセット


B1
CALL          TIM02
CALL          TIM04          ;600μs待って
BTFSC        PORTA,0      ;スイッチコード(3ビット目)確認0か?
GOTO         B2               ;No(1)ならB2へ
BSF            MEM_4,1      ;0ならMEM_4の1ビット目に1をセット


B2
CALL          TIM02
CALL          TIM04           ;600μs待って
BTFSC        PORTA,0       ;スイッチコード(4ビット目)確認0か?
GOTO         B3                ;No(1)ならB3へ
BSF            MEM_4,0       ;0ならMEM_4の0ビット目に1をセット

B3
CALL          TIM02
CALL          TIM04           ;600μs待って
BTFSC        PORTA,0       ;ストップビット(1ビット目)確認0か?
GOTO         LOOP            ;確認できずLOOPへ

CALL          TIM02
CALL          TIM04           ;600μs待って
BTFSS        PORTA,0       ;ストップビット(2ビット目)確認1か?
GOTO         LOOP            ;確認できずLOOPへ

CALL          TIM02
CALL          TIM04           ;600μs待って
BTFSC        PORTA,0       ;ストップビット(3ビット目)確認0か?
GOTO         LOOP            ;確認できずLOOPへ

CALL          TIM02
CALL          TIM04           ;600μs待って
BTFSS        PORTA,0       ;ストップビット(4ビット目)確認1か?
GOTO         LOOP            ;確認できずLOOPへ

CALL          TIM02
CALL          TIM04           ;600μs待って
BTFSC        PORTA,0       ;ストップビット(5ビット目)確認0か?
GOTO         LOOP            ;確認できずLOOPへ
;*****************************************
DECFSZ      MEM_4,1       ;スイッチコードが0001?
GOTO         C0                ;じゃないならC0へ
GOTO         Label0
C0
DECFSZ      MEM_4,1       ;スイッチコードが0010?
GOTO         LOOP
GOTO         Label1

Label0
;スイッチコードが0001の時の処理を書く
;処理終わり
GOTO LOOP
Label1
;スイッチコードが0010のときの処理を書く
;処理終わり
GOTO LOOP
;*****************************
;200μs (クロック 10MHz)
;*****************************
TIM02
MOVLW       07CH
MOVWF       MEM_1
TIMLP1        NOP
DECFSZ      MEM_1,F
GOTO         TIMLP1
RETURN


TIM04
MOVLW       0F9H
MOVWF       MEM_2
TIMLP2        NOP
DECFSZ      MEM_2,F
GOTO         TIMLP2
RETURN


TIM100
MOVLW       0F9H
MOVWF       MEM_3
TIMLP3        CALL TIM04
DECFSZ      MEM_3,F
GOTO         TIMLP3
RETURN
END