Pages: 1 2 [3] 4 5   Go Down
Author Topic: Autodiagnosi per Arduino?  (Read 3113 times)
0 Members and 1 Guest are viewing this topic.
Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Campagne Aretine
Offline Offline
God Member
*****
Karma: 0
Posts: 816
Arduino è una figata
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ah nel tuo disegno c'erano dei diodi io pensavo fossero normali smiley-grin
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
« Last Edit: May 31, 2010, 01:19:48 pm by furgorsin » Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Campagne Aretine
Offline Offline
God Member
*****
Karma: 0
Posts: 816
Arduino è una figata
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

eh con eagle me la cavicchio smiley-grin poi il circuito non è difficile da fare c'ho messo 15 minuti smiley-razz
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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]
« Last Edit: June 01, 2010, 01:04:54 pm by brainbooster » Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

eccomi qua, ho provato questo circuito http://img139.imageshack.us/img139/2560/diagnuinoschema.png con questo codice
Code:
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:
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
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley senza calcoli pesanti
« Last Edit: June 05, 2010, 02:24:20 pm by brainbooster » Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)?
« Last Edit: June 06, 2010, 12:37:14 am by brainbooster » Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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      
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: June 06, 2010, 09:52:54 am by brainbooster » Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 185
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Campagne Aretine
Offline Offline
God Member
*****
Karma: 0
Posts: 816
Arduino è una figata
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: 1 2 [3] 4 5   Go Up
Jump to: