Go Down

Topic: Spiegazione programma Led Cube 4x4x4 (Read 1 time) previous topic - next topic

Caio_ardu

Jun 08, 2014, 01:16 pm Last Edit: Jun 08, 2014, 05:06 pm by leo72 Reason: 1
Salve a tutti! Sono nuovo nel mondo Arduino poiché ho iniziato ad usarlo dopo che mi è stato consigliato di adoperarlo per un progetto di maturità alle scuole superiori. Proprio per l'esame ho deciso di presentare un cubo led, creato seguendo una guida di instructables. Il problema che mi trovo ad affrontare è che non essendo molto pratico con la programmazione di Arduino non riesco a capire il software che viene usato nel progetto. Qualcuno potrebbe gentilmente spiegarlo istruzione per istruzione con delle note a fianco? Ringrazio tutti in anticipo

Il programma è il seguente:
Code: [Select]
#include <avr/pgmspace.h>

#define CUBESIZE 4
#define PLANESIZE CUBESIZE*CUBESIZE
#define PLANETIME 3333
#define TIMECONST 20

// LED Pattern Table in PROGMEM - last column is display time in 100ms units
// TODO this could be a lot more compact but not with binary pattern representation
prog_uchar PROGMEM PatternTable[] = {

B0001,B0000,B0000,B0000, B0001,B0000,B0000,B0000, B0001,B0000,B0000,B0000,  B0001,B0000,B0000,B0000,6,
B0001,B0001,B0000,B0000, B0001,B0001,B0000,B0000, B0001,B0001,B0000,B0000,  B0001,B0001,B0000,B0000,6,
B0001,B0001,B0001,B0000, B0001,B0001,B0001,B0000, B0001,B0001,B0001,B0000,  B0001,B0001,B0001,B0000,6,
B0001,B0001,B0001,B0001, B0001,B0001,B0001,B0001, B0001,B0001,B0001,B0001,  B0001,B0001,B0001,B0001,6,
B0001,B0001,B0001,B0011, B0001,B0001,B0001,B0011, B0001,B0001,B0001,B0011,  B0001,B0001,B0001,B0011,6,
B0001,B0001,B0001,B0111, B0001,B0001,B0001,B0111, B0001,B0001,B0001,B0111,  B0001,B0001,B0001,B0111,6,
B0001,B0001,B0001,B1111, B0001,B0001,B0001,B1111, B0001,B0001,B0001,B1111,  B0001,B0001,B0001,B1111,6,

B0001,B0001,B1001,B1111, B0001,B0001,B1001,B1111, B0001,B0001,B1001,B1111,  B0001,B0001,B1001,B1111,6,
B0001,B1001,B1001,B1111, B0001,B1001,B1001,B1111, B0001,B1001,B1001,B1111,  B0001,B1001,B1001,B1111,6,
B1001,B1001,B1001,B1111, B1001,B1001,B1001,B1111, B1001,B1001,B1001,B1111,  B1001,B1001,B1001,B1111,6,
B1101,B1001,B1001,B1111, B1101,B1001,B1001,B1111, B1101,B1001,B1001,B1111,  B1101,B1001,B1001,B1111,6,
B1111,B1001,B1001,B1111, B1111,B1001,B1001,B1111, B1111,B1001,B1001,B1111,  B1111,B1001,B1001,B1111,6,


// this is a dummy element for end of table (duration=0) aka !!!DO NOT TOUCH!!!
B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, 0
};

/*
** Defining pins in array makes it easier to rearrange how cube is wired
** Adjust numbers here until LEDs flash in order - L to R, T to B
** Note that analog inputs 0-5 are also digital outputs 14-19!
** Pin DigitalOut0 (serial RX) and AnalogIn5 are left open for future apps
*/

int LEDPin[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
int PlanePin[] = {16, 17, 18, 19};

void setup()
{
int pin; // loop counter
// set up LED pins as output (active HIGH)
for (pin=0; pin<PLANESIZE; pin++) {
pinMode( LEDPin[pin], OUTPUT );
}
// set up plane pins as outputs (active LOW)
for (pin=0; pin<CUBESIZE; pin++) {
pinMode( PlanePin[pin], OUTPUT );
}
}


void loop()
{

byte PatternBuf[PLANESIZE];
int PatternIdx;
byte DisplayTime;
unsigned long EndTime;
int plane;
int patbufidx;
int ledrow;
int ledcol;
int ledpin;


PatternIdx = 0;

do {

memcpy_P( PatternBuf, PatternTable+PatternIdx, PLANESIZE );
PatternIdx += PLANESIZE;

DisplayTime = pgm_read_byte_near( PatternTable + PatternIdx++ );

EndTime = millis() + ((unsigned long) DisplayTime) * TIMECONST;


while ( millis() < EndTime ) {
patbufidx = 0;

for (plane=0; plane<CUBESIZE; plane++) {

if (plane==0) {
digitalWrite( PlanePin[CUBESIZE-1], HIGH );
} else {
digitalWrite( PlanePin[plane-1], HIGH );
}


ledpin = 0;
for (ledrow=0; ledrow<CUBESIZE; ledrow++) {
for (ledcol=0; ledcol<CUBESIZE; ledcol++) {
digitalWrite( LEDPin[ledpin++], PatternBuf[patbufidx] & (1 << ledcol) );
}
patbufidx++;
}


digitalWrite( PlanePin[plane], LOW );

delayMicroseconds( PLANETIME );
}
}
} while (DisplayTime > 0); // read patterns until time=0 which signals end
}


Il link al progetto di instructables:
http://www.instructables.com/id/4X4X4-LED-Cube-w-Arduino-Uno/?ALLSTEPS

nid69ita

Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0
e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0
- qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0
- qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

Il codice deve essere racchiuso nei tag code, vedi sezione 7 del regolamento, spiega bene come fare, altrimenti parte del codice non è ben visibile o potrebbe mancare.
my name is IGOR, not AIGOR

Go Up