Go Down

Topic: Utilizzare la libreria wire al posto della l2c? (Read 110 times) previous topic - next topic

aldoz

May 18, 2019, 10:33 am Last Edit: May 18, 2019, 07:12 pm by gpb01
Ciao a tutti ragazzi.

Sto utilizzando il laser Lidar-lite v2 e sto sviluppando un codice di scansione e mappatura del terreno.
I risultati fin'ora ottenuti sono fantastici (600 pixel 60°x50° di campo visivo utilizzando 2 servi) ma per varie problematiche vorrei evitare di utilizzare la libreria l2c che attualmente appunto uso nel codice e al suo posto vorrei utilizzare la wire.

E' possibile? riuscireste a modificare il codice che ho postato in seguito utilizzando la wire al posto della l2c?
grazie in anticipo a tutti!


Ecco il codice base del lidar-lite:

Code: [Select]
/*
http://pulsedlight3d.com
This sketch demonstrates getting distance with the LIDAR-Lite Sensor
It utilizes the 'Arduino I2C Master Library' from DSS Circuits:
http://www.dsscircuits.com/index.php/articles/66-arduino-i2c-master-library
You can find more information about installing libraries here:
http://arduino.cc/en/Guide/Libraries
*/

#include <I2C.h>
#define    LIDARLite_ADDRESS   0x62          // Default I2C Address of LIDAR-Lite.
#define    RegisterMeasure     0x00          // Register to write to initiate ranging.
#define    MeasureValue        0x04          // Value to initiate ranging.
#define    RegisterHighLowB    0x8f          // Register to get both High and Low bytes in 1 call.


void setup(){
  Serial.begin(500000); //Opens serial connection at 9600bps.     
  I2c.begin(); // Opens & joins the irc bus as master
  delay(1); // Waits to make sure everything is powered up before sending or receiving data 
  I2c.timeOut(50); // Sets a timeout to ensure no locking up of sketch if I2C communication fails
}

void loop()
{
  // Write 0x04 to register 0x00
  uint8_t nackack = 100; // Setup variable to hold ACK/NACK resopnses     
  while (nackack != 0)
  { // While NACK keep going (i.e. continue polling until sucess message (ACK) is received )
    nackack = I2c.write(LIDARLite_ADDRESS,RegisterMeasure, MeasureValue); // Write 0x04 to 0x00
    delay(1); // Wait 1 ms to prevent overpolling
  }

  byte distanceArray[2]; // array to store distance bytes from read function
 
  // Read 2byte distance from register 0x8f
  nackack = 100; // Setup variable to hold ACK/NACK resopnses     
  while (nackack != 0)
  { // While NACK keep going (i.e. continue polling until sucess message (ACK) is received )
    nackack = I2c.read(LIDARLite_ADDRESS,RegisterHighLowB, 2, distanceArray); // Read 2 Bytes from LIDAR-Lite Address and store in array
    delay(1); // Wait 1 ms to prevent overpolling
  }
  int distance = (distanceArray[0] << 8 ) + distanceArray[1];  // Shift high byte [0] 8 to the left and add low byte [1] to create 16-bit int

  Serial.println(distance);
}




Claudio_FF

#1
May 18, 2019, 12:17 pm Last Edit: May 18, 2019, 12:19 pm by Claudio_FF
Avevo pensato di fare la stessa cosa ma con i sensori IR della sharp.
Per le misure della distanza in verticale effettui anche la correzione dovuta all'angolo?
Riesci a ottenere una rappresentazione 3D corretta?

Comunque se non sbaglio le modifiche sono poche.

Code: [Select]
I2c.begin();
  
Wire.begin();


Code: [Select]
nackack = I2c.write(LIDARLite_ADDRESS,RegisterMeasure, MeasureValue); // Write 0x04 to 0x00


Wire.beginTransmissiom(LIDARLite_ADDRESS);
Wire.write(RegisterMeasure);
Wire.write(MeasureValue);
nackack = Wire.endTransmission();


Code: [Select]
nackack = I2c.read(LIDARLite_ADDRESS,RegisterHighLowB, 2, distanceArray); // Read 2 Bytes from LIDAR-Lite Address and store in array


Wire.beginTransmissiom(LIDARLite_ADDRESS);
Wire.write(RegisterHighLowB);
nackack = Wire.endTransmission();
if (0 == nackack)
{
    Wire.requestFrom(LIDARLite_ADDRESS, 2);
    if (Wire.available() == 2)
    {
        distanceArray[0] = Wire.read();
        distanceArray[1] = Wire.read();
    }
    else
    {
        nackack = 100;
    }
}




PS: Il codice va messo tra i tag code e non quote.
Una domanda ben posta è già mezza risposta.

aldoz

#2
May 18, 2019, 12:49 pm Last Edit: May 18, 2019, 05:49 pm by aldoz
Ahh mi hai messo la correzione del codice utilizzando la wire! GRAZIE 1000! dopo pranzo lo provo e ti faccio sapere!

ti allego l'immagine con la comparazione della vera scena e la rappresentazione con 600 pixels.

No, nessuna correzione di angolo, tutto molto basico:

movimento roll da 0° a 60°
pitch + 2°
movimento roll da 60° a 0°
pitch + 2°
movimento roll da 0° a 60°
ecc..

Quindi la testa che va da sinistra destra, memorizzando le misurazioni grado per grado.
Dopodiche' picchia di 2° e via da destra a sinistra.

60 punti orizzontali x 10 righe. (piu' e' vicino l'oggetto piu' il pixel sara' scuro)

Oggi provo anche un altro codice, trovato nel web, che dovrebbe migliorare, e tanto, tale scansione!

EDIT : Il codice con le tue modifiche funziona benissimo! grazie davvero Claudio!




Go Up