Go Down

Topic: DIMMER pour trois LEDs avec MAX MSP (Read 647 times) previous topic - next topic

Vinchiappetto

Bonjour,
j'utilise un Arduino entre autre pour varier l'intensité de trois leds (RGB). Ce qui m'intéresse c'est de pouvoir le faire à partir du logiciel MAX MSP. Il existe un patch appelé Maxuino qui marche bien, mais dès qu'on veut récupérer à la fois aussi les données d'un capteur en i2c, ça ne marche pas trop.
Du coup, en étant complétement débutant et ne sachant pas coder, je tourne en rond depuis plusieurs mois ...
Je sais qu'il y a un code appelé DIMMER qui utilise des bytes pour gérer une sortie PWM, mais je ne sais pas comment élargir cela à trois sorties PWM.
Le voici:
Code: [Select]
/*
  Dimmer

 Demonstrates the sending data from the computer to the Arduino board,
 in this case to control the brightness of an LED.  The data is sent
 in individual bytes, each of which ranges from 0 to 255.  Arduino
 reads these bytes and uses them to set the brightness of the LED.

 The circuit:
 LED attached from digital pin 9 to ground.
 Serial connection to Processing, Max/MSP, or another serial application

 created 2006
 by David A. Mellis
 modified 30 Aug 2011
 by Tom Igoe and Scott Fitzgerald

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Dimmer

 */

const int ledPin = 9;      // the pin that the LED is attached to

void setup() {
  // initialize the serial communication:
  Serial.begin(9600);
  // initialize the ledPin as an output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  byte brightness;

  // check if data has been sent from the computer:
  if (Serial.available()) {
    // read the most recent byte (which will be from 0 to 255):
    brightness = Serial.read();
    // set the brightness of the LED:
    analogWrite(ledPin, brightness);
  }
}

/* Processing code for this example
 // Dimmer - sends bytes over a serial port
 // by David A. Mellis
 //This example code is in the public domain.

 import processing.serial.*;
 Serial port;

 void setup() {
 size(256, 150);

 println("Available serial ports:");
 // if using Processing 2.1 or later, use Serial.printArray()
 println(Serial.list());

 // Uses the first port in this list (number 0).  Change this to
 // select the port corresponding to your Arduino board.  The last
 // parameter (e.g. 9600) is the speed of the communication.  It
 // has to correspond to the value passed to Serial.begin() in your
 // Arduino sketch.
 port = new Serial(this, Serial.list()[0], 9600);

 // If you know the name of the port used by the Arduino board, you
 // can specify it directly like this.
 //port = new Serial(this, "COM1", 9600);
 }

 void draw() {
 // draw a gradient from black to white
 for (int i = 0; i < 256; i++) {
 stroke(i);
 line(i, 0, i, 150);
 }

 // write the current X-position of the mouse to the serial port as
 // a single byte
 port.write(mouseX);
 }
 */

/* Max/MSP v5 patch for this example

----------begin_max5_patcher----------
1008.3ocuXszaiaCD9r8uhA5rqAeHIa0aAMaAVf1S6hdoYQAsDiL6JQZHQ2M
YWr+2KeX4vjnjXKKkKhhiGQ9MeyCNz+X9rnMp63sQvuB+MLa1OlOalSjUvrC
ymEUytKuh05TKJWUWyk5nE9eSyuS6jesvHu4F4MxOuUzB6X57sPKWVzBLXiP
xZtGj6q2vafaaT0.BzJfjj.p8ZPukazsQvpfcpFs8mXR3plh8BoBxURIOWyK
rxspZ0YI.eTCEh5Vqp+wGtFXZMKe6CZc3yWZwTdCmYW.BBkdiby8v0r+ST.W
sD9SdUkn8FYspPbqvnBNFtZWiUyLmleJWo0vuKzeuj2vpJLaWA7YiE7wREui
FpDFDp1KcbAFcP5sJoVxp4NB5Jq40ougIDxJt1wo3GDZHiNocKhiIExx+owv
AdOEAksDs.RRrOoww1Arc.9RvN2J9tamwjkcqknvAE0l+8WnjHqreNet8whK
z6mukIK4d+Xknv3jstvJs8EirMMhxsZIusET25jXbX8xczIl5xPVxhPcTGFu
xNDu9rXtUCg37g9Q8Yc+EuofIYmg8QdkPCrOnXsaHwYs3rWx9PGsO+pqueG2
uNQBqWFh1X7qQG+3.VHcHrfO1nyR2TlqpTM9MDsLKNCQVz6KO.+Sfc5j1Ykj
jzkn2jwNDRP7LVb3d9LtoWBAOnvB92Le6yRmZ4UF7YpQhiFi7A5Ka8zXhKdA
4r9TRGG7V4COiSbAJKdXrWNhhF0hNUh7uBa4Mba0l7JUK+omjDMwkSn95Izr
TOwkdp7W.oPRmNRQsiKeu4j3CkfVgt.NYPEYqMGvvJ48vIlPiyzrIuZskWIS
xGJPcmPiWOfLodybH3wjPbMYwlbFIMNHPHFOtLBNaLSa9sGk1TxMzCX5KTa6
WIH2ocxSdngM0QPqFRxyPHFsprrhGc9Gy9xoBjz0NWdR2yW9DUa2F85jG2v9
FgTO4Q8qiC7fzzQNpmNpsY3BrYPVJBMJQ1uVmoItRhw9NrVGO3NMNzYZ+zS7
3WTvTOnUydG5kHMKLqAOjTe7fN2bGSxOZDkMrBrGQ9J1gONBEy0k4gVo8qHc
cxmfxVihWz6a3yqY9NazzUYkua9UnynadOtogW.JfsVGRVNEbWF8I+eHtcwJ
+wLXqZeSdWLo+FQF6731Tva0BISKTx.cLwmgJsUTTvkg1YsnXmxDge.CDR7x
D6YmX6fMznaF7kdczmJXwm.XSOOrdoHhNA7GMiZYLZZR.+4lconMaJP6JOZ8
ftCs1YWHZI3o.sIXezX5ihMSuXzZtk3ai1mXRSczoCS32hAydeyXNEu5SHyS
xqZqbd3ZLdera1iPqYxOm++v7SUSz
-----------end_max5_patcher-----------
 */

Sinon j'ai édité , en regardant par-ci et par-là, ce code:
Code: [Select]

 const int ledR=9;
 const int ledB=6;
 const int ledG=5;


void setup() {
 // initialize serial:
 Serial.begin(19200);
 pinMode(ledR, OUTPUT);
 pinMode(ledG, OUTPUT);
 pinMode(ledB, OUTPUT);
}

void loop() {
   
 while (Serial.available()) {

 
     int valeur1 = Serial.parseInt();
     int valeur2 = Serial.parseInt();
     int valeur3 = Serial.parseInt();


     // traitement
   
  if (Serial.read()) {
   
       analogWrite(ledG,valeur1);
   
       analogWrite(ledB,valeur2);

       analogWrite(ledR,valeur3);
   
     }
   }
 }

Avec ce dernier j'arrive bien à envoyer 3 chiffres dans le moniteur série de l'Arduino et obtenir le résultat, par contre avec mon logiciel, j'ai une latence à chaque fois que j'envoie un message (je convertie des caractères ASCII en int).
Est-ce que une âme charitable pourrait m'aider à avancer ?
Merci d'avance.

Claudio



J-M-L

#1
Oct 20, 2016, 09:22 am Last Edit: Oct 20, 2016, 09:23 am by J-M-L
Votre if (Serial.read()) { met le bazar sauf si vous envoyez bien un retour chariot après le dernier entier et si vous ne le faites pas alors c'est lent parce que le dernier serial parseInt attend un timeout
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Vinchiappetto

Votre if (Serial.read()) { met le bazar sauf si vous envoyez bien un retour chariot après le dernier entier et si vous ne le faites pas alors c'est lent parce que le dernier serial parseInt attend un timeout
Bonjour J-M-L,
merci beaucoup de prendre le temps de m'aider.
Quand vous dites d'envoyer un retour chariot, il faut envoyer un chiffre 13 en ASCII ? Concrètement ça se code comment (si ce n'est pas trop long à écrire) ?
Merci d'avance de votre réponse.
Claudio

J-M-L

Si pour le moment vous tapez le texte dans la console arduino assurez vous que dans le petit popup en bas de la fenêtre (à côté de là où vous réglez la vitesse du terminal sérievous ayez choisi l'option d'envoyer CR et LF
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Vinchiappetto

Si pour le moment vous tapez le texte dans la console arduino assurez vous que dans le petit popup en bas de la fenêtre (à côté de là où vous réglez la vitesse du terminal sérievous ayez choisi l'option d'envoyer CR et LF
En effet par le terminal série j'arrive bien à gérer les informations sans latence, mais le problème c'est que n'arrive pas à faire cela par mon logiciel MAXMSP. Du coup j'imagine que je dois envoyer un chiffre 13 en ASCII à la porte série à la fin des valeurs ?

Vinchiappetto

C'est exactement ça !!!!!!!!!!!!
Voila la solution trouvée grâce à votre aide.
Mille mercis à vous.
Claudio

Vinchiappetto

#6
Nov 09, 2016, 07:10 pm Last Edit: Nov 10, 2016, 12:39 am by Vinchiappetto
Bonjour,
grâce à votre aide j'ai pu terminer mon capteur MAGIC BALL.
Je tenais à poster une petite vidéo de présentation: https://www.youtube.com/watch?v=P4FhdyV2KKo
Le seul souci que j'ai c'est que parfois, au démarrage de mon patch Max/Msp, la synchronisation ne se fait pas proprement. Pour cela je dois réactualiser la connexion du port série afin de synchroniser proprement mon MPU-6050. Je crois que ça vient plutôt du logiciel utilisé, mais si par hasard vous pensez que je puisse améliorer mon code, le voici:
Code: [Select]
/*
    The Magic Ball by 2t2l
*/
#include <TheAirBoard.h>
#include <Wire.h>
#include <MPU6050.h>

MPU6050 mpu;


// Leds Airboard

const int ledR = 9;
const int ledB = 6;
const int ledG = 5;

// Timers
unsigned long timer = 0;
float timeStep = 0.01;

// Pitch, Roll and Yaw values
float pitch = 0;
float roll = 0;
float yaw = 0;



void setup()
{
  Serial.begin(57600);
  pinMode(ledR, OUTPUT);
  pinMode(ledG, OUTPUT);
  pinMode(ledB, OUTPUT);


  // Initialize MPU6050
  while (!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
  {
    Serial.println("Could not find a valid MPU6050 sensor, check wiring!");
    delay(500);
  }

  // Calibrate gyroscope. The calibration must be at rest.
  // If you don't want calibrate, comment this line.
  mpu.calibrateGyro();

  // Set threshold sensivty. Default 3.
  // If you don't want use threshold, comment this line or set 0.
  mpu.setThreshold(3);
}

void loop()
{
  {
    timer = millis();

  // Read normalized values
  Vector norm = mpu.readNormalizeGyro();

  // Calculate Pitch, Roll and Yaw
  pitch = pitch + norm.YAxis * timeStep;
  roll = roll + norm.XAxis * timeStep;
  yaw = yaw + norm.ZAxis * timeStep;

  // Output raw
  Serial.print("Xa ");
  Serial.println(pitch);
  Serial.print("Ya ");
  Serial.println(roll);
  Serial.print("Za ");
  Serial.println(yaw);

  // Wait to full timeStep period
  delay((timeStep * 1000) - (millis() - timer));

  // ACCELERATION

  Vector normAccel = mpu.readNormalizeAccel();

  Serial.print("Xacc ");
  Serial.println(normAccel.XAxis);
  Serial.print("Yacc ");
  Serial.println(normAccel.YAxis);
  Serial.print("Zacc ");
  Serial.println(normAccel.ZAxis);
  }

  while (Serial.available()) {


    int valeur1 = Serial.parseInt();
    int valeur2 = Serial.parseInt();
    int valeur3 = Serial.parseInt();


    // traitement

    if (Serial.read()) {

      analogWrite(ledG, valeur1);

      analogWrite(ledB, valeur2);

      analogWrite(ledR, valeur3);


    }
  }
        delay (10);
}

Merci d'avance.
Claudio

Go Up