Gör en lätt knappen Wireless (6 / 6 steg)
Steg 6: programmering
Kan du prata med en med ett vanligt terminalprogram, men det är jobbigt på OS-X eftersom XBee inte skickar tillbaka kommandot rätt nya linje och alla svar få rörig tillsammans. Lyckligtvis Tom Igoe har klivit in i en enkel terminal program skrivet i bearbetning (och olika personer har utökat det sedan). Jag använder en modifierad version av Toms ursprungliga program, som jag kom in för hand ur texten i sin bok "Att göra saker Talk."
Här är den aktuella versionen av koden jag använder:
import processing.serial.*;
Seriella myPort;
Sträng portnum;
String outString = "";
InString sträng = "";
int receivedLines = 0;
int bufferedLines = 8;void setup()
{
storlek (400, 300);
PFont myFont = createFont(PFont.list() [3], 14);
textFont(myFont);
println(Serial.list());
portnum = Serial.list() [3].
myPort = ny följetong (denna, portnum, 9600);
}void draw()
{
Background(0);
text ("seriell port:" + portnum, 10, 20);
text ("skrivit:" + outString, 10, 40);
text ("fick:" + inString, 10, 80);
}void keyPressed()
{
Switch (nyckel)
{
fallet "\n":
myPort.write (outString + "\r");
outString = "";
bryta;mål 8:
outString = outString.substring (0, outString.length() -1);
bryta;fall 65535:
bryta;fallet "+":
myPort.write(key);
outString += nyckel;
bryta;standard:
outString += nyckel;
bryta;}
om (outString == "+++")
{
Delay(2000);
outString = "/ n";
}
}void serialEvent(Serial myPort)
{
inString = "Serial händelse nyinkomna!";
Delay(2000);
int inByte = myPort.read();
inString += char(inByte);
om (inByte == '\r')
{
inString += "\n";
receivedLines ++;
om (receivedLines > bufferedLines)
{
deleteFirstLine();
}
}
}void deleteFirstLine()
{
int firstChar = inString.indexOf('\n');
inString = inString.substring(firstChar + 1);
}
Kort stavelse bildar här. Du använder kommandon som börjar med en uppmärksamhet koden (+++, inget vagnretur) att få chip's uppmärksamhet, då en serie kommandon varje efterföljt av "AT". De är alla dokumenterade i manualen för XBee och om du inte vill gå så långt, grundläggande kommandon för att inrätta en linjen passerar läge kopieras på flera ställen på webben-- här, till exempel.
Som jag minns, var det enda jag var tvungen att ställa in på sändaren slutet:
+++ //gets nodens uppmärksamhet, det kommer att svara med "OK"
ATMY2 //this är nodens egen identitet
ATDL3 //this är den låga byten av adressen noden vill prata med
ATID5555 //this är PAN-ID; ID för det nätverket båda enheterna är på
ATD03 //this ställer in stift 20--Digital i/o 0, som en digital ingång
ATICFF / / övervakar alla I/O stift och skickar en överföring när någon av dem ändrar. Detta är ett bitfält, om du inte vill ha dem alla.
ATWR / / Glöm inte detta kommando! Det skriver inställningarna i minnet
ATAC / / detta kommando orsakar noden för att börja använda de nya inställningarna (och nära kommando-läge).
Du kan också tvinga prov mellanrum med hjälp av det och IR-kommandon, samt--genom att använda den rätta PIN-kod--har nod sömnen när det finns ingen ingång närvarande.
Min recieiver behövs för att de ömsesidiga ID: n och ställas in för pin utdata:
+++
ATRE / / återställa fabriksinställda - låt oss vara säkra här!
ATMY3
ATDL2
ATID5555
ATD05 / / nu stift 20 är sätta till ändra tillstånd beroende på data som tas emot från sändaren
ATWR
ATAC
Som ni kanske har märkt, finns det inget som tvingar överföring för att endast vara enkelriktad. Noderna kommunicerar gärna bidirectionally med de seriella linjerna (som inte har påverkats av denna linjen passerar läge, låt mig Obs!) och de kommer gärna upprepa I/O linjer i båda riktningarna.
Jag rekommenderar starkt att få XBee noderna talar på skärbräda innan du börjar skruva din knapp tillbaka tillsammans.
Åh; och den andra änden? Upptäcka ett "drog låg" är lika enkelt som att köra en tråd från lämplig i/o pin på XBee till en öppen I/O stift på Arduino och skrift;
CONST int xbeePin = 8;
CONST int ledPin = 13.void setup()
{
pinMode (xbeePin, ingång);
pinMode (ledPin, produktionen);
}void loop()
{
om (digitalRead(xbeePin) == låg)
{
digitalWrite (ledPin, hög);
}
annat
{
digitalWrite (ledPin, låg);
}
}
(Ovanstående kod ska fungera men jag skrev det med ögat här i Instructable. Jag har fått mycket brukade ha den Arduino- eller bearbetning - IDE checken min syntax för mig!)
Första gången jag satte min lätt knappen till är att ansluta mottagaren XBee till en Arduino som jag redan hade satt upp till spottar ut en MIDI-not meddelande när det såg rätt utlösa signalen. Vi använde nästan det som spelet Visa-typ summern för den musikaliska "Lucky Duck." Lite senare jag ansluten MIDI-kabel till vår belysning konsolen och kunde köra lätta signaler från utanför ljus montern på en show där tech var short-handed.
Fruktansvärda röran i den andra bilden är jag med knappen för att ändra program på BlinkM jag ändra (aka anslutit den till min Adafruit ISP och skrev nya program inom Arduino IDE). Det senare kan vara lite slöseri av en $20 radio, men det visar flexibiliteten i en fristående trådlös knapp.