/* Program 1 REV B

  Updated 7/01/2017 @ 06:43: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/50K 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 illuminat LED's #10(W) and LED #12(bl) to indicate that the switches
  on HIGH. These values are then displayed on the LCD menu on line 3 as a monitor
  of the switches values.

  // set the LCD address to 0x27 or 0x3F for a 20 chars 4 line display
  // Set the pins on the I2C chip used for LCD connections:
  //                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol

  The commands below will be compiled into machine code and uploaded
  to the microcontroller.

  This is in the public domain.

  Compiled size 6646 bytes.

  • /

  1. include <LiquidCrystal_I2C.h>
  2. include <Wire.h>

const int yellow = 7; // M1

const int orange = 5; // M2

const int brown = 6; // M3

const int blue = 4; // M4

const int CW = 2; //Sw1 in schematic

const int CCW = 3; //Sw2 in schematic

unsigned long int val = (analogRead(A0) / 4 + 10);

unsigned long int val1 = (analogRead('...') * 4 + 2);// scale it to use it with the steppermtr (value between 0 and 175)

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

void setup() {

  // initialize digital pin LED_BUILTIN (13) as an output.
  pinMode(LED_BUILTIN, OUTPUT);//Modified "blink" sequence (2)millisec in-step/W/MTR sequence
  pinMode(10, OUTPUT);// this is the LED pin for sensor val prgm
  pinMode(12, OUTPUT);// this is for LED pin 12 sensor Val prgm

  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(16, 0);

  lcd.print("0-5V");

  lcd.setCursor(0, 1);
  lcd.print("Direction:");//CCW or CC

  lcd.setCursor(0, 3);
  lcd.print("SwitchState:");//4th line for version display

  lcd.setCursor(0, 2);
  lcd.print("DIV:");

  Serial.begin(115200);

}

void loop() {

  // read the input on :
  for (int i = 0; i < 6; i++) {
    val1 = analogRead(i);
    delay(10);
    // Convert the analog reading (which goes from 0 - 1023) to voltage range (0 - 5V);
    float voltage0 = val1 * (5.0 / 1023.0);

    // print out the value you read:
    Serial.print(voltage0); Serial.print("i =");
    Serial.print(i); Serial.print(";");
    if (i == 5) Serial.println("  ");
    lcd.setCursor(11, 0);
    lcd.print(voltage0);//reads the current Voltage from A0

  }

  if (!digitalRead(CW))  {
    forward(10);
    all_coils_off();
    lcd.setCursor(13, 3);// set Cursor at place 12, 3
    lcd.print(CW);
  }

  if (!digitalRead(CCW))  {

    reverse(10);
    all_coils_off();
    lcd.setCursor(13, 3);// set Cursor at place 12, 3
    lcd.print(CCW);
  }
  {
    digitalWrite(LED_BUILTIN, HIGH);   // When button is pressed, moves MTR same# of steps as LED timing sequence
    delay(1);                       // wait for a second's
    digitalWrite(LED_BUILTIN, LOW);    //
    delay(1);                       // wait for a second's
  }
  //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 LED pin 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 LED pin 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
  }

  for (int i = 0; i <= 10; i++)//This keeps LED indicator  on high until button is pressed
  { //then blinks in sync with rotation of motor until released
    (analogRead(A0) / 4 + 10);
  }
  val1 = (analogRead(val1) * 4 + 2); //scale it to use it with the stepper mtr (value between 0 and 175)

} // 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(A0) / 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(A0) / 4 + 10);
    i--;
    if (i < 1) break;
    {
      lcd.setCursor(7, 0);
      lcd.print(analogRead(i--) / 4 + 10);
    }
    digitalWrite(blue, 0);
    digitalWrite(brown, 1);
    digitalWrite(orange, 0);
    digitalWrite(yellow, 1);
    delay(analogRead(A0) / 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(A0) / 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(A0) / 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(A0) / 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(A0) / 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(A0) / 4 + 10);
    i--;
    if (i < 1) break;
    {
      lcd.setCursor(12, 2);//print out the value of the pushbutton
      lcd.print(i--);
    }
  }

}

Share