Components and supplies
HC-05 Bluetooth Module
Infrared Module (Generic)
ELECTRIC SWITCH MACHINE
Arduino Nano R3
Motor-Driver L298 (Generic)
ULN2003 Stepper Motor Driver Board Module
Apps and platforms
Arduino Train DEMO
Arduino IDE
Project description
Code
Reverse Loop
arduino
1// LOOP FOR APP DEMO // 2 3// L298 4#define L298_ENA 6 5#define L298_IN1 7 6#define L298_IN2 5 7#define L298_IN3 4 8#define L298_IN4 2 9#define L298_ENB 3 10 11// SWITCH MACHINE 12#define STRAIGHT 9 13#define BRANCH 10 14 15// SENSOR 16#define SENSOR 11 17 18// VARIABLES // 19bool stringComplete = false; 20String inputString = ""; 21byte speedArray [] = {60, 80, 100, 120, 140, 170, 200, 230, 255}; 22byte speedTrain = 0; 23bool directionForward = false, directionBackward = false; 24bool sensorLatch = false; 25bool flagTimer = false; 26unsigned long millisLoop; 27 28void setup() { 29 30// Initializing Serial 31 Serial.begin(9600); 32 inputString.reserve(4); 33 34// Initializing Motor-Driver 35 pinMode(L298_ENA, OUTPUT); 36 pinMode(L298_IN1, OUTPUT); 37 pinMode(L298_IN2, OUTPUT); 38 pinMode(L298_IN3, OUTPUT); 39 pinMode(L298_IN4, OUTPUT); 40 pinMode(L298_ENB, OUTPUT); 41 42// Initializing Switch Machine 43 pinMode(STRAIGHT, OUTPUT); 44 pinMode(BRANCH, OUTPUT); 45 46// Initializing Sensor 47 pinMode(SENSOR, INPUT); 48 49// SET TURNOUT TO DEFAULT POSITION 50 digitalWrite(STRAIGHT, HIGH); 51 delay(600); 52 digitalWrite(STRAIGHT, LOW); 53 54} 55 56void loop() { 57 58// ---- START PARSING INCOMING APP COMMANDS 59 if (stringComplete) { 60 61 if (inputString.charAt(0) =='a') { 62 63 // Speed 64 if (inputString.charAt(1) =='0') { 65 if (inputString.charAt(2) =='0') speedTrain = 0; 66 if (inputString.charAt(2) =='2') speedTrain = speedArray[0]; 67 if (inputString.charAt(2) =='4') speedTrain = speedArray[1]; 68 if (inputString.charAt(2) =='6') speedTrain = speedArray[2]; 69 if (inputString.charAt(2) =='8') speedTrain = speedArray[3]; 70 } 71 if (inputString.charAt(1) =='1') { 72 if (inputString.charAt(2) =='0') speedTrain = speedArray[4]; 73 if (inputString.charAt(2) =='2') speedTrain = speedArray[5]; 74 if (inputString.charAt(2) =='4') speedTrain = speedArray[6]; 75 if (inputString.charAt(2) =='6') speedTrain = speedArray[7]; 76 if (inputString.charAt(2) =='8') speedTrain = speedArray[8]; 77 } 78 79 // Direction and Stop 80 if (inputString.charAt(1) =='d') { 81 if (inputString.charAt(2) =='f') { // (f) Forward 82 digitalWrite(L298_IN1, HIGH); 83 digitalWrite(L298_IN2, LOW); 84 directionForward = true; 85 directionBackward = false; 86 } 87 if (inputString.charAt(2) =='b') { // (b) Backward 88 digitalWrite(L298_IN1, LOW); 89 digitalWrite(L298_IN2, HIGH); 90 directionForward = false; 91 directionBackward = true; 92 } 93 if (inputString.charAt(2) =='s') { // (s) Stop button 94 digitalWrite(L298_IN1, LOW); 95 digitalWrite(L298_IN2, LOW); 96 speedTrain = 0; 97 directionForward = false; 98 directionBackward = false; 99 } 100 } 101 analogWrite(L298_ENA, speedTrain); // Throttle 102 analogWrite(L298_ENB, speedTrain); // Throttle 103 } 104 105 inputString = ""; 106 stringComplete = false; 107 } 108 109// ---- LOOP 110 // Train in sensor area 111 if (digitalRead(SENSOR) == HIGH) { 112 // To check STOP state 113 if (directionForward != directionBackward) { 114 directionForward = !directionForward; 115 directionBackward = !directionBackward; 116 // To change polarity of Main Line 117 if (directionForward) { 118 digitalWrite(L298_IN1, HIGH); 119 digitalWrite(L298_IN2, LOW); 120 } 121 else { 122 digitalWrite(L298_IN1, LOW); 123 digitalWrite(L298_IN2, HIGH); 124 } 125 // Switching turnout to branch 126 digitalWrite(STRAIGHT, LOW); 127 digitalWrite(BRANCH, HIGH); 128 } 129 sensorLatch = true; 130 } 131 132 // The train left the sensor 133 if (sensorLatch && digitalRead(SENSOR) == LOW) { 134 millisLoop = millis(); 135 sensorLatch = false; 136 flagTimer = true; 137 } 138 139 // Delay time is up (5000 - 5 sec.) 140 if (millis() > millisLoop + 5010) flagTimer = false; 141 142 if ((millis() > millisLoop + 5000) && flagTimer) { 143 Serial.println("Delay time is up"); 144 // Switching turnout to straight 145 digitalWrite(BRANCH, LOW); 146 digitalWrite(STRAIGHT, HIGH); 147 } 148 149 // To check STOP state 150 if ((directionForward != directionBackward) && digitalRead(SENSOR) == LOW) { 151 152 // To change polarity of Loop Line 153 if (directionForward) { 154 digitalWrite(L298_IN3, HIGH); 155 digitalWrite(L298_IN4, LOW); 156 } 157 else { 158 digitalWrite(L298_IN3, LOW); 159 digitalWrite(L298_IN4, HIGH); 160 } 161 } 162} 163 164 165//// FUNCTIONS //// 166 167void serialEvent() { 168 if (Serial.available()) { 169 char inChar = (char)Serial.read(); 170 inputString += inChar; 171 if (inChar == 'z') { 172 stringComplete = true; 173 } 174 } 175}
Downloadable files
Reverse Loop Circuit
Reverse Loop Circuit
Reverse Loop Circuit
Reverse Loop Circuit
Comments
Only logged in users can leave comments