Capteur tf luna en mode midi usb savec un leonardo

bonjour.

je suis un débutant sur les systèmes arduino mais avec de la patience et des recherches j'ai réussi à me fabriquer un capteur midi avec un lidar de chez sharp et qui m'envoi un message midi directement sur mon pure data. je voulais améliorer mon système avec un nouveau lidar: un tf luna. sur certains sites ils le vantent comme une bonne solution pour les arduino et les raspberry. (mon projet final sera d'avoir ce lidar sur mon raspberry directement mais je ne veux pas bruler les étapes.)

mon problème c'est que je passe d'un lidar qui se branche sur les ports analogiques de mon leonardo à un lidar qui lui se branche sur les ports numériques ( de ce que j'ai compris )

je ne suis pas sur de comment récupérer les données des ports rx et tx (sur un exemple ils disent de le brancher sur les ports 2 et 3) par rapport à mon code qui lui récupérait les infos du port analogique...

*/

//import the library in the sketch
#include <SharpIR.h>
#include <MIDIUSB.h>

//Create a new instance of the library
//Call the sensor "sensor"
//The model of the sensor is "GP2Y0A21YK0F"
//The sensor output pin is attached to the pin A0
SharpIR sensor( SharpIR::GP2Y0A21YK0F, A0 );

void setup()
{
  Serial.begin( 9600 ); //Enable the serial comunication
}

//Declare 'controlChange' function to 'package' & send MIDI data over USB (I think...)
  void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);

}

void loop()
{
  int distance = sensor.getDistance(); //Calculate the distance in centimeters and store the value in a variable
  byte Ctrl1 = (distance * 0.124144673); //Scale to 0-127 range
  controlChange(0, 14, Ctrl1); //Call 'controlChange' function using channel 0, controller 14, & our scaled value
  MidiUSB.flush();  //Forces data to be sent immediately
  delay(20);

  }

je pense que mon code est obsolete vu qu'il se sert de la bibliothèque de sharp...
du coup je pensais me baser sur ce code là.

/*
 This program is the interpretation routine of standard output protocol of TFmini-Plus product on Arduino.
 For details, refer to Product Specifications.
 For Arduino boards with only one serial port like UNO board, the function of software visual serial port is
to be used.
*/
#include <SoftwareSerial.h> //header file of software serial port
SoftwareSerial Serial1(2,3); //define software serial port name as Serial1 and define pin2 as RX and pin3
as TX
/* For Arduinoboards with multiple serial ports like DUEboard, interpret above two pieces of code and
directly use Serial1 serial port*/
int dist; //actual distance measurements of LiDAR
int strength; //signal strength of LiDAR
float temprature;
int check; //save check value
int i;
int uart[9]; //save data measured by LiDAR
const int HEADER=0x59; //frame header of data package
void setup() {
Page 3
 Serial.begin(9600); //set bit rate of serial port connecting Arduino with computer
 Serial1.begin(115200); //set bit rate of serial port connecting LiDAR with Arduino
}
void loop() {
 if (Serial1.available()) { //check if serial port has data input
 if(Serial1.read() == HEADER) { //assess data package frame header 0x59
 uart[0]=HEADER;
 if (Serial1.read() == HEADER) { //assess data package frame header 0x59
 uart[1] = HEADER;
 for (i = 2; i < 9; i++) { //save data in array
 uart[i] = Serial1.read();
 }
 check = uart[0] + uart[1] + uart[2] + uart[3] + uart[4] + uart[5] + uart[6] + uart[7];
 if (uart[8] == (check & 0xff)){ //verify the received data as per protocol
 dist = uart[2] + uart[3] * 256; //calculate distance value
 strength = uart[4] + uart[5] * 256; //calculate signal strength value
 temprature = uart[6] + uart[7] *256;//calculate chip temprature
 temprature = temprature/8 - 256;
 Serial.print("dist = ");
 Serial.print(dist); //output measure distance value of LiDAR
 Serial.print('\t');
Page 4
 Serial.print("strength = ");
 Serial.print(strength); //output signal strength value
 Serial.print("\t Chip Temprature = ");
 Serial.print(temprature);
 Serial.println(" celcius degree"); //output chip temperature of Lidar
 }
 }
 }
 }
}

mais je me pose deux questions: le arduino leonardo est apparenté au uno ou au DUEboard?

ensuite comment récupérer la donnée dist pour la convertir en donnée midiusb.

  int distance = sensor.getDistance(); //Calculate the distance in centimeters and store the value in a variable

je ne sais pas si cette commande fonctionnera... est-ce que je peux trouver un équivalent quelque part?

j'espère que mon message de débutant ne vous agacera pas et je vous remercie pour les informations que vous partageriez. je sèche un peu et j'ai peur de cramer quelque chose...

si vous êtes intéressés je partage volontiers mon code pure data en échange.

bonjour
Ce "LIDAR" semble mettre à disposition ses datas en I²C et serial.
l'interface ne doit donc pas être trés/trop compliqué à implémenter sur un leonardo ou autre

rapidement trouvé çà

merci pour votre retour.

j'ai essayé de refaire un code en mélangeant un exemple du tfluna I2C avec le midi.usb.h

je bloque sur une partie du code... comment je récupère la valeur de distance dans le void loop pour la stocker dans la variable? (Calculate the distance in centimeters and store the value in a variable byte Ctrl1) ce serait int16_t ou tfDist? ou une autre commande? j'apprends en analysant les parties de codes donc je suis pas encore super à l'aise avec la logique du code... sorry...

/* File Name: TFLI2C_simple.ino
 * Developer: Bud Ryerson
 * Date:      10 JUL 2021
 * Version:   0.1.1
 * Described: Simplified Arduino example sketch for the Benewake
 *            TF-Luna Lidar sensor configured for the I2C interface
 */
 
#include <Arduino.h>     // Every sketch needs this
#include <Wire.h>        // Instantiate the Wire library
#include <TFLI2C.h>      // TFLuna-I2C Library v.0.1.1
#include <MIDIUSB.h>

TFLI2C tflI2C;

int16_t  tfDist;    // distance in centimeters
int16_t  tfAddr = TFL_DEF_ADR;  // Use this default I2C address or
                                // set variable to your own value

void setup()
{
    Serial.begin( 115200);  // Initalize serial port
    Wire.begin();           // Initalize Wire library
}
    
//Declare 'controlChange' function to 'package' & send MIDI data over USB 
  void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);

}

void loop()
{
    if( tflI2C.getData( tfDist, tfAddr)) // If read okay...


{
  int tfdist = (); sensor.getDistance //Calculate the distance in centimeters and store the value in a variable
  byte Ctrl1 = (dist * 0.124144673); //Scale to 0-127 range
  controlChange(0, 14, Ctrl1); //Call 'controlChange' function using channel 0, controller 14, & our scaled value
  MidiUSB.flush();  //Forces data to be sent immediately
  delay(20);

}
  }

merci en tout cas pour votre réponse qui m'a aiguillé.

essaye le code ci-dessous
Compile OK , pas testé

prerequis :

  • installer la lib TFLI2C
  • configurer le module pour de l'i²C
    The communications mode (UART/U2C) is set by the voltage level of Pin #5

programme

/* File Name: TFLI2C_simple.ino
   Developer: Bud Ryerson
   Date:      10 JUL 2021
   Version:   0.1.1
   Described: Simplified Arduino example sketch for the Benewake
              TF-Luna Lidar sensor configured for the I2C interface
*/

#include <Arduino.h>     // Every sketch needs this
#include <Wire.h>        // Instantiate the Wire library
#include <TFLI2C.h>      // TFLuna-I2C Library v.0.1.1
#include <MIDIUSB.h>

TFLI2C tflI2C;

int16_t  tfDist;    // distance in centimeters
int16_t  tfAddr = TFL_DEF_ADR;  // Use this default I2C address or
// set variable to your own value

void setup()
{
  Serial.begin( 115200);  // Initalize serial port
  Wire.begin();           // Initalize Wire library
}



void loop()
{


  //Calculate the distance in centimeters and store the value in a variable





  if ( tflI2C.getData( tfDist, tfAddr)) // If read okay...
  {
    byte Ctrl1 = (tfDist * 0.124144673); //Scale to 0-127 range la valeur 0.124xxx vient d'où ?
    controlChange(0, 14, Ctrl1); //Call 'controlChange' function using channel 0, controller 14, & our scaled value
    MidiUSB.flush();  //Forces data to be sent immediately

  }

  delay( 25);
}

//Declare 'controlChange' function to 'package' & send MIDI data over USB
void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);

}

je me suis trompé dans le câblage (j'ai oublié de raccordé la pin 5 du luna au ground...). merci en tout cas pour ce code qui m'aide à mieux comprendre ce que je ne faisais pas bien et me débloque la situation. je vais retesté aujourd'hui. bonne continuation.

la 1ere chose à faire est déjà de passer un coup de scanner I²C module raccordé sur le leonardo
Leonardo I²C : 2 (SDA), 3 (SCL)

ça marche nickel. j'ai corrigé la valeur (tfDist * 0.124144673) par (tfDist * 0.99). c'est pour réduire la distance exploitée du lidar. le signal est relativement stable. mais la portée est de 1 mètre et non pas 8 mètres comme annoncée.

j'ai trouvé un tuto pour scanner l'I²C module. merci pour cette piste.

merci pour vos réponses qui me font vraiment avancer à pas de géant.