réseau de xbee et osc

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.

Je recherche des personnes sur Lyon qui seraient capable de réaliser cela et qui pourrait m'aider à mieux comprendre la programmation à réaliser.

Bien à vous

Olivier

olivier, je ne suis pas sur Lyon, mais je travaille aussi dans le spectacle vivant. donc si tu as besoin d un coup de palluche sur du code, pas de souci.

Merci beaucoup Karistouf

Utilises-tu également des xbee ?

non. ca fait deux semaines que je suis sous arduino, que je suis en train d'implémenter dans WhiteCat.
http://www.le-chat-noir-numerique.fr

donc un newbie sur l'aspect électronique, et un peu moins newbie sur l'aspect code.

Cool je ne connaissais pas ce soft, je suis resté sur d-light et lightregie.
De mon côté j'en ai besoin pour un spectacle qui tourne avec live et Maxforlive. J'utilisais des capteurs et des interfaces de chez interface-z mais financièrement c'est plus cher (mais bien moins prise de tête...)
J'ai testé arduino en usb et récupéré des codes à gauche à droite ça le fait. Mais pour la xbee et l'osc j'en trouve moins, surtout pour la xbee...
J'ai lu qu'il fallait une shield spéciale pour changer le firmware de la xbee mais malheureusement je ne l'ai pas, je l'ai commandé mais j'ai peur qu'il arrive trop tard. Si quelqu'un en possède une sur Lyon je suis preneur.

Ah!!! j'avais pas capté tu es le papa de schwartzpeter ! Je me disais bien white cat... schwartzpeter...
Enchanté !

moi de même ;D

si tu es en urgence, essayes de poster un shout sur http://vvvv.org/ et un autre sur codelab

bon courage :wink:

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 GitHub - andrewrapp/xbee-arduino: Arduino library for communicating with XBee radios in API mode
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

change dans Xbee.ReadPacket(5000) 5000 par 100 ( 100 millisecondes) ou moins. Faire un test à 1, pour voir.
verifies dans le header xbee.h que tu es bien en UDP et pas en TCPIP.

une autre exemple, plus rapide et véloce: http://www.digi.com/wiki/developer/index.php/UDP_to_XBee_Network

furettes dans xbee.h tu trouveras toutes les fonctions proposées par ceux qui ont écrit cette librairie. si tu peux poster le code ou un lien vers elle, je regarderais demain ( en créa donc un peu à fond)

tu peux ajouter dans ton module 2 la fonction d envoi xbee.send(data)

à++ ;D

Merci !

J'ai déjà fais des essais en baissant les temps mais ça ne change rien.
Pour le code en fait c'est du ptyhon et ce n'est pas tout à fait la même syntaxe.

ok si tu baisses les temps et que rien se passe, verifies que ta lib fait bien de l'UDP en non bloquant, et pas du TCP/IP

oups pour le python.

il y a ici une extension pour faire en udp tes envois. c est une modification de la livrairie ethernet. ouvre le fichier udp.cpp et regardes les fonctions. ca devrait le faire

good luck