言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

太鼓の達人コントローラの解析その2 太鼓を叩いて LED を光らせる

先日だいたい分かったので、今日は「太鼓を叩くと LED が光る仕組み」を作ってみる。
今までのまとめ:

  • 電源は 3.3V
  • センサからの入力は何もない時に3.3V で、叩くと一瞬 0V になる。
  • タタコン内のマイコンでは、センサ入力を U74HC14L で安定化、反転してから使っている。

P1060164

ここからどうやって信号を取り出そうかとても悩んだのですが、半田付けが簡単なように結局センサ入力をそのまま引っ張る事にしました。ここで分からなかったのは、そもそもセンサからの入力が何も無い時になぜ 3.3V になるかという事です。センサは圧力によって抵抗が変わるだけの仕組みなので、自分で 3.3V を発生するわけがない。センサを外した状態でテスタを当ててみて、入力が無い時はシュミットトリガ U74HC14L が電源電圧をかける事が分かりました。ちょっとググっただけでは U74HC14L の中身が分からなかったので何故こうなっているかは分からずじまいでしたが、気にしないでまず進む事にしました。

次に、いよいよ Arduino に繋ぎ LED を光らせてみます。Arduino には都合が良く 3.3V 出力がありますので、これをタタコンの電源として使います。センサー入力はデジタル D2 ピンに繋ぎます。Arduino が 5V なのに対してタタコンは 3.3V なので多少違いますが、まあデジタル入力の許容範囲みたいです。

P1060168 P1060171 P1060183

このように繋いでプログラムを走らせます。プログラムは Button サンプルとほとんど同じです。HIGH と LOW が逆転している所と、LED を光らせた後 30ms 程何もしない所が違います。

const int sensorPin = 2;     // Pressure sensor
const int ledPin =  13;      // LED pin
const int delayTime = 30;

void setup() {
  pinMode(ledPin, OUTPUT); // initialize the LED pin as an output:
  pinMode(sensorPin, INPUT); // initialize the sensor pin as an input:
}

void loop(){
  int sensorState = digitalRead(sensorPin); // read the state of the sensor value:

  if (sensorState == HIGH) {     
    digitalWrite(ledPin, LOW);  // If the sensorState is HIGH, Nothing happens.
  } else {
    digitalWrite(ledPin, HIGH); // If the sensorState is LOW, Taiko is triggered.
    delay(delayTime);
  }
}

P1060176

太鼓を叩くと LED が光った!

ちなみに、一応注意深く作業したのでこの状態で Wii コントローラに繋いで「太鼓の達人」ゲームで遊ぶ事も出来ます。壊したくなかったので作業前の調査に時間を食ってしまいましたが、工作自体は至って簡単でした。