私の入門記録であって、入門者向け解説サイトではありません。

ポイント切替

  • 投稿日:
  • Category:

自動運転に付き物なのはポイント切替、これもArduinoなら得意分野である。さいわい、実験基板にはモータードライバーが2セット実装されているので、もう1つを利用してポイントを制御してみよう(教科書170ページ)。但し、ご存じのようにポイントマシンは長時間電気を送り続けるとコイルが焼けてしまうので、一瞬だけHIGHにしてすぐLOWに戻す事を忘れてはいけない。教科書ではdelay(200)として0.2秒で処理している。

[ スケッチ:PwmPnt1 ]

void setup() {
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}
void loop() {
 // 往路
  analogWrite(10, 90);
  digitalWrite(11, LOW);
  delay(3000);
 // 停止
  analogWrite(10, LOW);
  digitalWrite(11, LOW);
  delay(5000);
 // 復路
  analogWrite(11, 90);
  digitalWrite(10, LOW);
  delay(2180);
 // 停止
  analogWrite(11, LOW);
  digitalWrite(10, LOW);
  delay(5000);
 // ポイント切替
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  delay(200);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
 // 往路
  analogWrite(10, 90);
  digitalWrite(11, LOW);
  delay(3000);
 // 停止
  analogWrite(10, LOW);
  digitalWrite(11, LOW);
  delay(5000);
 // 復路
  analogWrite(11, 90);
  digitalWrite(10, LOW);
  delay(2180);
 // 停止
  analogWrite(11, LOW);
  digitalWrite(10, LOW);
  delay(5000);
 // ポイント切替
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);
  delay(200);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
}

パワーパック

  • 投稿日:
  • Category:

次はいよいよパワーパック、PWM制御というヤツで(教科書158ページ)、今回よりモータードライバを活用した実験が続く。回路は写真の様な感じで、モータードライバ(TB6643KQ)含む出力側は実験キット基板上に実装されている(写真ピンクのマーキング部分)ものを使った。例によって不良パーツが含まれてないか心配だったが、今回は問題なし。他にスイッチングACアダプター(12V)、ボリューム、整流ダイオードは別途購入した。

Img_6786.png

[ スケッチ:Pwm1]

void setup() {
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}
void loop() {
  int vol = analogRead(A0)/4;
  analogWrite(10, vol);
  digitalWrite(11, LOW);
  delay(50);
}

踏切まとめ

  • 投稿日:
  • Category:

ここまでのまとめとして、光センサー、LED、サーボモーター、圧電ブザーを組み合わせ、踏切として組み上げてみる(教科書124ページ)。その前に、CdSセルが手元に少し余っていたので、キット基板上のものと入れ替え、動作するようにしておいた。スケッチは前回の光センサー+圧電ブザーのものに、LEDを加え、最後にサーボモーターのコントロールを加える。

[ スケッチ:Fumikiri1]

#include 
Servo myservo;  // create servo object to control a servo
void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
}
void loop() {
  int analogValue = analogRead(A0);
  if (analogValue< 100) {
    int i;
    for (i=0; i<10; i++) {
      // play a note on pin 6 for 200 ms:
      tone(6, 675, 500);
      digitalWrite(13, HIGH);
      delay(450);
      // turn off tone function for pin 8:
      noTone(6);
      digitalWrite(13, LOW);
      tone(6, 675, 500);
      digitalWrite(12, HIGH);
      delay(450);
      // turn off tone function for pin 8:
      digitalWrite(12, LOW);
      noTone(6);
      myservo.write(90);
    }
    delay(1000);
    myservo.write(0);
  }
}

圧電ブザー

  • 投稿日:
  • Category:

次は圧電ブザーで音を出す。これで踏切の要素が全て揃う事になるが、ブザーの模擬音なので音質はチープ。まあ、ちゃんとやろうとしたらサウンドシステムか何かを使う事になるんだろうが。スケッチはサンプルの toneMultipleからの改造で、LEDを交互に点滅させる処理を付け加える。

[ スケッチ:toneMultiple1]

void setup() {
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
}
void loop() {
  tone(6, 675, 500);
  digitalWrite(13, HIGH);
  delay(450);
  noTone(6);
  digitalWrite(13, LOW);
  tone(6, 675, 500);
  digitalWrite(12, HIGH);
  delay(450);
  noTone(6);
  digitalWrite(12, LOW);
}

踏切遮断機

  • 投稿日:
  • Category:

サーボモーターは色々な使い方が出来そうだが、とりあえずすぐ頭に浮かぶのは踏切遮断機だろう。というわけで、次の練習課題では光センサーと組み合わせ、列車の通過を検知して遮断機を操作する。

[ スケッチ:Sweep1]

#include <Servo.h>
const int analogPin = A0;    // pin that the sensor is attached to
const int threshold = 150;   // an arbitrary threshold level
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0;    // variable to store the servo position
void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}
void loop() {
  int analogValue = analogRead(analogPin);
  if (analogValue < threshold) {
    for (pos = 0; pos <= 90; pos += 1) { // goes from 0 degrees to 180 degrees
      // in steps of 1 degree
      myservo.write(pos);              // tell servo to go to position 'pos'
      delay(15);                       // waits 15ms for the servo to reach pos
    }
    delay(3000);
    for (pos = 90; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
      myservo.write(pos);              // tell servo to go to position in 'pos'
      delay(15);                       // waits 15ms for the servo to reach pos
    }
  }
}