ArduinoでNゲージのコントローラーを作ってみた

おとといの続きで、可変抵抗の値を読んでPWMで制御するコントローラーを作ってみた。

#define LED_PIN_LEFT 2
#define LED_PIN_RIGHT 3
#define VOLUME_PIN A1
#define MOTOR_FRONT 6
#define MOTOR_BACK 5
/**
 * ピン初期化
 */
void setup() {
  pinMode(LED_PIN_LEFT, OUTPUT);
  pinMode(LED_PIN_RIGHT, OUTPUT);
  pinMode(MOTOR_FRONT, OUTPUT);
  pinMode(MOTOR_BACK, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int value = ((analogRead(VOLUME_PIN) / 1023.0f) * 24) - 12; // 24段階に正規化して真ん中で左右を分ける
  Serial.println(value);
  if(value < 0) {
    // 左方向
    Serial.println("left");
    digitalWrite(LED_PIN_LEFT, HIGH);
    digitalWrite(LED_PIN_RIGHT, LOW);
    int speed =  (1 - (value / 12.0f)) * 250;
    analogWrite(MOTOR_BACK, 0);
    analogWrite(MOTOR_FRONT, speed);
  } else if(value > 0) {
    // 右方向
    Serial.println("right");
    digitalWrite(LED_PIN_RIGHT, HIGH);
    digitalWrite(LED_PIN_LEFT, LOW);
    int speed =  ((value / 12.0f)) * 250;
    analogWrite(MOTOR_BACK, speed);
    analogWrite(MOTOR_FRONT, 0);
  } else {
    // 停止
    Serial.println("stop");
    digitalWrite(LED_PIN_LEFT, LOW);
    digitalWrite(LED_PIN_RIGHT, LOW);
    float speed = 0;
    analogWrite(MOTOR_FRONT, 0);
    analogWrite(MOTOR_BACK, 0);
  }
  delay(100);
}

可変抵抗の値(0~1023)を24段階にして、中央(12)で停止。12未満なら左方向、12より大きければ右方向に走行とすることで、可変抵抗だけで正転逆転に対応。
周波数はデフォルトのまま(5ピンと6ピンは970Hz)なので走行中は励起音がずっとしてる。というか止まってても励起音がしてる。
この辺は周波数を変えれば良さそう。なんかVVVFインバーターの音再現できるみたいだし(?)

なにげにArduinoとモータードライバそれぞれに電源が必要なのが面倒だな。しかもモータードライバの電源は12Vあるから、間違えるとArduinoが死ぬ可能性があるし…

後はセンサーで車両検知して自動運転と、列車交換。あとは脱線検知できればいいなぁ……部品とレール買わなきゃ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください