Paso 3: Software
1 de todos los descargar e instalar Biblioteca de ADAFRUIT Neopixel
Aquí está mi código con algunas descripciones principales (también he añadido el archivo de dibujo). Me didn´t comentar cada paso porque creo que isn´t es necesario.
Subir el bosquejo en su ATTiny85 y divertirse con su nuevo juguete
Ideas para la función de «personalidad» + tal vez ejemplos de código son muy bienvenidas :-)
Si hay cualquier pregunta, sienta libre de preguntar.
Espero que hayas disfrutado de mi corto instructivo y el pequeño viaje en el mundo de ATTINYs.
/* ATTINY85-Rata simple ATTINY85 powered lightfollowing robot. Version 2.0, by Auer Markus */#include <avr/power.h>#include <Adafruit_NeoPixel.h>//motors #define LMOTOR 0 #define RMOTOR 1 //LEDs #define PIXELPIN 2 #define NUMPIXEL 3 //LDRs #define LLDR A2 #define RLDR A3//otherint emo = 0; float calib; boolean emostate; long oldmillis; //define NeopixelsAdafruit_NeoPixel PIXEL = Adafruit_NeoPixel(NUMPIXEL, PIXELPIN, NEO_GRB + NEO_KHZ800);void setup() { //upscale clock else you will encounter some timingproblems (the neopixel lib is written for 16MHz) #if defined (__AVR_ATtiny85__) if (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif //PINMODE pinMode(LMOTOR, OUTPUT); pinMode(RMOTOR, OUTPUT); pinMode(LLDR, INPUT); pinMode(LLDR, INPUT); //initialize pixels PIXEL.begin(); PIXEL.show(); delay(500); //startsequence for(int i=0;ivoid loop() { if(lightfollow() == 1) { left(); } else if(lightfollow() == 2) { right(); } else if(lightfollow() == 0) { forward(); } emotion(); }int lightfollow() { int treshold = 14; int result = 0; float left = 0; float right = 0; int samples = 1; //read LDRs for (int j = 0; j<samples; j++){ left = left + analogRead(LLDR); right = right + (analogRead(RLDR)*calib); }//calculate the result (which direction is the light coming from?) if((left/samples) > ((right/samples)+treshold)) {result = 2;} else if((left/samples) < ((right/samples)-treshold)) {result = 1;} else {result = 0;} return result; } void forward() { //Forward analogWrite(LMOTOR, 230); analogWrite(RMOTOR, 230); PIXEL.setPixelColor(0, PIXEL.Color(0,0,255)); PIXEL.setPixelColor(2, PIXEL.Color(0,0,255)); PIXEL.show(); }void left() { //LEFT analogWrite(LMOTOR, 150); analogWrite(RMOTOR, 255); PIXEL.setPixelColor(0, PIXEL.Color(0,0,255)); //PIXEL.setPixelColor(1, PIXEL.Color(75,0,0)); PIXEL.setPixelColor(2, PIXEL.Color(0,100,0)); PIXEL.show(); } void right() { //RIGHT analogWrite(LMOTOR, 255); analogWrite(RMOTOR, 150); PIXEL.setPixelColor(0, PIXEL.Color(0,100,0)); PIXEL.setPixelColor(2, PIXEL.Color(0,0,255)); PIXEL.show(); }//this is for further experiments, trying to give this one a little personality :-) i´m testing what could be able to do, but no good ideas yet. void emotion() { int emotimer = 2500; int duration = random(250,750); if (millis() - oldmillis > emotimer) { oldmillis = millis(); emo = random(1,4); } if (millis() - oldmillis > duration) { emostate = !emostate; } if (emostate == true) { switch (emo) { case 1: PIXEL.setPixelColor(1, PIXEL.Color((255),(255),(255))); PIXEL.show(); break; case 2: PIXEL.setPixelColor(1, PIXEL.Color((255),(0),(0))); PIXEL.show(); break; case 3: PIXEL.setPixelColor(1, PIXEL.Color((0),(255),(0))); PIXEL.show(); break; default: PIXEL.setPixelColor(1, PIXEL.Color(random(0,255),random(0,255),random(0,255))); PIXEL.show(); break; } } else { PIXEL.setPixelColor(1, PIXEL.Color(25,0,0)); PIXEL.show(); } }