Étape 6: programmation
Vous pouvez parler à un à l’aide d’un programme de terminal ordinaire, mais c’est gênant sur OS-X, parce que le XBee ne renvoyer la ligne de commande bon nouveau et toutes les réponses se mélangés ensemble. Heureusement, Tom Igoe est intervenu avec un simple programme de terminal écrit en traitement (et diverses personnes ont développé depuis). J’utilise une version modifiée du programme original de Tom, qui je suis entré à la main sur le texte dans son livre "Making choses parler."
Voici la dernière version du code que j’utilise :
Import processing.serial.* ;
Serial myPort ;
Chaîne portnum ;
String outString = "" ;
String inString = "" ;
int receivedLines = 0 ;
int bufferedLines = 8 ;void setup()
{
taille (400, 300) ;
PFont myFont = createFont(PFont.list() [3], 14) ;
textFont(myFont) ;
println(Serial.List()) ;
portnum = Serial.list() [3] ;
myPort = nouvelle série (ce, portnum, 9600) ;
}void draw()
{
Background(0) ;
texte ("Serial port:" + portnum, 10, 20) ;
texte ("tapé:" + outString, 10, 40) ;
texte ("reçu:" + inString, 10, 80) ;
}Sub keyPressed()
{
commutateur (clé)
{
cas « \n » :
myPort.write (outString + « \r ») ;
outString = "" ;
rupture ;
cas 8 :
outString = outString.substring (0, outString.length() -1) ;
rupture ;
cas 65535 :
rupture ;
cas « + » :
myPort.write(key) ;
outString += clé ;
rupture ;
par défaut :
outString += clé ;
rupture ;}
Si (outString == "+++")
{
Delay(2000) ;
outString = « / n » ;
}
}Sub serialEvent(Serial myPort)
{
inString = « Série événement reçu! » ;
Delay(2000) ;
int inByte = myPort.read() ;
inString += char(inByte) ;
Si (inByte == « \r »)
{
inString += « \n » ;
receivedLines ++ ;
Si (receivedLines > bufferedLines)
{
deleteFirstLine() ;
}
}
}Sub deleteFirstLine()
{
firstChar int = inString.indexOf('\n') ;
inString = inString.substring(firstChar + 1) ;
}
Forme abrégée ici. Vous utilisez à commandes qui commencent par un code d’attention (+++, aucun retour chariot) pour obtenir l’attention de la puce, puis une série de commandes chacun suffixée par « AT ». Elles sont toutes documentées dans le manuel pour le XBee, et si vous ne voulez pas aller aussi loin, les commandes de base pour la mise en place d’un mode de passage de ligne sont copiés dans plusieurs endroits sur le web-- ici, par exemple.
Je me souviens bien, les seules choses que j’ai dû mettre du côté de l’émetteur ont été :
+++ //gets attention du nœud, il répondra avec « OK »
ATMY2 //this est l’identité du soi du nœud
ATDL3 //this est l’octet de poids faible de l’adresse que du nœud veut parler
ATID5555 //this est l’ID de PAN ; l’ID du réseau sur que les deux appareils sont
ATD03 //this met en place la broche 20--e/s numériques 0, comme une entrée numérique
ATICFF / / surveille toutes les broches e/s et envoie une transmission lorsqu’un d'entre eux est modifié. Il s’agit d’un champ de bits, si vous ne voulez tous.
ATWR / / n’oubliez pas cette commande ! Il écrit les paramètres dans la mémoire
ATAC / / cette commande entraîne le nœud commencer à utiliser les nouveaux paramètres (et le mode de commande de fermeture).
Vous pouvez également forcer l’échantillon à des intervalles en utilisant les commandes IR et il, ainsi que--à l’aide de la goupille de droite--ont le sommeil de nœud quand il n’y a aucune entrée actuelle.
Mon recieiver avait besoin d’avoir les ID réciproques et être mis en place pour la sortie de la broche :
+++
ATRE / / réinitialisation d’usine par défaut--soyons sûrs ici !
ATMY3
ATDL2
ATID5555
ATD05 / maintenant broche 20 is set to change d’État selon les données communiquées par l’émetteur
ATWR
ATAC
Comme vous l’avez peut-être remarqué, il n’y a rien qui force la transmission à l’être unidirectionnelle uniquement. Nœuds communiquera avec bonheur dans les deux sens avec les lignes de la série (qui n’ont pas été affectés par ce mode de passage de ligne, laissez-moi Remarque!) et ils résonneront joyeusement i/o lignes dans les deux sens aussi bien.
Je recommande fortement d’obtenir les nœuds XBee parler sur le montage d’essai avant de commencer le vissage votre bouton à l’arrière.
Oh ; et l’autre extrémité ? DETECTER une « faible tiré » est aussi facile que de courir un fil de goupille appropriée de I/O sur le XBee jusqu'à une tige de I/O ouverte sur un Arduino et l’écriture ;
const int xbeePin = 8 ;
const int ledPin = 13 ;void setup()
{
pinMode (xbeePin, entrée) ;
pinMode (ledPin, sortie) ;
}void loop()
{
Si (digitalRead(xbeePin) == faible)
{
digitalWrite (ledPin, HIGH) ;
}
d’autre
{
digitalWrite (ledPin, basse) ;
}
}
(Le code ci-dessus devrait fonctionner, mais je l’ai tapé par oeil ici dans l’Instructable. J’ai obtenu jusqu'à maintenant à habituer à avoir le contrôle d’IDE Arduino--ou traitement--ma syntaxe pour moi!)
La première utilisation, à que j’ai mis mon bouton facile est de connecter le récepteur XBee à un Arduino, j’avais déjà mis en place pour crache un message de note MIDI chaque fois qu’il a vu le signal déclencheur approprié. Nous avons presque utilisé comme sonnerie jeu-questionnaire-type pour le musical « Lucky Duck ». Un peu plus tard, j’ai connecté le câble MIDI à notre console d’éclairage et a été en mesure d’exécuter des repères lumineux à partir à l’extérieur de la cabine lumineuse sur une émission où le personnel de tech était Short-handed.
L’horrible gâchis dans la deuxième photo c’est moi en utilisant le bouton pour changer les programmes sur le BlinkM je suis modifiant (aka branché sur mon FAI Adafruit et a écrit de nouveau logiciel au sein de l’IDE Arduino). Ce dernier peut être un peu inutile d’une radio de 20 $, mais il ne montre pas la flexibilité d’un bouton sans fil autonome.