Go Down

Topic: osc (Read 476 times) previous topic - next topic

rood69

Oct 07, 2012, 06:56 pm Last Edit: Oct 07, 2012, 08:50 pm by Jean-François Reason: 1
bonjours,
je tente de faire un proto pour envoyer l'etat des pin digital d'un arduino mega vers un mac avec MAX MSP (language objet), via OSC

j'ai un peu pret tout et cela commence a marche mais un probleme sur laquel je calle.

voici le prog arduino:

Code: [Select]

#include <SPI.h>
#include <Ethernet.h>
#include <ArdOSC.h>

byte myMac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte myIp[]  = { 192, 168, 127, 11 }; //adresse du module
int destPort=12001;//port de communication idem sur max et module
byte destIp[]  = { 192, 168, 127, 10 };//adresse de l'ordinateur
String adr1, adr2 ;
char adr3;
char oscadr;
OSCClient client;
const int firstPin = 2;         // first digital input
const int inputNumber = 6;     // number of inputs

int digitalStates[inputNumber];

//create new osc message
OSCMessage mes;


void setup(){
 
// configure all your inputs
 for(int i = firstPin ; i < inputNumber + firstPin ; i++)
 {
   pinMode(i, INPUT);
 }

Ethernet.begin(myMac ,myIp);
// initialize the pushbutton pin as an input:
adr1 = String("/Ard/");
adr2 = String ();


}
 
void loop(){
 //////etat des entres numerique//////

for(int i = firstPin ; i < inputNumber + firstPin ; i++)
{
 int currentPinState = digitalRead(i);
  adr2 = adr1 +i ;
 
 char adr3[50];
 adr2.toCharArray(adr3, 50);
 
[color=green] char oscadr[]= adr3();[/color]
 mes.setAddress(destIp,destPort);
 mes.beginMessage(oscadr);

 mes.addArgInt32(currentPinState);
 client.send(&mes);
 mes.flush(); //object data clear
 delay(500);
   

}
}


le probleme est qu'il faut une adresse en char pour OSC
je doit avoir un Pb de class
mais je ne vois pas
j'ai une erreur: 'adr3' cannot be used as a function

quelqu'un peut m'aider


Edit de Jean-François :  Merci de mettre le code entre les balises, le bouton avec le " # "

barbudor

Code: [Select]
  char adr3[50];
  adr2.toCharArray(adr3, 50);
 
  mes.setAddress(destIp,destPort);
  mes.beginMessage(adr3);


Quand on crée un tableau
Code: [Select]
  type tableau[taille]

le nom du tableau est syntaxiquement équivalent (mais pas fonctionnellement !) à un
Code: [Select]
  char *tableau;
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

rood69

ok ,mais comment je peux creer  mon adresse osc du genre adr/"numero de pin"/
valeur: oscadr

j'essaye comme ceci
Code: [Select]

int currentPinState = digitalRead(i);
   adr2 = adr1 +i ;
   
  char adr3[50];
  adr2.toCharArray(adr3, 50);
 
  char oscadr[]= adr3();
  mes.setAddress(destIp,destPort);
  mes.beginMessage(oscadr);

barbudor

Pourquoi remets tu ton code faux que j'ai déjà corrigé ci-dessus ?
char oscadr[] = adr3(); est FAUX et ARCHI FAUX pour plusieurs raisons

> adr3 est un tableau de char, donc ça n'a aucun sens de lui accoler des parenthèse qui sont l'appanage des fonctions.
> char oscadr[] est une déclaration de variable illégale. Acceptable comme déclaration de paramètre de fonction, cette syntaxe n'alloue pas de variable.

la fonction int16_t OSCMessage::beginMessage( const char *_addr); attend donc comme paramètre un pointeur sur char.
Comme indiqué dans ma 1ere répondre, c'est adr3 qu'il faut passer

Tu as déjà fait :
adr1 = String("/Ard/");     --> adr1 = "/Ard/";
puis
adr2 = adr1 + i;      --> adr2 = "/Ard/2"  ...  adr2 = "/Ard/8"
Ensuite tu copie dans un tableau de char :
char adr3[50];
adr2.toCharArray(adr3, 50);

Puis tu passes à beginMessage :
mes.beginMessage(adr3);


Par ailleurs je note aussi dans ton code
Code: [Select]
adr2 = String ();
Inutile, adr2 est déjà déclarée comme une string
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

rood69

le programme fonctionne parfaitement merci pour l'aide
voici le prog fini
Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include <ArdOSC.h>
#include <UTFT.h>

byte myMac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte myIp[]  = { 192, 168, 127, 11 }; //adresse du module
int destPort=12001;//port de communication idem sur max et module
byte destIp[]  = { 192, 168, 127, 10 };//adresse de l'ordinateur
String adr1, adr2 ;
char adr3;
char oscadr;
OSCClient client;
const int firstPin = 2;         // first digital input
const int inputNumber = 6; // number of inputs
//pour ecran LCD
extern uint8_t SmallFont[];
UTFT myGLCD(LPH9135,6,5,2,3,4);

int digitalStates[inputNumber];

//create new osc message
OSCMessage mes;


void setup(){
 
// configure all your inputs
  for(int i = firstPin ; i < inputNumber + firstPin ; i++)
  {
    pinMode(i, INPUT);
  }

Ethernet.begin(myMac ,myIp);
// initialize the pushbutton pin as an input:
adr1 = String("/Ard/");
//pour lcd
// Setup the LCD
  myGLCD.InitLCD(PORTRAIT);
  myGLCD.setFont(SmallFont);



}
 
void loop(){


for(int i = firstPin ; i < inputNumber + firstPin ; i++)
{
   ////////////////////generation de l'adresse OSC//////////
  int currentPinState = digitalRead(i);
  adr2 = adr1 +i  ;
  char adr3[16];
  adr2.toCharArray(adr3, 50);
 
  ////////////////////generation du message osc////////////
  mes.setAddress(destIp,destPort);
  mes.beginMessage(adr3);
  mes.addArgInt32(currentPinState);
  client.send(&mes);
  mes.flush(); //object data clear
 
 
  ///////////////////gestion de l'affichage LCD////////////////
  myGLCD.clrScr();
  myGLCD.setContrast(0);
  myGLCD.fillScr(0,0,255);
  myGLCD.setColor(255,0,0);
  myGLCD.fillRoundRect(2, 40, 125, 88);
  myGLCD.setColor(255,255,255);
  myGLCD.setBackColor(255,0,0);
  myGLCD.print("OSC ro2 module", CENTER, 46);
  myGLCD.print("valeur de la pin",i, CENTER, 66);
  myGLCD.print("Etat",currentPinState, CENTER, 76);
 
  delay(50);

}
}

Go Up