Ciao,
devo realizzare un "controllore di cavi" con Arduino in pratica devo controllare dei passanti (roba sportiva), sono tre fili, devo controllare se c'è continuità (e in questo non ci sono problemi), devo controllare che non vi siano incroci di collegamento (anche per questo non dovrebbe esserci problema) e che la resistenza di cavi sia inferiore ad 1 ohm... e qui invece ci sono problemi.
Ho trovato diversi esempi che usano un partitore di tensione per ricavare la resistenza "ignota"... come questo uno degli esempi ... facendo un mix con questa soluzione pensavo di poter, con una unica connessione, testare i tre cavi per le tre esigenze, ovviamente usando 3 digital Output differenti per ogni cavo con tre partitori separati. Ho provato prima con una resistenza di 10 ohm epoi una di 47 ohm (le raccomandazioni sono di un uso di una rapporto fra la resistenza nota e la ignota possibilmente vicino ad 1)
Ho il problema che, nonostante la Vout del digitalWrite sia di 5V i valori che mi restituisce sono completamente sballati, costanti, ma sballati. Se invece uso una uscita da 5V di Arduino le letture sono corrette - ma la resistenza nota di test (sia che usi la 10 o la 47 ohm) si surriscalda.
A parte il surriscaldamento usando il PIN 5V non potrei verificare eventuali incroci o corti per quello uso il digital output.
Dove sbaglio?
Il circuito è quello derivato dai link che riassumo :
Digital output D2 che va a R2 e R2 collegata a R1 in serie fra le due collego a A0 uscita R1 va a GND
questo è il codice:
#include <Arduino.h>
int analogPin= 0; // Pin Analogico A0
int raw= 0;
float Vin= 5.0; // Volt in uscita dal Pin 5V di Arduino
float Vout= 0;
float R1= 47; // impostare il valore della resistenza nota in Ohm
float R2= 0;
void setup(void)
{
Serial.begin(115200);
pinMode(2, OUTPUT);
pinMode(A0, INPUT);
digitalWrite( 2, HIGH);
}
void loop(void)
{
delay(200);
raw= analogRead(analogPin);
Serial.print("raw:");
Serial.println(raw);
if(raw) {
Vout = map(raw, 0, 1023, 0, 5000)/1000.0;
Serial.print("Vout: ");
Serial.println(Vout);
R2 = R1*(Vin - Vout)/(Vout);
Serial.print("R2: ");
Serial.println(R2);
delay(100);
} else {
Serial.println("Lettura non valida");
}
}
Ovviamente serve solo per vedere se funziona su un cavo poi dovrò triplicare il circuito e le letture e ovviamente ottimizzarlo (tipo più letture e media fra le letture), display per risultati (c'era ma l'ho tolto per i test) pull_down per gli ingressi ... ecc. ecc. MA PRIMA DEVE FUNZIONARE QUESTO!!!!
Manda i 5V delle tre uscite attraverso 3 resistenze da 100 Ohm 1/2W e poi verifica con analogRead() che il valore sia minore di 50mV.
---Ooops... No, non è il modo giusto!
Devi usare dei transistor NPN a collettore comune, mettendo 47 Ohm in serie all'emettitore e 47 Ohm come carico alla fine del cavo. Poi misuri con analogRead (doppio!) all'inizio e, subito dopo, alla fine del cavo. La differenza ti da la resistenza; con la lettura di almeno 400 (l'emitter follower darà circa 4,4V in uscita) alla fine del cavo verifichi la continuità.
Tra l'attivazione dei 5V su un'uscita attendi sempre alcuni millisecondi per superare le variazioni di tensione dovute a fenomeni capacitivi e induttivi dei cavi e fai sempre due letture consecutive:
Quattro anni fa feci un prova cavi audio che identifica automaticamente lo stato del cavo: OK, in controfase, sbilanciato (un filo collegato a massa), un filo interrotto. Alimentavo uno per volta i cavi, leggevo con alalogRead dall'altro capo e scrivevo il risultato (1 o 0) in alcune variabili, che identificavano le uscite e gli ingressi: A1, A2, A3, B1, B2, B3, C1, C2, C3. In questo modo avevo un quadro completo dello stato del cavo. Poi andavo ad analizzare le variabili e determinavo lo stato del cavo. Per un cavo buono doveva essere: A1B2C3==1; A2+A3+B1+B3+C1+C2==0.
verificare la continuità e l'incrocio non è un problema ma lo è la resistenza con la doppia lettura, se ho capito bene, mi servono 6 analogiche e non le ho.. mi sa che dovro "switchare" il 5V sulle diverse porte passando ad una resistenza di 270 ohm altrimenti brucio tutto
Devo collegare un display I2C per cui A4 e A5 sono out a sto punto opto per usare lo schema iniziale con una resistenza alta (a scapito della precisione da quello che ho capito) e 3 transistor per aprire chiudere i 5 V sulle tre analogiche, un primo ciclo per verificare i collegamenti che non siano incrociati aprendo una porta alla volta e verificando la presenza di tensione SOLO sulla Analogica corrispondente e poi lasciare aperto tutto per verificare le resistenze (in questa fase di solito si muovono i cavi per verificare i falsi contatti).
Mi spiace solo che dai test fatti con una resistenza di 270ohm ho fluttuazione nella lettura di 1,25 ohm che vanno da 1 a 1,90 ohm ... ma forse la breadboard non è il massimo come base per queste verifiche
Uhm ... non ho capito perche' non usare un semplice LM317 in configurazione a corrente costante impostato per dare una corrente nota (ad esempio 100mA) e leggere direttamente la sua uscita ... dato che la limitazione della corrente la fara' il regolatore, se ci si collega direttamente il cavo la tensione di uscita sara' basata sulla resistenza del cavo stesso ... mentre allo stesso tempo si vede la continuita' o l'interruzione (se la tensione e' uguale o simile a quella in ingresso al regolatore meno la caduta interna dello stesso, il cavo e' interrotto)
Oppure un qualsiasi altro circuito di base per milliohmetri, che alla fine, si basa sempre sullo stesso principio, fornire una corrente costante (funzionano quasi tutti con 100mA) e leggere la tensione ai capi della resistenza sotto misura (in questo caso, il cavo) ...
EDIT: dimenticavo, che precisione serve ? ... se alta, meglio usare un'amplificatore per strumentazione per "dar da mangiare" il valore gia amplificato all'ingresso digitale di Arduino
Non sono un elettronico e comincio ora a 'smanettare' un po' ... proverò anche a verificare l'utilizzo dell'LM317, prima devo capire cosa è come funziona e come integrarlo!
Il regolamento sportivo da come limite di un cavo 1ohm. non parla di tolleranze ma, considerando che alla fine la verifica la puoi fare con un tester, la tolleranza potrebbe essere quella di un tester commerciale
Il problema dei tester "commerciali" (ed un po anche di quelli professionali) e' che sotto un certo valore di resistenza diventano abbastanza imprecisi ... e' per quello che i milliohmetri usano sistemi diversi, con le clip a 4 fili (2 per clip, uno che porta la corrente ed uno che legge il valore, per escludere la caduta sul primo filo), ed i sistemi piu precisi addirittura la commutazione della polarita' e la lettura in fase (ma nel tuo caso questo sarebbe superfluo)
Il sistema piu semplice che mi viene in mente "al volo", e' quello dell'LM317 ... richiede due diversi circuiti, oppure se lo hai, un circuito ed un tester con scala 200mV DC ... colleghi il 317 come generatore di corrente, e lo imposti in modo da dare esattamente 100mA alimentandolo con 4 stilo, o al limite una batteria da 9V (lo puoi misurare direttamente sull'uscita oppure con un carico, milliamperometro in serie ovviamente), poi se hai il tester con una scala 200mV DC, lo colleghi direttamente ai capi del cavo dopo aver connesso il 317 con un paio di coccodrilli o simile, e sul tester leggi direttamente la resistenza in ohm del cavo (legge di ohm, con 100mA che scorrono nel conduttore, per ogni ohm avrai 100mV ai suoi capi, quindi cosi puoi misurare dai milliohm a massimo 2 ohm ... occhio a colegare il tester SOLO DOPO aver connesso il cavo, e scollegarlo PRIMA di scollegare il cavo)
Oppure se vuoi fare il tutto usando Arduino, leggi la tensione con quello, e la visualizzi da qualche parte, puoi anche farci un sistema che piloti il 317 con un mosfet a comando ...
Se ti dovessero servire qualche sistema piu complesso o preciso fammelo sapere, ho un'archivio quasi sterminato di circuiti vari e dovrebbero esserci anche diversi strumenti di misura, inclusi microohmetri, ma l'archivio e' del tipo "carta&matita" ed il PC non me lo indicizza, quindi devo cercarlo a mano e puo servire un po di tempo