Go Down

Topic: Autodiagnosi per Arduino? (Read 3659 times) previous topic - next topic

BrainBooster

wow! che velocità! complimenti calamaro!
e se sostituissimo i diodi normali con dei led? in modo da avere un riscontro visuale più "scenografico"? ::)

Calamaro

ah nel tuo disegno c'erano dei diodi io pensavo fossero normali :D

frog

#32
May 31, 2010, 08:17 pm Last Edit: May 31, 2010, 08:19 pm by furgorsin Reason: 1
@Calamaro
orca, che rapidità! devo dire, però, che ho pensato ad una modifica al circuito. Se un'uscita digitale ri "rompe" e rimane sempre fissa alta non viene rilevata. Per ovviare a ciò direi di togliere R3 e mettere una resistenza in serie ad ogni diodo che vanno poi ad unirsi verso R2.

@brainbooster
avevo pensato a dei diodo schottky perché hanno una bassa tensione di soglia. si può anche provare con i led realizzando un fw che però vada "lento"


edit: prima di partire con modifiche su eagle, direi di fare qualche prova con componenti volanti

BrainBooster

i led ed il loro pilotaggio in "rampa" di luminosità dovrebbero dare riscontro visuale del problema appena sollevato da frog, tanto non serve che il controllo sia fulmineo...no?
quoto per quanto riguarda le prove...

Calamaro

eh con eagle me la cavicchio :D poi il circuito non è difficile da fare c'ho messo 15 minuti :P

BrainBooster

#35
Jun 01, 2010, 08:00 pm Last Edit: Jun 01, 2010, 08:04 pm by brainbooster Reason: 1
scusate l'assenza, ma mi è arrivato il sensore ad ultrasuoni (pagato 9?) e per prova ho messo giù un sonar (uno sketch trovato in giro..) è funge!
Arduino è spettacolare per la duttilità, ho provato varii mcu ma devo dire che arduino ha il miglior rapporto prezzo/prestazioni/possibilità.
O.T.
per chi fosse interessato:
http://luckylarry.co.uk/2009/11/arduino-processing-make-a-radar-screen-to-visualise-sensor-data-from-srf-05-part-1-setting-up-the-circuit-and-outputting-values/

e ancora continuo ad intripparmi! è infinito, ci si può fare veramente di tutto....bellissimo! [smiley=laugh.gif]

BrainBooster

Forse possiamo anche togliere il passabasso, usare un pwm con frequenza "comoda"e generare via duty cycle un ciclo di alba-tramonto per tutti i led (uno per volta o tutti insieme) e magari contemporaneamente leggere dagli ingressi analogici  la tensione con cui ogni led è stato pilotato, che ne dite? sarebbe ancora + semplice

frog

eccomi qua, ho provato questo circuito http://img139.imageshack.us/img139/2560/diagnuinoschema.png con questo codice
Code: [Select]
char inByte;
int val = 0;
int analogPin = 0;
int digitalPin;

#define MAX_ANALOG_PIN  5
#define MAX_DIGITAL_PIN  13

void setup()
{                
 Serial.begin(9600);
 for(digitalPin = 2; digitalPin < (MAX_DIGITAL_PIN + 1); digitalPin++)
 {
   pinMode(digitalPin, OUTPUT);
   digitalWrite(digitalPin, LOW);
 }
}

void loop()                    
{
 while(!Serial.available())
   ;
 inByte = Serial.read();
 if(inByte == 's')
 {
   Serial.println("parto");
   // tutti i pin digitali HIGH
   for(digitalPin = 2; digitalPin < (MAX_DIGITAL_PIN + 1); digitalPin++)
   {
     digitalWrite(digitalPin, HIGH);
   }
   delay(200);
   Serial.print("tutto alto");
   Serial.print('\t');
   for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
   {
     val = analogRead(analogPin);
     Serial.print(val);
     Serial.print('\t');
   }
   Serial.print('\n');
   // tutti i pin digitali LOW
   for(digitalPin = 2; digitalPin < (MAX_DIGITAL_PIN + 1); digitalPin++)
   {
     digitalWrite(digitalPin, LOW);
   }
   delay(200);
   Serial.print("tutto basso");
   Serial.print('\t');
   for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
   {
     val = analogRead(analogPin);
     Serial.print(val);
     Serial.print('\t');
   }
   Serial.print('\n');
   for(digitalPin = 2; digitalPin < (MAX_DIGITAL_PIN + 1); digitalPin++)
   {
     Serial.print("digitale ");
     Serial.println(digitalPin);
     Serial.print("\tbasso\t");
     delay(200);
     for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
     {
       val = analogRead(analogPin);
       Serial.print(val);
       Serial.print('\t');
     }
     Serial.print('\n');
     digitalWrite(digitalPin, HIGH);
     Serial.print("\talto\t");
     delay(200);
     for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
     {
       val = analogRead(analogPin);
       Serial.print(val);
       Serial.print('\t');
     }
     Serial.print('\n');
     digitalWrite(digitalPin, LOW);
     delay(200);
   }
     Serial.println("fine");
 }
 else
 {
   Serial.println("problema");
 }
 Serial.flush();
}

inviando 's' via serialMonitor si ottiene questo risultato http://img263.imageshack.us/img263/7371/diagnuinoseriale.png (per colonne i vari valori letti dai diversi ingressi analogici).

Sto lavorando sul riconoscimento automatico degli ingressi analogici guasti. Quello che ho pensato è di prendere un array formato dalla prima riga, tutte le uscite digitali alte, e trovare quel sottoinsieme di valori che ha varianza bassa. Una volta trovato il sottoinsieme ne calcolo la media e individuo gli ingressi analogici guasti come quelli che si discostano da tale media più di un delta. Ripeto la procedura con l'array formato dalle letture con tutte le uscite digitali basse.

Algortimo per individuare il sottoinsieme a varianza bassa:
1) formo un array dei valori in ordine crescente;
2) se la varianza è sotto una soglia passo al punto 7;
3) calcolo la varianza_1 dell'array dai cui ho tolto il valore più basso;
4) calcolo la varianza_2 dell'array dai cui ho tolto il valore più alto;
4) se varianza_1 > varianza_2 aggiorno l'array togliendo il valore più basso altrimenti aggiorno togliendo il valore più alto
6) ritorno dal punto 2

Come algoritmo per ordinare una array di 6 valori nominato analogValues ho buttato giù questo
Code: [Select]
void sortAnalog()
{
 byte i, j;
 int tmp = 0;
 for(i = 0; i < 6; i++)
   analogSorted[i] = analogValues[i];
 for(i = 0; i < 6; i++)
 {
   for(j = 0; j < 5 - i; j++)
   {
     if(analogSorted[j] > analogSorted[j + 1])
     {
       tmp = analogSorted[j];
       analogSorted[j] = analogSorted[j + 1];
       analogSorted[j + 1] = tmp;
     }
   }
 }
 return;
}


@Calamaro
mi sono permesso di adottare il tuo "diagnuino"

@brainbooster
il filtro RC serve per ripulire un po' il valore che finisce sull'ingresso analogico, io lo terrei

BrainBooster

#38
Jun 05, 2010, 08:18 pm Last Edit: Jun 05, 2010, 09:24 pm by brainbooster Reason: 1
ok, il filtro l'avrei rimosso solo in caso di led;
i valori leggermente differenti dal normale sulla porta credo che dipendano dal led, per quella si potrebbe fare un discorso a parte.
perchè non sommare semplicemente i valori letti per fare una semplice media pesata?
l'andamento dei valori + o - sarebbe "prevedibile" http://it.wikipedia.org/wiki/Regressione_lineare
ma magari si può anche semplificare ulteriormente :) senza calcoli pesanti

frog

sicuramente i valori letti quando il pin 13 è alto sono più bassi rispetto agli altri pin per la caduta sul led presente su Arduino (per la cronaca, io ho un Arduino 2009).

per la regressione lineare non ci avevo pensato. però leggendo il link è un po' quello che ho fatto (magari in maniera un po' rozza): cerco quel valore che minimizza lo scarto quadratico medio e lo uso come stimatore del valore atteso

BrainBooster

#40
Jun 06, 2010, 07:34 am Last Edit: Jun 06, 2010, 07:37 am by brainbooster Reason: 1
comunque, vedo che si ottengono dati abbastanza omogenei per fare una semplice media pesata, che si potrà usare per il valore di "tutto ok"
P.S.
Hai provato a simulare gli errori? com'è l'output con un pin staccato o collegato fisso ai 5v, o tramite una resistenza (per avere un valore diverso da 0 o 5)?

frog

come peseresti la media? ecco qualche prova con analogiche e digitali inchiodate. se serve qualche altra combinazione basta chiedere

tutto ok
tutto alto      917      917      917      917      918      917      
tutto basso      0      0      0      0      0      0
digitale 2
basso      0      0      0      0      0      0      
     alto      481      481      481      481      481      481
...
digitale 13
basso      0      0      0      0      0      0      
     alto      471      471      472      471      471      471
--------------------------------------
digitale 13 a Vcc
tutto alto      912      912      911      912      912      912      
tutto basso      487      488      487      487      487      487
digitale 2
     basso      487      487      487      487      488      487      
     alto      654      655      655      654      654      654
...
digitale 13
     basso      487      487      487      488      488      487      
     alto      487      487      488      488      487      487
--------------------------------------
digitale 13 a GND
tutto alto      911      911      911      912      911      911      
tutto basso      0      0      0      0      0      0
digitale 2
     basso      0      0      0      0      0      0      
     alto      481      481      481      481      481      481
...
digitale 13
     basso      0      0      0      0      0      0      
     alto      0      0      0      0      0      0
--------------------------------------
digitale 13 a 3,3Vdc
tutto alto      911      911      911      911      911      912      
tutto basso      315      315      315      315      315      314
digitale 2
     basso      314      315      315      315      314      314      
     alto      539      539      538      539      539      538
...
digitale 13
     basso      314      315      315      315      314      315      
     alto      315      315      315      315      315      315
--------------------------------------
analogica 0 a GND
tutto alto      0      908      910      909      909      909      
tutto basso      0      0      0      0      0      0
digitale 2
     basso      0      0      0      0      0      0      
     alto      0      457      458      457      457      457
...
digitale 13
     basso      0      0      0      0      0      0      
     alto      0      448      448      449      448      448
--------------------------------------
anaolgica0 a Vcc
tutto alto      1023      918      918      917      918      918      
tutto basso      1023      81      81      81      80      81
digitale 2
     basso      1023      81      81      80      81      81      
     alto      1023      507      507      506      507      507
...
digitale 13
     basso      1023      81      81      81      81      81      
     alto      1023      498      498      498      498      498
--------------------------------------
anaolgica0 a 3,3Vdc
tutto alto      680      915      914      916      915      915      
tutto basso      678      50      49      49      50      49
digitale 2
     basso      678      50      49      50      50      49      
     alto      679      490      490      490      489      490
...
digitale 13
     basso      678      50      50      49      49      49      
     alto      679      481      481      481      481      481
--------------------------------------
anaolgica0 a Vcc, analogica 1 a GND
tutto alto      1023      0      910      911      910      911      
tutto basso      1023      0      74      74      74      73
digitale 2
     basso      1023      0      74      74      74      73      
     alto      1023      0      483      484      483      483
...
digitale 13
     basso      1023      0      74      74      74      74      
     alto      1023      0      475      475      475      475      

BrainBooster

#42
Jun 06, 2010, 04:51 pm Last Edit: Jun 06, 2010, 04:52 pm by brainbooster Reason: 1
adesso dovremmo mettere a fuoco l'obbiettivo, e cioè:
vogliamo sapere se
1)c'è qualcosa che non và (allarme generico)?
2)c'è qualcosa che non và al pin n. (allarme valori strani su pin)?
3)quale pin ha quale problema?
fino a quale livello di dettaglio è utile spingersi?
P.S.
azz, hai fatto le prove proprio con il pin 13 ;D

frog

secondo me possiamo partire cercando di dare il massimo del dettaglio (il pin x è fuori uso) per poi andare a diminuire la complessità se c'è qualche impedimento.
ho utilizzato il pin 13 (e anche il 12) perché sono quelli più comodi da spostare per come sono messo: Arduino "a testa in giù" (prendendo come riferimento la serigrafia) alla sinistra del PC. Comunque le cose non cambiano se metto uno qualunque degli altri pin (in realtà il filetto che va al diodo) a VCC o a GND

Calamaro

2 cose ot :D
1. @ frog lo schema non è il mio ma ho semplicemente rifatto in eagle lo schema che tu avevi fatto a mano :P
2. questo thread andrebbe stickato perchè è abbastanza importante ed è un progetto comune :D

Go Up