Buongiorno.
Come detto in altro thread sto cercando di pilotare una piattaforma girevole che nasce con un motore in CC per la sua rotazione.
Sto cercando di pilotarla con uno stepper e ho cominciato con un driver ULN2003 che pilota un motore 28BYJ-48 ma non funziona bene perchè il lasco dell’albero vanifica la precisione che dovrebbe avere uno stepper, evidentemente è di scarsa qualità ma non ne ho trovati in rete che siano dichiarati buoni, quindi sono passato a un NEMA17 pilotandolo con un driver A4988.
Dapprima ho scritto una sketch con la libreria “stepper” poi l’ho modificato utilizzando la libreria ”accelstepper” e utilizzando il disabling se il motore è fermo per vedere se riesco a raffreddarlo.
Il disabling funziona ma non ne sono sicuro faccia quello che pensavo facesse.
Poi sono passato ad aggiungere la libreria “Bounce2” ma se utilizzo le sue funzioni per far muovere il motore non su muove un bel niente.
Qui lo sketch funzionante senza le funzioni di debouncing
/* Example sketch to control a NEMA17 stepper motor with
A4988 driver board, AccelStepper, Bounce2 and Arduino UNO
More info: https://www.makerguides.com */
#include "AccelStepper.h"
#include "Bounce2.h"
// Assegnazione pin motore:
#define stepPin 7
#define dirPin 8
#define enablePin 9
// Assegnazione pin bottoni:
const int buttonPin2 = 2; // nome pulsante e pin associato
const int buttonPin4 = 4; // nome pulsante e pin associato
const int buttonPin5 = 5; // nome pulsante e pin associato
const int buttonPin6 = 6; // nome pulsante e pin associato
// Inizializzazione posizione e bottoni
int posizione = 1;
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
int enablePinstatus = 0;
int stepperspeed=196;
// Millisecondi per il deounce
const int debounceMs = 10;
//Stato (Enable/Disable)
boolean abilitato;
const int gradi180 = 8015; // numero di step per una rotazione di 180°
//const int gradi12 = gradi180 / 180 * 15; // numero di step per una rotazione di 12°
const int gradi12 = 560; // numero di step per una rotazione di 12°
const int gradi168 = gradi180 - gradi12; // numero di step per una rotazione di 168°
// Define the AccelStepper interface type; 4 wire motor in half step mode:
#define motorInterfaceType 1
// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
// DEBOUNCE-INIT
// Creazione istanze dei pulsanti
Bounce dbbutton1 = Bounce();
Bounce dbbutton2 = Bounce();
Bounce dbbutton3 = Bounce();
Bounce dbbutton4 = Bounce();
// DEBOUNCE-END
void setup()
{
// DEBOUNCE-INIT
// Inizializzazione stato enable/disable (LOW/HIGH)
abilitato = false;
//Definizione modalità dei pin
pinMode(buttonPin2, INPUT);
pinMode(buttonPin4, INPUT);
pinMode(buttonPin5, INPUT);
pinMode(buttonPin6, INPUT);
pinMode(enablePin, OUTPUT);
//Impostazione pullUp dei i pin dei bottoni
digitalWrite(buttonPin2, HIGH);
digitalWrite(buttonPin4, HIGH);
digitalWrite(buttonPin5, HIGH);
digitalWrite(buttonPin6, HIGH);
//setta stato del pin enable
//digitalWrite(enablePin, !abilitato)
// Set the maximum steps per second:
stepper.setMaxSpeed(200);
// Inizializzazione bottoni
dbbutton1.attach(buttonPin2);
dbbutton1.interval(debounceMs);
dbbutton2.attach(buttonPin4);
dbbutton2.interval(debounceMs);
dbbutton3.attach(buttonPin5);
dbbutton3.interval(debounceMs);
dbbutton4.attach(buttonPin6);
dbbutton4.interval(debounceMs);
// DEBOUNCE-END
//inizializzo la comunicazione seriale cosi da mostrare i valori nel Monitor Seriale
Serial.begin(9600);
}
void loop()
{
//DEBOUNCE-INIT
dbbutton1.update();
dbbutton2.update();
dbbutton3.update();
dbbutton3.update();
//DEBOUNCE-END
// Set the current position to 0:
stepper.setCurrentPosition(0);
buttonState1 = 0;
buttonState2 = 0;
buttonState3 = 0;
buttonState4 = 0;
// Leggi stato del bottone 1
buttonState1 = digitalRead(buttonPin2);
//DEBOUNCE-INIT
//buttonState1 = dbbutton1.read();
//DEBOUNCE-END
/*Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("buttonState1 = ");
Serial.print(buttonState1);
Serial.print(" Posizione iniziale= ");
Serial.println(posizione);
delay(5000);
*/
// Controlla se il bottone 1 è stato premuto (valore HIGH)
if (buttonState1 == HIGH)
{
abilitato=false;
digitalWrite(enablePin,abilitato);
/*Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("buttonState1 = ");
Serial.print(buttonState1);
Serial.print(" Posizione iniziale= ");
Serial.println(posizione);
delay(5000);
*/
if (posizione == 1)
{
//Aziona il motore per 180° senso antiorario
stepper.setCurrentPosition(0);
while (stepper.currentPosition() <= gradi180)
{
/*Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("buttonState1 = ");
Serial.print(buttonState1);
Serial.print(" Posizione corrente= ");
Serial.println(stepper.currentPosition());
*/
stepper.setSpeed(stepperspeed);
stepper.runSpeed();
}
/*Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("buttonState1 = ");
Serial.print(buttonState1);
Serial.print(" Posizione iniziale= ");
Serial.println(posizione);
delay(5000);
*/
}
else
{
//Aziona il motore per 15° senso orario
stepper.setCurrentPosition(0);
while (stepper.currentPosition() >= -gradi12)
{
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
// Serial.print("buttonState1 = HIGH");
// Serial.print(" Posizione corrente= ");
// Serial.println(stepper.currentPosition());
stepper.setSpeed(-stepperspeed);
stepper.runSpeed();
}
posizione = 1;
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
//Serial.print("buttonState1 = HIGH");
//Serial.print(" Posizione finale= ");
//Serial.println(posizione);
//delay(5000);
}
abilitato=true;
digitalWrite(enablePin,abilitato);
}
buttonState1 = 0;
// Leggi stato del bottone 2
buttonState2 = digitalRead(buttonPin4);
//DEBOUNCE-INIT
//buttonState2 = dbbutton2.read();
//DEBOUNCE-END
// Controlla se il bottone 2 è stato premuto (valore HIGH)
if (buttonState2 == HIGH)
{
abilitato=false;
digitalWrite(enablePin,abilitato);
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
//Serial.print("buttonState2 = HIGH");
//Serial.print(" Posizione iniziale = ");
//Serial.println(posizione);
//delay(5000);
if (posizione == 1)
{
//Aziona il motore per 15° senso antiorario
stepper.setCurrentPosition(0);
while (stepper.currentPosition() <= gradi12)
{
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
// Serial.print("buttonState1 = HIGH");
// Serial.print(" Posizione corrente= ");
// Serial.println(stepper.currentPosition());
stepper.setSpeed(stepperspeed);
stepper.runSpeed();
}
posizione = 2;
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
//Serial.print("buttonState2 = HIGH");
//Serial.print(" Posizione finale = ");
//Serial.println(posizione);
}
else
{
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
//Serial.print("buttonState2 = HIGH");
//Serial.print(" Posizione iniziale = ");
//Serial.println(posizione);
//Aziona il motore per 168° senso antiorario
stepper.setCurrentPosition(0);
while (stepper.currentPosition() <= gradi168)
{
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
// Serial.print("buttonState1 = HIGH");
// Serial.print(" Posizione corrente= ");
// Serial.println(stepper.currentPosition());
stepper.setSpeed(stepperspeed);
stepper.runSpeed();
}
posizione = 1;
//Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
//Serial.print("buttonState2 = HIGH");
//Serial.print(" Posizione finale = ");
//Serial.println(posizione);
}
abilitato=true;
digitalWrite(enablePin,abilitato);
}
buttonState2 = 0;
// Leggi stato del bottone 3
// buttonState3 = digitalRead(buttonPin5);
//DEBOUNCE-INIT
buttonState3 = dbbutton3.read();
//DEBOUNCE-END
// Controlla se il bottone 3 è stato premuto (valore HIGH)
// allora ruota in senso antiorario
if (buttonState3 == HIGH)
{
abilitato=false;
digitalWrite(enablePin,abilitato);
stepper.setCurrentPosition(0);
while (buttonState3==HIGH)
{
/*Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("buttonState3 = ");
Serial.print(buttonState3);
Serial.print(" Posizione corrente= ");
Serial.println(stepper.currentPosition());
*/
stepper.setSpeed(stepperspeed);
stepper.runSpeed();
buttonState3 = digitalRead(buttonPin5);
//DEBOUNCE-INIT
//buttonState3 = dbbutton3.read();
//DEBOUNCE-END
}
/*
Serial.print(" Fuori loop ");
Serial.println(stepper.currentPosition());
Serial.print(" buttonState3: ");
Serial.println(buttonState3);
delay(1000);
*/
abilitato=true;
digitalWrite(enablePin,abilitato);
}
// Leggi stato del bottone 4
buttonState4 = digitalRead(buttonPin6);
//DEBOUNCE-INIT
//buttonState4 = dbbutton4.read();
//DEBOUNCE-END
// Controlla se il bottone 4 è stato premuto (valore HIGH)
// allora ruota in senso antiorario
if (buttonState4 == HIGH)
{
abilitato=false;
digitalWrite(enablePin,abilitato);
stepper.setCurrentPosition(0);
while (buttonState4==HIGH)
{
/*Invio i dati letti al Monitor seriale, cosi da poterli vedere a video
Serial.print("buttonState4 = ");
Serial.print(buttonState4);
Serial.print(" Posizione corrente= ");
Serial.println(stepper.currentPosition());
*/
stepper.setSpeed(-stepperspeed);
stepper.runSpeed();
buttonState4 = digitalRead(buttonPin6);
//DEBOUNCE-INIT
//buttonState4 = dbbutton4.read();
//DEBOUNCE-END
}
/*
Serial.print(" Fuori loop ");
Serial.println(stepper.currentPosition());
Serial.print(" buttonState4: ");
Serial.println(buttonState4);
delay(1000);
*/
abilitato=true;
digitalWrite(enablePin,abilitato);
}
}
Le istruzioni esecutive per il debouncing sono commentate tra “//DEBOUNCE-INIT” E “DEBOUNCE-END”, basta scommentare la linea e commentare quella funzionante tipo
buttonState4 = digitalRead(buttonPin6);
//DEBOUNCE-INIT
//buttonState4 = dbbutton4.read();
//DEBOUNCE-END
diventa
//buttonState4 = digitalRead(buttonPin6);
//DEBOUNCE-INIT
buttonState4 = dbbutton4.read();
//DEBOUNCE-END
Avete qualche suggerimento?
Grazie.
Massimo.