目次

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 ;
}

  スイッチの情報を使う側は、初期化と状態取得の
  関数名だけを覚えておけばよいので、担当作業に
  集中できます。


目次

inserted by FC2 system