Tester cavi

Verissimo,ma da volerselo fare a volerlo fare complicato.....

Beh, insomma, non lo vedo così complicato né come cablaggi né come codice.

Se ad esempio volesse fare un tester per cavi di rete potrebbe mettere due connettori Ethernet femmina e collegare gli 8+8 cavi ad altrettanti pin, più lo schermo a GND (per i cavi non schermati si può prendere un conduttore come massa comune per i test).

Come codice penso che io in un'ora lo scrivo da zero. :slight_smile:

Vero,
Ma con un 555, un contatore decadico e una manciata di componenti passivi...

Lo hai già fatto da 30 anni...

docdoc:
Beh, insomma, non lo vedo così complicato né come cablaggi né come codice.

Per te non è complicato, per me è banale, per altri potrebbe essere difficilissimo da implementare. :slight_smile:
Tutto dipende dalla preparazione, ma anche dall'esperienza, che si possiede.

Si, certo, ma in ogni caso direi di aspettare le ulteriori risposte ed informazioni del nostro amico che ha chiesto questa cosa, più che parlarci addosso con questioni filosofico-tecniche... :wink:

non pensavo di scatenare tutto questo ma mi fa piacere. :slight_smile: Dunque o iniziato a buttare giù qualcosa l' idea come già detto è controllare solo il corto e a quale ingresso corrisponde l' attivazione di una determinata uscita l' idea era all' incirca questa:

int out[] ={2,3};

int in[]= {8,9};

queste sono le mie due uscite e i miei due ingressi per ora.
Ora attivo l' uscita 2 con il ciclo for e vado a leggere a questo punto tutti e 2 gli ingressi cosi da poter verificare anche il cto e qui già mi interrompo... Come dire al programma procedi se tutto ok oppure fermati se sbagliato?

Ma qui mancano elementi di programmazione strutturata...

Fai così:
Metti una variabile globale inizializzata a zero

Un ciclo for per ogni uscita
Dentro un ciclo for per ogni ingresso

Fai il test
Se test non ok metti a 1 la variabile

All'uscita dai for se la variabile globale è a 1
Segnali no good...

Altrimenti segnali good

Però così niente array...

Prova ciclo for per ogni uscita
Dentro un ciclo for per ogni ingresso

Registri nello array lo stato dell'ingresso

Uscito dai cicli for confronti lo array misurato con quello di riferimento

Se vuoi ottimizzarlo, considera anche che ogni volta che controlli un'ingresso, le uscite da controllare si riducono di una ... intendo, metti di avere per semplicita' 4 fili ... collego l'ingresso ad 1, e testo le uscite 1, 2, 3, 4 ... se tutto e' ok, quando poi collego l'ingresso a 2, non mi serve piu testare l'uscita 1, perche' l'ho gia fatto prima (se avessi avuto un corto fra 1 e 2, sarebbe gia stato rilevato, quindi non serve piu testare di nuovo il corto fra 2 ed 1) ... e cosi via ...

Occhio che così popoli solo metà dello array....

Ma per continuita' e corto, non ti serve altro ...

Per impedenze, dispersioni ed intermodulazione, l'hardware richiesto sarebbe molto piu complesso, ma se devi solo verificare se c'e' continuita' e che non ci siano corti, ti basta ... prova a pensare un'attimo ...

attivo ingresso 1
misuro uscita 1 - ok (contatto)
misuro uscita 2 - ok (no contatto = no corto)
misuro uscita 3 - ok (no contatto = no corto)
misuro uscita 4 - ok (no contatto = no corto)
spengo ingresso 1, attivo ingresso 2
(ora non mi serve piu misurare uscita 1, perche' da prima gia so che c'e' continuita' con uscita 1 e nessun corto con 2, 3, 4)
misuro uscita 2 - ok (contatto)
misuro uscita 3 - ok (no contatto = no corto)
misuro uscita 4 - ok (no contatto = no corto)
spengo ingresso 2, attivo ingresso 3
(ora non mi serve piu controllare neppure uscita 2, perche' come prima, ora so che c'e' continuita' con ingresso 2 e nessun corto con 3, 4, e da prima so anche che non c'e' alcun corto con 1)

... e cosi via ... non conta il numero dei fili, ogni uscita controllata e che e' ok, automaticamente elimina la necessita' di ricontrollare sia se stessa che quelle gia controllate, ad ogni cambio di ingresso ... praticamente, quasi dimezzi il numero di cicli di controllo necessari ... se hai pochi fili il risparmio di tempo e' esiguo, ma se ti capita di dover controllare cavi con parecchie decine di conduttori ... :wink:

EDIT: Se proprio sei costretto (ma non immagino perche' :D) ad usare un'array "pieno", puoi scrivere le equivalenti posizioni contemporaneamente ... tanto sono complementari (se, ad esempio, non c'e' corto fra 1 e 2, automaticamente non c'e' corto neppure fra 2 ed 1, e cosi via, quindi scrivi entrambi i valori ogni volta)

Io non lo so a cosa serva,

Lo vuole, un array... Dice che così è più semplice....

Io ho idea di semplificato ancora, un test per ogni polo, e basta

2 pin per polo, e fin qui è chiaro

Tutti i pin out alti, con resistenza limitatrice in serie sulla prima serie di pin

Dal primo all'ultimo polo, in un solo for

Primo pin out basso, secondo pin input pullup

Se legge alto delle due l'una

O interrotto, e legge pullup
O in corto con uno qualunque dei pin alti

Un break

L'indice indica che pin è fallato

Meno di così....

Occhio solo a non usare il pin 13 come input pullup, causa led non andrebbe

Pianificare di usare il pin 13 nella prima serie di pin, quelli usati come output

Io proporrei di provare questo codice:

// 18 23

//pin 0 e 1 seriale
//pin 2 input tasto avvio prova, attivo se messo a massa
//pin 3 output led verde prova OK
//pin pari a partire dal 4 al primo connettore senza resistenza di limitazione
//pin dispari a partire dal 5 al secondo connettore con resistenza di limitazione da 1K
//connessi in sequenza 4 e 5 al primo polo 6 e 7 al secondo e via così
#define riservati 4
//numero dei pin riservati prima dell'inizio cablaggio cavo in prova
#define poli 5
// numero dei poli del cavo
// va da se che poli+riservati < numero pin della scheda
int ok = 1;
// se ok vale 0 il cavo è non OK


void setup() {
  Serial.begin(9600);
  Serial.println(F("Programma di prova per cavi"));
  Serial.print(F("Predisposto per provare cavi a: "));
  Serial.print(poli);
  Serial.println(F(" poli"));
  pinMode(2, INPUT_PULLUP);
  pinMode(3, OUTPUT);
}

void loop() {
  if (digitalRead(2)) {
    // tasto non premuto
  }
  else {
    //Ciclo avviato
    // Spengo il led di cavo OK
    digitalWrite(3, LOW);

    // dichiaro uscite tutti i pin
    for (int i = riservati; i < riservati + poli; i++) {
      pinMode(i, OUTPUT);
      pinMode(i + poli, OUTPUT);
      digitalWrite(i, HIGH);
      digitalWrite(i+poli, HIGH);

    }



    // do per buon il cavo
    ok = 1;
    // per tutti i poli
    for (int i = 0; i < poli; i++) {
      // metto basso il pin dispari
      digitalWrite(4 + i * 2 + 1, LOW);
      // 4 riservati +2 volte l'indice + 1 per fare dispari
      //cambio il modo di funzionamneto del pin pari
      pinMode (4 + 2 * i, INPUT_PULLUP);
      // aspetto 5 millisecondi per lasciare il tempo di assestamento (forse non serve)
      delay(5);
      // se input è alto errore nel cablaggio
      if (digitalRead(4 + 2 * i)) {
        // errore nel cablaggio
        Serial.print (F("Cablaggio errato al polo numero: "));
        Serial.println(i);
        // dichiaro non OK il cavo
        ok = 0;
        // resetto tutti i pin
        for (int j = riservati; j < riservati + poli; j++) {
          pinMode(j, OUTPUT);
          digitalWrite(j, LOW);
        }
        //esco dal for
        break;
      }
      else {
        // test OK
        // rimetto a posto i pin usati
        digitalWrite(4 + i * 2 + 1, HIGH);
        pinMode (4 + 2 * i, OUTPUT);
        digitalWrite(4 + i * 2, HIGH);
      }
    }
    // fuori dal for
    //se cavo OK
    digitalWrite(3, ok);
  }
}

// 18 53

fa più o meno quello che avevo descritto prima

NON usa array, e anche poche variabili
è parametrizzabile
e usa il pin 13 come output

Compilare compila

ma la mia UNO è nell'altra casa

NON lo garantisco, è ancora da dubuggare