| RAUNARDE
| Inviato il: 26/04/2021 12:20:37
|
Ciao a tutti, sono alle prime armi con arduino e non riesco a far funzionare questo sketch.
Devo motorizzare l'asse X di una fresa con un motore passo passo Nema34 (ho esagerato, bastava un nema 23....)
Come comandi ho un joystick con pulsanti NO che mi deve effettuare il movimento DX o SX
ho 2 microswitch NC che mi fanno da finecorsa e che quando l'asse x mi arriva al limite apre il contatto
ho 1 pulsante per avanzamento veloce
ho un potenziometro per regolare la velocità normale ed uno per avanzamento veloce.
Infine ho 3 uscite per un driver DM556 e 2 uscite per dei led di stato che "dovrebbero accendersi" quando vado a destra o sx.
il programma l'ho scritto ma non mi funziona, non capisco dove stia sbagliando, ho provato a fare dei cicli richiamati dal Void loop ma senza esito infatti li ho esclusi racchiudendoli tra /*----*/ e li ho poi copiati direttamente nel void loop, ma anche in qusto modo non mi va.
Tutti i comandi li ho collegati verso massa impostando la porta arduino come INPUT_PULLUP così normalmente è alta come valore (HIGH = 5V) e quando chiudo un contatto va a 0 (LOW) tranne i finecorsa che essendo sempre NC sono a = finchè uno non viene azionato e mi manda la porta in HIGH
Sapreste dirmi cosa sto sbagliando?
Grazie mille
int puls_sx = 3; //pulsante controller SX
int puls_dx = 4; //pulsante controller DX
int ena = 5; //ENA stepper Driver
int dir = 6; //DIR stepper Driver
int pul = 7; //PUL stepper Driver
int rapid = 8; //Pulsante rapido
int potS = A0; //Potenziometro velocità normale
int potR = A1; //Potenziometro velocità Rapida
int fcsx = 10; //Fine corsa SX NC
int fcdx = 11; //Fine corsa DX NC
int ledSx = 12; //Led direzione SX
int ledDx = 13; //Led direzione DX
int buzzer = 9; // Buzzer segnalazioni acustiche
int power_on = 2; //led stato acceso
int direzione;
long currentMicros = 0;
long previousMicros = 0;
long delay_Micros = 0;
void setup() {
Serial.begin(9600);
pinMode(puls_sx, INPUT_PULLUP);
pinMode(puls_dx, INPUT_PULLUP);
pinMode(ena, OUTPUT);
pinMode(dir, OUTPUT);
pinMode(pul, OUTPUT);
pinMode(potS, INPUT);
pinMode(potR, INPUT);
pinMode(fcsx, INPUT_PULLUP);
pinMode(fcdx, INPUT_PULLUP);
pinMode(ledSx, OUTPUT);
pinMode(ledDx, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(power_on, OUTPUT);
digitalWrite(power_on, LOW);
digitalWrite(ledSx,LOW);
digitalWrite(ledDx,LOW);
delay(200);
digitalWrite(ledSx, HIGH);
digitalWrite(ledDx, HIGH);
Serial.println ("Ready");
delay(1000);
digitalWrite(ledSx, LOW);
digitalWrite(ledDx, LOW);
tone(1, 1000, 600);
}
void tone_err() {
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
}
/*
void direz() {
if (puls_sx == LOW) { //funziona a SX
if (fcsx == LOW) {
digitalWrite(ledSx, HIGH);
digitalWrite(dir, HIGH);
digitalWrite(ena, HIGH);
tone(4, 800, 300);
Serial.print("sinistra");
}
else { if (fcsx == HIGH) { //finecorsa sx aperto blocco movimento
digitalWrite(ledSx, LOW); {
digitalWrite(ena, LOW);
Serial.print("finecorsa sinistra");
tone_err();
}
}
}
}
if (puls_dx == LOW){
if (fcdx == LOW){ //funziona a dx
digitalWrite(ledDx, LOW);
digitalWrite(dir, LOW);
digitalWrite(ena, HIGH);
Serial.print("Destra");
tone(4, 800, 300);
}
else { //(fcdx = HIGH); finecorsa dx aperto blocco movimento
digitalWrite(ledDx, HIGH); {
digitalWrite(ena, LOW);
Serial.print("finecorsa destra");
tone_err();
}
}
}
if (puls_dx && puls_sx==LOW){
digitalWrite(ena,LOW);
}
}
*/
void start() {
currentMicros = micros();
if (digitalRead(rapid)==HIGH) { //if rapid not pressed
delay_Micros = map(analogRead(potS), 0, 1024, 50000, 1000); //Read speed
if (currentMicros - previousMicros >= delay_Micros)
{
previousMicros = currentMicros;
digitalWrite(pul, HIGH);
delayMicroseconds(100); //Set Value
digitalWrite(pul, LOW);
}
}
else (digitalRead(rapid)==LOW);{ //if rapid pressed
delay_Micros = map(analogRead(potR), 0, 1024, 1000, 300); //Read rapid speed
if (currentMicros - previousMicros >= delay_Micros)
{
previousMicros = currentMicros;
digitalWrite(pul, HIGH);
delayMicroseconds(100); //Set Value
digitalWrite(pul, LOW);
}
}
}
void loop() {
if (puls_sx == LOW) { //funziona a SX
if (fcsx == LOW) {
digitalWrite(ledSx, HIGH);
digitalWrite(dir, HIGH);
digitalWrite(ena, HIGH);
tone(4, 800, 300);
Serial.print("sinistra");
start();
}
else { if (fcsx == HIGH) { //finecorsa sx aperto blocco movimento
digitalWrite(ledSx, LOW); {
digitalWrite(ena, LOW);
Serial.print("finecorsa sinistra");
tone_err();
}
}
}
}
if (puls_dx == LOW){
if (fcdx == LOW){ //funziona a dx
digitalWrite(ledDx, LOW);
digitalWrite(dir, LOW);
digitalWrite(ena, HIGH);
Serial.print("Destra");
tone(4, 800, 300);
start();
}
else { //(fcdx = HIGH); finecorsa dx aperto blocco movimento
digitalWrite(ledDx, HIGH); {
digitalWrite(ena, LOW);
Serial.print("finecorsa destra");
tone_err();
}
}
}
if (puls_dx && puls_sx==LOW){
digitalWrite(ena,LOW);
}
}
//start();
| | | | Maufedro
| Inviato il: 26/04/2021 13:38:02
|
A prima vista sembra che manchi la dichiarazione delle librerie
--------------- Per ogni problema esistono più soluzioni. ma solo una è la migliore
| | | | RAUNARDE
| Inviato il: 26/04/2021 14:46:36
|
Ciao Maufedro, grazie per la risposta, ma non capisco a quali librerie tu stia facendo riferimento, teoricamente non ho usato nulla che necessita di libreria, o magari mi sbaglio ed ecco l'errore. | | | | RAUNARDE
| Inviato il: 29/04/2021 10:08:59
|
Allora situazione in evoluzione, prima da newby di arduino non avevo inserito la lettura dello stato dei pin, sistmato questo mi funziona quasi tutto, non riesco a variare i giri e ad usare l'avanzamento veloce.
probabilmente sbaglio qualcosa con il void start()
provato da solo funziona, ma inserito nello sketch non va.
int puls_sx = 3; //pulsante controller SX
int puls_dx = 4; //pulsante controller DX
int ena = 5; //ENA stepper Driver
int dir = 6; //DIR stepper Driver
int pul = 7; //PUL stepper Driver
int rapid = 8; //Pulsante rapido
int potS = A0; //Potenziometro velocità normale
int potR = A1; //Potenziometro velocità Rapida
int fcsx = 10; //Fine corsa SX NC
int fcdx = 11; //Fine corsa DX NC
int ledSx = 22; //Led direzione SX
int ledDx = 23; //Led direzione DX
int buzzer = 9; // Buzzer segnalazioni acustiche
int power_on = 2; //led stato acceso
int val_p_sx =1;
int val_p_dx =1;
int val_fcsx =0;
int val_fcdx =0;
int val_potS =0;
int val_potR =0;
long currentMicros = 0;
long previousMicros = 0;
long delay_Micros = 0;
void setup() {
Serial.begin(9600);
pinMode(puls_sx, INPUT_PULLUP);
pinMode(puls_dx, INPUT_PULLUP);
pinMode(ena, OUTPUT);
pinMode(dir, OUTPUT);
pinMode(pul, OUTPUT);
pinMode(potS, INPUT);
pinMode(potR, INPUT);
pinMode(fcsx, INPUT_PULLUP);
pinMode(fcdx, INPUT_PULLUP);
pinMode(ledSx, OUTPUT);
pinMode(ledDx, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(power_on, OUTPUT);
digitalWrite(power_on, LOW);
digitalWrite(ledSx,LOW);
digitalWrite(ledDx,LOW);
delay(200);
digitalWrite(ledSx, HIGH);
digitalWrite(ledDx, HIGH);
Serial.println ("Ready");
delay(1000);
digitalWrite(ledSx, LOW);
digitalWrite(ledDx, LOW);
tone(1, 1000, 600);
val_potS = analogRead(potS);
Serial.println(val_potS);
delay(1000);
val_potR = analogRead(potR);
Serial.println(val_potR);
delay(1000);
}
void tone_err() {
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
}
void start() {
currentMicros = micros();
if (digitalRead(rapid)==1) { //se puls rapid non premuto
delay_Micros = map(analogRead(val_potS), 0, 1024, 10000, 1000); //leggo velocita potS
if (currentMicros - previousMicros >= delay_Micros)
{
previousMicros = currentMicros;
digitalWrite(pul, HIGH);
delayMicroseconds(20);
digitalWrite(pul, LOW);
}
}
else (digitalRead(rapid)==0);{ //se premo rapid
delay_Micros = map(analogRead(val_potR), 0, 1024, 1000, 300); //leggo potR
if (currentMicros - previousMicros >= delay_Micros)
{
previousMicros = currentMicros;
digitalWrite(pul, HIGH);
delayMicroseconds(20);
digitalWrite(pul, LOW);
}
}
}
void loop() {
val_p_sx = digitalRead(puls_sx);
val_p_dx = digitalRead(puls_dx);
val_fcsx = digitalRead(fcsx);
val_fcdx = digitalRead(fcdx);
if ((val_p_sx == 0)&&(val_p_dx==1)) { //funziona a SX
if (val_fcsx == 0) {
digitalWrite(ledSx, HIGH);
digitalWrite(dir, HIGH);
digitalWrite(ena, HIGH);
Serial.println("sinistra");
start();
}
else { if (val_fcsx == 1) { //finecorsa sx aperto blocco movimento
digitalWrite(ledSx, LOW); {
digitalWrite(ena, LOW);
Serial.println("finecorsa sinistra");
tone_err();
}
}
}
}
if ((val_p_dx == 0)&&(val_p_sx==1)){
if (val_fcdx == 0){ //funziona a dx
digitalWrite(ledDx, HIGH);
digitalWrite(dir, LOW);
digitalWrite(ena, HIGH);
Serial.println("Destra");
start();
}
else { if(val_fcdx == 1); { //finecorsa dx aperto blocco movimento
digitalWrite(ledDx, LOW); {
digitalWrite(ena, LOW);
Serial.println("finecorsa destra");
tone_err();
}
}
}
}
if ((val_p_dx==0) && (val_p_sx==0)){
digitalWrite(ena, LOW);
Serial.println("Stop 1");
}
if ((val_p_dx==1) && (val_p_sx==1)){
digitalWrite(ena, LOW);
Serial.println("Stop 2");
}
}
| | | | NextStep
milliWatt Gruppo:Utente Messaggi:2
Stato:
| Inviato il: 16/06/2021 20:12:30
|
CITAZIONE (RAUNARDE, 29/04/2021 10:08:59 )
Allora situazione in evoluzione, prima da newby di arduino non avevo inserito la lettura dello stato dei pin, sistmato questo mi funziona quasi tutto, non riesco a variare i giri e ad usare l'avanzamento veloce.
probabilmente sbaglio qualcosa con il void start()
provato da solo funziona, ma inserito nello sketch non va.
Hai provato a vedere con un oscilloscopio l'andamento del segnale PUL quando vai in rapido?
Come hai collegato i pin di uscita di Arduino agli ingessi del driver DM556, in modo diretto (figura 2 del manuale) oppure hai messo in mezzo un buffer?
Prova ad aggiungere un ulteriore ritardo delayMicroseconds(20); dopo che mandi basso PUL, un esempio:
if (currentMicros - previousMicros >= delay_Micros)
{
previousMicros = currentMicros;
digitalWrite(pul, HIGH);
delayMicroseconds(20);
digitalWrite(pul, LOW);
delayMicroseconds(20); <== AGGIUNTO
}
Hai provato a misurare il tempo che ci impiega Arduino a fare un ciclo completo in rapido ovvero quando tempo ci mette a ritornare nel codice che gestisce la modalità in rapido? Se il giro è più lungo di quello che sarebbe la scansione prevista per il modo rapido può essere che non vada in rapido in quanto il sistema nel suo complesso è troppo lento ed è lui che limita...
Ciao
Modificato da NextStep - 16/06/2021, 20:35:02
| | | | RAUNARDE
| Inviato il: 22/06/2021 10:43:48
|
grazie della risposta.
Ho modificato il codice in questo modo e mi funziona tutto, ho solo un problema che di seguito descrivo:
I funzionamento è corretto tranne quando vario la velocità del rapido, mi passa dal valore minimo come rpm fino al massimo ogni 1/3 di giro del potenziometro, superata quella soglia torna al minimo per arrivare al max a 2/3 di giro idem appena supero ed entro nel 3/3 ritorna al minimo e riparte fino al max.
I valori del potenziometro sono corretti, sale costantemente come resistenza, sembra quasi come in radiofrequenza quando si sovrappongano delle armoniche.
Spero di essermi spiegato.
Il problema me lo genera con i delay_microseconds, se lascio in millis va bene , ma ho il problema che mi gira troppo piano (come movimento rapid) avendo impostato sul driver un certo numero di passi per farlo muovere lentamente ma fluido quando devo usarlo per fresare materiali duri.
#define puls_sx 3 //pulsante controller SX
#define puls_dx 4 //pulsante controller DX
#define ena 5 //ENA stepper Driver
#define dir 6 //DIR stepper Driver
#define pul 7 //PUL stepper Driver
#define rapid 8 //Pulsante rapido
#define potS A0 //Potenziometro velocità normale
#define potR A1 //Potenziometro velocità Rapida
#define fcsx 10 //Fine corsa SX NC
#define fcdx 11 //Fine corsa DX NC
#define ledSx 12 //Led direzione SX
#define ledDx 13 //Led direzione DX
#define buzzer 9 // Buzzer segnalazioni acustiche
#define power_on 2 //led stato acceso
int val_p_sx =0;
int val_p_dx =0;
int val_fcsx =0;
int val_fcdx =0;
int val_potS =0;
int val_potR =0;
int val_rapid =0;
int delay_MicrosS = 0;
int delay_MicrosR = 0;
void setup() {
Serial.begin(9600);
pinMode(puls_sx, INPUT_PULLUP);
pinMode(puls_dx, INPUT_PULLUP);
pinMode(ena, OUTPUT);
pinMode(dir, OUTPUT);
pinMode(pul, OUTPUT);
pinMode(potS, INPUT);
pinMode(potR, INPUT);
pinMode(fcsx, INPUT_PULLUP);
pinMode(fcdx, INPUT_PULLUP);
pinMode(ledSx, OUTPUT);
pinMode(ledDx, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(power_on, OUTPUT);
pinMode(rapid, INPUT_PULLUP);
digitalWrite(power_on, LOW);
digitalWrite(ledSx,LOW);
digitalWrite(ledDx,LOW);
delay(200);
digitalWrite(ledSx, HIGH);
digitalWrite(ledDx, HIGH);
Serial.println ("Ready");
delay(1000);
digitalWrite(ledSx, LOW);
digitalWrite(ledDx, LOW);
tone(1, 1000, 600);
delay(1000);
}
void tone_err() {
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
tone(2, 1200, 100);
delay(100);
Serial.println("Tono Errore");
}
void loop() {
check_valori();
direzione();
}
void start_normal() {
// if (digitalRead(val_rapid)==1){ //se puls rapid non premuto
//leggo velocita potS
{
delay (delay_MicrosS);
digitalWrite(pul, HIGH);
delayMicroseconds(10);
digitalWrite(pul, LOW);
}
}
void start_rapid() {
// if(digitalRead(val_rapid)==0) { //se premo rapid
//leggo potR
{
delayMicroseconds (delay_MicrosR);
digitalWrite(pul, HIGH);
delayMicroseconds(10);
digitalWrite(pul, LOW);
}
}
//}
void check_valori() {
val_p_sx = digitalRead(puls_sx);
val_p_dx = digitalRead(puls_dx);
val_fcsx = digitalRead(fcsx);
val_fcdx = digitalRead(fcdx);
val_rapid = digitalRead(rapid);
delay_MicrosS = map(analogRead(potS), 0, 1023, 1, 40);
delay_MicrosR = map(analogRead(potR), 0, 1023, 50, 1000);
}
void direzione(){
if ((val_p_sx == 0)&&(val_p_dx==1)) { //funziona a SX
if (val_fcsx == 0) {
digitalWrite(ledSx, HIGH);
digitalWrite(dir, HIGH);
digitalWrite(ena, HIGH);
if (val_rapid==0){
start_rapid();
}
else {
start_normal();
}
}
else { if (val_fcsx == 1) { //finecorsa sx aperto blocco movimento
digitalWrite(ledSx, LOW); {
digitalWrite(ena, LOW);
Serial.println("finecorsa sinistra");
tone_err();
}
}
}
}
if ((val_p_dx == 0)&&(val_p_sx==1)){
if (val_fcdx == 0){ //funziona a dx
digitalWrite(ledDx, HIGH);
digitalWrite(dir, LOW);
digitalWrite(ena, HIGH);
if (val_rapid==0){
start_rapid();
}
else {
start_normal();
}
}
else { if(val_fcdx == 1); { //finecorsa dx aperto blocco movimento
digitalWrite(ledDx, LOW); {
digitalWrite(ena, LOW);
Serial.println("finecorsa destra");
tone_err();
}
}
}
}
if (((val_p_dx==0) && (val_p_sx==0))||((val_p_dx==1) && (val_p_sx==1))){
digitalWrite(ena, LOW);
//Serial.println("Stop");
}
}
Modificato da RAUNARDE - 22/06/2021, 10:53:33
| |
| | |
|
Versione Mobile!
|
|
|
|
|
|