Hi there,
i am trying to modify the code for my arduino nano from arduino railwaycontrol to use a different motor driver as the original one is too big.
The code is to control a model train via a bluetooth connected app. Very simple forward, backward, stop and a slider for the speed.
Original it uses the L298N and now i ordered a MX1508 "mini L298N". As i am still waiting for the driver to arrive, i had a look at the code and saw that they both work differentely as the MX1508 does not have a ENA Input. So the code needs to be changed but can not really find much about the MX1508 code on the web, especially with speed control.
The original code:
//--------------------------------------//
// # WWW.ARDUINORAILWAYCONTROL.COM //
// //
// ARDUINO GARDEN APP | FIRST SKETCH //
// //
// V.1.2019 Steve Massikker //
//--------------------------------------//
#include <SoftwareSerial.h>
// SOFTWARE SERIAL
SoftwareSerial Bluetooth(12, 13); // RX, TX
// L298
#define L298_ENA 9
#define L298_IN1 10
#define L298_IN2 11
// VARIABLES //
bool stringComplete = false;
String inputString = "";
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
byte speedArray [] = {40, 50, 60, 70, 80, 90,100,110,120,130,140,150,160,170,180,190,200,220,240,255};
byte speedTrain = 0;
void setup() {
// Initializing Serial
Bluetooth.begin(9600);
Serial.begin(9600);
inputString.reserve(4);
// Initializing Motor-Driver
pinMode(L298_ENA, OUTPUT);
pinMode(L298_IN1, OUTPUT);
pinMode(L298_IN2, OUTPUT);
}
void loop() {
// ---- START PARSING INCOMING APP COMMANDS
if (stringComplete) {
if (inputString.charAt(0) =='a') {
// Speed
if (inputString.charAt(1) =='0') {
if (inputString.charAt(2) =='0') speedTrain = 0;
if (inputString.charAt(2) =='1') speedTrain = speedArray[0];
if (inputString.charAt(2) =='2') speedTrain = speedArray[1];
if (inputString.charAt(2) =='3') speedTrain = speedArray[2];
if (inputString.charAt(2) =='4') speedTrain = speedArray[3];
if (inputString.charAt(2) =='5') speedTrain = speedArray[4];
if (inputString.charAt(2) =='6') speedTrain = speedArray[5];
if (inputString.charAt(2) =='7') speedTrain = speedArray[6];
if (inputString.charAt(2) =='8') speedTrain = speedArray[7];
if (inputString.charAt(2) =='9') speedTrain = speedArray[8];
}
if (inputString.charAt(1) =='1') {
if (inputString.charAt(2) =='0') speedTrain = speedArray[9];
if (inputString.charAt(2) =='1') speedTrain = speedArray[10];
if (inputString.charAt(2) =='2') speedTrain = speedArray[11];
if (inputString.charAt(2) =='3') speedTrain = speedArray[12];
if (inputString.charAt(2) =='4') speedTrain = speedArray[13];
if (inputString.charAt(2) =='5') speedTrain = speedArray[14];
if (inputString.charAt(2) =='6') speedTrain = speedArray[15];
if (inputString.charAt(2) =='7') speedTrain = speedArray[16];
if (inputString.charAt(2) =='8') speedTrain = speedArray[17];
if (inputString.charAt(2) =='9') speedTrain = speedArray[18];
}
if (inputString.charAt(1) =='2') {
if (inputString.charAt(2) =='0') speedTrain = speedArray[19];
}
// Direction and Stop
if (inputString.charAt(1) =='d') {
if (inputString.charAt(2) =='f') { // (f) Forward
digitalWrite(L298_IN1, HIGH);
digitalWrite(L298_IN2, LOW);
}
if (inputString.charAt(2) =='b') { // (b) Backward
digitalWrite(L298_IN1, LOW);
digitalWrite(L298_IN2, HIGH);
}
if (inputString.charAt(2) =='s') { // (s) Stop button
digitalWrite(L298_IN1, LOW);
digitalWrite(L298_IN2, LOW);
speedTrain = 0;
}
}
analogWrite(L298_ENA, speedTrain); // Throttle
}
Serial.println(inputString);
inputString = "";
stringComplete = false;
}
bluetoothEvent();
}
//// FUNCTIONS ////
void bluetoothEvent() {
if (Bluetooth.available()) {
char inChar = (char)Bluetooth.read();
inputString += inChar;
if (inChar == 'z') {
stringComplete = true;
}
}
}
And what i changed yet:
//--------------------------------------//
// # WWW.ARDUINORAILWAYCONTROL.COM //
// //
// ARDUINO GARDEN APP | FIRST SKETCH //
// //
// V.1.2019 Steve Massikker //
//--------------------------------------//
#include <SoftwareSerial.h>
// SOFTWARE SERIAL
SoftwareSerial Bluetooth(12, 13); // RX, TX
// L298
#define MX1508_IN1 10
#define MX1508_IN2 11
// VARIABLES //
bool stringComplete = false;
String inputString = "";
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
byte speedArray [] = {40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 220, 240, 255};
byte speedTrain = 0;
void setup() {
// Initializing Serial
Bluetooth.begin(9600);
Serial.begin(9600);
inputString.reserve(4);
// Initializing Motor-Driver
pinMode(MX1508_IN1, OUTPUT);
pinMode(MX1508_IN2, OUTPUT);
}
void loop() {
// ---- START PARSING INCOMING APP COMMANDS
if (stringComplete) {
if (inputString.charAt(0) == 'a') {
// Speed
if (inputString.charAt(1) == '0') {
if (inputString.charAt(2) == '0') speedTrain = 0;
if (inputString.charAt(2) == '1') speedTrain = speedArray[0];
if (inputString.charAt(2) == '2') speedTrain = speedArray[1];
if (inputString.charAt(2) == '3') speedTrain = speedArray[2];
if (inputString.charAt(2) == '4') speedTrain = speedArray[3];
if (inputString.charAt(2) == '5') speedTrain = speedArray[4];
if (inputString.charAt(2) == '6') speedTrain = speedArray[5];
if (inputString.charAt(2) == '7') speedTrain = speedArray[6];
if (inputString.charAt(2) == '8') speedTrain = speedArray[7];
if (inputString.charAt(2) == '9') speedTrain = speedArray[8];
}
if (inputString.charAt(1) == '1') {
if (inputString.charAt(2) == '0') speedTrain = speedArray[9];
if (inputString.charAt(2) == '1') speedTrain = speedArray[10];
if (inputString.charAt(2) == '2') speedTrain = speedArray[11];
if (inputString.charAt(2) == '3') speedTrain = speedArray[12];
if (inputString.charAt(2) == '4') speedTrain = speedArray[13];
if (inputString.charAt(2) == '5') speedTrain = speedArray[14];
if (inputString.charAt(2) == '6') speedTrain = speedArray[15];
if (inputString.charAt(2) == '7') speedTrain = speedArray[16];
if (inputString.charAt(2) == '8') speedTrain = speedArray[17];
if (inputString.charAt(2) == '9') speedTrain = speedArray[18];
}
if (inputString.charAt(1) == '2') {
if (inputString.charAt(2) == '0') speedTrain = speedArray[19];
}
// Direction and Stop
if (inputString.charAt(1) == 'd') {
if (inputString.charAt(2) == 'f') { // (f) Forward
digitalWrite(MX1508_IN2, LOW);
analogWrite(MX1508_IN1, speedTrain);
}
if (inputString.charAt(2) == 'b') { // (b) Backward
digitalWrite(MX1508_IN1, LOW);
analogWrite(MX1508_IN2, speedTrain);
}
if (inputString.charAt(2) == 's') { // (s) Stop button
digitalWrite(MX1508_IN1, HIGH);
digitalWrite(MX1508_IN2, HIGH);
}
}
}
Serial.println(inputString);
inputString = "";
stringComplete = false;
}
bluetoothEvent();
}
//// FUNCTIONS ////
void bluetoothEvent() {
if (Bluetooth.available()) {
char inChar = (char)Bluetooth.read();
inputString += inChar;
if (inChar == 'z') {
stringComplete = true;
}
}
}
But i dont think that this can work, for my understanding now the motor would only spin when the button "f" for forward or "b" for backward is pressed on the app. I do not get how this can work without a seperate Input for the speed.
Can someone help me to modify the code or give me a hint how this could work?
Thanks a lot in advance
Cedric