Maledetto sensore SRF02

Salve a tutti, sto cercando di utilizzare un sensore US srf02 collegato alla mia scheda arduino 2009.
Ho trovato sul sito di arduino lo schema e il programma per i sensori srf08 e srf10 su arduino.cc.

Ho predisposto il collegamento come indicato e ho inserito il programma messo a disposizione sul sito, purtroppo i valori che mi restituisce sono totalmente diversi da quelli reali.
Ci possono essere delle incompatibilità?

Posto i programma (da me un pò modificato)

#include <Wire.h>

void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial communication at 9600bps
}

int reading = 0;

void loop()
{
// step 1: instruct sensor to read echoes
Wire.beginTransmission(0x70); // transmit to device #112 (0x70)
// the address specified in the datasheet is 224 (0xE0)
// but i2c adressing uses the high 7 bits so it’s 112
Wire.write(byte(0x00)); // sets register pointer to the command register (0x00)
Wire.write(byte(0x51)); // command sensor to measure in “inches” (0x50)
// use 0x51 for centimeters
// use 0x52 for ping microseconds
Wire.endTransmission(); // stop transmitting

// step 2: wait for readings to happen
delay(70); // datasheet suggests at least 65 milliseconds

// step 3: instruct sensor to return a particular echo reading
Wire.beginTransmission(0x70); // transmit to device #112
Wire.write(byte(0x02)); // sets register pointer to echo #1 register (0x02)
Wire.endTransmission(); // stop transmitting

// step 4: request reading from sensor
Wire.requestFrom(0x70, 2); // request 2 bytes from slave device #112

// step 5: receive reading from sensor
if(2 <= Wire.available()) // if two bytes were received
{
reading = Wire.read(); // receive high byte (overwrites previous reading)
Serial.println(reading); // print the reading
reading = reading << 8; // shift high byte to be high 8 bits
Serial.println(reading); // print the reading
reading |= Wire.read(); // receive low byte as lower 8 bits
Serial.println(reading); // print the reading
}

delay(500); // wait a bit since people have to read the output :slight_smile:
}

Non maledire il sensore, potrebbe anche essere colpa tua no? Invece del codice che, se hai preso pari pari dal sito funziona di sicuro visto che sarà stato provato, perché non provi a postare il datasheet del sensore e lo schema di collegamenti che hai fatto, magari esce qualche piccola svista che giustifica tutto :)

Ho trovato solo questo in rete (http://www.robot-electronics.co.uk/htm/srf02tech.htm) ho trovato il collegamento e il programma nello stesso sito

Sì, ok, ma i tuoi collegamenti è possibile vederli o almeno puoi descrivere cosa e come hai collegato? Il programma senza modifiche come si comporta? Lo hai provato?

uso il tuo stesso sensore… qui il codice

#include <Wire.h>

#define srfAddress 0x70                           // Address of the SRF08
#define cmdByte 0x00                              // Command byte
#define rangeByte 0x02                            // Byte for start of ranging data

byte highByte = 0x00;                             // Stores high byte from ranging
byte lowByte = 0x00;                              // Stored low byte from ranging

void setup(){
  
  Serial.begin(9600);                             // Begins serial port for LCD_03
  Wire.begin();                               
  delay(100);     
}

void loop(){
  int rangeData = getRange();                     // Calls a function to get range
  Serial.println(rangeData);
 delay(100);
}

int getRange(){                                   // This function gets a ranging from the SRF08
  
  int range = 0; 
  
  Wire.beginTransmission(srfAddress);             // Start communticating with SRF08
 Wire.send(cmdByte);                             // Send Command Byte
  Wire.send(0x51);                                // Send 0x51 to start a ranging
  Wire.endTransmission();
  
  delay(300);                                     // Wait for ranging to be complete
  
  Wire.beginTransmission(srfAddress);             // start communicating with SRFmodule
  Wire.send(rangeByte);                           // Call the register for start of ranging data
  Wire.endTransmission();
  
  Wire.requestFrom(srfAddress, 2);                // Request 2 bytes from SRF module
  while(Wire.available() < 2);                    // Wait for data to arrive
  highByte = Wire.receive();                      // Get high byte
  lowByte = Wire.receive();                       // Get low byte

  range = highByte*256 + lowByte;              // Put them together
  
  return(range);                                  // Returns Range
}

a me da valori corretti (cambia solo il modo in cui sono “interpretati i due bytes”)

ps lo schema di collegamento è quello dell’srf08 pari pari.

Credo che il problema sia mio, ricevo numerosi errori provando il tuo programma...

prova ad usare il vecchio ide :wink:

BrainBooster: prova ad usare il vecchio ide ;)

Confermo nel il nuovo ide (l'1.0) c'è un bug che ti impedisce di spedire valori "int" con Wire.write()

Ciao, in effetti con il tuo programma ed il vecchio compilatore funziona tutto a meraviglia. Ti posso chiedere ancora una cosa? Come utlizzo più sensori? Ho già inserito in serie tutti i sensori ma non capisco se devo utilizzare un condensatore per sensore oppure no, inoltre come assegno indirizzi diversi a sensori diversi? Durante l'assegnazione dell'indirizzo devo isolare l'SDA o SCL degli altri sensori?

Grazie

nikel90:

BrainBooster: prova ad usare il vecchio ide ;)

Confermo nel il nuovo ide (l'1.0) c'è un bug che ti impedisce di spedire valori "int" con Wire.write()

Non è un bug, è cambiata la trasmissione dei dati.

Per quanto riguarda il mio problema?

Ciao ho aperto un thread proprio sopra il tuo per collegare tre srf 05 che dovrebbe essere lo stesso, …

Ciao a tutti, scrivo ancora qui per non riaprire un nuovo post. Premetto che non sono ancora riuscito a collegare più di un sensore. Ma l'attuale problema è diverso. Ho scritto durante le vacanze un programma per cambiare l'indirizzo al sensore SRF02.

Credo di aver fatto un pò di casino fatto stà che ora non ricordo che indirizzo avevo inserito. Esiste un modo per resettare il sensore???

Grazie

Mark116: Ciao a tutti, scrivo ancora qui per non riaprire un nuovo post. Premetto che non sono ancora riuscito a collegare più di un sensore. Ma l'attuale problema è diverso. Ho scritto durante le vacanze un programma per cambiare l'indirizzo al sensore SRF02.

Credo di aver fatto un pò di casino fatto stà che ora non ricordo che indirizzo avevo inserito. Esiste un modo per resettare il sensore???

Grazie

Hai provato a riprogrammarlo inserendo i valori che vedi nell'immagine del link? http://www.robot-electronics.co.uk/htm/srf02tech.htm

Grazie mille per la risposta, sono cmq riuscito a risolvere in un altro modo. Ho caricato in un ciclo tutti i possibili indirizzi e ho aspettato che trovasse quello giusto.

Mark116:
Grazie mille per la risposta, sono cmq riuscito a risolvere in un altro modo.
Ho caricato in un ciclo tutti i possibili indirizzi e ho aspettato che trovasse quello giusto.

Bene, l’importante è risolvere! :slight_smile:

Ciao ancora a tutti, oggi sto cercando (finalmente) di collegare più sensori in I2c.
Sto ancora utilizzando questa funzione

int s_address, range = 0;

s_address = US_Address(0, s);

Wire.beginTransmission(s_address) // Start communticating with SRF08
Wire.send(cmdByte); // Send Command Byte
Wire.send(0x51); // Send 0x51 to start a ranging
Wire.endTransmission();

delay(300); // Wait for ranging to be complete

Wire.beginTransmission(s_address); // start communicating with SRFmodule
Wire.send(rangeByte); // Call the register for start of ranging data
Wire.endTransmission();

Wire.requestFrom(s_address, 2); // Request 2 bytes from SRF module
while(Wire.available() < 2); // Wait for data to arrive
highByte = Wire.receive(); // Get high byte
lowByte = Wire.receive(); // Get low byte

range = highByte*256 + lowByte; // Put them together

return(range);

Ho notato che quando l’arduino non trova il sensore il programma si blocca.
Esiste un moto per esegure un controllo sulla connessione? Del tipo if(connessione == TRUE) allora esegui la funzione

Grazie