Go Down

Topic: Arduino raspberry pi2 lidar lite V3 I2C (Read 193 times) previous topic - next topic

zigomato

Bonjour à tous,

J'ai un petit projet à faire, celui-ci concerne un scan avec un lidar (le lidar lite V3 de chez garmin).
Je passe par un script python qui viendra commander l'arduino sur le bus I2C.
L'arduino renverra l'information fourni par le capteur.
J'ai testé la méthode pour le lidar en I2C et PWM, seul le PWM fonctionne avec le script Python.
La mesure avec l'Arduino seul fonctionne que ce soit en I2C et PWM.

Mon soucis apparait lorsque le tente l'appel via le script python pour l'I2C :

Code: [Select]
    Traceback (most recent call last):
  File "lidar-V2.py", line 23, in <module>
    number = readNumber()
  File "lidar-V2.py", line 16, in readNumber
    number = bus.read_byte(addressArduino)
OSError: [Errno 5] Input/output error

Voici le code python :
Code: [Select]
    #!/usr/bin/env python3
# -*- coding: utf-8 -*-


import smbus
import time
bus = smbus.SMBus(1)

addressArduino = 0x12

def writeNumber(value):
bus.write_byte(addressArduino,value)
return -1

def readNumber():
number = bus.read_byte(addressArduino)
return number

var = 3
writeNumber(var)
#time.sleep(0.007)
time.sleep(1)
number = readNumber()
print(number)

Le script arduino pour le PWM qui fonctionne :
Code: [Select]
#include <Wire.h>

#define SLAVE_ADDRESS 0x12

int distance;
int number;

// capteur LIDAR
unsigned long pulseWidth;

void setup(){
  Serial.begin(9600);
  Wire.begin(SLAVE_ADDRESS);
  Wire.onReceive(receiveData);
  Wire.onRequest(sendData);
  // capteur LIDAR
  pinMode(2, OUTPUT);
  digitalWrite(3, INPUT);

}

void loop(){
  delay(100);
}
 
void receiveData(int byteCount){
  while(Wire.available()){
    distance = mesure();
    number = Wire.read();
    Serial.print("donnee recue : ");
    Serial.println(number);
  }
}
void sendData(){
  Wire.write(distance);
}
int mesure(){
  pulseWidth = pulseIn(3, HIGH);
  if(pulseWidth != 0){
    pulseWidth = pulseWidth / 10;
    return pulseWidth;
  }
  //  return 100;
}

Maintenant le script Arduino I2C, à noter que lorsque je fais la mesure dans la boucle et l'affiche dans le moniteur, la mesure se fait :
Code: [Select]
#include <Wire.h>
#include <LIDARLite.h>

#define SLAVE_ADDRESS 0x12

LIDARLite lidarlite;

int number;
unsigned long distance;

void setup(){
  Serial.begin(9600);
  Wire.begin(SLAVE_ADDRESS);
  Wire.onReceive(receiveData);
  Wire.onRequest(sendData);
  // capteur LIDAR
  lidarlite.begin(0, true);
  lidarlite.configure(0);
}

void loop(){
  delay(100);
//  Serial.println(mesure());
}

void receiveData(int byteCount){
  while(Wire.available()){
    distance = mesure();
//    Serial.println(distance);   
    number = Wire.read();
    Serial.print("Donnee recue : ");
    Serial.println(number);
  }
}

void sendData(){
  Wire.write(distance);
}

int mesure(){
  distance = lidarlite.distance();
  return distance;
}


Pour info, après avoir charger le script I2C dans l'Arduino et que jefait un i2cdetect -y 1 sur le pi, j'obtiens les adresses du capteur et de l'arduino mais après exécution du script et l'apparaition du message d'erreur, les adresse ne sont plus présente sur le bus.

Je sspecte un conflit lors de la communication en I2C.

En attente de vos nombreuse réponse.

Go Up