/* Program 1 REV B
Updated 6/19/2017 @ 3:39:AM Code concept and project design by David H Haffner Sr.
Stepper program for the 28YBJ-48 (stepper MTR) and ULN2003 driver
This particular stepper motor is 5.625 degrees per step
/64
Speed is controlled by a delay between each step. The longer the delay the slower the rotation. That delay value is obtained by reading and analog-to-digital cover (A0 in this case/10K trimmer POT) which gives a value from 0 to 1023. The value is divided by 4 and add 10 for a delay in milliseconds:delay(analogRead(0)/4 +10)
For faster speeds change 10 to say 2.
This is calculated between every step to vary speed while stepping.
I incorporated unsigned long int Val, in order read a little bit more of the AN/Map A nice feature of unsigned ints: if a val is unsigned, then val / 4 is optimized by the compiler into a bit shift, much more efficient than the actual division you would get if val was signed.
Further incorporated a pin array;//read the pushbutton value into a variable int sensorVal[] = { digitalRead [2][3] };//SW1 pin2 & SW2 pin3 This will illuminate LED's #10(W) and LED #12(bl) to indicate that the switches on HIGH.
Line 3 on the LCD display has a "current pos:" which indicates shaft position both in forward and reverse.
The commands below will be compiled into machine code and uploaded to the microcontroller.
This is in the public domain.
Compiled size 6196 bytes.
unsigned long int val = (analogRead('...') / 4 + 10);
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
void setup() {
pinMode(10, OUTPUT);// this is the LED pin10 pinMode(12, OUTPUT);// this is for LED pin12
digitalWrite(CW, 1); // pull up on digitalWrite(CCW, 1); // pull up on
pinMode(blue, OUTPUT); pinMode(brown, OUTPUT); pinMode(orange, OUTPUT); pinMode(yellow, OUTPUT);
// all coils off digitalWrite(blue, 0); digitalWrite(brown, 0); digitalWrite(orange, 0); digitalWrite(yellow, 0);
lcd.begin(20, 4); // initialize the lcd for 20 chars 4 lines, turn on backlight
// ------- Quick 3 blinks of backlight ------------- for (int i = 0; i < 3; i++) { lcd.backlight(); delay(250); lcd.noBacklight(); delay(250); } lcd.backlight(); // finish with backlight on // set up the LCD's number of columns and rows: lcd.begin(20, 4); // Print a message to the LCD. lcd.print("AN/MAP:");
lcd.setCursor(12, 0);
lcd.print("0-1023");
lcd.setCursor(0, 1); lcd.print("Direction:");//CCW or CC
lcd.setCursor(0, 3); lcd.print("V3.01 Turret Control");//4th line for version display
lcd.setCursor(0, 2);
lcd.print("CurrentPos:");
Serial.begin(115200);
}
void loop() {
if (!digitalRead(CW)) { forward(10);//rpm all_coils_off(); }
if (!digitalRead(CCW)) {
reverse(10);//rpm all_coils_off(); }
//read the pushbutton value into a variable int sensorVal_1 = digitalRead(CW);//SW pin //print out the value of the pushbutton Serial.println(sensorVal_1);
// Keep in mind the pullup means the pushbutton's // logic is inverted. It goes HIGH when it's open, // and LOW when it's pressed. Turn on pin 13 when the // button's pressed, and off when it's not: if (sensorVal_1 == HIGH) { digitalWrite(10, LOW);//LED pin } else { digitalWrite(10, HIGH);//LED pin } //read the pushbutton value into a variable int sensorVal_2 = digitalRead(CCW);//SW pin //print out the value of the pushbutton Serial.println(sensorVal_2);
// Keep in mind the pullup means the pushbutton's // logic is inverted. It goes HIGH when it's open, // and LOW when it's pressed. Turn on pin 13 when the // button's pressed, and off when it's not: if (sensorVal_2 == HIGH) { digitalWrite(12, LOW);//LED pin } else { digitalWrite(12, HIGH);//LED pin }
} // end loop
void all_coils_off(void) {
digitalWrite(blue, 0); digitalWrite(brown, 0); digitalWrite(orange, 0); digitalWrite(yellow, 0);
}
void reverse(int i) {
{ lcd.setCursor(10, 1); lcd.print("<<CCW"); } while (1) {
digitalWrite(blue, 1); digitalWrite(brown, 0); digitalWrite(orange, 1); digitalWrite(yellow, 0); delay(analogRead('...') / 4 + 10); i--; if (i < 1) break; { lcd.setCursor(12, 2);//print out the value of the pushbutton lcd.print(i--); } digitalWrite(blue, 0); digitalWrite(brown, 1); digitalWrite(orange, 1); digitalWrite(yellow, 0); delay(analogRead('...') / 4 + 10); i--; if (i < 1) break; { lcd.setCursor(7, 0); lcd.print(analogRead('...') / 4 + 10); } digitalWrite(blue, 0); digitalWrite(brown, 1); digitalWrite(orange, 0); digitalWrite(yellow, 1); delay(analogRead('...') / 4 + 10); i--; if (i < 1) break; { lcd.setCursor(12, 2);//print out the value of the pushbutton lcd.print(i--); } digitalWrite(blue, 1); digitalWrite(brown, 0); digitalWrite(orange, 0); digitalWrite(yellow, 1); delay(analogRead('...') / 4 + 10); i--; if (i < 1) break; { lcd.setCursor(12, 2);//print out the value of the pushbutton lcd.print(i--); } }
}
void forward(int i) {
{ lcd.setCursor(10, 1); lcd.print("CW>>>"); } while (1) {
digitalWrite(blue, 1); digitalWrite(brown, 0); digitalWrite(orange, 0); digitalWrite(yellow, 1); delay(analogRead('...') / 4 + 10); i--; if (i < 1) break; { lcd.setCursor(12, 2);//print out the value of the pushbutton lcd.print(i--); } digitalWrite(blue, 0); digitalWrite(brown, 1); digitalWrite(orange, 0); digitalWrite(yellow, 1); delay(analogRead('...') / 4 + 10); i--; if (i < 1) break; { lcd.setCursor(12, 2);//print out the value of the pushbutton lcd.print(i--); } digitalWrite(blue, 0); digitalWrite(brown, 1); digitalWrite(orange, 1); digitalWrite(yellow, 0); delay(analogRead('...') / 4 + 10); i--; if (i < 1) break; { lcd.setCursor(12, 2);//print out the value of the pushbutton lcd.print(i--); } digitalWrite(blue, 1); digitalWrite(brown, 0); digitalWrite(orange, 1); digitalWrite(yellow, 0); delay(analogRead('...') / 4 + 10); i--; if (i < 1) break; { lcd.setCursor(12, 2);//print out the value of the pushbutton lcd.print(i--); } }
}