Stap 6: programmeren
U kunt praten met met behulp van een gewone terminal-programma, maar dit is lastig op de OS-X, omdat de XBee niet de juiste nieuwe opdrachtregel terugsturen en alle antwoorden krijgen samen door elkaar gegooid. Gelukkig Tom Igoe heeft stapte met een eenvoudige terminal programma geschreven in Processing (en diverse mensen hebben uitgebreid sinds). Ik ben met behulp van een gewijzigde versie van Tom's oorspronkelijke programma, die ik heb ingevoerd met de hand uit de tekst in zijn boek "Maken dingen praten."
Hier is de huidige versie van de code die ik gebruik:
importeren van processing.serial.*;
Seriële myPort;
String portnum;
String outString = "";
InString koord = "";
int receivedLines = 0;
int bufferedLines = 8;VOID Setup
{
grootte (400, 300);
PFont myFont = createFont(PFont.list() [3], 14);
textFont(myFont);
println(Serial.List());
portnum = Serial.list() [3];
myPort = nieuwe Serial (, portnum, 9600);
}VOID draw()
{
Background(0);
tekst ("seriële poort:" + portnum, 10, 20);
tekst ("getypt:" + outString, 10, 40);
tekst ("ontvangen:" + inString, 10, 80);
}VOID keyPressed()
{
schakelaar (sleutel)
{
Case '\n':
myPort.write (outString + '\r');
outString = "";
breken;
zaak 8:
outString = outString.substring (0, outString.length() -1);
breken;
Case 65535:
breken;
geval '+':
myPort.write(key);
outString += sleutel;
breken;
standaard:
outString += sleutel;
breken;}
Als (outString == "+++")
{
delay(2000);
outString = "/ n";
}
}VOID serialEvent(Serial myPort)
{
inString = "Serial gebeurtenis Recieved!";
delay(2000);
int inByte = myPort.read();
inString += char(inByte);
Als (inByte == '\r')
{
inString += '\n';
receivedLines ++;
Als (receivedLines > bufferedLines)
{
deleteFirstLine();
}
}
}VOID deleteFirstLine()
{
int firstChar = inString.indexOf('\n');
inString = inString.substring(firstChar + 1);
}
Korte formulier hier. U bent met AT-opdrachten, die met een aandacht-code beginnen (+++, geen regelterugloop) te krijgen aandacht van de chip, dan een reeks opdrachten elk suffix door "AT". Ze zijn al gedocumenteerd in de handleiding voor de XBee, en als u niet wilt dat om ver te gaan, de basisopdrachten voor de oprichting van een lijn passeren modus bijvoorbeeld op verschillende plaatsen op het web-- hier worden gekopieerd.
Als ik me goed herinner, waren de enige dingen die ik had om in te stellen op het einde van de zender:
+++ //gets van het knooppunt de aandacht, het zal antwoorden met "OK"
ATMY2 //this is van het knooppunt eigen identiteit
ATDL3 //this is de lage byte van het adres van dat het knooppunt wil met praten
ATID5555 //this is de PAN ID; de ID voor het netwerk dat beide apparaten zijn op
ATD03 //this ingesteld pin 20--digitale i/o 0, als een digitale ingang
ATICFF / / controleert alle de I/O pinnen en stuurt een verzending wanneer om het even welk van hen wijzigt. Dit is een bitfield, als u niet wilt dat ze allemaal.
ATWR / / Vergeet niet deze opdracht! Het schrijft de instellingen in het geheugen
ATAC / / dit commando zorgt ervoor dat het knooppunt dat u wilt beginnen met de nieuwe instellingen (en nauwe opdrachtmodus).
U kunt ook dwingen monster intervallen met behulp van de opdrachten het en IR, evenals--door gebruik te maken van de juiste pin--het knooppunt slaap hebben als er geen invoer aanwezig.
Mijn recieiver nodig om de wederzijdse-id, en worden opgezet voor pin-uitgang:
+++
ZIJN / / reset naar fabrieksinstellingen--laten we veilig hier!
ATMY3
ATDL2
ATID5555
ATD05 / / pin 20 is nu ingesteld om te veranderen staat afhankelijk van de gegevens ontvangen van de zender
ATWR
ATAC
Zoals u wellicht heeft gemerkt, is er niets dat de transmissie dwingt als one-way alleen. Knooppunten zal gelukkig bidirectionally met de seriële lijnen communiceren (die nog niet getroffen door deze lijn passeren modus, laat me nota!) en ze zal gelukkig echo I/O lijnen in beide richtingen ook.
Ik adviseer hoogst om de knooppunten van de XBee praten op het breadboard voordat u start uw knop terug samen schroeven.
Oh; en het andere uiteinde? Detecteren een "getrokken laag" is net zo eenvoudig als het loopt een draad van passende I/O pin op de XBee tot een open I/O pin van een Arduino en schrijven;
Const int xbeePin = 8;
Const int ledPin = 13;VOID Setup
{
pinMode (xbeePin, INPUT);
pinMode (ledPin, OUTPUT);
}void loop
{
Als (digitalRead(xbeePin) == laag)
{
digitalWrite (ledPin, hoge);
}
anders
{
digitalWrite (ledPin, laag);
}
}
(De bovenstaande code zou moeten werken maar ik getypt door oog hier in de Instructable. Ik heb gekregen toe gewend met de Arduino-- of verwerking--IDE-check mijn syntaxis voor mij!)
Het eerste gebruik dat ik mijn Easy Button wil is de ontvanger XBee verbinden met een Arduino die ik al had ingesteld op spugen een MIDI-bericht Opmerking Wanneer het zag de juiste trigger signaal. We gebruikten het bijna als spelshow-type zoemer voor de muzikale "Lucky Duck." Even later ik de MIDI-kabel aangesloten op onze verlichting console en was kundig voor stormloop lichte signalen van buiten de lichte stand op een show waar tech staff short-handed.
De verschrikkelijke puinhoop in de tweede foto is mij met behulp van de knop wijzigen van programma's op de BlinkM ik ben wijzigen (aka aangesloten op mijn ISP Adafruit en schreef nieuwe software binnen de Arduino IDE). De laatste kan een beetje verspilling voor een $20-radio, maar het toont de flexibiliteit van een self-contained draadloze knop.