Killer godis Robot 3000 (1 / 3 steg)
Steg 1: Att göra huvudet
Jag började med att göra huvudet, jag mätte och klipp ut ögat slots (för MAX7219s) och munnen (som är faktiskt där jag tittade ut huvudet). Jag använde varmt lim för att fästa en keps (med brädden bort) i mitten av toppen så att jag kunde bära huvudet.
Jag programmerade ljud-aktiverat lysdioderna för 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() {
Läs värdet från sensorn:
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
om (sensorValue < 100) {//The "tystnad" sensor värdet är 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); Röda lysdioder bo 2 sekunder
}
annat
{
digitalWrite(LED_1,LOW);
digitalWrite(LED_2,LOW);
digitalWrite(LED_3,LOW);
digitalWrite(LED_4,LOW);
digitalWrite(LED_5,LOW);
digitalWrite(LED_6,LOW);
}
}
Då jag programmerade ögonen för mbed::
#include "mbed.h"
#include
#include / * printf, scanf, sätter, NULL * /
#include / * srand, rand * /
#include / * tid * /
med hjälp av std::string;
P5: buller, p7: CLK, p8: belastning/CS
SPI max72_spi (SPI_MOSI, NC, SPI_SCK);
DigitalOut load(D5);
Seriell pc (SERIAL_TX, SERIAL_RX);
InterruptIn mybutton(USER_BUTTON);
int maxInUse = 2; ändra denna variabel om du vill ange hur många MAX7219 du kommer att använda
int lastMode = -1;
int currMode = 0;
definiera max7219 register
#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 låg 0
#define hög 1
#define MHZ 1000000
void maxSingle (int reg, int col)
{
Ladda = låg; börja
max72_spi.write(REG); Ange register
max72_spi.write(Col); lägga data
ladda = hög; se till att data laddas (på stigande kanten av belastning/CS)
}
void maxAll (int reg, int col)
{
initiera alla MAX7219 i systemet
Ladda = låg; börja
för (int c = 1, c < = maxInUse; c ++) {
max72_spi.write(REG); Ange register
max72_spi.write(Col); lägga data
}
ladda = hög;
}
void maxOne (int maxNr, int reg, int col)
{
int c = 0;
Ladda = låg;
för (c = maxInUse; c > maxNr; c--) {
max72_spi.write(0); No-op
max72_spi.write(0); No-op
}
max72_spi.write(REG); Ange register
max72_spi.write(Col); lägga data
för (c = maxNr-1; c > = 1; c--) {
max72_spi.write(0); No-op
max72_spi.write(0); No-op
}
ladda = hög;
}
Ogiltiga inställningar)
{
inledande av de max 7219
SPI setup: 8 bitar, läge 0
max72_spi.format (8, 0);
Going av databladet, är min clk 100ns så teoretiskt 10MHz bör fungera...
max72_spi.Frequency(10*MHz);
maxAll (max7219_reg_scanLimit, 0x07);
maxAll (max7219_reg_decodeMode, 0x00); med en led-matris (inte siffror)
maxAll (max7219_reg_shutdown, 0x01); inte i Avslutningsläge
maxAll (max7219_reg_displayTest, 0x00); ingen display test
för (int e = 1; e < = 8; e ++) {/ / tömma register, inaktivera alla lysdioder
maxAll(e,0);
}
maxAll (max7219_reg_intensity, 0x0f & 0x0f); den första 0x0f är det värde som du kan ställa in
utbud: 0x00 till 0x0f
}
int getBitValue (int bitar)
{
PC.printf ("bit = %d\n\r", lite);
Switch(bit)
{
fall 0: returnera 1;
fall 1: returnera 2.
fall 2: returnera 4.
fall 3: returnera 8.
fall 4: returnera 16.
fall 5: returnera 32.
mål 6: returnera 64;
fall 7: returnera 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 ser = 10;
int lookMode = 0;
int main)
{
srand (time(NULL));
(setup);
OpenEyes();
While(true)
{
IF(looky > Looking)
{
looky = 0;
Switch(lookMode)
{
fall 0:
currMode = 1;
bryta;
fall 1:
currMode = 0;
bryta;
fall 2:
currMode = 1;
bryta;
fall 3:
currMode = 2;
bryta;
fall 4:
currMode = 1;
bryta;
fall 5:
currMode = 0;
bryta;
fall 6:
currMode = 1;
bryta;
fall 7:
currMode = 3;
bryta;
mål 8: / /.
currMode = 1;
bryta;
mål 9:
currMode = 0;
bryta;
}
lookMode ++;
om (lookMode > 9) lookMode = 0;
om (lastMode! = currMode)
{
lastMode = currMode;
Switch(currMode)
{
fall 0: / / blink
Blink();
wait(.25F);
OpenEyes();
bryta;
fall 1: / / se framåt
LookAhead();
bryta;
fall 2:
LookLeft();
bryta;
fall 3:
LookRight();
bryta;
}
}
}
annat
looky ++;
wait(.25F);
}
}