Go Down

Topic: Guasto o malfunzionamento programma (Read 347 times) previous topic - next topic

Galmik

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

Code: [Select]
<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);
   
   }
   
 
   
   
   
  }

Datman

#1
Dec 05, 2019, 11:33 pm Last Edit: Dec 05, 2019, 11:38 pm by Datman
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.
Code: [Select]
digitalWrite(10,LOW);//azzero il valore del pulsante di apertura
digitalWrite(9,LOW);//azzero il valore del pulsante di chiusura

Questi non hanno proprio senso.
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Galmik

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

gpb01

#3
Dec 06, 2019, 07:43 am Last Edit: Dec 06, 2019, 07:46 am by gpb01
... 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).

Quote
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.
Guglielmo
Search is Your friend ... or I am Your enemy !

Salvorhardin

essendo poche righe di programma " per me " e chiaro che funzione ha quell'input,
per me che ti devo aiutare invece no, come la mettiamo?
Sempre una scintilla

Dal Dinamico Duo

Standardoil

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

Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

Galmik

scusate gli errori di gioventù

, 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

Code: [Select]
#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

Go Up