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) {}
}