Misuratore Ampere / Volt / Continuità per pista Slot

Senza una minima modifica all'auto, non mi viene in mente alcun altro sistema ... a parte ovviamente quello suggerito come alternativa, di far circolare una minima tensione in permanenza fra le tracce e rilevarne l'assorbimento ... ma che con le correnti ed extratensioni dovute alle manovre, avrebbe un sacco di problemi, e sarebbe estremamente difficile da implementare, specie se anche i regolatori fossero degli utenti come le auto ...

Auto presente= Tensione presente corrente presente

auto assente = tensione presente corrente assente

NON determinato (ma ininfluente) tensione assente

è il massimo fattibile, mi spiace

controllare una cosa, però...

che a causa di normative EMC non sia già obbligatorio il condensatore citato

Ci avevo pensato, ma se dicono di non volere peso extra, possibile che non ci sia (o che lo rimuovano, magari :D) ... se c'e', comunque, si puo provare ...

Se poi non fosse possibile aprire le auto, forse basterebbe costruire un circuitino con un 555 sui 500KHz o frequenza simile, collegarlo ad un sistema di rilevazione (accoppiato in modo capacitivo), e poi misurare se c'e' attenuazione e quanta collegando i capi alle spazzole dell'auto ...

oh beh...

se fosse obbligatorio, per ragioni EMC

si obbliga la verifica dell'auto, con misura esplicita, con lo stesso circuito che rileva la presenza

o meglio ancora, si aggiunge per regolamento che un auto "assente" ovvero che non risulta in pista col circuitino non avrà una eventuale vittoria omologata

se ci fosse l'obbligo...........

Ho parlato con un po' di piloti e il guru per noi slottisti... "Beh tu prova a vedere, se è interessante si può provare a renderlo obbligatorio".
Però non sono molto preparato su questa parte dell'elettronica.

Ho fatto alcune ricerche ed è lo stesso metodo utilizzato nei plastici per trenini per capire se un treno è deragliato o meno.
In pratica si tratta di mettere un'impedenza in serie al positivo, dopo questa bisogna iniettare la frequenza. Il condensatore serve per cortocircuitare la frequenza e quindi abbassare l'ampiezza del segnale.
Nei trenini vengono usate frequenze da 100 kHz.

A questo punto però sorgono altri due problemi:
-1: Qualcuno può usare un regolatore in PWM per il motore. Usare una frequenza molto alta potrebbe non influire sulla regolazione in PWM;
-2: Se le spazzole (magari perché troppo lunghe o perché dopo un'uscita si sono arricciate) vanno in cortocircuito fra di loro? Se vanno in cortocircuito sul telaio e quindi sul corpo del motore e quindi sui magneti del motore? Possono succedere danni?

si usano due o trecento KHz, e non dovrebbero interferire con i PWM, basta calcolare opportunamente le impedenze ...

Se va qualcosa in corto, fa gli stessi danni sia con che senza il sistema ed i condensatori, quelli non influiscono ...

Eh, il calcolo di impedenze e condensatori non l'ho mai fatto. 300 KHz ok. I danni in quel senso corrispondono solo alla macchina che non si muove o che in curva non ha potenza, su un sistema di regolazione "lineare" come l'ho io.

Buongiorno a tutti,
alla fine ho preso l'hardware che mi deve ancora arrivare dalla Cina.
La scelta per il momento, per quello che serve a noi con maggiore celerità, è ricaduta su due display 1.8" TFT con connessione SPI ed un Arduino Pro Micro Clone.

Display:
https://www.ebay.it/itm/1-8-Inch-TFT-LCD-Touch-Panel-Board-Display-Module-For-Arduino-UNO-MEGA-Nano-HOT/311967275698?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649

Arduino Pro Micro:
https://www.ebay.it/itm/Pro-Micro-5V-16MHz-ATmega32U4-Replace-ATmega328-Arduino-Pro-Mini/122745843861?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649

Innanzitutto non ho mai fatto un collegamento con lo standard SPI.

Questo è il pettine della breakout board dei due display:

Nell'ordine abbiamo:

1 GND
2 VCC
3 NC
4 NC
5 NC
6 RESET
7 A0
8 SDA
9 SCK
10 CS
11 SCH (?)
12 MISO
13 MOSI
14 SD_CS
15 LED+
16 LED-

Allora, la mia domanda iniziale è:

  • Basta un Arduino Pro Micro per pilotare due display? Io ero rimasto che il display veniva pilotato via SPI ma siccome c'è anche la memoria SD non ci sto capendo molto. In ogni caso come devo fare i collegamenti? Quei due pin SCK e SDA ricordano molto un i2c ...
  • Nell'inserzione dice touch display. Siccome ne so veramente pochissimo, è veramente touchscreen? In tal caso eliminerei due pulsanti che devo mettere assolutamente per selezionare una delle 4 piste e azzerare eventualmente i valori.

Innanzitutto queste due domande.

Intanto spiego cosa andrò a fare: ho un alimentatore che alimenta 4 postazioni con 12v, la GND è su una delle due "trecce" della corsia, le 4 corsie hanno la GND in comune. Nelle postazioni i concorrenti inseriscono il proprio regolatore (presa BiTicino MAGIC 3 poli, +, - REG) con il quale regolano la velocità e la frenata delle macchine. Noi vogliamo andare a monitorare la tensione in pista dei concorrenti, salvando il picco massimo, per essere sicuri che non ci sia nessuno che bara. (dal momento che per regolamento nessuno può fornire alla macchina una tensione maggiore rispetto a quella fornita dall'alimentatore)

Devo fare dunque una misurazione del voltaggio tra la GND dell'alimentatore e il positivo della pista. (alcune piste invece hanno un alimentatore per ogni corsia, ma il GND comune... in pratica non cambia nulla siccome hanno in comune la GND) Quindi per ogni positivo delle corsie metto verso GND una resistenza / fusibile da 1 Ohm 1/4 W per proteggere qualsiasi cosa possa accadere sulla pista, poi faccio un partitore di tensione con resistenza di "precisione" da 680 k Ohm 1/4 W e verso massa un trimmer multigiro da 200 k Ohm, prelevo dunque la tensione tra la resistenza e il trimmer e metto verso massa in anti parallelo un diodo da 5.1 v per sicurezza verso l'entrata di Arduino. E' un Arduino Pro Micro, quindi funziona a 5 v con regolatore di tensione interno.

Per quanto riguarda l'alimentazione di Arduino e dei display, 220v CA, un piccolo trasformatore a 12 v CC, per Arduino Pro Micro visto che ha l'alimentatore interno non c'è problema, per i display metterò un LM7805 in package TO220 con un paio di condensatori in entrata e in uscita da 100 nF e un paio di condensatori più grossi elettrolitici sempre in entrata in uscita, sempre tra entrata / uscita e massa. Naturalmente le masse di alimentazione e della pista per le misure vanno separate.

Detto ciò e tralasciato per il momento il discorso sulla connessione con i display (e il codice da scrivere che ancora devo studiare visto che, e lo ripeto per l'ennesima volta, non ho mai lavorato con questi display), veniamo al codice semplice semplice per intanto effettuare le misurazioni.

** il primo pezzo di codice arriverà fra qualche giorno **

  1. Studia QUI e QUI come funziona un bus SPI e come viene selezionato il device con cui vuoi parlare

  2. Il bus SPI è un bus molto veloce e ... collegarlo con i "cavetti", come dovrai fare (visto che la Pro Mini NON ha quel connettore che è fatto per la MEGA) può essere fonte di molti problemi! Tienili molto corti e speriamo bene.

Guglielmo

E perché non cominciare semplicemente con 4 comparatori tra Vcc e +Alimentatore?
4 bei led rossi di superamento soglia, a seguire 4 flip-flop per mantenere l'informazione
e poi passi ad arduino, ma intanto hai anche una "controprova" HW che nessuno tarocca nulla.
poi non ho capito come farebbe un concorrente a taroccare il suo regolatore, cosa è? la sua manetta di comando?, e cosa ci tiene dentro? un reattore nucelare tascabile, una pila ricaicabile? un supercondensatore?

gpb01:

  1. Studia QUI e QUI come funziona un bus SPI e come viene selezionato il device con cui vuoi parlare

  2. Il bus SPI è un bus molto veloce e ... collegarlo con i "cavetti", come dovrai fare (visto che la Pro Mini NON ha quel connettore che è fatto per la MEGA) può essere fonte di molti problemi! Tienili molto corti e speriamo bene.

Guglielmo

  1. Grazie mille! Per quanto riguarda l'infarinatura, mi ci metto sotto. Invece volevo avere qualche consiglio sul collegamento alla breakout board. Perché ci sono molti pin e non capisco quali usare. Purtroppo ho richiesto il datasheet ma mi hanno mandato quello del controller che hanno tutti e le dimensioni della board.

  2. In che senso problemi sul connettore? Io metterò degli strip femmina su una millefori sulla quale mi collego con dei cavetti da 0.30 mm2. La lunghezza massima dei cavetti sarà sui 50 mm. Potrei usare anche un cavo con i poli twistati e schermati. Io pensavo comunque di mettere i due display e al centro Arduino Pro Micro. E se serve metto due pulsanti, uno per selezionare la pista, l'altro per resettare i valori massimi.

Standardoil:
E perché non cominciare semplicemente con 4 comparatori tra Vcc e +Alimentatore?
4 bei led rossi di superamento soglia, a seguire 4 flip-flop per mantenere l'informazione
e poi passi ad arduino, ma intanto hai anche una "controprova" HW che nessuno tarocca nulla.
poi non ho capito come farebbe un concorrente a taroccare il suo regolatore, cosa è? la sua manetta di comando?, e cosa ci tiene dentro? un reattore nucelare tascabile, una pila ricaicabile? un supercondensatore?

Guarda, per quanto riguarda il come si fa a barare, non lo so (e rabbrividisco pensando che, non essendoci nulla in palio, ci sia qualcuno che lo fa), però ho sentito di pile, ho sentito di induttanze... però non so come si debba fare per far funzionare l'accrocchio. So solo che su una tensione massima di 12 v qualcuno girava con picchi di 13.1-2 v in rettilineo (qualcuno sapendo di queste cose ha fatto un voltmetro di questo tipo in altre piste... potrei copiare il loro progetto ma mi piacerebbe imparare qualcosa e farlo mio, specialmente nella gestione del display ed eventualmente in quella del touchscreen). Oppure la prima parte della gara era normale, la seconda superlativa. Oppure in uscita della curva e nel primo pezzo di rettilineo si è affiancati, poi l'avversario va via in una maniera che non è imputabile ad un rapporto finale diverso o cosa.

Per quanto riguarda l'hardware, può essere un'idea anche la tua, ma siccome ho Arduino, volevo fare tutto tramite lui.

ricki158:
... poi l'avversario va via in una maniera che non è imputabile ad un rapporto finale diverso o cosa.

... quello dipende dal flusso canalizzatore ... :smiley:

Pigliate pigliate in giro :smiley: Non pensavo nemmeno io mi prendesse così.

Allora, per quanto riguarda i collegamenti:

I due display devono avere in comune il "Clock" e il "MOSI" dell'SPI, perché la comunicazione è unidirezionale verso i display. Quello che cambia sono i pin CS, A0 e RESET che devono essere specifici dei due display. Quindi in pratica per pilotarne due mi bastano 2 + 3 + 3 = 8 pin.

Quindi sostanzialmente devo collegare ad Arduino i pin 8 e 9 (SDA e SCK) dei display e i pin 10, 7 e 6 (CS, A0, RESET) di ogni display. Questo a seguito di quello che ho visto fare per la libreria di Adafruit per la gestione del chip ST7735.

Per quanto riguarda il codice, ho trovato qualcosa in internet di già pronto, però volevo fare (di testa mia) una funzione, che però alla fine ricalca perfettamente quella che ho trovato in un sito: in poche parole vado a fare una misurazione con salvataggio in un array.

#define sclk 13               /* clock della comunicazione SPI, in comune */
#define mosi 11               /* comunicazione unidirezionale master -> slave, in comune */
#define cs1 10                /* selezione dello slave 1, primo display */
#define rs1 9                 /* , primo display */
#define rst1 8                /* reset dello slave 1, primo display */
#define cs2 7                 /* selezione dello slave 2, secondo display */
#define rs2 6                 /* , secondo display */
#define rst2 5                /* reset dello slave 2, secondo display */

#include <SPI.h>              /* libreria per comunicazione SPI */
#include <Adafruit_GFX.h>     /* libreria grafica di Adafruit */
#include <Adafruit_ST7735.h>  /* libreria per il chip ST7735 di gestione del display */

Adafruit_ST7735 display1 = Adafruit_ST7735(cs1, rs1, rst1);   /* creazione oggetto display1 per la libreria Adafruit di gestione del chip del display */
Adafruit_ST7735 display2 = Adafruit_ST7735(cs2, rs2, rst2);   /* creazione oggetto display2 per la libreria Adafruit di gestione del chip del display */

#define VREF  5.0             /* calibrazione della tensione di riferimento delle misure */
#define nCanali  4            /* numero dei canali da leggere */
#define nCampioni  128        /* numero dei campionamenti per leggere una media */

/* siccome Arduino legge in entrata al massimo 5 v, devo dividere con un partitore di tensione la Vin. Per fare ciò utilizzo una Ra = 680 k Ohm e una Rb = trimmer 200 k Ohm. */
/* il valore dei seguenti div sarà dato da Vin(max) / 5 . Vin(max) viene calcolata con 5 / (Rb / (Ra + Rb)). Quindi div = (Ra + Rb) / Rb. Ma siccome Ra è fisso, basta inserire il valore di Rb */

int Ra1 = 680000;             /* valore in Ohm di Ra1 */
int Rb1 = 200000;             /* valore in Ohm di Rb1 */
int Ra2 = 680000;             /* valore in Ohm di Ra2 */
int Rb2 = 200000;             /* valore in Ohm di Rb2 */
int Ra3 = 680000;             /* valore in Ohm di Ra3 */
int Rb3 = 200000;             /* valore in Ohm di Rb3 */
int Ra4 = 680000;             /* valore in Ohm di Ra4 */
int Rb4 = 200000;             /* valore in Ohm di Rb4 */

int divisore[4] = {((Ra1 + Rb1) / Rb1), ((Ra2 + Rb2) / Rb2), ((Ra3 + Rb3) / Rb3), ((Ra4 + Rb4) / Rb4)};   /* array di valori fissi dati dalle resistenze di ogni canale */
int misura[4] = {0, 0, 0, 0};                     /* array di valori delle misure digitali sui vari canali */ 
int Vmisura[4] = {0.00, 0.00, 0.00, 0.00};        /* array di valori delle misure delle tensioni sui vari canali in riferimento a VREF */
int Vmax[4] = {0.00, 0.00, 0.00, 0.00};           /* array di valori delle misure delle tensioni massime sui vari canali in riferimento a VREF */
int Vmin[4] = {100.00, 100.00, 100.00, 100.00};   /* array di valori delle misure delle tensioni minime sui vari canali in riferimento a VREF */

byte contCampioni = 0;        /* contatore dei campionamenti  */
byte contGenerale = 0;        /* contatore generale per cambiare di volta in volta la lettura e la scrittura nell'array corrispondente */

void lettura(){
  while (contCampioni < nCampioni) {    /* finché il contatore dei campionamenti è inferiore al numero dei campionamenti voluti */
    for (contGenerale = 0; contGenerale < nCanali; contGenerale++) {    /* varia contGenerale da 0 al numero dei canali */
      misura[contGenerale] += analogRead(A0 + contGenerale);    /* salva nell'array misura i valori dei canali in digitale */
    }
    contCampioni++;           /* aggiungi un "passo" al contatore dei campionamenti */
    delay(0);                 /* tempo nel quale aspetto */
  }
}

void maxmin(){
  for (contGenerale = 0; contGenerale < nCanali; contGenerale++) {   /*  */
    Vmisura[contGenerale] = ((misura[contGenerale]>>7) * VREF) / 1024.0;    /*  */
    if(Vmisura[contGenerale] > Vmax[contGenerale]){                 /*  */
      Vmax[contGenerale] = Vmisura[contGenerale];                   /*  */
    }
    if(Vmisura[contGenerale] < Vmin[contGenerale]){                 /*  */
      Vmin[contGenerale] = Vmisura[contGenerale];                   /*  */
    }         
  }
}

Una delle cose che non capisco è l'uso dei campionamenti. Cioè il ciclo while mi fa continuare fino a che non arrivo al 128° passo. Poi? Che senso ha? (Per inciso la mia funzione è praticamente identica, c'è solo il ciclo while in più). Dopodiché anziché il ciclo while non posso usare un semplice millis() con il quale ciclo tutte le funzioni che mi interessano? Infine dovrò fare una funzione di reset maxmin collegata a due pulsanti, in maniera che uno gestisca l'avanzamento del contatore dell'array e l'altro, quando premuto, azzera quel tale oggetto presente nell'array.

Alcune non chiare cose: come hai calcolato il divisore di tensione? Mi sembra sbagliato.
Tutte le misure intere? Sei sicuro?
Perché tenere traccia del minimo? Sarà zero, per auto ferma o frenata in corto circuito, è inutile da memorizzare
Il riferimento di tensione difficile che sia costante, conviene magari prevedere un riferimento esterno oppure una funzione di taratura, dove fai leggere ad ogni canale la piena tensione delalimentatore e la usi per autotarare i rapporti dei partitori
Invece per rispondere alla tua domanda, Perché 128 letture?
Chi ha scritto aveva idee strane, la somma di 128 letture di un intero potrebbe superare (e probabile lo farà ) la capacità di un intero, mandando a quel paese i calcoli.
Ho letto che in passato hai già fatto qualcosa con gli ingressi analogici, parti da quello che sai tu, non copiare a muzzo

Standardoil:
Alcune non chiare cose: come hai calcolato il divisore di tensione? Mi sembra sbagliato.

Beh, 5 v x 4.34 fanno 21.7 v che sono i volt massimi in entrata.

Tutte le misure intere? Sei sicuro?

No, gli array con i valori con due cifre dopo la virgola no. Solo che non ho grande esperienza di tipi di variabili e sarei andato a cambiarli più avanti.

Perché tenere traccia del minimo? Sarà zero, per auto ferma o frenata in corto circuito, è inutile da memorizzare

Pensavo potesse essere utile in qualche modo.

Il riferimento di tensione difficile che sia costante, conviene magari prevedere un riferimento esterno oppure una funzione di taratura, dove fai leggere ad ogni canale la piena tensione dell'alimentatore e la usi per auto tarare i rapporti dei partitori

Come riferimento prendo i 5 volt massimi del riferimento per i convertitori A/D. C'è un modo per auto tarare questo valore in maniera interna?

Invece per rispondere alla tua domanda, Perché 128 letture?
Chi ha scritto aveva idee strane, la somma di 128 letture di un intero potrebbe superare (e probabile lo farà ) la capacità di un intero, mandando a quel paese i calcoli.

Ah ecco mi sembrava! Quindi non cambia nulla se faccio la funzione come voglio io.

ricki158:
Beh, 5 v x 4.34 fanno 21.7 v che sono i volt massimi in entrata.

non era 12V? ho letto male?

Si, l'alimentatore è a 12 v, ma siccome voglio andare a vedere se ci sono dei picchi massimi sopra i 12 v, devo calcolare il partitore in modo che la mia Vout sia 5 volt e la mia Vin sia, diciamo 15 volt, ma mettiamo almeno 20 volt per sicurezza. Il partitore fatto dalla resistenza da 680 k Ohm e il trimmer da 200 k Ohm fanno in modo che come tensione massima posso avere 21,7 volt, se voglio leggere con Arduino al massimo 5 volt (più di 5 volt lo danneggerei).