BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   Arduino Uno: chi ci gioca? (https://www.baronerosso.it/forum/circuiti-elettronici/369985-arduino-uno-chi-ci-gioca.html)

aero330 18 maggio 17 19:34

Citazione:

Originalmente inviato da andore (Messaggio 5040408)
C'è un modo per collegare questo display touch resistivo con flat a 40pin ?

Sto cercando qualche adattatore ma non trovo nulla:unsure:

PS. il circuito lo script ottimizzato funziona alla grande e le spiegazioni sono state chiarissime!:lol:

Ottimo!
Ci son tanti display in giro per la rete, proprio uno con 40 pin ??? :lol:

aero330 18 maggio 17 20:07

Citazione:

Originalmente inviato da dex1 (Messaggio 5040342)

Ho letto l'articolo, interessante.
In cosa avresti bisogno nello specifico?

andore 18 maggio 17 21:34

Citazione:

Originalmente inviato da aero330 (Messaggio 5040431)
Ottimo!
Ci son tanti display in giro per la rete, proprio uno con 40 pin ??? :lol:

Eh beh questo ho trovato a casa :icon_rofl

aero330 18 maggio 17 21:39

Citazione:

Originalmente inviato da andore (Messaggio 5040452)
Eh beh questo ho trovato a casa :icon_rofl

Il problema è poter mettere in comunicazione il controller del display con arduino. Forse il tuo ha un protocollo proprietario per cui è inutilizzabile (suppongo)...se c'è qualche sigla prova a digitarla su google per vedere se c'è una compatibilità (al di là di un adattatore)

ElNonino 18 maggio 17 22:04

Alcuni suggerimenti di valenza generale ed indipendenti dal hw o linguaggio di programmazione usato:

- quando è necessario leggere una tensione (anche quella fornita da un sensore) utilizzando un AD converter, sia esso integrato nel microprocessore od anche esterno è bene usare un circuito d'ingresso (con partitore) simile a questo:

http://win.wallytech.it/public/ADCIN.jpg

il condensatore C1 andrebbe posto fisicamente il più vicino possibile al relativo piedino d'ingresso analogico del convertitore.

L'insieme R3-C1 è un primitivo filtro bassa basso che garantisce una tensione stabile ed a bassa impedenza al convertitore AD e filtra eventuali spike.

- per ottenere una buona precisione di lettura è anche consigliato usare come Vref per il convertitore AD (se è disponibile un pin dedicato del micro) quella fornita da uno 'zener' apposito, ottimo per i convertitori AD a 12 bit usarne uno da 4,096V in modo che ogni step del convertitore corrisponda ad 1mV o multipli precisi dati dal partitore d'ingresso. Questo trucco consente anche di usare interi per le conversioni e l'elaborazione dei valori ottenuti anzichè con virgola che nei piccoli micro rallenta molto il tempo d'esecuzione. Naturalmente nel caso di ingresso ratiometrico (potenziometro o sensore con uscita equivalente) va benissimo usare i +5V di alimentazione del micro.

- per ottenere un dato stabile ed attendibile sul display è anche bene filtrare il segnale del ADC utilizzando una semplice media mobile su più campionamenti, se poi la media mobile è eseguita su un multiplo di 2 ci sono trucchetti (che se vi interessa dirò in altro intervento) per renderla estremamente veloce e semplice da implementare.

- non vedo troppo bene per andore la regolazione 'brutale' ON/OFF della ventola, meglio sarebbe renderla proporzionale alla temperatura usando una semplice regolazione PD o PI se non proprio PID, con poche righe di codice eviteresti la continua oscillazione della stessa.

:yeah:

dex1 19 maggio 17 13:06

Citazione:

Originalmente inviato da aero330 (Messaggio 5040440)
Ho letto l'articolo, interessante.
In cosa avresti bisogno nello specifico?

la compilazione e successive modifiche del software.
per esempio:
nel progetto ci sono tre varianti,
una lettura
due letture
quattro letture

pero solo su quella a due letture ce il valore minimo e massimo letti
almeno cosi mi sembra.
vorrei in futuro poterla implementare anche sulle altre.

a livello schematico,collegamenti partitori ecc ecc non ho problemi.

andore 19 maggio 17 15:45

Citazione:

Originalmente inviato da ElNonino (Messaggio 5040458)
Alcuni suggerimenti di valenza generale ed indipendenti dal hw o linguaggio di programmazione usato:

- quando è necessario leggere una tensione (anche quella fornita da un sensore) utilizzando un AD converter, sia esso integrato nel microprocessore od anche esterno è bene usare un circuito d'ingresso (con partitore) simile a questo:

http://win.wallytech.it/public/ADCIN.jpg

il condensatore C1 andrebbe posto fisicamente il più vicino possibile al relativo piedino d'ingresso analogico del convertitore.

L'insieme R3-C1 è un primitivo filtro bassa basso che garantisce una tensione stabile ed a bassa impedenza al convertitore AD e filtra eventuali spike.

- per ottenere una buona precisione di lettura è anche consigliato usare come Vref per il convertitore AD (se è disponibile un pin dedicato del micro) quella fornita da uno 'zener' apposito, ottimo per i convertitori AD a 12 bit usarne uno da 4,096V in modo che ogni step del convertitore corrisponda ad 1mV o multipli precisi dati dal partitore d'ingresso. Questo trucco consente anche di usare interi per le conversioni e l'elaborazione dei valori ottenuti anzichè con virgola che nei piccoli micro rallenta molto il tempo d'esecuzione. Naturalmente nel caso di ingresso ratiometrico (potenziometro o sensore con uscita equivalente) va benissimo usare i +5V di alimentazione del micro.

- per ottenere un dato stabile ed attendibile sul display è anche bene filtrare il segnale del ADC utilizzando una semplice media mobile su più campionamenti, se poi la media mobile è eseguita su un multiplo di 2 ci sono trucchetti (che se vi interessa dirò in altro intervento) per renderla estremamente veloce e semplice da implementare.

- non vedo troppo bene per andore la regolazione 'brutale' ON/OFF della ventola, meglio sarebbe renderla proporzionale alla temperatura usando una semplice regolazione PD o PI se non proprio PID, con poche righe di codice eviteresti la continua oscillazione della stessa.

:yeah:

Infatti, l'unico problema che ho appena notato è questo: dopo qualche secondo che il motore dc è acceso, il display e il led di arduino, oltre al led del modulo di alimentazione esterno, cominciano a sfarfallare:wacko:

Lo script funziona alla grande ma forse c'è qualcosa da modificare nel progetto, per renderlo più stabile.

aero330 19 maggio 17 17:39

Citazione:

Originalmente inviato da andore (Messaggio 5040591)
Infatti, l'unico problema che ho appena notato è questo: dopo qualche secondo che il motore dc è acceso, il display e il led di arduino, oltre al led del modulo di alimentazione esterno, cominciano a sfarfallare:wacko:

Lo script funziona alla grande ma forse c'è qualcosa da modificare nel progetto, per renderlo più stabile.

Il motore a spazzole è una brutta bestia...le commutazioni delle spazzolle sul collettore producono scintille e quindi picchi di tensione (leggi disturbi) che potrebbero dar fastidio a tutto il circuito. Probabilmente la tensione non è ben stabilizzata, io metterei un condensatore elettrolitico da qualche uF sull'alimentazione, ma ElNonino saprebbe indirizzarti meglio.

Per curiosità, questo modulo di alimentazione esterno com'è fatto? riesci a dare più info? tensione in uscita, corrente max fornita....

aero330 19 maggio 17 18:33

2 Allegato/i
Citazione:

Originalmente inviato da dex1 (Messaggio 5040560)
la compilazione e successive modifiche del software.
per esempio:
nel progetto ci sono tre varianti,
una lettura
due letture
quattro letture

pero solo su quella a due letture ce il valore minimo e massimo letti
almeno cosi mi sembra.
vorrei in futuro poterla implementare anche sulle altre.

a livello schematico,collegamenti partitori ecc ecc non ho problemi.

Allora:
1) collega la scheda arduino al PC
2) apri l'IDE di arduino, vai su "Strumenti ->Scheda" e selezioni quella che utilizzi
e poi "Strumenti -> Programmatore -> AVRISP mkII"
3) scarica i due file ZIP che ti ho messo in allegato
4) vai su "Strumenti -> Sketch -> #includi libreria -> Aggiungi libreria da file .ZIP"
e cerca i due file "Adafruit_GFX.ZIP" e "Adafruit_ST7735".
5) chiudi tutto e riapri l'IDE di arduino
6) "File -> Nuovo", cancelli tutto e incolli questo:
Codice:

#define sclk 13
#define mosi 11
#define cs  10
#define dc  9
#define rst  8  //  reset

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

// number of analog samples to take per reading, per channel
#define NSAMP 100 // number of samples to take befor displaying

// voltage divider calibration values
#define Dv1    11.00
#define Dv2    11.001
#define Dv3    11.00
#define Dv4    10.985

// ADC reference voltage / calibration value
#define VREF    5.00

int sum[4] = {0};                // sums of samples taken
unsigned char Scount = 0;  // current sample number
float AVvolts[4] = {0.0};        // calculated voltages
char cnt1 = 0;                  // used in 'for' loops

float V_max[4] = {0.00 ,0.00, 0.00, 0.00};
float V_min[4] = {100.00, 100.00, 100.00, 100.00};

void setup()
{
  tft.initR(INITR_BLACKTAB);  // initialize a ST7735S chip, black tab
  tft.fillScreen(ST7735_BLACK); //  clear screen
  tft.setTextColor(ST7735_WHITE);
  tft.drawRoundRect(2, 20, 120, 110, 5,ST7735_WHITE);
  tft.setTextSize(1);
  tft.setCursor(5,0);
  tft.println("4 channel voltmeter");
  tft.setTextColor(0XFF00);
  tft.setCursor(0,140);
  tft.println(" Caution max voltage        55vdc");
}

       
void loop()
{
    // take a number of analog samples and add them up
    while (Scount < NSAMP) {
        // sample each channel A0 to A3
        for (cnt1 = 0; cnt1 < 4; cnt1++) {
            sum[cnt1] += analogRead(A0 + cnt1);
        }
        Scount++;
        delay(10);
    }
   
    // calculate the voltage for each channel
    for (cnt1 = 0; cnt1 < 4; cnt1++) {
        AVvolts[cnt1] = ((float)sum[cnt1] / (float)NSAMP * VREF) / 1024.0;
        if(AVvolts[cnt1] > V_max[cnt1]){ //get MAX value of sample
          V_max[cnt1] = AVvolts[cnt1];
        }
        if(AVvolts[cnt1] < V_min[cnt1]){ //get MIN value of sample
          V_min[cnt1] = AVvolts[cnt1];
        }       
    }
    // display voltages on TFT LCC Display
 
    // voltage 1 - V1(pin A0) 
    tft.setTextColor(ST7735_YELLOW,ST7735_BLACK); // set color for V1
    tft.setTextSize(2);
    tft.setCursor(15, 40);
    tft.print("V1 ");
    tft.print(AVvolts[0] * Dv1, 1);
    tft.print("V ");
    // voltage 2 - V2(pin A1)
    tft.setTextColor(ST7735_GREEN,ST7735_BLACK);// set color for V2
    tft.setCursor(15, 60);
    tft.print("V2 ");
    tft.print(AVvolts[1] * Dv2, 1);
    tft.print("V ");
    // voltge 3 - V3(pin A2)
    tft.setTextColor(ST7735_CYAN,ST7735_BLACK);// set color for V3
    tft.setCursor(15, 80);
    tft.print("V3 ");
    tft.print(AVvolts[2] * Dv3, 1);
    tft.print("V ");
    // voltage 4 - V4(pin A3)
    tft.setTextColor(ST7735_WHITE,ST7735_BLACK);// set color for V4
    tft.setCursor(15, 100);
    tft.print("V4 ");
    tft.print(AVvolts[3] * Dv4, 2);
    tft.print("V ");
    tft.drawRoundRect(2, 20, 120, 110, 5,ST7735_WHITE);
    // reset count and sums
    Scount = 0;
    for (cnt1 = 0; cnt1 < 4; cnt1++) {
        sum[cnt1] = 0;
    }
}

7)clicca in alto sulla freccia a destra ("carica")
8)se tutto è andato a buon fine non ottieni nessun errore ma solo "caricamento "completato"
9) fatto

Ho preso il codice quello completo con le 4 tensioni lette e aggiunto il calcolo dei valori massimi/minimi per ciascun canale.
L'unica cosa è che non li visualizzi perchè non c'è abbastanza spazio sul display, a meno che tu non mi dica come fare (esempio: visualizzo ogni singolo canale ciclicamente con sotto il max/min relativo, oppure i 4 canali contemporaneamente ma con i valori max/min scrittti a fianco più piccoli ecc ecc)

P.s. non ho il display in questione per cui sto facendo tutto al buio :lol:

ElNonino 19 maggio 17 21:46

@andore: per il problema dei disturbi prova a mettere un condensatore in parallelo al motorino, meglio due: un elettrolitico da 22uF..47uF ed un altro ceramico da 10nF, od anche tre, l'elettrolitico e due da 10nF saldati fra i fili di alimentazione del motore e la carcassa dello stesso.

@aero330: per mediare il valore letto dal convertitore AD è meglio usare una media mobile in potenza di 2 lavorando con interi e poi usare lo shift a destra al posto della divisione, solo alla fine fare un unico casting in float che ci sarebbe anche il modo di evitarlo (forse).

Il casting in float, i calcoli in float ed i prinf sono estremamente lenti sui piccoli micro ad 8 bit come quello di arduino 1.

Un altro suggerimento: è buona norma nel assegnare nomi alle variabili usare un prefisso che identifichi il formato della stessa, ad esempio:

- count è meglio chiamarla u8count od u8_count se si usa un intero ad 8 bit senza segno, etc.

:yeah:


Tutti gli orari sono GMT +2. Adesso sono le 12:37.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002