目次
前
次
ArduinoMega2560ピン関係処理
ArduinoMega2560はピン数が多いので、ATmega2560の
ポートに合わせた入出力設定や初期値を指定するより
APIのpinModeを使っての設定の方が簡単になります。
ArduinoMega2560のデジタルピンでは、デフォルトで
次のように機能が決められてます。
D0 RxD0(input) - transfer firmware <builtin USB>
D1 TxD0(output) - transfer firmware <builtin USB>
D13 LED(bundling)
D14 TxD3(output)
D15 RxD3(input)
D16 TxD2(output)
D17 RxD2(input)
D18 TxD1(output)
D19 RxD1(input)
D20 SDA <IIC bus>
D21 SCL <IIC bus>
D50 MISO <SPI>
D51 MOSI <SPI>
D52 SCK <SPI>
D53 SS <SPI>
デフォルトで決められているとはいえ、GPIOでどのようにでも
使えるのがArduinoのウリなので、ピンの入出力方向設定や値
指定を簡単にする関数を考えてみました。
LED点滅処理
ArduinoMega基板上に半田付けされているLEDと
外部に接続したLEDを使うならば、2種の関数
を用意して対応します。
入出力方向指定の関数は、次のように定義。
#define LED_BIT 13
#define MON_OUT 40
void init_led()
{
/* set initial value */
digitalWrite( LED_BIT , LOW );
digitalWrite( MON_OUT , LOW );
/* pin direction */
pinMode( LED_BIT , OUTPUT );
pinMode( MON_OUT , OUTPUT );
}
setupの中で、上の関数を呼び出せば、入出力の指定と
初期値設定は、終了。
実際にLEDを点灯、消灯するには、別の関数を
定義して対応します。
void put_led(boolean lx,boolean mx)
{
/* LED_BIT */
digitalWrite( LED_BIT , LOW );
if ( lx ) { digitalWrite( LED_BIT , HIGH ); }
/* MON_OUT */
digitalWrite( MON_OUT , LOW );
if ( mx ) { digitalWrite( MON_OUT , HIGH ); }
}
LCD処理
LCDとして、2行x16桁のSC1602を使うとします。
LCDを扱うための専用ライブラリがあるので
それを使うために、インクルードし、利用
ピンを指定。
#include <LiquidCrystal.h>
/* LCD rs , e , D4 , D5 , D6 , D7 */
LiquidCrystal lcd(28,29,30,31,32,33);
LCDは初期化しないと使えないので、初期化の
関数を定義。
void init_lcd()
{
byte ii ;
/* 16 columns x 2 lines */
lcd.begin( 16, 2 );
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Measure");
lcd.setCursor(0, 1);
lcd.print("Hello, world!");
/* LCD string default */
clr_lcd();
}
LCDに表示する文字列は、配列に入れて処理すると
操作が楽なので、配列を上下の2行分用意します。
char lineU[17] ;
char lineL[17] ;
上下それぞれにスペースを入れて、何も表示されないように
した方が楽なので、画面クリアの関数を用意。
void clr_lcdU()
{
byte ii ;
/* LCD string default */
for ( ii = 0 ; ii < 16 ; ii++ ) {
*(lineU+ii) = ' ' ;
}
*(lineU+16) = '\0';
}
void clr_lcdL()
{
byte ii ;
/* LCD string default */
for ( ii = 0 ; ii < 16 ; ii++ ) {
*(lineL+ii) = ' ' ;
}
*(lineL+16) = '\0';
}
void clr_lcd()
{
clr_lcdU();
clr_lcdL();
}
最後に、配列に格納した文字列を、LCDへと
転送する関数を定義します。
void put_lcd()
{
/* upper */
lcd.setCursor(0,0);
lcd.print( lineU );
/* lower */
lcd.setCursor(0,1);
lcd.print( lineL );
}
文字列を格納する処理は、他のブロックが担当するので
上下に相当するエリアとスペースで配列の内容を埋める
関数名を公開すれば、使う側が考えることになります。
スイッチ状態取得
プッシュスイッチやタクタイルスイッチを使うときに
プルアップ抵抗をつけるのは、煩わしいので、チップ
内部のプルアップ抵抗を利用できるようにします。
#define ENTRY_SW 22
#define ENTRY_SW_EXIT 30
void init_sw()
{
byte ii ;
/* scan */
for ( ii = ENTRY_SW ; ii < ENTRY_SW_EXIT ; ii++ ) {
pinMode( ii , INPUT_PULLUP );
}
}
プルアップでの入力を指定したなら、スイッチの
状態を取得する関数を定義。
byte get_sw()
{
byte result ;
int ii ;
/* clear */
result = 0 ;
/* scan */
for ( ii = ENTRY_SW_EXIT-1 ; ii > ENTRY_SW - 1 ; ii-- ) {
result <<= 1 ;
result |= digitalRead( ii ) ;
}
/* mask */
result &= 0xff ;
return result ;
}
スイッチの情報を使う側は、初期化と状態取得の
関数名だけを覚えておけばよいので、担当作業に
集中できます。
目次
前
次