Components and supplies
1
Generic Arduino IR-sensor module
1
L9110s motor-driver
1
Arduino Nano R3
1
HC-06 Bluetooth Module
Apps and platforms
1
Arduino IDE
1
Arduino Train for Kids 2
Project description
Code
Sketch for Loco
arduino
1#define SENSOR_IR 2 2#define L9110S_AIA 3 3#define L9110S_AIB 5 4#define GND1 8 5#define LED1 9 6#define LED2 10 7#define FLOODLIGHT 11 8#define GND2 12 9 10static unsigned long preMillis; 11String inputString = ""; 12boolean stringComplete = false; 13int locoSpeed, counter = 0; 14bool tick, directionForward, directionBackward; 15bool sensorActive = false, alarm_allRed = false; 16 17 18void setup() { 19 // Initialize serial 20 Serial.begin(9600); 21 inputString.reserve(4); 22 23 // Pins 24 pinMode(GND1, OUTPUT); 25 pinMode(GND2, OUTPUT); 26 pinMode(LED1, OUTPUT); 27 pinMode(LED2, OUTPUT); 28 pinMode(FLOODLIGHT, OUTPUT); 29 pinMode(L9110S_AIA, OUTPUT); 30 pinMode(L9110S_AIB, OUTPUT); 31 pinMode(SENSOR_IR, INPUT); 32 33 digitalWrite(GND1, LOW); 34 digitalWrite(GND2, LOW); 35 digitalWrite(FLOODLIGHT, HIGH); 36 delay(300); 37 digitalWrite(FLOODLIGHT, LOW); 38} 39 40void loop() { 41 42 if (stringComplete) { 43 44 // TRAIN CONTROL 45 if (inputString.charAt(0) =='a') { 46 47 // TROTTLE 48 if (inputString.charAt(1) =='0') { 49 if (inputString.charAt(2) =='0') locoSpeed = 0; // Stop 50 if (inputString.charAt(2) =='2') locoSpeed = 80; 51 if (inputString.charAt(2) =='4') locoSpeed = 110; 52 if (inputString.charAt(2) =='6') locoSpeed = 140; 53 if (inputString.charAt(2) =='8') locoSpeed = 170; 54 } 55 if (inputString.charAt(1) =='1') locoSpeed = 200; 56 57 // MOVE DIRECTION 58 if (inputString.charAt(1) =='d') { 59 if (inputString.charAt(2) =='f') { 60 directionForward = true; 61 directionBackward = false; 62 } 63 if (inputString.charAt(2) =='b') { 64 directionForward = false; 65 directionBackward = true; 66 } 67 if (inputString.charAt(2) =='s') { 68 locoSpeed = 0; 69 directionForward = false; 70 directionBackward = false; 71 // DC motor conflict prevention 72 digitalWrite(L9110S_AIA, LOW); 73 digitalWrite(L9110S_AIB, LOW); 74 delay(400); 75 } 76 } 77 } 78 79 // LIGHT 80 if (inputString.charAt(0) =='l') { 81 if (inputString.charAt(2) =='0') digitalWrite(FLOODLIGHT, LOW); 82 if (inputString.charAt(2) =='1') digitalWrite(FLOODLIGHT, HIGH); 83 } 84 85 // SENSOR ON/OFF 86 if (inputString.charAt(0) =='s') { 87 if (inputString.charAt(2) =='0') sensorActive = false; 88 if (inputString.charAt(2) =='1') sensorActive = true; 89 } 90 91 inputString = ""; 92 stringComplete = false; 93 } 94 95 if (digitalRead(SENSOR_IR) == HIGH || !sensorActive) { 96 97 if (directionBackward) { 98 digitalWrite(L9110S_AIB, LOW); 99 analogWrite(L9110S_AIA, locoSpeed); 100 } 101 if (directionForward) { 102 digitalWrite(L9110S_AIA, LOW); 103 analogWrite(L9110S_AIB, locoSpeed); 104 } 105 alarm_allRed = false; 106 107 } 108 else { // STOP at IR sensor 109 110 digitalWrite(L9110S_AIA, LOW); 111 digitalWrite(L9110S_AIB, LOW); 112 Serial.println("alarmz"); 113 alarm_allRed = true; 114 } 115 116 if (locoSpeed > 0 && !alarm_allRed) { 117 static unsigned long blinkMillis; 118 if (millis() > (blinkMillis + 300)) { 119 tick = !tick; 120 blinkMillis = millis(); 121 } 122 digitalWrite(LED1, tick); 123 digitalWrite(LED2, !tick); 124 } 125 else if (alarm_allRed) { 126 digitalWrite(LED1, HIGH); 127 digitalWrite(LED2, HIGH); 128 } 129 else { 130 digitalWrite(LED1, LOW); 131 digitalWrite(LED2, LOW); 132 } 133} 134 135// FUNCTIONS 136void serialEvent() { 137 while (Serial.available()) { 138 char inChar = (char)Serial.read(); 139 inputString += inChar; 140 if (inChar == 'z') { 141 stringComplete = true; 142 } 143 } 144}
Sketch for Loco
arduino
1#define SENSOR_IR 2 2#define L9110S_AIA 3 3#define L9110S_AIB 5 4#define GND1 8 5#define LED1 9 6#define LED2 10 7#define FLOODLIGHT 11 8#define GND2 12 9 10static unsigned long preMillis; 11String inputString = ""; 12boolean stringComplete = false; 13int locoSpeed, counter = 0; 14bool tick, directionForward, directionBackward; 15bool sensorActive = false, alarm_allRed = false; 16 17 18void setup() { 19 // Initialize serial 20 Serial.begin(9600); 21 inputString.reserve(4); 22 23 // Pins 24 pinMode(GND1, OUTPUT); 25 pinMode(GND2, OUTPUT); 26 pinMode(LED1, OUTPUT); 27 pinMode(LED2, OUTPUT); 28 pinMode(FLOODLIGHT, OUTPUT); 29 pinMode(L9110S_AIA, OUTPUT); 30 pinMode(L9110S_AIB, OUTPUT); 31 pinMode(SENSOR_IR, INPUT); 32 33 digitalWrite(GND1, LOW); 34 digitalWrite(GND2, LOW); 35 digitalWrite(FLOODLIGHT, HIGH); 36 delay(300); 37 digitalWrite(FLOODLIGHT, LOW); 38} 39 40void loop() { 41 42 if (stringComplete) { 43 44 // TRAIN CONTROL 45 if (inputString.charAt(0) =='a') { 46 47 // TROTTLE 48 if (inputString.charAt(1) =='0') { 49 if (inputString.charAt(2) =='0') locoSpeed = 0; // Stop 50 if (inputString.charAt(2) =='2') locoSpeed = 80; 51 if (inputString.charAt(2) =='4') locoSpeed = 110; 52 if (inputString.charAt(2) =='6') locoSpeed = 140; 53 if (inputString.charAt(2) =='8') locoSpeed = 170; 54 } 55 if (inputString.charAt(1) =='1') locoSpeed = 200; 56 57 // MOVE DIRECTION 58 if (inputString.charAt(1) =='d') { 59 if (inputString.charAt(2) =='f') { 60 directionForward = true; 61 directionBackward = false; 62 } 63 if (inputString.charAt(2) =='b') { 64 directionForward = false; 65 directionBackward = true; 66 } 67 if (inputString.charAt(2) =='s') { 68 locoSpeed = 0; 69 directionForward = false; 70 directionBackward = false; 71 // DC motor conflict prevention 72 digitalWrite(L9110S_AIA, LOW); 73 digitalWrite(L9110S_AIB, LOW); 74 delay(400); 75 } 76 } 77 } 78 79 // LIGHT 80 if (inputString.charAt(0) =='l') { 81 if (inputString.charAt(2) =='0') digitalWrite(FLOODLIGHT, LOW); 82 if (inputString.charAt(2) =='1') digitalWrite(FLOODLIGHT, HIGH); 83 } 84 85 // SENSOR ON/OFF 86 if (inputString.charAt(0) =='s') { 87 if (inputString.charAt(2) =='0') sensorActive = false; 88 if (inputString.charAt(2) =='1') sensorActive = true; 89 } 90 91 inputString = ""; 92 stringComplete = false; 93 } 94 95 if (digitalRead(SENSOR_IR) == HIGH || !sensorActive) { 96 97 if (directionBackward) { 98 digitalWrite(L9110S_AIB, LOW); 99 analogWrite(L9110S_AIA, locoSpeed); 100 } 101 if (directionForward) { 102 digitalWrite(L9110S_AIA, LOW); 103 analogWrite(L9110S_AIB, locoSpeed); 104 } 105 alarm_allRed = false; 106 107 } 108 else { // STOP at IR sensor 109 110 digitalWrite(L9110S_AIA, LOW); 111 digitalWrite(L9110S_AIB, LOW); 112 Serial.println("alarmz"); 113 alarm_allRed = true; 114 } 115 116 if (locoSpeed > 0 && !alarm_allRed) { 117 static unsigned long blinkMillis; 118 if (millis() > (blinkMillis + 300)) { 119 tick = !tick; 120 blinkMillis = millis(); 121 } 122 digitalWrite(LED1, tick); 123 digitalWrite(LED2, !tick); 124 } 125 else if (alarm_allRed) { 126 digitalWrite(LED1, HIGH); 127 digitalWrite(LED2, HIGH); 128 } 129 else { 130 digitalWrite(LED1, LOW); 131 digitalWrite(LED2, LOW); 132 } 133} 134 135// FUNCTIONS 136void serialEvent() { 137 while (Serial.available()) { 138 char inChar = (char)Serial.read(); 139 inputString += inChar; 140 if (inChar == 'z') { 141 stringComplete = true; 142 } 143 } 144}
Downloadable files
Electric scheme
Electric scheme

Comments
Only logged in users can leave comments