ATTiny-RAT, ATTINY powered mini lightfollower (3 / 3 steg)
Steg 3: programvara
1. Ladda ner och installera ADAFRUIT Neopixel bibliotek
Här är min kod med några stora beskrivningar (jag har också lagt filen skiss). Jag didn´t kommentera varje steg eftersom jag tror det isn´t nödvändiga.
Ladda upp skissen på din ATTiny85 och ha kul med din nya leksak
Idéer för "personlighet" funktion + kanske kodexempel är mycket välkomna :-)
Om det finns några frågor, Välkommen att ställa.
Jag hoppas du gillade min korta instructable och lilla resan in i världen av ATTINYs.
/ * ATTINY85-råtta
en enkel ATTINY85 drivs lightfollowing robot.
Version 2.0 av Auer Markus
*/
#include < avr/power.h >
#include < Adafruit_NeoPixel.h >
motorer
#define LMOTOR 0
#define RMOTOR 1
Lysdioder
#define PIXELPIN 2
#define NUMPIXEL 3
LDRs
#define LLDR A2
#define RLDR A3
andra
int emo = 0;
float calib;
booleska emostate;
lång oldmillis;
definiera Neopixels
Adafruit_NeoPixel PIXEL = Adafruit_NeoPixel (NUMPIXEL, PIXELPIN, NEO_GRB + NEO_KHZ800);
void setup()
{
exklusiva klocka annat du kommer att stöta på några timingproblems (neopixel lib är skriven för 16MHz)
#if definieras (__AVR_ATtiny85__)
om (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
PINMODE
pinMode (LMOTOR, OUTPUT);
pinMode (RMOTOR, OUTPUT);
pinMode (LLDR, indata);
pinMode (LLDR, indata);
initiera pixlar
PIXEL.begin();
PIXEL.show();
Delay(500);
startsequence
för (int jag = 0; jag
void loop()
{
IF(lightfollow() == 1) {left();}
annat if(lightfollow() == 2) {right();}
annat if(lightfollow() == 0) {forward();}
Emotion();
}
int lightfollow() {
int tröskelvärde = 14.
int resultatet = 0;
flyttal vänster = 0;
float höger = 0;
int prover = 1;
Läs LDRs
för (int j = 0; j < prover; j ++) {
vänster = vänster + analogRead(LLDR);
höger = höger + (analogRead(RLDR)*calib);
}
beräkna resultatet (vilken riktning är ljuset som kommer från?)
IF((Left/Samples) > ((right/samples) + tröskelvärde)) {resultatet = 2;}
annat if((left/samples) < ((right/samples)-tröskelvärde)) {resultatet = 1;}
annat {resultatet = 0;}
returnera resultat;
}
void forward() {
Framåt
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() {
VÄNSTER
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() {
HÖGER
analogWrite (LMOTOR, 255);
analogWrite (RMOTOR, 150);
PIXEL.setPixelColor (0, PIXEL. Color(0,100,0));
PIXEL.setPixelColor (2, PIXEL. Color(0,0,255));
PIXEL.show();
}
Detta är för ytterligare experiment, att försöka ge detta en en liten personlighet :-) i´m testning vad skulle kunna göra, men inga bra idéer ännu.
void emotion() {
int emotimer = 2500;
int längd = random(250,750);
om (millis() - oldmillis > emotimer) {
oldmillis = millis();
emo = random(1,4);
}
om (millis() - oldmillis > varaktighet) {
emostate =! emostate;
}
om (emostate == true) {
Växla (emo) {
fall 1:
PIXEL.setPixelColor (1, PIXEL. Color((255),(255),(255)));
PIXEL.show();
bryta;
fall 2:
PIXEL.setPixelColor (1, PIXEL. Color((255),(0),(0)));
PIXEL.show();
bryta;
fall 3:
PIXEL.setPixelColor (1, PIXEL. Color((0),(255),(0)));
PIXEL.show();
bryta;
standard:
PIXEL.setPixelColor (1, PIXEL. Color(Random(0,255),Random(0,255),Random(0,255)));
PIXEL.show();
bryta;
}
}
annat {
PIXEL.setPixelColor (1, PIXEL. Color(25,0,0));
PIXEL.show();
}
}