Bonjour tout le monde.
dans le cadre d'un spectacle d'un danse je souhaiterais réaliser un réseau xbee avec plusieurs arduino. Sur chacune de ces arduino sont branchés des capteurs (piezzo, interrupteurs, accéléromètres). Une des arduino est équipé de la shield ethernet afin de réaliser une conversion xbee -> osc.
Un ordinateur reçoit les données des capteurs et les traites avec max/msp.
Voici le topo global.
Pour l'instant j'aimerais juste brancher des capteurs sur une arduino avec la shield xbee (module 1) et les recevoir via la deuxième arduino avec la shield xbee sur port USB de l'arduino (module 2).
Mes xbee sont des xbee serie 1.
J'ai chercher sur internet et j'ai trouvé la librairie suivante http://code.google.com/p/xbee-arduino/
J'ai suivi la configuration décrite et j'ai essayer avec l'exemple ci-dessous :
sketch arduino pour module 1 :
/** * Copyright (c) 2009 Andrew Rapp. All rights reserved. * * This file is part of XBee-Arduino. * * XBee-Arduino is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * XBee-Arduino is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with XBee-Arduino. If not, see <http://www.gnu.org/licenses/>. */ #include <XBee.h> /* This example is for Series 1 XBee Sends a TX16 or TX64 request with the value of analogRead(pin5) and checks the status response for success Note: In my testing it took about 15 seconds for the XBee to start reporting success, so I've added a startup delay */ XBee xbee = XBee(); unsigned long start = millis(); // allocate two bytes for to hold a 10-bit analog reading uint8_t payload[] = { 0, 0 }; // with Series 1 you can use either 16-bit or 64-bit addressing // 16-bit addressing: Enter address of remote XBee, typically the coordinator Tx16Request tx = Tx16Request(0x1874, payload, sizeof(payload)); // 64-bit addressing: This is the SH + SL address of remote XBee //XBeeAddress64 addr64 = XBeeAddress64(0x0013a200, 0x4008b490); // unless you have MY on the receiving radio set to FFFF, this will be received as a RX16 packet //Tx64Request tx = Tx64Request(addr64, payload, sizeof(payload)); TxStatusResponse txStatus = TxStatusResponse(); int pin5 = 0; int statusLed = 11; int errorLed = 12; void flashLed(int pin, int times, int wait) { for (int i = 0; i < times; i++) { digitalWrite(pin, HIGH); delay(wait); digitalWrite(pin, LOW); if (i + 1 < times) { delay(wait); } } } void setup() { pinMode(statusLed, OUTPUT); pinMode(errorLed, OUTPUT); xbee.begin(9600); } void loop() { // start transmitting after a startup delay. Note: this will rollover to 0 eventually so not best way to handle if (millis() - start > 15000) { // break down 10-bit reading into two bytes and place in payload pin5 = analogRead(5); payload[0] = pin5 >> 8 & 0xff; payload[1] = pin5 & 0xff; xbee.send(tx); // flash TX indicator flashLed(statusLed, 1, 100); } // after sending a tx request, we expect a status response // wait up to 5 seconds for the status response if (xbee.readPacket(5000)) { // got a response! // should be a znet tx status if (xbee.getResponse().getApiId() == TX_STATUS_RESPONSE) { xbee.getResponse().getZBTxStatusResponse(txStatus); // get the delivery status, the fifth byte if (txStatus.getStatus() == SUCCESS) { // success. time to celebrate flashLed(statusLed, 5, 50); } else { // the remote XBee did not receive our packet. is it powered on? flashLed(errorLed, 3, 500); } } } else { // local XBee did not provide a timely TX Status Response -- should not happen flashLed(errorLed, 2, 50); } delay(1000); }
sketch arduino pour le module 2
/** * Copyright (c) 2009 Andrew Rapp. All rights reserved. * * This file is part of XBee-Arduino. * * XBee-Arduino is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * XBee-Arduino is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with XBee-Arduino. If not, see <http://www.gnu.org/licenses/>. */ #include <XBee.h> /* This example is for Series 1 XBee (802.15.4) Receives either a RX16 or RX64 packet and sets a PWM value based on packet data. Error led is flashed if an unexpected packet is received */ XBee xbee = XBee(); XBeeResponse response = XBeeResponse(); // create reusable response objects for responses we expect to handle Rx16Response rx16 = Rx16Response(); Rx64Response rx64 = Rx64Response(); int statusLed = 11; int errorLed = 12; int dataLed = 10; uint8_t option = 0; uint8_t data = 0; void flashLed(int pin, int times, int wait) { for (int i = 0; i < times; i++) { digitalWrite(pin, HIGH); delay(wait); digitalWrite(pin, LOW); if (i + 1 < times) { delay(wait); } } } void setup() { pinMode(statusLed, OUTPUT); pinMode(errorLed, OUTPUT); pinMode(dataLed, OUTPUT); // start serial xbee.begin(9600); flashLed(statusLed, 3, 50); } // continuously reads packets, looking for RX16 or RX64 void loop() { xbee.readPacket(); if (xbee.getResponse().isAvailable()) { // got something if (xbee.getResponse().getApiId() == RX_16_RESPONSE || xbee.getResponse().getApiId() == RX_64_RESPONSE) { // got a rx packet if (xbee.getResponse().getApiId() == RX_16_RESPONSE) { xbee.getResponse().getRx16Response(rx16); option = rx16.getOption(); data = rx16.getData(0); for (int i=0; i< rx16.getDataLength(); i++) { Serial.print(rx16.getData(0), HEX); } } else { xbee.getResponse().getRx64Response(rx64); option = rx64.getOption(); data = rx64.getData(0); } // TODO check option, rssi bytes flashLed(statusLed, 1, 10); // set dataLed PWM to value of the first byte in the data analogWrite(dataLed, data); } else { // not something we were expecting flashLed(errorLed, 1, 25); } } }
Je reçois des données dans max/msp mais seulement toutes les 5sec or il me me faut un flux continu, de plus je ne comprends pas comment je peux brancher d'autres capteurs.
J'ai refais des recherches et je suis tomber sur le b-a-b-a avec l'exemple du site arduino http://arduino.cc/en/Guide/ArduinoXbeeShield
Cet exemple est parfait mais je souhaiterais communiquer dans le sens inverse. Or pour cela comment je peux lire dans mon module 2 l'information provenant de la xbee et la ré-écrire sur l'usb avec les jumper en position xbee ???
Bref je patauge dans la semoule.
Est-ce quelqu'un saurait m'apporter des réponses ?
Bien à vous
Olivier
Hors ligne
pour le retard de 5s c'est écrit dans le code du module1 émetteur:
// after sending a tx request, we expect a status response
// wait up to 5 seconds for the status response
if (xbee.readPacket(5000)) {}
alors si tu remplace 5000ms par 0 théoriquement il n'y aura plus de delay.
Hors ligne
je l'ai fais à 100ms et 20ms.
Dernière modification par olivierpfeiffer (2010-09-14 17:41:07)
Hors ligne
Bonjour
citation :
j'ai essayé de baisser mais ça ne le fait pas
Es-tu passé directement à zéro? Ou fait des tests en diminuant la valeur (il faut probablement laisser le temps de recevoir la réponse)
Hors ligne