Buongiorno a tutti
ho scritto un semplice programma che alla pressione di un pulsane mi attiva un attuatore per sollevare o abbassare una portella.
improvvisamente l'attuatore non risponde piu ai comandi ma si muove di vita propria.
Eseguendo un rapido debug ho notato che uno uno degli ingressi va allo stato alto senza che ci sia la pressione del pulsante.
Inizialmente avevo dato la colpa ad un malfunzionamento del pusante stesso , ma una volta smontato e controllato funzionava senza problemi, in seconda battuta ho ritenuto difettoso l'ingresso, e quindi l'ho cambiato, ma senza successo, se inverto il funzionamento degli ingressi ribaldo il problema ma non lo risolvo.
ho provato ad utilizzare due ingressi non collegati ma ottengo sempre lo stesso risultato.
A questo punto non riesco a capire se c'e un'anomalia nel programma oppure se si e rotto Arduino
Ribadisco che inizialmente il tutto ha funzionato perfettamente per qualche mese
<Servo.h> // include la Libreria Servo.h
#define stato 8 // led ala aperta
Servo servoMotorDx; // Crea il servomotore
void setup() {
Serial.begin(9600);
servoMotorDx.attach(5); //pin uscita servomotore destro
pinMode (10,INPUT); // definisce che 10 è un input
pinMode (9,INPUT); // definisce che 9 è un input
pinMode (8,OUTPUT); // definisce uscita led
pinMode (4,OUTPUT);// definisce che 4 l'uscita per il magnete
digitalWrite(8,LOW); // spegne il led
digitalWrite(4,LOW); //spegne il magete
digitalWrite(10,LOW);//azzero il valore del pulsante di apertura
digitalWrite(9,LOW);//azzero il valore del pulsante di chiusura
servoMotorDx.write(160);
}
void loop()
{
delay(500);
int aperto = digitalRead(10); //legge lo stato del pulsante di apertura
int chiuso = digitalRead(9);//legge lo stato del pulsante di chiusura
Serial.println("aperto"); // visualizza lo stato del pulsante di apertura
Serial.println(aperto,DEC); // visualizza lo stato del pulsante di apertura
Serial.println("chiuso");// visualizza lo stato del pulsante di chiusura
Serial.println(chiuso,DEC);// visualizza lo stato del pulsante di chiusura
if (aperto == HIGH)
{
Serial.println(aperto);
delay(500);
servoMotorDx.write(5);
digitalWrite(8,HIGH);
digitalWrite(4,LOW);
Serial.println(8);
}
if (chiuso == HIGH)
{
digitalWrite(4,HIGH);
delay(500);
Serial.println(chiuso);
servoMotorDx.write(20);
delay(100);
servoMotorDx.write(40);
delay(100);
servoMotorDx.write(60);
delay(100);
servoMotorDx.write(80);
delay(100);
servoMotorDx.write(100);
delay(100);
servoMotorDx.write(120);
delay(100);
digitalWrite(8,LOW);
}
}
Hai messo le resistenze di pull-down sui pulsanti?
Nota: "// definisce che 10 è un input" non serve a nulla; è ovvio. Dovresti, invece, scrivere che cosa fa quel pulsante.
digitalWrite(10,LOW);//azzero il valore del pulsante di apertura
digitalWrite(9,LOW);//azzero il valore del pulsante di chiusura
resistenze di pull-down messe,
essendo poche righe di programma " per me " e chiaro che funzione ha quell'input,
per quello che riguarda mettere bassi gli ingressi lo considero una sorta di inizializzazione del sistema,
non mi spiego comunque come mai abbia smesso di funzionare , non credo che il problema sino quelle due righe di codice
Galmik:
... per quello che riguarda mettere bassi gli ingressi lo considero una sorta di inizializzazione del sistema,
...e lo consideri male! Leggeteli i datasheet ... in realtà fai un'operazione del tutto inutile, ovvero disabiliti la pull-up interna che, comunque, NON hai mai abilitato e null'altro (... per usare il tuo commento, in realtà non "azzeri" nulla).
Da DS40002061A, page 85, section 14.2.1 "Configuring the Pin"
If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to be configured as an output pin.
mi sembra evidente che tu non hai letto il nostro "aiutateci ad aiutarvi"
vabbe' soprassediamo...
alcune domande:
come è alimentato il tutto?
il servomotore di "suo", senza comandi, sta fermo?
quando il servomotore si muove di vita propria cosa esce sul monitore seriale?
e un'azione da intreprendere: metti due led ai due ingressi, che così ti cavi il dubbio se è matto il pulsante o l'ingresso
, spero che cosi sia piu chiaro, ho anche eliminato i le parti superflue scritte solo pre prova e la parte che Guglielmo mi ha suggerito di eliminare perchè inutile
#include <Servo.h> // include la Libreria Servo.h
#define stato 8 // led ala aperta
Servo servoMotorDx; // Crea il servomotore
void setup() {
Serial.begin(9600);
servoMotorDx.attach(5); //pin uscita servomotore destro
// servoMotorSx.attach(9); //pin uscita servomotore sinistro
pinMode (10,INPUT); // indica il pin 10 come ingresso per il pulsante di apertura
pinMode (9,INPUT); // indica il pin 9 come ingresso per il pulsante di chiusura
pinMode (8,OUTPUT); // indica che sul pin 8n e collegato il led per indicare lo stato di apertura
pinMode (4,OUTPUT);// indica che sul pin 4 e collegata l'uscita che pilota il rele di accensione del magnete di blocco
}
void loop()
{
//Serial.println("6");
//Serial.println("9");
delay(500);
int aperto = digitalRead(10); //legge lo stato del pulsante di apertura
int chiuso = digitalRead(9);//legge lo stato del pulsante di chiusura
Serial.println("aperto"); // visualizza lo stato del pulsante di apertura
Serial.println(aperto,DEC); // visualizza lo stato del pulsante di apertura
Serial.println("chiuso");// visualizza lo stato del pulsante di chiusura
Serial.println(chiuso,DEC);// visualizza lo stato del pulsante di chiusura
if (aperto == HIGH)
// Serial.println("aperto");
{
Serial.println(aperto);
delay(500);
servoMotorDx.write(5);//posiziono il servomotore in apertura
digitalWrite(8,HIGH);//accendo il magnete di blocco
digitalWrite(4,LOW);//accendo il led che indica lo stato di apertura
Serial.println(8);
}
if (chiuso == HIGH)
{
digitalWrite(4,HIGH); // spengo il magnete di blocco
delay(500);
// chiusura a step per evitare che avvenga tropppo velocemente
Serial.println(chiuso);
servoMotorDx.write(20);
delay(100);
servoMotorDx.write(40);
delay(100);
servoMotorDx.write(60);
delay(100);
servoMotorDx.write(80);
delay(100);
servoMotorDx.write(100);
delay(100);
servoMotorDx.write(120);
delay(100);
digitalWrite(8,LOW);//spegne il led che indica lo stato di apertura
}
}
il sistema e alimentato con una batteria a 12v da auto, da cui alimento direttamente un magnete a tramite un relay e il servomotore, poi tramite un regolato re di tensione creo i 5v per alimentare l'arduino e i servizi
all'inizio il servo senza nessun tipo di comando stava fermo, in seguito ti direi un paio di mesi sembra che tutte le volti che provi ad aprire premendo il relativo pulsate si richiuda immediatamente, guardando il seriale sembra che l'ingresso che gestisce la chiusura sia sempre attivo.
Ho provate anche ad utilizzare degli ingressi senza che ci fosse nulla collegato ma sempre con lo stesso risultato.
invertendo i pulsanti di apertura/chiusura l'effetto si inverte come se fosse un problema di programmazione ma non ne capisco il motivo visto che prima ha sempre funzionato
per i led devo provare perchè il dispositivo è installato da un collega e non facilmente accessibile