DCC++ Receiver
Track-Side or OnBoard
revised 01-19-2017 d. bodnar
|
|
The wireless throttle is shown with the
Arduino Uno and its motor shield. The HC-12 radio module is at the
right rear under the USB cable. The shield is available from
eBay,
Amazon and other vendors. Its
only significant limitation is that its maximum input voltage is 16
volts which may be too low for some applications, especially for G-Scale
trains.
This close-up shows the minimal number of connections. Four wires go from the HC-12 to the Arduino. The red/black wires at the top go to the motor and the two at the bottom left go to the motor power supply. The Monster Motor shield is available from eBay and other sources for less than $10.00. Note that it is a dual motor shield but that, at least for now, we are only using one of the motor driver chips. It is possible to have this single unit power two tracks independently and this functionality may be added in the future. |
|
The Circuit The unit shown here uses an Arduino Uno (just about any Arduino should work) and an IBT-3 Motor Driver (any PWM controlled motor driver that works with an Arduino should work.) The LCD display is optional. The code associated with it is in the Arduino file and can be left there or removed should you not use the LCD. |
|
Operation Linking to a DCC address is done with the only button on the unit. Press and hold the button while turning the unit on. When the LED is solidly lit release the button (the LED will stay lit) and send a throttle command using the DCC address that you want to associate with the receiver. The LED will go out and the receiver will store that address in memory. |
|
|
|
Single Motor Control Chip (VNH2SP30) This schematic shows the wiring for a single VNH2SP30 - They are available here: eBay and here Amazon for as little as a few dollars.
|
|
Draft Code Version 0.8a/* 1-13-2017 - working on Uno and Pro Mini Single Mosfet board test (red board with pins on side & cap at power input end bypassed current test for now */ /*d. bodnar 9-30-2016 working well NOTE - this version works but 2.8 does not - not sure why! /* TODO: 1. add functions for different motor drivers 2. add LED for linking 3. test link button & process 4. consider servo activation (use function then rotary?) */ #include <Wire.h> #include <LCD.h> #include <LiquidCrystal_I2C.h> #include<EEPROM.h> #define I2C_ADDR 0x27 // <<----- Add your address here. Find it from I2C Scanner #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin); const int linkButton = 7; // Link Button int linkButtonState = 0; const int onBoardLED = 13; const byte numChars = 32; char receivedChars[numChars]; int Count = 0; boolean newData = false; String inString = ""; // string to hold input String saveString = ""; int TorF = 0; #define MAX 252 int MotorSpeed = 0; int MotorDirection = 0; int DCCAddress = 0; int activeDCCAddress = 1794; int linkAddressFlag = 0; int DCCFunction = 0; #define BRAKEVCC 0 #define CW 1 #define CCW 2 #define BRAKEGND 3 // 130 is about 2.5 amps #define CS_THRESHOLD 170 // Definition of safety current int inApin = 2; int inBpin = 3; int pwmpin = 5; // PWM's input int cspin = A0; // Current's sensor input //int statpin = 13; int i = 0;; int enable = 4; int LED0 = 10; int LED1 = 11; int LED2 = 12; int LED3 = 13; void setup() { pinMode(LED0, OUTPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(enable, OUTPUT); for (int i = 0; i < 2; i++) { pinMode(inApin, OUTPUT); pinMode(inBpin, OUTPUT); pinMode(pwmpin, OUTPUT); } for (int i = 0; i < 2; i++) { digitalWrite(inApin, LOW); digitalWrite(inBpin, LOW); } Serial.println("Dual chip shield test"); pinMode(onBoardLED, OUTPUT); pinMode(linkButton, INPUT_PULLUP); Serial.begin(115200); Serial.println("<Arduino is ready - versionsingleMonster-red-test-0.8a"); lcd.begin (16, 2); // <<----- My LCD was 16x2 // Switch on the backlight lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home lcd.setCursor(0, 0); lcd.print("DCC++ Rec. V0.8a"); linkButtonState = digitalRead(linkButton); if (linkButtonState == 0) { linkAddress(); // if button pressed on boot link to first DCC address seen } getAddress(); activeDCCAddress = 1794; /// DCCAddress = 1794; } void loopXXX() { digitalWrite(enable, HIGH); // pin 10 is ENABLE and LED0 MotorUpDownTest(); // works with dual chip shield } void loop() { while (Serial.available() > 0) { int inChar = Serial.read(); inString += (char)inChar; if (inChar == '>') { // > is ending character inString.trim(); // remove leading space saveString = inString; Serial.print("saveString= "); Serial.println(saveString); int firstOpeningBracket = inString.indexOf('<'); if (inString.substring(firstOpeningBracket, firstOpeningBracket + 2) == "<f") // Speed command seen { int nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string inString.trim(); // remove leading space nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string inString.trim(); // remove leading space int fun = inString.toInt(); Serial.print(fun); Serial.print(" as BIN = "); Serial.println(fun, BIN); Serial.print("bits = "); Serial.print(bitRead(fun, 0)); Serial.print(" "); if (bitRead(fun, 0) == 1) { digitalWrite(LED0, HIGH); } else digitalWrite(LED0, LOW); if (bitRead(fun, 1) == 1) { digitalWrite(LED1, HIGH); } else digitalWrite(LED1, LOW); if (bitRead(fun, 2) == 1) { digitalWrite(LED2, HIGH); } else digitalWrite(LED2, LOW); if (bitRead(fun, 3) == 1) { digitalWrite(LED3, HIGH); } else digitalWrite(LED3, LOW); Serial.print(bitRead(fun, 1)); Serial.print(" "); Serial.print(bitRead(fun, 2)); Serial.print(" "); Serial.print(bitRead(fun, 3)); Serial.print(" "); Serial.print(bitRead(fun, 4)); Serial.print(" "); Serial.println(bitRead(fun, 5)); } if (inString.substring(firstOpeningBracket, firstOpeningBracket + 3) == "<t1") // Speed command seen { int nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string DCCAddress = inString.toInt(); Serial.print(" Address = "); Serial.print(DCCAddress); if (linkAddressFlag == 1) { //lcd.setCursor(0, 0); //lcd.print("Read Address"); Serial.println("Resetting DCC Address"); activeDCCAddress = DCCAddress; linkAddressFlag = 0; digitalWrite(LED0, LOW); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); saveAddress(); } inString.trim(); // remove leading space nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string // MotorSpeed nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string MotorSpeed = inString.toInt(); Serial.print(" Speed = "); Serial.print(MotorSpeed); inString.trim(); // remove leading space // MotorDirection nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string MotorDirection = inString.toInt(); Serial.print(" Direction = "); Serial.print(MotorDirection); Serial.print(" Current = "); // Serial.println(analogRead(currentREAD)); Serial.print("add & active add "); Serial.print(DCCAddress); Serial.print(" "); Serial.println(activeDCCAddress); if (DCCAddress == activeDCCAddress) { // Serial.println("DCC match!"); doMotorShield(); // doMotor(); // for IBT-3 } } if (inString.substring(firstOpeningBracket) == "<1>") // Power On { Serial.print("Start "); } if (inString.substring(firstOpeningBracket) == "<0>") // Power Off { Serial.print("Stop "); } // clear the string for new input: lcd.setCursor(0, 1); lcd.print(saveString); lcd.print(" "); inString = ""; } } } void doMotorShield() { digitalWrite(enable, HIGH); if (MotorDirection == 0) { // PIN_CCW set to LOW; digitalWrite(inApin, LOW); digitalWrite(inBpin, HIGH); //start CW analogWrite(pwmpin, MotorSpeed * 2); Serial.print("@doMotorShield pwm= "); Serial.println(MotorSpeed); } else { // PIN_CW set to LOW; digitalWrite(inApin, HIGH); digitalWrite(inBpin, LOW); //start CCW analogWrite(pwmpin, MotorSpeed * 2); Serial.print("@doMotorShieldElse pwm= "); Serial.println(MotorSpeed); } } void linkAddress() { Serial.println("@@@@@ link Address"); linkAddressFlag = 1; // tells the program to link to first address seen digitalWrite(LED0, HIGH); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); } void saveAddress() { // TO EEPROM int xxx = 0; xxx = DCCAddress / 256; EEPROM.write(0, xxx); xxx = DCCAddress - (xxx * 256); EEPROM.write( 1, xxx); } void getAddress() { // from EEPROM int xxx = 0; DCCAddress = EEPROM.read(0) * 256; DCCAddress = DCCAddress + EEPROM.read( 1); Serial.print("Read Address = "); Serial.println(DCCAddress); activeDCCAddress = DCCAddress; } //NOT USED WITH IBT-3 H-Bridge void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm) //Function that controls the variables: motor(0 ou 1), direction (cw ou ccw) e pwm (entra 0 e 255); { if (motor <= 1) { if (direct <= 4) { if (direct <= 1) digitalWrite(inApin, HIGH); else digitalWrite(inApin, LOW); if ((direct == 0) || (direct == 2)) digitalWrite(inBpin, HIGH); else digitalWrite(inBpin, LOW); analogWrite(pwmpin, pwm); } } } //NOT USED WITH IBT-3 H-Bridge void motorOff(int motor) //Function to shut the motor down case it locks { for (int i = 0; i < 2; i++) { digitalWrite(inApin, LOW); digitalWrite(inBpin, LOW); } analogWrite(pwmpin, 0); i = 0; digitalWrite(13, HIGH); Serial.println("Motor Locked"); delay(1000); } //NOT USED WITH IBT-3 H-Bridge void MotorUpDownTest() { while (i < 250) { motorGo(0, CW, i); // Increase the speed of the motor, according to the value of i is increasing delay(50); i += 2; if (analogRead(cspin) > CS_THRESHOLD) // If the motor locks, it will shutdown and... { // ...Resets the process of increasing the PWM motorOff(0); } Serial.print(i); Serial.print(" CS= "); Serial.println(analogRead(cspin)); } while (i > 0) { motorGo(0, CW, i); // Increase the speed of the motor, according to the value of i is increasing delay(50); i -= 2; if (analogRead(cspin) > CS_THRESHOLD) // If the motor locks, it will shutdown and... { // ...Resets the process of increasing the PWM motorOff(0); } Serial.print(i); Serial.print(" CS= "); Serial.println(analogRead(cspin)); } while (i < 155) { motorGo(0, CCW, i); // Increase the speed of the motor, according to the value of i is increasing delay(50); i += 2; if (analogRead(cspin) > CS_THRESHOLD) // If the motor locks, it will shutdown and... { // ...Resets the process of increasing the PWM motorOff(0); } Serial.print(i); Serial.print(" CS= "); Serial.println(analogRead(cspin)); } while (i > 0) { motorGo(0, CCW, i); // Increase the speed of the motor, according to the value of i is increasing delay(50); i -= 2; if (analogRead(cspin) > CS_THRESHOLD) // If the motor locks, it will shutdown and... { // ...Resets the process of increasing the PWM motorOff(0); } Serial.print(i); Serial.print(" CS= "); Serial.println(analogRead(cspin)); } }
|
|
OLED Display The LCD display works well but I feel it is a bit large for what it needs to do. Its primary purpose is displaying pertinent information during setup and initial testing. I wanted to use a smaller display and came across a 128x64 pixel (actually 128 x 32) OLED display that can easily be used in place of the LCD. It is VERY small measuring less than 1" on each side. They are available from eBay, Amazon and other vendors for less than $10.00. Make sure you get the unit with a 4 wire I2C interface.
This photo is of my prototype, the display is at the front.
The information shown is the raw data from the throttle, the received DCC address and the active DCC address (these must match for the unit to power up an engine) the speed and direction.
|
|
![]() |
|
New Code for OLED DisplayVERSION # --> Receiver-singleMosnter-red-test-v1-5-OLED-DFPlayer /* 1-17-2017 - working on Uno and Pro Mini Single Mosfet board test (red board with pins on side & cap at power input end bypassed current test for now */ /*d. bodnar 9-30-2016 working well NOTE - this version works but 2.8 does not - not sure why! /* TODO: 1. add functions for different motor drivers x 2. add LED for linking x 3. test link button & process 4. consider servo activation (use function then rotary?) 5. Check use of <0> and <1> */ #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> SoftwareSerial mySerial(1, 6); // RX, TX - note, RX not used //int MP3file = 0; int buusyPin = A1;// buusyPin = 10; // sound player busy int bsy = 0; //#include <Wire.h> //#include <LCD.h> //#include <LiquidCrystal_I2C.h> #include<EEPROM.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); int num; const int linkButton = 7; // Link Button int linkButtonState = 0; const int onBoardLED = 13; const byte numChars = 32; char receivedChars[numChars]; int Count = 0; boolean newData = false; String inString = ""; // string to hold input String saveString = ""; int TorF = 0; // max tested was 254 #define MAX 252 int MotorSpeed = 0; int MotorDirection = 0; int DCCAddress = 0; int activeDCCAddress = 1794; int linkAddressFlag = 0; int DCCFunction = 0; #define BRAKEVCC 0 #define CW 1 #define CCW 2 #define BRAKEGND 3 unsigned long time; // 130 is about 2.5 amps #define CS_THRESHOLD 170 // Definition of safety current int inApin = 2; int inBpin = 3; int pwmpin = 5; // PWM's input int cspin = A0; // Current's sensor input int i = 0;; int enable = 4; int LED0 = 10; int LED1 = 11; int LED2 = 12; int LED3 = 13; int currentOld = 0; void setup() { pinMode(buusyPin, INPUT); mySerial.begin(9600); mp3_set_serial (mySerial); //set Serial for DFPlayer-mini mp3 module mp3_set_volume (30); // 15 is low for unpowered speaker // 30 good for unpowered speaker - requires power off to reset volume display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64) display.setCursor(0, 0); // these two lines together clear the buffer then show zip on the screen display.clearDisplay(); display.display(); delay(100); pinMode(LED0, OUTPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(enable, OUTPUT); for (int i = 0; i < 2; i++) { pinMode(inApin, OUTPUT); pinMode(inBpin, OUTPUT); pinMode(pwmpin, OUTPUT); } for (int i = 0; i < 2; i++) { digitalWrite(inApin, LOW); digitalWrite(inBpin, LOW); } //Serial.println("Dual chip shield test"); pinMode(onBoardLED, OUTPUT); pinMode(linkButton, INPUT_PULLUP); Serial.begin(115200); Serial.println("<Arduino is ready - versionsingleMonster-red-test-1.2-OLED"); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.println("DCC++ Rec. V 1.2 oled"); display.display(); linkButtonState = digitalRead(linkButton); if (linkButtonState == 0) { linkAddress(); // if button pressed on boot link to first DCC address seen } getAddress(); // activeDCCAddress = 1794; /// DCCAddress = 1794; } void loop() { while (Serial.available() > 0) { int inChar = Serial.read(); inString += (char)inChar; if (inChar == '>') { // > is ending character inString.trim(); // remove leading space saveString = inString; Serial.print("saveString= "); Serial.println(saveString); int firstOpeningBracket = inString.indexOf('<'); if (inString.substring(firstOpeningBracket, firstOpeningBracket + 2) == "<f") // Speed command seen { int nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string inString.trim(); // remove leading space nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string inString.trim(); // remove leading space int fun = inString.toInt(); Serial.print(fun); Serial.print(" as BIN = "); Serial.println(fun, BIN); Serial.print("bits = "); Serial.print(bitRead(fun, 0)); Serial.print(" "); if (bitRead(fun, 0) == 1) { digitalWrite(LED0, HIGH); Serial.println("MP3-BELL"); mp3_play(1); ///dlayPrint(); } else { digitalWrite(LED0, LOW); } if (bitRead(fun, 1) == 1) { digitalWrite(LED1, HIGH); Serial.println("MP3-Horn"); mp3_play(2); ///dlayPrint(); } else { digitalWrite(LED1, LOW); } if (bitRead(fun, 2) == 1) { digitalWrite(LED2, HIGH); } else digitalWrite(LED2, LOW); if (bitRead(fun, 3) == 1) { digitalWrite(LED3, HIGH); } else digitalWrite(LED3, LOW); Serial.print(bitRead(fun, 1)); Serial.print(" "); Serial.print(bitRead(fun, 2)); Serial.print(" "); Serial.print(bitRead(fun, 3)); Serial.print(" "); Serial.print(bitRead(fun, 4)); Serial.print(" "); Serial.println(bitRead(fun, 5)); } if (inString.substring(firstOpeningBracket, firstOpeningBracket + 3) == "<t1") // Speed command seen { int nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string DCCAddress = inString.toInt(); Serial.print(" Address = "); Serial.print(DCCAddress); if (linkAddressFlag == 1) { //lcd.setCursor(0, 0); //lcd.print("Read Address"); Serial.println("Resetting DCC Address"); activeDCCAddress = DCCAddress; display.clearDisplay(); display.setCursor(0, 0); display.print("NEW ADDRESS = "); display.setCursor(0, 8); display.print(activeDCCAddress); display.display(); delay(1000); linkAddressFlag = 0; digitalWrite(LED0, LOW); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); saveAddress(); } inString.trim(); // remove leading space nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string // MotorSpeed nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string MotorSpeed = inString.toInt(); Serial.print(" Speed = "); Serial.print(MotorSpeed); inString.trim(); // remove leading space // MotorDirection nextSpace = inString.indexOf(' '); inString = inString.substring(nextSpace); // lop off first part of string MotorDirection = inString.toInt(); Serial.print(" Direction = "); Serial.print(MotorDirection); Serial.print(" Current = "); Serial.print("add & active add "); Serial.print(DCCAddress); Serial.print(" "); Serial.println(activeDCCAddress); if (DCCAddress == activeDCCAddress) { // Serial.println("DCC match!"); doMotorShield(); } } if (inString.substring(firstOpeningBracket) == "<1>") // Power On { Serial.print("Start "); } if (inString.substring(firstOpeningBracket) == "<0>") // Power Off { Serial.print("Stop "); } display.clearDisplay(); display.setCursor(0, 0); display.print(saveString); display.setCursor(0, 8); display.print("DCC= "); display.print(DCCAddress); display.print(" "); if (activeDCCAddress == DCCAddress) { display.setTextColor(WHITE, BLACK); } else { display.setTextColor(BLACK, WHITE); } display.print("ACT= "); display.print(activeDCCAddress); display.setTextColor(WHITE, BLACK); display.setCursor(0, 16); display.print("SPEED= "); display.print(MotorSpeed); display.print(" DIR= "); if (MotorDirection == 0) { display.print("<<<"); display.display(); } else { display.print(">>>"); display.display(); } // display.setCursor(0, 24); // line 4 // display.print("current= "); // display.print( analogRead(cspin)); // display.display(); inString = ""; } } if ((analogRead(cspin) != currentOld) && (millis() - time >= 100) ) { display.setCursor(0, 24); // line 4 display.print("current= "); display.print( analogRead(cspin)); display.print(" / "); display.print(CS_THRESHOLD); display.print(" "); display.display(); currentOld = analogRead(cspin); time = millis(); } } void doMotorShield() { digitalWrite(enable, HIGH); if (MotorDirection == 0) { // PIN_CCW set to LOW; digitalWrite(inApin, LOW); digitalWrite(inBpin, HIGH); //start CW analogWrite(pwmpin, MotorSpeed * 2); Serial.print("@doMotorShield pwm= "); Serial.println(MotorSpeed); } else { // PIN_CW set to LOW; digitalWrite(inApin, HIGH); digitalWrite(inBpin, LOW); //start CCW analogWrite(pwmpin, MotorSpeed * 2); Serial.print("@doMotorShieldElse pwm= "); Serial.println(MotorSpeed); } } void linkAddress() { Serial.println("@@@@@ link Address"); display.clearDisplay(); display.setCursor(0, 0); display.print("NEW ADDRESS MODE"); display.display(); delay(1000); linkAddressFlag = 1; // tells the program to link to first address seen digitalWrite(LED0, HIGH); digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); } void saveAddress() { // TO EEPROM int xxx = 0; xxx = DCCAddress / 256; EEPROM.write(0, xxx); xxx = DCCAddress - (xxx * 256); EEPROM.write( 1, xxx); } void getAddress() { // from EEPROM int xxx = 0; DCCAddress = EEPROM.read(0) * 256; DCCAddress = DCCAddress + EEPROM.read( 1); Serial.print("Read Address = "); Serial.println(DCCAddress); activeDCCAddress = DCCAddress; } //NOT USED WITH IBT-3 H-Bridge void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm) //Function that controls the variables: motor(0 ou 1), direction (cw ou ccw) e pwm (entra 0 e 255); { if (motor <= 1) { if (direct <= 4) { if (direct <= 1) digitalWrite(inApin, HIGH); else digitalWrite(inApin, LOW); if ((direct == 0) || (direct == 2)) digitalWrite(inBpin, HIGH); else digitalWrite(inBpin, LOW); analogWrite(pwmpin, pwm); } } } //NOT USED WITH IBT-3 H-Bridge void motorOff(int motor) //Function to shut the motor down case it locks { for (int i = 0; i < 2; i++) { digitalWrite(inApin, LOW); digitalWrite(inBpin, LOW); } analogWrite(pwmpin, 0); i = 0; digitalWrite(13, HIGH); Serial.println("Motor Locked"); delay(1000); } //NOT USED WITH IBT-3 H-Bridge void MotorUpDownTest() { while (i < 250) { motorGo(0, CW, i); // Increase the speed of the motor, according to the value of i is increasing delay(50); i += 2; if (analogRead(cspin) > CS_THRESHOLD) // If the motor locks, it will shutdown and... { // ...Resets the process of increasing the PWM motorOff(0); } Serial.print(i); Serial.print(" CS= "); Serial.println(analogRead(cspin)); } while (i > 0) { motorGo(0, CW, i); // Increase the speed of the motor, according to the value of i is increasing delay(50); i -= 2; if (analogRead(cspin) > CS_THRESHOLD) // If the motor locks, it will shutdown and... { // ...Resets the process of increasing the PWM motorOff(0); } Serial.print(i); Serial.print(" CS= "); Serial.println(analogRead(cspin)); } while (i < 155) { motorGo(0, CCW, i); // Increase the speed of the motor, according to the value of i is increasing delay(50); i += 2; if (analogRead(cspin) > CS_THRESHOLD) // If the motor locks, it will shutdown and... { // ...Resets the process of increasing the PWM motorOff(0); } Serial.print(i); Serial.print(" CS= "); Serial.println(analogRead(cspin)); } while (i > 0) { motorGo(0, CCW, i); // Increase the speed of the motor, according to the value of i is increasing delay(50); i -= 2; if (analogRead(cspin) > CS_THRESHOLD) // If the motor locks, it will shutdown and... { // ...Resets the process of increasing the PWM motorOff(0); } Serial.print(i); Serial.print(" CS= "); Serial.println(analogRead(cspin)); } }
|