Visualizzazione post con etichetta spdf5408. Mostra tutti i post
Visualizzazione post con etichetta spdf5408. Mostra tutti i post

martedì 17 dicembre 2013

Mandelbrot a colori su Arduino

In questo post viene mostrata  la creazione di un insieme di Mandelbrot su Arduino con un display LCD a colori da 320x240 pixel
La scheda impiegata e' stata una Arduino UNO


Il codice per la generazione dell'insieme e' riportata al termine del post. Di seguito invece il video in tempo reale. Considerando che questo schermo ha piu' o meno le dimensioni della schermata grafica di un Commodore 64 (anche se con un numero di colori maggiori) fa abbastanza pensare come un Commodore 64 agli inizi degli anni 90 impiegasse oltre 1 ora per lo stesso compito che una Arduino esegue in meno di tre minuti





----------------------------------------------------------------------
#define LCD_CS A3    
#define LCD_CD A2    
#define LCD_WR A1   
#define LCD_RD A0    
#define LCD_RESET A4

#define C0           0x00FF
#define C1           0x0F00
#define C2           0xF800
#define C3           0xF880
#define C4           0x8008
#define C5           0x8800
#define C6           0xFF00
#define C7           0xFFFF

#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240

float re_min = -2.0;
float im_min = -1.2;
float re_max = 1.0;
float im_max = 1.2;
int iterazioni = 124;
float a,b;
float x,y,x_new,y_new;
int test;
int k,j,i;

#include "TFTLCD.h"
TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

void setup(void) {

  tft.reset();
  tft.initDisplay();
  tft.fillScreen(0x0000);

  //---------------------------------
  float re_factor = (re_max-re_min);
  float im_factor = (im_max-im_min);
  for (i=0;i<SCREEN_HEIGHT;i++)
     {
     for (j=0;j<SCREEN_WIDTH;j++)
      {
      a = re_min+(j*re_factor/SCREEN_WIDTH); 
      b = im_min+(i*im_factor/SCREEN_HEIGHT);
      x = 0;
      y = 0;
      test = 0;
      for (k=0;k<iterazioni;k++)
       {
       x_new = (x*x)-(y*y)+a;
       y_new = (2*x*y)+b;
       if (((x_new*x_new)+(y_new*y_new))>4)
        {
        test = k;
        switch (k%8)
          {
            case 0 : tft.drawPixel(i,j,C0); break;     
            case 1 : tft.drawPixel(i,j,C1); break;      
            case 2 : tft.drawPixel(i,j,C2); break;      
            case 3 : tft.drawPixel(i,j,C3); break;      
            case 4 : tft.drawPixel(i,j,C4); break;      
            case 5 : tft.drawPixel(i,j,C5); break;      
            case 6 : tft.drawPixel(i,j,C6); break;      
            case 7 : tft.drawPixel(i,j,C7); break; 
         }     
        break;
        }
       x = x_new;
       y = y_new;
       }
      }
     }
}

void loop(void) {
  while (1) {}
}



LCD Shield SPFD5408 su Arduino

Mi sono comprato questo shield Arduino su un e-commerce cinese allettato dal prezzo modesto (circa una decina di euro spedizione compresa) e dato l'accoppiamento con un touch screen

Vista da sopra - Si osservi il pessimo montaggio del touch screen

Vista inferiore

Quando mi e' arrivato mi sono reso conto subito di un paio di cose:
1) lo shield e' montato in modo pessimo (il touch screen e' montato storto rispetto all'LCD)
2) tutti i piedini dell'Arduino sono coperti per cui in sostanza si puo' usare il solo shield

Ma i problemi non erano questi, il difficile e' stato farlo funzionare.

Sul sito del venditore viene dichiarato che ha un controller spfd5408 che non risulta supportato dalla libreria UTFT (quella standard per gli shield originali Arduino)

Frugando su Internet ho finalmente trovato questo link ad una libreria che permette di utilizzare questo dispositivo.

Il display (diciamolo francamente) fa abbastanza schifo un quanto se si accende tutto con il medesimo colore di fondo mostra delle bande di colore leggermente differenti.
Comunque vale la solita regola, spendi poco ottiene poco

Ecco il video della demo grafica (compresa negli esempi della libreria)



PS: la libreria non permette l'utilizzo dell' SD Reader

Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...