Stap 1: Het maken van het hoofd
Ik begon door het hoofd, ik gemeten en knip de oog "slots" (voor de MAX7219s) en de mond (dat is eigenlijk waar ik keek uit het hoofd). Ik gebruikte warme lijm om te hechten een baseballcap (met de rand verwijderd) in het midden van de bovenkant zodat ik kon het hoofd dragen.
Ik de LEDs muziekgestuurde geprogrammeerd voor de Arduino Nano:
int sensorPin = 4;int sensorValue = 0; int LED_1 = 2; int LED_2 = 3; int LED_3 = 4; int LED_4 = 5; int LED_5 = 6; int LED_6 = 7;
void setup() { pinMode(LED_1, OUTPUT); pinMode(LED_2, OUTPUT); pinMode(LED_3, OUTPUT); pinMode(LED_4, OUTPUT); pinMode(LED_5, OUTPUT); pinMode(LED_6, OUTPUT); Serial.begin(9600); }
void loop() { // read the value from the sensor: sensorValue = analogRead(sensorPin); Serial.println(sensorValue); if (sensorValue<100){ //The 'silence' sensor value is 509-511 digitalWrite(LED_1,HIGH); digitalWrite(LED_2,HIGH); digitalWrite(LED_3,HIGH); digitalWrite(LED_4,HIGH); digitalWrite(LED_5,HIGH); digitalWrite(LED_6,HIGH); delay(5); // The red LEDs stay on for 2 seconds } else { digitalWrite(LED_1,LOW); digitalWrite(LED_2,LOW); digitalWrite(LED_3,LOW); digitalWrite(LED_4,LOW); digitalWrite(LED_5,LOW); digitalWrite(LED_6,LOW); } }
Toen ik de ogen voor de mbed geprogrammeerd::
#include "mbed.h"#include #include /* printf, scanf, puts, NULL */ #include /* srand, rand */ #include /* time */ using std::string; // p5: DIN, p7: CLK, p8: LOAD/CS SPI max72_spi(SPI_MOSI, NC, SPI_SCK); DigitalOut load(D5); Serial pc(SERIAL_TX, SERIAL_RX); InterruptIn mybutton(USER_BUTTON); int maxInUse = 2; //change this variable to set how many MAX7219's you'll use
int lastMode = -1; int currMode = 0;
// define max7219 registers #define max7219_reg_noop 0x00 #define max7219_reg_digit0 0x01 #define max7219_reg_digit1 0x02 #define max7219_reg_digit2 0x03 #define max7219_reg_digit3 0x04 #define max7219_reg_digit4 0x05 #define max7219_reg_digit5 0x06 #define max7219_reg_digit6 0x07 #define max7219_reg_digit7 0x08 #define max7219_reg_decodeMode 0x09 #define max7219_reg_intensity 0x0a #define max7219_reg_scanLimit 0x0b #define max7219_reg_shutdown 0x0c #define max7219_reg_displayTest 0x0f
#define LOW 0 #define HIGH 1 #define MHZ 1000000
void maxSingle( int reg, int col) { load = LOW; // begin max72_spi.write(reg); // specify register max72_spi.write(col); // put data load = HIGH; // make sure data is loaded (on rising edge of LOAD/CS) }
void maxAll (int reg, int col) { // initialize all MAX7219's in the system load = LOW; // begin for ( int c=1; c<= maxInUse; c++) { max72_spi.write(reg); // specify register max72_spi.write(col); // put data } load = HIGH; }
void maxOne(int maxNr, int reg, int col) { int c = 0; load = LOW;
for ( c = maxInUse; c > maxNr; c--) { max72_spi.write(0); // no-op max72_spi.write(0); // no-op }
max72_spi.write(reg); // specify register max72_spi.write(col); // put data
for ( c=maxNr-1; c >= 1; c--) { max72_spi.write(0); // no-op max72_spi.write(0); // no-op } load = HIGH; }
void setup () { // initiation of the max 7219 // SPI setup: 8 bits, mode 0 max72_spi.format(8, 0); // going by the datasheet, min clk is 100ns so theoretically 10MHz should work... // max72_spi.frequency(10*MHZ); maxAll(max7219_reg_scanLimit, 0x07); maxAll(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits) maxAll(max7219_reg_shutdown, 0x01); // not in shutdown mode maxAll(max7219_reg_displayTest, 0x00); // no display test for (int e=1; e<=8; e++) { // empty registers, turn all LEDs off maxAll(e,0); } maxAll(max7219_reg_intensity, 0x0f & 0x0f); // the first 0x0f is the value you can set // range: 0x00 to 0x0f }
int getBitValue(int bit) { pc.printf("bit = %d\n\r", bit); switch(bit) { case 0: return 1; case 1: return 2; case 2: return 4; case 3: return 8; case 4: return 16; case 5: return 32; case 6: return 64; case 7: return 128; } return 0; } void OpenEyes() { maxAll(7,60); maxAll(6,126); maxAll(5,102); maxAll(4,102); maxAll(3,126); maxAll(2,60); } void Blink() { maxAll(3,0); maxAll(4,0); maxAll(5,0); maxAll(6,0); maxOne(1, 7, 0); maxOne(2, 2, 0); } void LookAhead() { maxAll(4,102); maxAll(5,102); } void LookLeft() { maxOne(1,4,78); maxOne(1,5,78); maxOne(2,4,114); maxOne(2,5,114); } void LookRight() { maxOne(2,4,78); maxOne(2,5,78); maxOne(1,4,114); maxOne(1,5,114); } int looky = 0; int looking = 10; int lookMode = 0; int main() { srand (time(NULL)); setup (); OpenEyes();
while(true) { if(looky > looking) { looky = 0; switch(lookMode) { case 0: currMode = 1; break; case 1: currMode = 0; break; case 2: currMode = 1; break; case 3: currMode = 2; break; case 4: currMode = 1; break; case 5: currMode = 0; break; case 6: currMode = 1; break; case 7: currMode = 3; break; case 8: // ahead; currMode = 1; break; case 9: currMode = 0; break; } lookMode++; if(lookMode > 9) lookMode = 0; if(lastMode != currMode) { lastMode = currMode; switch(currMode) { case 0: // blink Blink(); wait(.25f); OpenEyes(); break; case 1: // look ahead LookAhead(); break; case 2: LookLeft(); break; case 3: LookRight(); break; } } } else looky++; wait(.25f); } }