Olá pessoal,
Sou estudante de Automação e estou fazendo um projeto para alimentador de animais em que consiste girar um motor uma certa quantidade de vezes e que aconteça em certa quantidade do dia. A quantidade de giros e de vezes que isso acontece por dia é programado por um codificador rotativo, que é mostrado no display.
Agora vem minha dúvida (pois sou um leigo se falando de linguagem de programação), o programa que tenho é para trabalhar com servo motor 360º (giro livre), porém gostaria de trocar a parte da programação que escreve sobre o servo motor para usar o motor de passo para mesma finalidade. Alguém pode me ajudar com isso?
Desde já agradeço a ajuda de todos!
Segue abaixo a programação:
#include <DS1307RTC.h>
// include the library code:
#include <LiquidCrystal.h>
#include <Wire.h>      // needed for the RTC libraty
#include <Time.h>
#include <TimeLib.h>
// Real Time Clock Library
#include <Servo.h>
#include <DS1307RTC.h>
#include <Time.h>
#include <TimeLib.h>
// initialize the library with the numbers of the interface pins dor the LCD
LiquidCrystal lcd(12, 11, 5, 8, 7, 6);
#define PIN_SERVO 9
Servo feedServo;
Servo stirServo;
int pos = 0;
volatile boolean TurnDetected;
volatile boolean up;
const int PinCLK=2;                   // Used for generating interrupts using CLK signal
const int PinDT=3;                    // Used for reading DT signal
const int PinSW=4;                    // Used for the push button switch of the Rotary Encoder
const int buttonPin = A3;             // the number of the pushbutton pin for manual feed 13
int buttonState = 0;                  // variable for reading the manual feed pushbutton status
int feed1hour = 8;                   // variables for feeding times and quantity
int feed1minute = 00;
int feed2hour = 18;
int feed2minute = 30;
int feedQty = 6;
int feedRate = 800;   //a pwm rate the triggers forward on the servo 75
int feedReversal = 500; //a pwm rate that triggers reverse on the servo
// play with these numbers for your servo. Mine is a Futaba digital servo
// that I removed the pot from and the plastic lug, to make it continuous.
void isr ()  {                    // Interrupt service routine is executed when a HIGH to LOW transition is detected on CLK
if (digitalRead(PinCLK))         // this keeps an eye out for the rotary encoder being turned regardless of where the program is
up = digitalRead(PinDT);       // currently exectuting - in other words, during the main loop this ISR will always be active
else
up = !digitalRead(PinDT);
TurnDetected = true;
}
void setup ()  {
// set up the LCD’s number of columns and rows:
lcd.begin(16, 2);
// setup the Rotary encoder
pinMode(PinCLK,INPUT);
pinMode(PinDT,INPUT);
pinMode(PinSW,INPUT);
pinMode(buttonPin, INPUT);
attachInterrupt (0,isr,FALLING);   // interrupt 0 is always connected to pin 2 on Arduino UNO
lcd.setCursor(17,0);
lcd.print("Alimentador ");  // A bit of fun smile emoticon
lcd.setCursor(17,1);
lcd.print(“de animais”);
for (int positionCounter = 0; positionCounter < 17; positionCounter++) {
// scroll one position left:
lcd.scrollDisplayLeft();
// wait a bit:
delay(150);
}
delay(3000);
for (int positionCounter = 0; positionCounter < 17; positionCounter++) {
// scroll one position left:
lcd.scrollDisplayRight();
// wait a bit:
delay(150);
         }  // end of fun
 lcd.setCursor(17,0);
 lcd.print("                ");
 lcd.setCursor(17,1);
 lcd.print("                ");  
    }
void loop ()  {  //Main program loop - most things in here!
static long virtualPosition=0;    // without STATIC it does not count correctly!!!
tmElements_t tm;    // This sectionm reads the time from the RTC, sets it in tmElements tm (nice to work with), then displays it.
RTC.read™;
lcd.setCursor(0, 0);
printDigits(tm.Hour); //call to print digit function that adds leading zeros that may be missing
lcd.print(":");
printDigits(tm.Minute);
lcd.print(":");
printDigits(tm.Second);
lcd.print("  “);
lcd.print(“Qty “);
lcd.print(feedQty);
lcd.print(” “);
lcd.setCursor(0,1);
lcd.print(“1)”);
printDigits(feed1hour);
lcd.print(”:”);
printDigits(feed1minute);
lcd.print(” 2)");
printDigits(feed2hour);
lcd.print(":");
printDigits(feed2minute);
// MAIN BREAKOUT “IF” SECION BELOW THAT MONITORS THE PUSH BUTTON AND ENTERS PROGRAMMING IF IT’S PUSHED
if (!(digitalRead(PinSW))) {      // check if pushbutton is pressed
// if YES then enter the programming subroutine
lcd.blink();   // Turn on the blinking cursor:
lcd.setCursor(5,0);
lcd.print(" SET");
virtualPosition = tm.Hour;  //needed or the hour will be zero each time you change the clock.
do  {
lcd.setCursor(0,0);   // put cursor at Time Hour
delay(500);   // Delay needed or same button press will exit do-while as while is checking for another button push!
if (TurnDetected)  {        // do this only if rotation was detected
if (up)
virtualPosition–;
else
virtualPosition++;
TurnDetected = false;          // do NOT repeat IF loop until new rotation detected
}
// Here I change the hour of time -
tm.Hour = virtualPosition;
RTC.write™;
lcd.setCursor(0, 0);
printDigits(tm.Hour);  // then re-print the hour on the LCD
} while ((digitalRead(PinSW)));  // do this “do” loop while the PinSW button is NOT pressed
lcd.noBlink();
delay(1000);
   //   SET THE MINS
    
    lcd.blink();   // Turn on the blinking cursor:
   virtualPosition = tm.Minute;  //needed or the minute will be zero each time you change the clock.
   do  {
   lcd.setCursor(3,0);   // put cursor at Time Mins
   delay(500);   // Delay needed or same button press will exit do-while as while is checking for another button push!
       if (TurnDetected)  {       // do this only if rotation was detected
        if (up)
          virtualPosition--;
        else
        virtualPosition++;
        TurnDetected = false;          // do NOT repeat IF loop until new rotation detected
                           }
        // Here I change the min of time -
        tm.Minute = virtualPosition;
        RTC.write(tm);
        lcd.setCursor(3, 0);
        printDigits(tm.Minute);  // then re-print the min on the LCD
     } while ((digitalRead(PinSW)));
     lcd.noBlink();
     delay(1000);
   //   SET THE QTY - Feed quantity
    
   lcd.blink();   // Turn on the blinking cursor:
   virtualPosition = feedQty;  //needed or the qty will be zero.
   do  {
   lcd.setCursor(14,0);   // put cursor at QTY
   delay(500);   // Delay needed or same button press will exit do-while as while is checking for another button push!
       if (TurnDetected)  {       // do this only if rotation was detected
        if (up)
          virtualPosition--;
        else
        virtualPosition++;
        TurnDetected = false;          // do NOT repeat IF loop until new rotation detected
                           }
        // Here I change the feed qty
        feedQty = virtualPosition;
        lcd.setCursor(14, 0);
        lcd.print(feedQty);
       } while ((digitalRead(PinSW)));
     lcd.noBlink();
     delay(1000);
     
 //   SET THE Feed1 Hour
    
   lcd.blink();   // Turn on the blinking cursor:
   virtualPosition = feed1hour;  //needed or will be zero to start with.
   do  {
   lcd.setCursor(2,1);   // put cursor at feed1hour
   delay(500);   // Delay needed or same button press will exit do-while as while is checking for another button push!
       if (TurnDetected)  {       // do this only if rotation was detected
        if (up)
          virtualPosition--;
        else
        virtualPosition++;
        TurnDetected = false;          // do NOT repeat IF loop until new rotation detected
                           }
        // Here I change the feed1 hour
        feed1hour = virtualPosition;
        lcd.setCursor(2,1);
        printDigits(feed1hour);
       } while ((digitalRead(PinSW)));
     lcd.noBlink();
     delay(1000);  
  //   SET THE Feed1 Mins
    
   lcd.blink();   // Turn on the blinking cursor:
   virtualPosition = feed1minute;  //needed or will be zero to start with.
   do  {
   lcd.setCursor(5,1);   // put cursor at feed1minute
   delay(500);   // Delay needed or same button press will exit do-while as while is checking for another button push!
       if (TurnDetected)  {       // do this only if rotation was detected
        if (up)
          virtualPosition--;
        else
        virtualPosition++;
        TurnDetected = false;          // do NOT repeat IF loop until new rotation detected
                           }
        // Here I change the feed1 minute
        feed1minute = virtualPosition;
        lcd.setCursor(5,1);
        printDigits(feed1minute);
       } while ((digitalRead(PinSW)));
     lcd.noBlink();
     delay(1000);   
// SET THE Feed2 Hour
   lcd.blink();   // Turn on the blinking cursor:
   virtualPosition = feed2hour;  //needed or will be zero to start with.
   do  {
   lcd.setCursor(10,1);   // put cursor at feed1hour
   delay(500);   // Delay needed or same button press will exit do-while as while is checking for another button push!
       if (TurnDetected)  {       // do this only if rotation was detected
        if (up)
          virtualPosition--;
        else
        virtualPosition++;
        TurnDetected = false;          // do NOT repeat IF loop until new rotation detected
                           }
        // Here I change the feed1 hour
        feed2hour = virtualPosition;
        lcd.setCursor(10,1);
        printDigits(feed2hour);
       } while ((digitalRead(PinSW)));
     lcd.noBlink();
     delay(1000);  
  //   SET THE Feed2 Mins
    
   lcd.blink();   // Turn on the blinking cursor:
   virtualPosition = feed2minute;  //needed or will be zero to start with.
   do  {
   lcd.setCursor(13,1);   // put cursor at feed1minute
   delay(500);   // Delay needed or same button press will exit do-while as while is checking for another button push!
       if (TurnDetected)  {       // do this only if rotation was detected
        if (up)
          virtualPosition--;
        else
        virtualPosition++;
        TurnDetected = false;          // do NOT repeat IF loop until new rotation detected
                           }
        // Here I change the feed1 minute
        feed2minute = virtualPosition;
        lcd.setCursor(13,1);
        printDigits(feed2minute);
       } while ((digitalRead(PinSW)));
     lcd.noBlink();
     delay(1000);                         
} // end of main IF rotary encoder push button checker
// CHECK FOR MANUAL FEED BUTTON
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
feed();
}
// CHECK FEEDING TIME AND FEED IF MATCHED
if (tm.Hour == feed1hour && tm.Minute == feed1minute && tm.Second == 0)  {  // if I dont’ check seconds are zero
feed();                                                                   // then it’ll feed continuously for 1 minute!
}
if (tm.Hour == feed2hour && tm.Minute == feed2minute && tm.Second == 0)  {
feed();
}
} // End of main Loop
void printDigits(int digits){   // utility function for digital clock display: prints leading 0
if(digits < 10)
lcd.print(‘0’);
lcd.print(digits);
}
void feed() {
lcd.setCursor(17,0);
lcd.print(" Yum Yum Yum!");
for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
// scroll one position left:
lcd.scrollDisplayLeft();
// wait a bit:
delay(150);
}
// rotate the Auger
feedServo.attach(PIN_SERVO);
for (int cnt = 0; cnt < feedQty; cnt++)
{
feedServo.write(feedRate);  //the feedrate is really the feed direction and rate.
delay(600);   //this delay sets how long the servo stays running from the previous command
feedServo.write(feedReversal);  //…until this command sets the servo a new task!
delay(300);
feedServo.write(feedRate);
delay(600);
feedServo.write(feedReversal);  // if you want to increase the overall feedrate increase the forward delays (1000 at the moment)
delay(300);     // or better still just copy and past the forward & backwards code underneath to repeat
// that way the little reverse wiggle is always there to prevent jams
feedServo.write(feedRate);
delay(600);
feedServo.write(feedReversal);
delay(300);
feedServo.write(feedRate);
delay(600);
feedServo.write(feedReversal);
delay(300);
}
 feedServo.detach();
 for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
 // scroll one position left:
 lcd.scrollDisplayRight(); 
 // wait a bit:
 delay(150);
     }
         }