マイクロマウス入門 基本編１ - PiCoClassic3

# 概要

マイクロマウス学習キット（Pi:Co Classic3）を使用したプログラミング入門編です。C言語で、各部品の操作方法を学習します。

**注意事項**
学習キットで使用するバッテリーは、バッテリー電圧が9Vを下回ると使用できなくなります。学習キット付録のサンプルプログラムには、バッテリー残量をLEDで表示するプログラムが付いていますが、書籍のプログラムはバッテリー残量を確認できないため、長時間の利用やこまめな充電など細心の注意が必要です。

- [Pi:Co Classic3 マイクロマウス学習キット | 株式会社ア－ルティ](https://rt-net.jp/products/pico-classic3/)
- [学習キット付録のサンプルプログラム/マニュアル](https://www.rt-shop.jp/download/PC3/)
- [マイクロマウスではじめよう ロボットプログラミング入門 | Ohmsha](https://www.ohmsha.co.jp/book/9784274507113/)


# プログラム

## LED

この章では、Pi:Co Classic3に搭載されているLEDの使い方を理解しましょう。

```PiCoClassic3.c
#include "iodefine.h"

void init_led(void);
void set_led(unsigned char data);
void main(void);


void main(void)
{
  int i;
	
  init_led();

  while(1)
  {
    PORTB.PODR.BIT.B0 = 1;
    PORTA.PODR.BIT.B6 = 1;
    PORTA.PODR.BIT.B4 = 1;
    PORTA.PODR.BIT.B0 = 1;
    for(i=0; i<0xFFF; i++);
    PORTB.PODR.BIT.B0 = 0;
    PORTA.PODR.BIT.B6 = 0;
    PORTA.PODR.BIT.B4 = 0;
    PORTA.PODR.BIT.B0 = 0;
    for(i=0; i<0xFFF; i++);
  }
}


void init_led(void)
{
  PORTB.PDR.BIT.B0 = 1;
  PORTA.PDR.BIT.B6 = 1;
  PORTA.PDR.BIT.B4 = 1;
  PORTA.PDR.BIT.B0 = 1;
}

void set_led(unsigned char data)
{
  PORTB.PODR.BIT.B0 = data&0x01;
  PORTA.PODR.BIT.B6 = (data>>1)&0x01;
  PORTA.PODR.BIT.B4 = (data>>2)&0x01;
  PORTA.PODR.BIT.B0 = (data>>3)&0x01;
}

```

**解説**

実行手順
1. PDRレジスタで、入出力ポートを設定します。出力ポートは1、入力ポートは0、デフォルトでは入力ポートが指定されています。
2. PODRレジスタで、出力ポートへの出力値を設定します。

---

### 演習

1. 各LEDが、どのポート番号とビットフィールドに対応しているか調べてください。
2. set_led関数を使用して、左から数えて偶数列だけ点灯するプログラムを作成してください。


## Buzzer

この章では、Pi:Co Classic3に搭載されているBuzzerの使い方を理解しましょう。

```PiCoClassic3.c
#include "iodefine.h"

void init_buzzer(void);
void main(void);


void main(void)
{
  int i;

  init_buzzer();

  while(1)
  {
    PORTB.PDR.BIT.B3 = 1;
    for(i=0; i<0x3F; i++);
    PORTB.PDR.BIT.B3 = 0;
    for(i=0; i<0x3F; i++);
  }
}


void init_buzzer(void)
{
  PORTB.PDR.BIT.B3 = 1;
}

```

**解説**

実行手順
1. PDRレジスタで、入出力ポートを設定します。出力ポートは1、入力ポートは0、デフォルトでは入力ポートが指定されています。
2. PODRレジスタで、出力ポートへの出力値を設定します。
3. 学習キットで利用するBuzzerは、ONとOFFの振動で音を鳴らします。そのため、一定間隔で出力ポートへの出力値をを切り替えます。


## Switch

この章では、Pi:Co Classic3に搭載されているSwitchの使い方を理解しましょう。

```PiCoClassic3.c
#include "iodefine.h"

void init_led(void);
void set_led(unsigned char data);
void init_buzzer(void);
void init_switch(void);
void main(void);


void main(void)
{
  int mode=1;
  int i;

  init_led();
  init_buzzer();
  init_switch();

  while(1)
  {
    set_led(mode);

    if(!PORTC.PIDR.BIT.B2)
    {
      for(i=0; i<0xFFF; i++);
      mode++;
      if(mode>4) mode=4;
      while(!PORTC.PIDR.BIT.B2);
      for(i=0; i<0xFFF; i++);
    }

    if(!PORT3.PIDR.BIT.B1)
    {
      for(i=0; i<0xFFF; i++);
      mode--;
      if(mode<1) mode=1;
      while(!PORT3.PIDR.BIT.B1);
      for(i=0; i<0xFFF; i++);
    }

    if(!PORTC.PIDR.BIT.B3)
    {
      break;
    }
  }
  
  while(1)
  {
    PORTB.PDR.BIT.B3 = 1;
    for(i=0; i<0x3F; i++);
    PORTB.PDR.BIT.B3 = 0;
    for(i=0; i<0x3F; i++);
  }
}


void init_switch(void)
{
  PORTC.PDR.BIT.B2 = 0;
  PORT3.PDR.BIT.B1 = 0;
  PORTC.PDR.BIT.B3 = 0;
}

void init_led(void)
{
  PORTB.PDR.BIT.B0 = 1;
  PORTA.PDR.BIT.B6 = 1;
  PORTA.PDR.BIT.B4 = 1;
  PORTA.PDR.BIT.B0 = 1;
}

void set_led(unsigned char data)
{
  PORTB.PODR.BIT.B0 = data&0x01;
  PORTA.PODR.BIT.B6 = (data>>1)&0x01;
  PORTA.PODR.BIT.B4 = (data>>2)&0x01;
  PORTA.PODR.BIT.B0 = (data>>3)&0x01;
}

void init_buzzer(void)
{
  PORTB.PDR.BIT.B3 = 1;
}

```

**解説**

実行手順
1. PDRレジスタで、入出力ポートを設定します。出力ポートは1、入力ポートは0、デフォルトでは入力ポートが指定されています。
2. PIDRレジスタで、入力ポートの状態を取得します。
3. Switchを使用する際は、チャタリング対策を実装します。

プログラム解説
４個のLEDで、４ビット１６通りの表現ができます。実際には、全消灯を除いた１５通りでプログラムの実行モードを表現します。
実行モードの選択は、左右のスイッチで行います。中央のスイッチで、モード選択を確定し、選択されたプログラムへ処理が流れていきます。

---

### 演習

1. 各Switchが、どのポート番号とビットフィールドに対応しているか調べてください。
1. チャタリング対策のループ処理を、ブザーに変更してください。