Arduino Lilypad interaktiva Passion Sensing halsduk (6 / 7 steg)
Steg 6: Arduino skiss
/ * ++ Får - använda en kombination av RGB och IR-lysdioder och en photosensor att imitera publiken-reaktivt (framväxande) beteende här koden går med Fuse fabriken Workshop "Göra en Emergent beteende skulptur med The Arduino" http://thefusefactory.org/2009/09/03/make-an-emergent-behavior-sculpture-with-the-arduino/ den scultpture, eller "får", är en konstnärliga assemblage av en Lilypad Pro kit (Lilypad bas bifogas en Lilipad 5V power unit) med en tri-color LED monteras över 328V MCU Lilypad styrelse. En stor Lilypad Protoboard sitter mellan PSU och Lilypad sig att dirigera makt och hålla motstånd och IR-komponenterna. Illusionen av en quadraped avslutas av 1W och 2W LED lödas till PSU "kropp" och böjd som ben. Koden är beroende av en ihållande variabel kallas "humör" - när det är noll eller nära noll, fåren är "glad". Under noll och fåren är "ensam"; ovanför noll och får känns trångt eller upprörd. Ensamhet representeras av blå, lycka av green och agitation av red. Mellan att uttrycka "humör" (med PWM skuggar RGB LED), den huvudsakliga delen av koden kontrollerar IR pulser från andra får och kan släppa ut sina egna pulser "samtal" till andra får. Genom tweaking interna variabler, kan fåren vara mer eller mindre känsliga för samtal av andra får. Den framväxande beteendet kommer ut när flera fåren är monterade och placeras på ett bord, ropar till varandra. Uppsjö av IR-pulser kan inducera fåren att vara lycklig eller kanske upprörd. Några pulser och fåren uppvisar ensamhet. Sheep.pde - slå en Arduino till en emergent beteende skulptur Copyright (C) 2009, Ethan Dicks detta program är fri programvara: du kan vidaredistribuera det och/eller modifiera det i enlighet med GNU General Public License som offentliggörs av Free Software Foundation, antingen version 3 av licensen, eller (vid ditt alternativ) någon senare version. Detta program är distribuerat med förhoppning att det kommer att vara användbart men helt utan garantier; utan att ens underförstådd garanti om SÄLJBARHET eller lämplighet för ett visst ändamål. Se GNU General Public License för mer detaljer. Du bör ha fått en kopia av GNU General Public License tillsammans med detta program. Om inte, se.--* / / * ++ variabelinitieringen - innan koden, lägga alla användare justerbara parametrar på toppen så de är lätta att justera. --* / / / Definitioner av "humör" värden
#define MOODMAX 80
#define MOODMIN (-1 * MOODMAX)
#define ensam (MOODMIN)
#define glad (0)
#define TRÅNGT (MOODMAX)
#define MSTEPS 5
#define BLEAT_VOLUME 1
Globala definitioner av pin assigments (att förenkla enskilda funktionsanrop) int statusPin = 13. Onboard status-LED är ansluten till digital pin 13int redPin = 11; R kronblad på RGB LED-modul är ansluten till digital pin 11int greenPin = 9; G kronblad på RGB LED-modul är ansluten till digital pin 9int bluePin = 10; B kronblad på RGB LED-modul är ansluten till digital pin 10int sensorPin = 5; IR fototransistor ansluten till digital pin 5int irPin = 6; IR-LED ansluten till digital stift 6 / / börja förväntar sig att vara glad int humör = HAPPY;
Hålla reda på känslan av input pinint ögat = 0;
Och kom ihåg hur "högt" vi är "bräkande" (blinkande vår IR-LED) int bleat = BLEAT_VOLUME;
/ * ++ setup() - Arduino miljö kommer att kalla koden i setup() en gång bara, rätt efter styrelsen återställs. Lägga koden i funktionen att initiera I/O pins och sådant - saker som behöver bara göras en gång under en körning. --* / Annullerasetup)
{
för felsökning
Serial.BEGIN(9600);
Serial.println ("får v0.02");
Mestadels, är våra I/O pins utgångar till lysdioder
pinMode (statusPin, produktionen); anger statusPin vara en utgång
pinMode (redPin, produktionen); anger redPin vara en utgång
pinMode (greenPin, produktionen); anger greenPin vara en utgång
pinMode (bluePin, produktionen); anger bluePin vara en utgång
pinMode (irPin, produktionen); anger irPin vara en utgång
Ett undantag är IR fototransistor
pinMode (sensorPin, ingång); anger sensorPin vara en ingång
Serial.Print ("inställningen IR-" bleat"till");
Serial.println(bleat);
analogWrite (irPin, bleat);
}
/ * ++ loop() - Arduino miljö kommer att kalla koden i denna slinga för evigt. Sätt intressanta saker här som är avsedda att köras oändlighet efter setup() anropas en gång. Den enda vägen ut ur denna slinga är att återställa styrelsen. --* / Annulleraloop() / / kör om och om igen
{
Ställa in våra RGB LED att spegla våra "humör", som förhoppningsvis kommer att förändras från tid till
set_mood(Mood);
Sakta ner hur snabbt vi reagerar på andra 'får'
Delay(100); fördröjning för 1 sekund
sensorPin har en 10K pullup motstånd, så * nr * ljus rapporterar en 1. Vi måste
Invertera den logiska avkänningen av klämma fast om vi vill tänka på ljuset logiskt
så 1-är-/ 0-är-på
Eye = 1 - digitalRead(sensorPin); Ange öga 1 om vi "ser" alla IR ljus
Rapportera våra nuvarande status varje gång genom öglan
Serial.Print ("humör är");
Serial.Print(Mood);
Serial.Print(". Sensorn är ");
Serial.println(Eye);
Om vi ser pulser från en annan "får", öka humör, men inte tidigare MOODMAX
om (ögat) {
eftersom människor inte kan "se" infrarött ljus, använda status-LED som en synlig indikator
digitalWrite (statusPin, hög); ECHO IR-indata detektering på status-LED
humör += MSTEPS * 2;
om (humör > MOODMAX) {
humör = MOODMAX;
}
}
Om vi inte ser någon IR-pulser, minska humör, men inte nedan MOODMIN
annat {
eftersom människor inte kan "se" infrarött ljus, använda status-LED som en synlig indikator
digitalWrite (statusPin, låg); ECHO IR-indata detektering på status-LED
humör-= 1;
om (humör < MOODMIN) {
humör = MOODMIN;
}
}
}
/ * ++ set_mood - konvertera "humör" till ett färgschema humör varierar från några negativt tal till samma värde som ett positivt tal (hittills,-80 / + 80 och -100 / 100 ger rimliga resultat). Proportionellt, kontinuum av humör att färgmappning liknar följande: humör -100 0 100 Lonely -> Happy -> CrowdedR 0 0 0 30 100 G 0 30 100 70 0B 100 70 0 0 0--* / void set_mood (int humör)
{
Börja med varje färg att vara utanför – justera uppåt baserat på "humör"
unsignedchar rodnad = 0;
unsignedchar grönska = 0;
unsignedchar blåhet = 0;
#ifdef DEBUG
Serial.Print ("humör är");
Serial.println(Mood);
#endif
blåhet handlar om humör vara mindre då lycklig
om (humör < HAPPY) {
blåhet = abs(mood);
grönskan = MOODMAX + humör;
}
rodnad är allt om stämningen som mer än gärna
ElseIf (humör > HAPPY) {
rodnad = humör;
grönskan = MOODMAX - humör;
}
grönskan är stämningen runt glad
annat {
grönskan = MOODMAX;
}
Set LED att spegla vårt nuvarande humör
färg (rodnad, grönska, blåhet);
}
/ * ++ färg (r, g, b) - ange tri-färg ledde till den önskade färg värde använder analogWrite (pin, värde) för att ange PWM-värdet för varje enskild LED färg Tri-color LED är en common-anod enhet, så att göra ljus, vi grunden önskad PIN-koden. Om du vill invertera PWM vågformen, subtrahera vi våra önskad intensitet från 255, så att, till exempel, om vi vill röd, logiskt, vi passerar runt noll, men värdet PWM till 255 så att stiftet är drivande hög 100% av tiden. För att få röda till den högsta intensiteten, vi passerar runt ett logiskt värde 255, men som PWM-värde till 0, dra det klämmer fast låg 100% av tiden.--* / annullera färg (unsignedchar röda, unsignedchar grön, unsignedchar blå) / / färg genererar funktion
{
#ifdef DEBUG
Serial.Print("Color(");
Serial.Print(Red,hex);
Serial.Print(Blue,hex);
Serial.Print(Green,hex);
Serial.println(")");
#endif
Invertera avkänningen av PWM-värde när du ringer analogWrite() för varje färg
analogWrite (redPin, 255-röd);
analogWrite (bluePin, 255-blå);
analogWrite (greenPin, 255-grön);
}