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);
}
}