マイコン始めました

自作パソコンに飽きたのでマイコンを始めました。マイコンというとアセンブリでガリガリとプログラムを書いて専用のプログラマで ROM に焼いて周辺回路を作るようなイメージでした。でも、最近は Arduino という Atmel の AVR マイコンを使ったマイコンボードはC言語風のProcessing/Wiring 言語を実装した専用の開発環境を使って、 USB で接続してプログラムを書き込めるので相当使い勝手がよくて、作りたいと思った時に作りたいものがすぐ作れる。自作PCは飽きたけれど、何かハードをいじりたい人はマイコンがお勧めです。


加速度センサーを使ってフルカラー LED を制御してみました。
水平状態で緑色、プラス方向の傾斜で赤色、マイナス方向の傾斜で青色の LED が点灯します。PWNで水平状態から離れるほど LED が明るく点灯します。


水平状態


傾斜状態水(X = プラス方向 Y = マイナス方向)


Sketch

// 加速度センサー接続ピン //
int xPin = 2;
int yPin = 1;
int zPin = 0;

// LED接続ピン //
int LEDRedX = 3;
int LEDGreenX = 6;
int LEDBlueX = 5;
int LEDRedY = 9;
int LEDGreenY = 11;
int LEDBlueY = 10;
int LEDStatus = 13;

// スイッチ //
int ResetSW = 12;

// 反応範囲 //
int RangeMax = 5;
int RangeMin = -5;

// 加速度センサー補正値 //
int defvalx;
int defvaly;
int defvalz;

void setup() {
  // ピン設定 //
  pinMode(ResetSW, INPUT);
  pinMode(LEDStatus, OUTPUT);
  
  // 角度をリセット //
  defvalx = analogRead(xPin);
  defvaly = analogRead(yPin);
  defvalz = analogRead(zPin);
  
  // シリアル通信開始 //
  Serial.begin(9600);
}

void loop() {
  // 値を読み込み //
  int x = analogRead(xPin) - defvalx;
  int y = analogRead(yPin) - defvaly;
  int z = analogRead(zPin) - defvalz;
  
  // 角度をリセット //
  if(digitalRead(ResetSW) == LOW || Serial.available() > 0) {
    Serial.flush();
    digitalWrite(LEDStatus, HIGH);
    defvalx = analogRead(xPin);
    defvaly = analogRead(yPin);
    defvalz = analogRead(zPin);
  } else {
    digitalWrite(LEDStatus, LOW);
  }
  
  // LED点灯 //
  // X軸 //
  if(x>RangeMax) {
    LEDX(x, 0, 0);
  }
  if(x
    LEDX(0, 0, x * -1);
  }
  if(x
    LEDX(0, 100, 0);
  }
  
  // Y軸 //
  if(y>RangeMax) {
    LEDY(y, 0, 0);
  }
  if(y
    LEDY(0, 0, y * -1);
  }
  if(y
    LEDY(0, 100, 0);
  }
  
  // シリアルでPCに角度を送信 //
  // X軸 //
  Serial.print("X=");
  Serial.print(x, DEC);
  Serial.print(",");
  
  // Y軸 //
  Serial.print("Y=");
  Serial.print(y, DEC);
  Serial.print(",");
  
  // Z軸 //
  Serial.print("Z=");
  Serial.println(z, DEC);
  
  // 反応スピード //
  delay(100);
}

// X軸用フルカラーLED制御 //
void LEDX(int Red, int Green, int Blue) {
  analogWrite(LEDRedX, Red);
  analogWrite(LEDGreenX, Green);
  analogWrite(LEDBlueX, Blue);
}
// Y軸用フルカラーLED制御 //
void LEDY(int Red, int Green, int Blue) {
  analogWrite(LEDRedY, Red);
  analogWrite(LEDGreenY, Green);
  analogWrite(LEDBlueY, Blue);
}