概要
マイクロマウス学習キット(Pi:Co Classic3)を使用したプログラミング入門編です。C言語で、各部品の操作方法を学習します。
注意事項
学習キットで使用するバッテリーは、バッテリー電圧が9Vを下回ると使用できなくなります。学習キット付録のサンプルプログラムには、バッテリー残量をLEDで表示するプログラムが付いていますが、書籍のプログラムはバッテリー残量を確認できないため、長時間の利用やこまめな充電など細心の注意が必要です。
- Pi:Co Classic3 マイクロマウス学習キット | 株式会社ア-ルティ
- 学習キット付録のサンプルプログラム/マニュアル
- マイクロマウスではじめよう ロボットプログラミング入門 | Ohmsha
プログラム
LED
この章では、Pi:Co Classic3に搭載されているLEDの使い方を理解しましょう。
# 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;
}
解説
実行手順
- PDRレジスタで、入出力ポートを設定します。出力ポートは1、入力ポートは0、デフォルトでは入力ポートが指定されています。
- PODRレジスタで、出力ポートへの出力値を設定します。
演習
- 各LEDが、どのポート番号とビットフィールドに対応しているか調べてください。
- set_led関数を使用して、左から数えて偶数列だけ点灯するプログラムを作成してください。
Buzzer
この章では、Pi:Co Classic3に搭載されているBuzzerの使い方を理解しましょう。
# 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;
}
解説
実行手順
- PDRレジスタで、入出力ポートを設定します。出力ポートは1、入力ポートは0、デフォルトでは入力ポートが指定されています。
- PODRレジスタで、出力ポートへの出力値を設定します。
- 学習キットで利用するBuzzerは、ONとOFFの振動で音を鳴らします。そのため、一定間隔で出力ポートへの出力値をを切り替えます。
Switch
この章では、Pi:Co Classic3に搭載されているSwitchの使い方を理解しましょう。
# 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;
}
解説
実行手順
- PDRレジスタで、入出力ポートを設定します。出力ポートは1、入力ポートは0、デフォルトでは入力ポートが指定されています。
- PIDRレジスタで、入力ポートの状態を取得します。
- Switchを使用する際は、チャタリング対策を実装します。
プログラム解説
4個のLEDで、4ビット16通りの表現ができます。実際には、全消灯を除いた15通りでプログラムの実行モードを表現します。
実行モードの選択は、左右のスイッチで行います。中央のスイッチで、モード選択を確定し、選択されたプログラムへ処理が流れていきます。
演習
- 各Switchが、どのポート番号とビットフィールドに対応しているか調べてください。
- チャタリング対策のループ処理を、ブザーに変更してください。