第十章 ロボットサッカーにチャレンジ


10-1-2 赤外線ボールの信号を作る

これも上記と同様にPIC16f690を用いて作ります。 MODE-AからDまでをサポートします。モード変更はタクトスイッチを用います。モード変更時にはカラーLEDが点灯しどのモードになったかを知らせます。

IrBall.c
#define true 1

sbit High at PORTC.B5;
sbit Middle at PORTC.B4;
sbit Low at PORTC.B3;
sbit SuperLow at PORTC.B6;

char mode=0;
void mode0();
void mode1();
void mode2();
void mode3();

void interrupt(){
  if(++mode==4) mode = 0;
  PORTA &= 0xf8;
  switch(mode){
    case 0: PORTA.B0 = 1; break;
    case 1: PORTA.B1 = 1; break;
    case 2: PORTA.B2 = 1; break;
    case 3: PORTA.B0 = 1; PORTA.B2 = 1;break;
  }
  do{
    Delay_ms(10);
  } while(PORTA.B3==0);
  Delay_ms(100);
  PORTA &= 0xf8;
  INTCON.RABIF = 0;   // RA割り込みOK
}

void main() {
  PORTC = 0xff;
  TRISA = 0x00;              // PORTAを出力にする
  TRISB = 0xff;              // PORTBを入力にする
  TRISC = 0x00;              // PORTCを出力にする
  ANSEL = 0x00;              // アナログ入力をOFF
  ANSELH = 0x00;             // アナログ入力をOFF

  IOCA.B3=1;
  INTCON.RABIF=0;
  INTCON.RABIE=1;
  INTCON.GIE=1;
  PORTA = 1;
  Delay_ms(100);
  mode=0;
  PORTA = 0;
  while(true)
  {
    switch(mode){
      case 0: mode0(); break;
      case 1: mode1(); break;
      case 2: mode2(); break;
      case 3: mode3(); break;
    }
  }
}

void mode0()
{
  int i;
  while(true)
  {
    if(mode!=0) break;
    for(i=0; i<8; i++)
    {
      High = 1;
      Delay_us(12);
      High = 0;
      Delay_us(9);
    }
    for(i=0; i<4; i++)
    {
      Middle = 1;
      Delay_us(12);
      Middle = 0;
      Delay_us(9);
    }
    for(i=0; i<4; i++)
    {
      Low = 1;
      Delay_us(12);
      Low = 0;
      Delay_us(9);
    }
    for(i=0; i<4; i++)
    {
      SuperLow = 1;
      Delay_us(12);
      SuperLow = 0;
      Delay_us(9);
    }
    Delay_us(346);
  }
}

void mode1()
{
  High = 1;
  while(true) if(mode!=1) break;
}
 
void mode2()
{
  int i;
  while(true)
  {
    if(mode!=2) break;
    for(i=0; i<33; i++)
    {
      High = 1;
      Delay_us(12);
      High = 0;
      Delay_us(9);
    }
    Delay_us(833);
  }
}

void mode3()
{
  int i;
  while(true)
  {
    if(mode!=3) break;
    for(i=0; i<17; i++)
    {
      High = 1;
      Delay_us(12);
      High = 0;
      Delay_us(9);
    }
    Delay_us(417);
  }
}
 1 
 2 Mode-Aの時の出力設定
 3 振幅が100%の場合
 4 振幅が25%の場合
 5 振幅が6.25%の場合
 6 振幅が1.54%の場合
 7 
 8 モードのカウンタ
 9 Mode-A
10 Mode-B
11 Mode-C
12 Mode-D
13 
14 割り込みルーチン
15 タクトスイッチが押されると割り込まれる
16 カラーLED消灯
17 新しいモードによりカラーLEDを点灯させる
18 緑
19 青
20 赤
21 黄
22
23 チャタリング防止
24
25
26 LED点灯時間
27 カラーLED消灯
28
29 
30 
31 
32 
33
34
35
36
37 
38 
39 ポートAのbit3が変化したら割り込む設定
40 割り込みフラグクリア
41 ポートAからの割り込み許可
42 CPUへの割り込み許可
43 緑を点灯させる
44 
45 モードを0(MODE-A)に設定する
46 LED消灯
47 タクトスイッチが押されてモードが終わったら
48 それに応じで作業内容を変える
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 MODE-Aの信号を作る
59 40kHz信号の周期の半分は12.5μsと半端であり、
60 実測してその通りにはなるわけがないので、
61 調整してこの値になっている。
62 
63 タクトスイッチが押されてモードが変わったので終了する
64 振幅100%の部分
65 
66 
67 
68 
69 
70 
71 振幅が25%の部分
72 
73 
74 
75 
76 
77 
78 振幅が6.25%の部分
79 
80 
81 
82 
83 
84 
85 振幅が1.54%の部分
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 MODE-B
97 
98 100%のみ定常発光
99 タクトスイッチが押されてモードが変わったので終了する
100 
101 
102 MODE-C
103 
104 
105 
106 
107 タクトスイッチが押されてモードが変わったので終了する
108 833μsの間振幅100%で40kHzを出力する
109 
110 
111 
112 
113 
114 
115 833μsの間出力停止
116 
117 
118 
119 
120 MODE-D
121 
122 
123 
124 タクトスイッチが押されてモードが変わったので終了する
125 416μsの間振幅100%で40kHzを出力する
126 
127 
128 
129 
130 
131 
132 417μsの間出力停止
133 
134 

チェック用の回路ですので、正確な振幅にはなっていません。取りあえず動くという感じです。

回路図

第一章に行く    ホームに戻る