SSブログ

自動運転用の暫定プログラム [Arduinoで自動運転(DCC)]

こんにちは。3連休の中日、都内は曇り空・・・このまま雨が降らないといいのですが。。。

かなり間が空いてしまいましたが・・・7月に入ってから、チマチマと自動運転用のプログラムをイジっていました。
とりあえず、動画をUPしました。
あ、これだけを観ても「何コレ?」的な感じですが、一応、動作チェックなので。。。



車輌の前後進やポイントの切り替えをLEDでチェックできるようにしてあります。
なので、このまま線路やポイントに繋げば動いたり切り替わったりするハズ。
あとは、フォトリフレクタを繋いで、それをチェックするプログラムが残っています。

そして、以前はプログラムの段ずらしがうまく表示できていなかったのですが、arduinoのIDEの編集タブに『HTML形式でコピーする』ってのがあったので、試してみました。

/***********************************************************************/
/*                                                                     */
/*      Zゲージ 千秀鉄道 姨捨タイプワンプレートレイアウト           */
/*      自動運転プログラム                                             */
/*                                                                     */
/*                                                                     */
/*      Ver.1.00                2016.07.xx                             */
/*                                                                     */
/*                                              by 目黒のダンボ        */
/*                                                                     */
/***********************************************************************/

#include <IRremote.h>

#define P01_R 1    // No.1 ポイント  右
#define P01_L 2   // No.1 ポイント  左
#define P02_R 3   // No.2 ポイント  右
#define P02_L 4   // No.2 ポイント  左
#define P03_R 5   // No.3 ポイント  右
#define P03_L 6   // No.3 ポイント  左
#define P04_R 7   // No.4 ポイント  右
#define P04_L 8   // No.4 ポイント  左
#define P05_R 9   // No.5 ポイント  右
#define P05_L 10  // No.5 ポイント  左
#define P06_R 11  // No.6 ポイント  右
#define P06_L 12  // No.6 ポイント  左
#define P07_R 13  // No.7 ポイント  右
#define P07_L 14  // No.7 ポイント  左

//  変数を宣言

//  タイマー割り込みのレジスター値を指定して周波数を設定します
//  analogWrite3(n)の n に相当する部分に出力値を入れていきます
//

/***********************************************************************/
/*      変数を宣言                                                     */
/*      タイマー割り込みのレジスター値を指定して周波数を設定します     */
/*      analogWrite3(n)のnに相当する部分に出力値を入れていきます     */
/***********************************************************************/

void analogWrite3(int op1)
{
  TCCR2A=0b00100011;
  TCCR2B=0b00001010;
  OCR2A=150;
  OCR2B=op1;
}
/***********************************************************************/
/*      変数を宣言                                                     */
/*      タイマー割り込みのレジスター値を指定して周波数を設定します     */
/*      analogWrite10(n)のnに相当する部分に出力値を入れていきます    */
/***********************************************************************/
void analogWrite10(int op2)
{
  TCCR1A=0b00100011;
  TCCR1B=0b00011010;
  OCR1A=150;
  OCR1B=op2;
} 



int latchPin = 2; // 74HC595のST_CPへ 白
int clockPin = 7; // 74HC595のSH_CPへ 緑
int dataPin  = 4; // 74HC595のDSへ  黄色

int v;
int h;
int l;

int fw=1;   // 前後進用変数

int RECV_PIN = 8;     // リモコン入力 赤
IRrecv irrecv(RECV_PIN);
decode_results results;


void setup() {
  pinMode(latchPin, OUTPUT);  // 白
  pinMode(clockPin, OUTPUT);  // 緑
  pinMode(dataPin, OUTPUT); // 黄色

  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver

  pinMode(13, OUTPUT); // 確認用LED

  pinMode(3,OUTPUT);   // 赤
  pinMode(10,OUTPUT);  // 白
  pinMode(11,OUTPUT);  // 緑
  pinMode(12,OUTPUT);  // 黄

}

void loop() {

int val;        // フォトリフレクタ用変数

  digitalWrite(13, HIGH);   // 電源ONでLEDを点灯
  delay(1000);  // wait for a second
  // turn the LED off by making the voltage LOW
  Serial.println("Step000");

  if (irrecv.decode(&results)) {
    Serial.println("Step000");
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value

    if((results.value == 0xFF30CF) ||
      (results.value == 0x9716BE3F)){ // リモコンが1か?
        // turn the LED on (HIGH is the voltage level)

      digitalWrite(13, LOW);    // LEDを消灯
      delay(1000);  // wait for a second


      // モータードライバ準備
      Serial.println("Step001");
      PR_Mdriver();

      // ポイント設定1
      Serial.println("Step011");
      point_set1();
      delay(2000);

      // モータードライバ準備
      Serial.println("Step012");
      PR_Mdriver();

      delay(500);

      // 前進加速
      Serial.println("Step013");
      F_Accel();

      // 前進減速
      Serial.println("Step014");
      F_Decel();

      // ポイント設定2
      Serial.println("Step021");
      point_set2();
      delay(2000);

      // モータードライバ準備
      Serial.println("Step022");
      PR_Mdriver();

      delay(500);

      // 後進加速
      Serial.println("Step023");
      R_Accel();

      // 後進減速
      Serial.println("Step024");
      R_Decel();

      // ポイント設定3
      Serial.println("Step031");
      point_set3();
      delay(2000);

      // モータードライバ準備
      Serial.println("Step032");
      PR_Mdriver();

      delay(500);

      // 前進加速
      Serial.println("Step033");
      F_Accel();

      // 前進減速
      Serial.println("Step034");
      F_Decel();

      // ポイント設定4
      Serial.println("Step041");
      point_set4();
      delay(2000);


      // モータードライバ準備
      Serial.println("Step042");
      PR_Mdriver();

      // 後進加速
      Serial.println("Step043");
      R_Accel();

      // ポイント設定5
      Serial.println("Step051");
      point_set5();
      delay(2000);

      // 後進減速
      Serial.println("Step052");
      R_Decel();

      // モータードライバ準備
      Serial.println("Step053");
      PR_Mdriver();

    }
  }
}

/***********************************************************************/
/*      ポイント設定1                                                  */
/*      ポイントの状態を                                               */
/*              P1⇒左                                                 */
/*              P2⇒左                                                 */
/*              P3⇒右                                                 */
/*              P4⇒右                                                 */
/*              P5⇒右                                                 */
/*              P6⇒右                                                 */
/*              P7⇒右                                                 */
/*      に切り換える                                                   */
/***********************************************************************/

void point_set1() {

  point_onoff8(P01_L);
  point_onoff8(P02_L);
  point_onoff8(P03_R);
  point_onoff8(P04_R);
  point_onoff8(P05_R);
  point_onoff8(P06_R);
  point_onoff8(P07_R);
  point_off();

}

/***********************************************************************/
/*      ポイント設定2                                                  */
/*      ポイントの状態を                                               */
/*              P1⇒左                                                 */
/*              P2⇒左                                                 */
/*              P3⇒左                                                 */
/*              P4⇒右                                                 */
/*              P5⇒右                                                 */
/*              P6⇒右                                                 */
/*              P7⇒左                                                 */
/*      に切り換える                                                   */
/***********************************************************************/

void point_set2() {

  point_onoff8(P01_L);
  point_onoff8(P02_L);
  point_onoff8(P03_L);
  point_onoff8(P04_R);
  point_onoff8(P05_R);
  point_onoff8(P06_R);
  point_onoff8(P07_L);
  point_off();

}

/***********************************************************************/
/*      ポイント設定3                                                  */
/*      ポイントの状態を                                               */
/*              P1⇒左                                                 */
/*              P2⇒左                                                 */
/*              P3⇒右                                                 */
/*              P4⇒左                                                 */
/*              P5⇒左                                                 */
/*              P6⇒左                                                 */
/*              P7⇒右                                                 */
/*      に切り換える                                                   */
/***********************************************************************/

void point_set3() {

  point_onoff8(P01_L);
  point_onoff8(P02_L);
  point_onoff8(P03_R);
  point_onoff8(P04_L);
  point_onoff8(P05_L);
  point_onoff8(P06_L);
  point_onoff8(P07_R);
  point_off();

}

/***********************************************************************/
/*      ポイント設定4                                                  */
/*      ポイントの状態を                                               */
/*              P1⇒左                                                 */
/*              P2⇒左                                                 */
/*              P3⇒左                                                 */
/*              P4⇒左                                                 */
/*              P5⇒左                                                 */
/*              P6⇒左                                                 */
/*              P7⇒右                                                 */
/*      に切り換える                                                   */
/***********************************************************************/

void point_set4() {

  point_onoff8(P01_L);
  point_onoff8(P02_L);
  point_onoff8(P03_L);
  point_onoff8(P04_L);
  point_onoff8(P05_L);
  point_onoff8(P06_L);
  point_onoff8(P07_R);
  point_off();

}

/***********************************************************************/
/*      ポイント設定5                                                  */
/*      ポイントの状態を                                               */
/*              P1⇒左                                                 */
/*              P2⇒左                                                 */
/*              P3⇒右                                                 */
/*              P4⇒左                                                 */
/*              P5⇒右                                                 */
/*              P6⇒左                                                 */
/*              P7⇒右                                                 */
/*      に切り換える                                                   */
/***********************************************************************/

void point_set5() {

  point_onoff8(P01_L);
  point_onoff8(P02_L);
  point_onoff8(P03_R);
  point_onoff8(P04_L);
  point_onoff8(P05_R);
  point_onoff8(P06_L);
  point_onoff8(P07_R);
  point_off();

}


/***********************************************************************/
/*      ポイント切り換え                                               */
/*        ポイント point_no を切り替えます                             */
/***********************************************************************/
void point_onoff8(int point_no) {
  // 送信中のlatchPinはグランド(LOW)レベル
  digitalWrite(latchPin, LOW);
  // シフト演算を使って切り替えるポイントを選択しています
  point_no = point_no -1;

  v = 1<<point_no;
  h = v>>8;
  l = v & 0xff;
  shiftOut(dataPin, clockPin, MSBFIRST, h);
  shiftOut(dataPin, clockPin, MSBFIRST, l);
  // 送信終了後latchPinをHIGHにする
  digitalWrite(latchPin, HIGH);
  delay(500);
}


/***********************************************************************/
/*      ポイント切り換え終了                                           */
/*        シフトレジスタをクリアする                                   */
/***********************************************************************/
void point_off() {
  // 送信中のlatchPinはグランド(LOW)レベル
  digitalWrite(latchPin, LOW);
  // シフト演算を0クリア
  shiftOut(dataPin, clockPin, MSBFIRST, 0);
  shiftOut(dataPin, clockPin, MSBFIRST, 0);
  // 送信終了後latchPinをHIGHにする
  digitalWrite(latchPin, HIGH);
  // 送信終了後latchPinをHIGHにする
  delay(1000);
}

/***********************************************************************/
/*      モータードライバ準備                                           */
/***********************************************************************/

void PR_Mdriver() {
  digitalWrite(3,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW); 
}

/***********************************************************************/
/*      前進 加速                                                     */
/***********************************************************************/

void F_Accel() {
  digitalWrite(11,HIGH);
  for (int i=1 ;i<10 ;i++ ){
    analogWrite3(i);
    digitalWrite(10,LOW);
    delay(300);
  }
}

/***********************************************************************/
/*      後進 加速                                                     */
/***********************************************************************/

void R_Accel() {
  digitalWrite(12,HIGH);
  for (int i=1 ;i<10 ;i++ ){
    analogWrite10(i);
    digitalWrite(3,LOW);
    delay(300);
  }
}

/***********************************************************************/
/*      前進 減速                                                     */
/***********************************************************************/

void F_Decel() {
  for (int i=10;i>1;i--){
    analogWrite3(i);
    digitalWrite(10,LOW);
    delay(300);
  }
}

/***********************************************************************/
/*      後進 減速                                                     */
/***********************************************************************/

void R_Decel() {
  for (int i=10;i>1;i--){
    analogWrite10(i);
    digitalWrite(13,LOW);
    delay(300);
  }
}




nice!(2)  コメント(2)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 2

コメント 2

taka@

ダンボさん、おはようございます。

自動運転、良いですねぇ(^^)
ワタシも感化されてちょいとカジリ出しました。
こちらのように1から勉強されるのが良いのでしょうが、ちょいとインチキしてますけど・・・(^^ゞ

でもいつかはArduino IDE 環境を作ってやってみたいものです。

今後も参考にさせていただきます。m(_ _)m
by taka@ (2016-07-27 08:46) 

目黒のダンボ

taka@さん、こんにちは。

>自動運転、良いですねぇ(^^)
なんとか形になってきました♪

>ワタシも感化されてちょいとカジリ出しました。
ブログ、拝見しました!
私ので『ヤル気スイッチ』がONになったのなら幸いです!

>こちらのように1から勉強されるのが良いのでしょうが、ちょいとインチキしてますけど・・・(^^ゞ
>でもいつかはArduino IDE 環境を作ってやってみたいものです。
ネットで公開されているプログラムが大量にあるので、ゼロからでないのでなんとかんりますよ!

>今後も参考にさせていただきます。m(_ _)m
taka@さんのDCCのほうを参考にしてNのモジュールを再構築してみようと妄想が膨らんでます!(笑)
by 目黒のダンボ (2016-07-28 12:23) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0