Paso 6: ¿Qué hago ahora?
Ahora tenemos una secuencia programada de Marcos y transforma el código a un formato que vamos a ejecutar dentro de nuestro sketch de Arduino. '¿Qué sketch' pides? El sketch de Arduino que usa para conducir mi cubo se ve así:/*
Basado en ledcube.c de hacer: podcast de fin de semana de 07 de septiembre de 2007
http://blog.Makezine.com/Archive/2007/09/make_a_pocket_led_cube_we.html
Animación personalizada programada por Mark Boszko, http://stationinthemetro.com
*/
#include < avr/pgmspace.h > / / permite el uso de PROGMEM para almacenar patrones de flash
#define CUBESIZE 3
#define PLANESIZE CUBESIZE * CUBESIZE
#define PLANETIME 3333 / / tiempo de cada plano se muestra en nosotros -> refresco de 100 Hz
#define TIMECONST 5 / / multiplica DisplayTime para obtener ms - = ¿por qué no 100?
Tabla de patrón de LED en PROGMEM - la última columna es tiempo de visualización en unidades de 100ms
TODO esto podría ser mucho más compacto, pero no con la representación del patrón binario
prog_uchar PROGMEM PatternTable [] = {}
B101, B010, B101, B000, B000, B000, B000, B000, B000, 50,
B000 B000, B000, B000, B010, B000, B000, B000, B000, 50,
B000 B000, B000, B000, B000, B000, B101, B010, B101, 50,
B000 B000, B000, B000, B010, B000, B000, B000, B000, 50,
}
/*
** Definición de pines de matriz facilita cambiar cómo se cablea el cubo
** Ajustar números aquí hasta que parpadean en orden - L a R, T a B
** Nota que entradas analógicas 0-5 también son salidas digitales 14-19.
** Pin DigitalOut0 (serial RX) y AnalogIn5 se dejan abierta para futuras aplicaciones
*/
int LEDPin [] = {16, 3, 1, 15, 4, 6, 14, 5, 7};
int LEDPin [] = {2, 3, 4, 5, 6, 7, 8, 9, 10};
int [] PlanePin = {19, 18, 17};
int PlanePin [] = {12, 13, 11};
inicialización de
void setup()
{
int pin; contador de bucle
configura pines del LED como salida (activo alto)
para (pin = 0; pin < PLANESIZE; pin ++) {}
pinMode (LEDPin [pin], salida);
}
configurar pines plano como salidas (activo bajo)
para (pin = 0; pin < CUBESIZE; pin ++) {}
pinMode (PlanePin [pin], salida);
}
}
muestra patrón en mesa hasta DisplayTime es cero (y repetir)
void loop()
{
declarar variables
byte PatternBuf [PLANESIZE]; guarda el patrón actual de PatternTable
int PatternIdx;
byte DisplayTime; tiempo * 100ms para mostrar configuración
EndTime largo sin firmar;
plano de int. contador de bucle para actualización de cubo
int patbufidx; índices que byte del buffer patrón
int ledrow; cuenta con LEDs en bucle de actualización
int ledcol; cuenta con LEDs en bucle de actualización
int ledpin; cuenta con LEDs en bucle de actualización
Inicializar PatternIdx al principio de la tabla patrón
PatternIdx = 0;
lazo sobre las entradas de tabla de patrón - mientras DisplayTime > 0
{}
Lee el patrón de PROGMEM y guardar en array
memcpy_P (PatternBuf, PatternTable + PatternIdx, PLANESIZE);
PatternIdx += PLANESIZE;
leer DisplayTime del índice PROGMEM y el incremento de
DisplayTime = pgm_read_byte_near (PatternTable + PatternIdx ++);
calcular EndTime del actual tiempo (ms) y DisplayTime
EndTime = millis() + ((unsigned long) DisplayTime) * TIMECONST;
bucle mientras DisplayTime > tiempo 0 y actual < EndTime
mientras que (millis() < EndTime) {}
patbufidx = 0; reiniciar contador de índice al principio del buffer
lazo sobre planos
para (plano = 0; plano < CUBESIZE; plano ++) {}
Apague el plano anterior
Si (plano == 0) {}
digitalWrite (PlanePin [CUBESIZE-1], LOW);
} else {}
digitalWrite (PlanePin [plano-1], LOW);
}
datos actuales de patrón plano de carga en puertos
ledPin = 0;
para (ledrow = 0; ledrow < CUBESIZE; ledrow ++) {}
para (ledcol = 0; ledcol < CUBESIZE; ledcol ++) {}
digitalWrite (LEDPin [ledpin ++], PatternBuf [patbufidx] & (1 << ledcol));
}
patbufidx ++;
}
encender el avión actual
digitalWrite (PlanePin [avión], alto);
retrasar PLANETIME nos
delayMicroseconds (PLANETIME);
} / / avión
} / / mientras < EndTime
} mientras (DisplayTime > 0); leer patrones hasta el momento = 0 que indica el final
}