Arduino Forum

International => Italiano => Hardware => Topic started by: nocentini on Aug 25, 2018, 04:26 pm

Title: Libreria leggera per utilizzare un display
Post by: nocentini on Aug 25, 2018, 04:26 pm
Buonasera,
Ho un arduino uno che mi deve svolgere dei calcoli molto complessi e deve visualizzarmi i dati su un display.
Al momento dispongo di un display oled da 0.98'' ma quando vado a utilizzarlo arduino fatica ad elaborare e visualizzare i dati.
Se provo a non utilizzare il display e a visualizzare i dati via monitor seriale non si verifica alcun problema, ma dal momento che i dati vengono visualizzati sul display tutto va molto a rilento.
Quale display mi consigliate di utilizzare? Con quale libreria?
grazie in anticipo.
Title: Re: Libreria leggera per utilizzare un display
Post by: steve-cr on Aug 25, 2018, 04:39 pm
Se non hai bisogno della grafica ma solo caratteri va benissimo un 16x2 oppure un 20x4.
E' normale che lo OLED da 0,98 vada a rilento. perché "ragiona" a pixel e non a carattere...
Title: Re: Libreria leggera per utilizzare un display
Post by: uwefed on Aug 25, 2018, 10:40 pm
Una libreria che pilota un OLED deve tenere sia i dati in memoria (RAM) che nella libreria avere la definizione dei caratteri. Non puó essere leggera.

usa come suggerito un display con un controller HD44780 o compatibile.

Ciao Uwe
Title: Re: Libreria leggera per utilizzare un display
Post by: SukkoPera on Aug 26, 2018, 09:11 am
"Molto a rilento" cosa vuol dire? Se vuoi 50 aggiornamenti al secondo allora usare un OLED la vedo dura, ma se 1 al secondo è sufficiente, non vedo problemi.
Title: Re: Libreria leggera per utilizzare un display
Post by: paulus1969 on Aug 26, 2018, 12:22 pm
Oppure, se proprio vuoi usare l'OLED, vedi se trovi display OLED "intelligenti", dotati di un proprio processore, come Nextion o 4DSystems, come questo (https://www.4dsystems.com.au/product/uOLED_128_G2/)
Title: Re: Libreria leggera per utilizzare un display
Post by: Patrick_M on Aug 26, 2018, 12:48 pm
...però decisamente più complicati da gestire :(
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Aug 26, 2018, 01:39 pm
buongiorno,
Si, avevo bisogno di anche qualche animazione grafica e sopratutto mi serve un display con un alto contrasto e nitidezza.
In futuro mi servirà un display molto più grosso nella quale verranno visualizzati molti dati.
Secondo voi ha un senso utilizzare un arduino due? Oppure utilizzare un arduino uno o mega che svolge i calcoli e poi collegato ad un altro arduino che ha il compito di visualizzare i dati?
Title: Re: Libreria leggera per utilizzare un display
Post by: Patrick_M on Aug 26, 2018, 03:28 pm
a questo punto appoggio paulus1969... :D
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Aug 28, 2018, 05:27 pm
qualche informazione su come si utilizzi questo display e come pilotarlo? gli mando il dato via seriale e lui pensa a ogni pixel?
Title: Re: Libreria leggera per utilizzare un display
Post by: gpb01 on Aug 28, 2018, 05:39 pm
qualche informazione su come si utilizzi questo display e come pilotarlo? gli mando il dato via seriale e lui pensa a ogni pixel?
Sono diplay intelligenti, dotati di memoria e di MCU propria.  Tu con un apposito "editor" disegni le varie maschere, i vari campi, bottoni, ecc. ecc. poi comandi questi "oggetti" via seriale.

Sono prodotti piuttosto complessi che richiedono un certo studio per imparare ad usarli bene.

Guglielmo
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Aug 29, 2018, 01:31 pm
okay grazie mille.
Altre opzioni più semplici? Tipo utilizzare un arduino più veloce dell'arduino uno oppure utilizzare un arduino mega per i calcoli e la gestione dei sensori e un arduino uno collegato via seriale con lo scopo di visualizzare?
Title: Re: Libreria leggera per utilizzare un display
Post by: miky_police on Aug 29, 2018, 01:49 pm
si... un pc :D
scusa non ho resistito.
comunque da una UNO ad una MEGA la potenza di calcolo non cambia... cambia il numero di I/O, seriali, flash e sram. ma sempre 16 MHz di clock hanno... che poi il problema non è il calcolo di per sé, ma come si ottimizza il codice...
Title: Re: Libreria leggera per utilizzare un display
Post by: uwefed on Aug 29, 2018, 11:35 pm
Raspberry PI é un PC.
Title: Re: Libreria leggera per utilizzare un display
Post by: SukkoPera on Aug 30, 2018, 10:14 am
Comunque non ha ancora risposto alla mia domanda sopra... Se basta qualche aggiornamento al secondo non vedo che problemi ci siano ad usare un OLED?
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Aug 31, 2018, 01:05 pm
L'unico problema è che uso un codice già fatto e non saprei come fare a fargli leggere i dati meno volte al secondo.
Se vi linko il codice sapreste come aiutarmi?
Title: Re: Libreria leggera per utilizzare un display
Post by: fabpolli on Aug 31, 2018, 02:25 pm
Non è tanto la lettura e elaborazione dei dati che devi limitare ma l'aggiornamento dello schermo al solo minimo indispensabile.
Se mett il codice sicuramente qualcuno potrà darti suggerimenti e aiuto
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Aug 31, 2018, 04:38 pm
Code: [Select]

  read_mpu_6050_data();   
 //Subtract the offset values from the raw gyro values
  gyro_x -= gyro_x_cal;                                               
  gyro_y -= gyro_y_cal;                                               
  gyro_z -= gyro_z_cal;                                               
         
  //Gyro angle calculations . Note 0.0000611 = 1 / (250Hz x 65.5)
  angle_pitch += gyro_x * 0.0000611;                                   //Calculate the traveled pitch angle and add this to the angle_pitch variable
  angle_roll += gyro_y * 0.0000611;                                    //Calculate the traveled roll angle and add this to the angle_roll variable
  //0.000001066 = 0.0000611 * (3.142(PI) / 180degr) The Arduino sin function is in radians
  angle_pitch += angle_roll * sin(gyro_z * 0.000001066);               //If the IMU has yawed transfer the roll angle to the pitch angel
  angle_roll -= angle_pitch * sin(gyro_z * 0.000001066);               //If the IMU has yawed transfer the pitch angle to the roll angel
 
  //Accelerometer angle calculations
  acc_total_vector = sqrt((acc_x*acc_x)+(acc_y*acc_y)+(acc_z*acc_z));  //Calculate the total accelerometer vector
  //57.296 = 1 / (3.142 / 180) The Arduino asin function is in radians
  angle_pitch_acc = asin((float)acc_y/acc_total_vector)* 57.296;       //Calculate the pitch angle
  angle_roll_acc = asin((float)acc_x/acc_total_vector)* -57.296;       //Calculate the roll angle
 
  angle_pitch_acc -= 0.0;                                              //Accelerometer calibration value for pitch
  angle_roll_acc -= 0.0;                                               //Accelerometer calibration value for roll

  if(set_gyro_angles){                                                 //If the IMU is already started
    angle_pitch = angle_pitch * 0.9996 + angle_pitch_acc * 0.0004;     //Correct the drift of the gyro pitch angle with the accelerometer pitch angle
    angle_roll = angle_roll * 0.9996 + angle_roll_acc * 0.0004;        //Correct the drift of the gyro roll angle with the accelerometer roll angle
  }
  else{                                                                //At first start
    angle_pitch = angle_pitch_acc;                                     //Set the gyro pitch angle equal to the accelerometer pitch angle
    angle_roll = angle_roll_acc;                                       //Set the gyro roll angle equal to the accelerometer roll angle
    set_gyro_angles = true;                                            //Set the IMU started flag
  }
 
  //To dampen the pitch and roll angles a complementary filter is used
  angle_pitch_output = angle_pitch_output * 0.9 + angle_pitch * 0.1;   //Take 90% of the output pitch value and add 10% of the raw pitch value
  angle_roll_output = angle_roll_output * 0.9 + angle_roll * 0.1;      //Take 90% of the output roll value and add 10% of the raw roll value
   Serial.print(" | Angle  = "); Serial.println(angle_pitch_output);

      display.clearDisplay();  // cancello il buffer del display
      display.setFont(&FreeMonoBold9pt7b);  // seleziono il font
      display.setTextSize(1);  // seleziono le dimensioni del testo
      display.setCursor(10, 40);                       // setto il cursore a x=57 e y=27
      display.println(angle_pitch_output);// scrivo nel display l'angolo di incl
      display.display();

 while(micros() - loop_timer < 4000);                                 //Wait until the loop_timer reaches 4000us (250Hz) before starting the next loop
 loop_timer = micros();//Reset the loop timer
}


Title: Re: Libreria leggera per utilizzare un display
Post by: Sulimarco on Aug 31, 2018, 10:47 pm
Non ha senso aggiornare un display ogni 4mS, serve solo a sovraccaricare la cpu.

Usa millis() ed aggiorna il display ogni 100mS, cioe' 10 aggiornamenti al secondo: bastano e avanzano e la cpu e' molto piu' alleggerita.

Ciao
Marco
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Sep 01, 2018, 02:46 am
Scusami ma io e l'istruzione millis() siamo due rette parallele, ho provato a usarlo molte volte ma senza successo..
Potresti farmi un esempio di come poterlo usare nel mio caso? Grazie in anticipo
Title: Re: Libreria leggera per utilizzare un display
Post by: paulus1969 on Sep 01, 2018, 09:30 am
comunque da una UNO ad una MEGA la potenza di calcolo non cambia...

oltretutto, se devi fare cose come:

Code: [Select]

angle_pitch += angle_roll * sin(gyro_z * 0.000001066);
angle_roll -= angle_pitch * sin(gyro_z * 0.000001066); 
acc_total_vector = sqrt((acc_x*acc_x)+(acc_y*acc_y)+(acc_z*acc_z));
...
angle_pitch_acc = asin((float)acc_y/acc_total_vector)* 57.296;
angle_roll_acc = asin((float)acc_x/acc_total_vector)* -57.296;     


io andrei su una Teensy 3.6 piuttosto che su una Mega

Title: Re: Libreria leggera per utilizzare un display
Post by: Patrick_M on Sep 01, 2018, 10:02 am
* 0.000001066

infatti dal reference:
Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point.

quindi quel numero sopra viene troncato in:
0.00000(1)
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Sep 01, 2018, 11:59 am
Di che si tratta, io sono ignorante in materia
Title: Re: Libreria leggera per utilizzare un display
Post by: Patrick_M on Sep 01, 2018, 12:53 pm
come dice il reference il tipo di variabili float (cioè con la virgola) su arduino hanno solo 6-7 decimali di precisione, ma conprendendo nei 6-7 anche le cifre prima della virgola, quindi nel calcolo che riporti nel tuo programma
Code: [Select]

angle_pitch += angle_roll * sin(gyro_z * 0.000001066);
angle_roll -= angle_pitch * sin(gyro_z * 0.000001066); 

gyro_z moltiplicato per 0.000001066 calcolando 6 cifre da come risultato zero, calcolandone 7 da 1 milionesimo. Le altre cifre (066) non vengono considerate
quindi se la precisione di calcolo è determinante per il corretto funzionamento.... devi cambiare piattaforma
inoltre questo tipo di calcoli (tra float) sono impegnativi anche come tempo di esecuzione
Title: Re: Libreria leggera per utilizzare un display
Post by: Sulimarco on Sep 01, 2018, 01:05 pm
Dichiara queste due variabli globali, prima del setup:

unsigned long Millis;
unsigned long PreviousDislayTime;

inizializza PreviousDisplayTime alla fine del setup in questo modo:

PreviousDisplayTime = millis();

quando scrivi sul display fai cosi:

Code: [Select]
  Millis = millis();
  if (Millis - PreviousDisplayTime) >= 100)
  {
      PreviousDisplayTime = Millis;
     
      display.clearDisplay();                          // cancello il buffer del display
      display.setFont(&FreeMonoBold9pt7b);  // seleziono il font
      display.setTextSize(1);                         // seleziono le dimensioni del testo
      display.setCursor(10, 40);                    // setto il cursore a x=57 e y=27
      display.println(angle_pitch_output);      // scrivo nel display l'angolo di incl
      display.display();
  } 



Ciao
Marco
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Sep 01, 2018, 01:17 pm
Okay grazie mille, ho testato il tutto e funziona alla perfezione
Title: Re: Libreria leggera per utilizzare un display
Post by: Sulimarco on Sep 01, 2018, 01:23 pm
Se scrivi solo quello sul display le istruzioni:



Code: [Select]
      display.setFont(&FreeMonoBold9pt7b);  // seleziono il font
      display.setTextSize(1);                         // seleziono le dimensioni del testo
      display.setCursor(10, 40);                    // setto il cursore a x=57 e y=27



puoi scriverle anche solo una volta nel setup.


Ciao
Marco
Title: Re: Libreria leggera per utilizzare un display
Post by: Sulimarco on Sep 01, 2018, 04:10 pm

@Patrik_M


0.000001066  e' rappresentato senza troncamenti dal formato Single precision floating point (https://en.wikipedia.org/wiki/Single-precision_floating-point_format) , quello usato da Arduino, ed in questo post e' spiegato il perche':


Wrong. Digits precision is counting across all(!) digits, starting with the first non-zero digit in the number:

First non-zero digit in number 0003.14159 is the digit "3", so there is one digit before and 5 digits after the decimal point = total of "six significant digits", and that's pretty much all which the 'float' type can provide in decimal number precision.
Decimal digits of precision (https://forum.arduino.cc/index.php?topic=466477.0)


Ciao
Marco
Title: Re: Libreria leggera per utilizzare un display
Post by: gpb01 on Sep 01, 2018, 05:20 pm
>Sulimarco: ... chiarimemto necessario ed estremamente utile infatti, la classica frase che si trova nel "reference" :

Quote
Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.
... è estremamente fuorviante e sembra dire che, tra parte intera e parte decimale, comunque si hanno 6-7 digit.

In realtà questo, come hai specificato, è vero ha partire da primo digit NON zero !

Quindi, anche un numero tipo 0.0000000000123 viene correttamente memorizzato. :)

Bello anche il link (https://www.h-schmidt.net/FloatConverter/IEEE754.html), inserito in quella discussione, che porta alla pagina dove "giocare" con la precisione dei float ;)

Guglielmo
Title: Re: Libreria leggera per utilizzare un display
Post by: gpb01 on Sep 01, 2018, 05:26 pm
io andrei su una Teensy 3.6 piuttosto che su una Mega
Di che si tratta, io sono ignorante in materia
Mah ... senza scomodare le Teensy, probabilmente basterebbe, restando in ambito totalmente Arduino, o una Arduino M0 o una delle varie schede della serie MKRxxxx, tutte basate su MCU ARM a 32 bit.

Guglielmo
Title: Re: Libreria leggera per utilizzare un display
Post by: Patrick_M on Sep 01, 2018, 05:55 pm
>Sulimarco: ... chiarimemto necessario ed estremamente utile infatti, la classica frase che si trova nel "reference" :
... è estremamente fuorviante e sembra dire che, tra parte intera e parte decimale, comunque si hanno 6-7 digit.

In realtà questo, come hai specificato, è vero ha partire da primo digit NON zero !

Quindi, anche un numero tipo 0.0000000000123 viene correttamente memorizzato. :)

Bello anche il link (https://www.h-schmidt.net/FloatConverter/IEEE754.html), inserito in quella discussione, che porta alla pagina dove "giocare" con la precisione dei float ;)

Guglielmo
verificato....
letto
capito
grazie
:)
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Sep 06, 2018, 01:29 pm
Mah ... senza scomodare le Teensy, probabilmente basterebbe, restando in ambito totalmente Arduino, o una Arduino M0 o una delle varie schede della serie MKRxxxx, tutte basate su MCU ARM a 32 bit.

Guglielmo
Averi più velocità di calcolo più precisione? cambia tanto da programmare un Arduino uno da un Arduino da te citato?
Title: Re: Libreria leggera per utilizzare un display
Post by: gpb01 on Sep 06, 2018, 01:44 pm
Averi più velocità di calcolo più precisione?
SI, un Arduino M0 monta una MCU ARM Cortex-M0+ a 32bit che lavora a 48MHz, quindi hai sia un po' più velocità che maggiore precisione nei calcoli (puoi usare i double a 64 bit).

cambia tanto da programmare un Arduino uno da un Arduino da te citato?
Se usi l'IDE di Arduno no, è praticamnete uguale, però ... occhio che NON tutte le librerie per AVR si trovano anche per ARM, quindi devi verificare esattamente quelle che ti servono e vedere se sono state portate per ARM.

Attenzione anche al fatto che i pin lavorano tutti a 3.3V !

Guglielmo
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Sep 07, 2018, 11:55 am
E come posso fare ad adattare tutti i vari sensori e display? mpu 6050, display oled, un gps che non ho ancora deciso quale( se potete citarmene qualcuno mi fareste un favore) e lettore della scheda sd?
Title: Re: Libreria leggera per utilizzare un display
Post by: Patrick_M on Sep 07, 2018, 12:42 pm
se parli di come farli lavorare... solo studiando otterrai la risposta :)

se al contrario intendi come collegarli fisicamente visto che lavorano a tensioni diversa... esistono delle schedine per adattare il livello del segnale da +5 a +3,3 e viceversa
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Sep 07, 2018, 01:10 pm
Che gps mi consigliereste con una frequenza di aggiornamento di 5-10 hz che sia abbastanza preciso e non troppo complesso da utilizzare?
Title: Re: Libreria leggera per utilizzare un display
Post by: gpb01 on Sep 07, 2018, 06:52 pm
Che gps mi consigliereste con una frequenza di aggiornamento di 5-10 hz che sia abbastanza preciso e non troppo complesso da utilizzare?
Questo (https://www.adafruit.com/product/746) è un bel oggettino ;)

Questo (https://drotek.com/shop/en/u-blox/883-ublox-neo-m8-gps-module.html) è ancora meglio :) , ma ... occupa decisamente uno spazio maggiore.

Con entrambi parli via porta seriale.

Guglielmo
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Sep 10, 2018, 01:16 pm
Non ci sarebbe qualcosa di più economico?
Title: Re: Libreria leggera per utilizzare un display
Post by: gpb01 on Sep 10, 2018, 01:23 pm
Non ci sarebbe qualcosa di più economico?

C'e sempre "monnezza" molto più economica, vai su Aliexpress e vedi quanti ne trovi ... non ti lamentare però poi di scarsa sensibilità, problemi, prodotti fake, ecc, ecc ... :D

Guglielmo
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Sep 11, 2018, 11:30 am
Io intendevo un gps con caratteristiche inferiori a quelli da te riportati, non la "monnezza"
Title: Re: Libreria leggera per utilizzare un display
Post by: nocentini on Sep 17, 2018, 03:19 pm
Sto cercando di realizzare un tracker gps e visto che in rete non si trova nullo di chiaro.
Mi servirebbe un gps non troppo costoso con una frequenza di aggiornamento di 5-10hz, potete aiutarmi ?
grazie in anticipo.
Title: Re: Libreria leggera per utilizzare un display
Post by: SukkoPera on Sep 17, 2018, 03:26 pm
Devi metterlo su un aereo?

In ogni caso prendi un semplice u-blox NEO-6, economico ed eccellente. Ci sono anche i cloni cinesi a meno di 3€ che funzionano meglio di quanto si possa immaginare. E... Sì, li ho provati anche su un aereo! :smiley-twist:
Title: Re: Libreria leggera per utilizzare un display
Post by: gpb01 on Sep 17, 2018, 04:28 pm
In ogni caso prendi un semplice u-blox NEO-6, economico ed eccellente. Ci sono anche i cloni cinesi a meno di 3€ che funzionano meglio di quanto si possa immaginare.
... nel 90% dei casi sono dei volgari falsi fatti con scarti di recupero, ovvero "monnezza" ... ti rammento QUESTO (http://forum.arduino.cc/index.php?topic=513818.0) mio thread ;)

Guglielmo