Salve a tutti, sto provando dei sensori a ultrasuoni, modello SRF02, con questa libreria http://www.grapelabs.org/arduino/libraries/srf02-ultrasonic-distance-sensor sono riuscito a cambiare l'indirizzo senza problemi, l'intoppo è che al momento della lettura della distanza mi viene restituito un valore coerente alla distanza ma a tale valore viene aggiunto il numero 40, ad esempio, se rileva 150 (cm) mi viene restituito 40150... ho provato con altri sensori (sempre SRF02) e il problema rimane.
Mi viene da dire che ho sicuramente sbagliato qualcosa nello sketch, so che è un attimo incasinato ma volevo gestire tre sensori montati su un rover, e prima di scrivere tutto il codice volevo assicurarmi che la lettura della distanza fosse ok:
//Sketch per il rover 4wd settato come cingolato
#include "Wire.h"
#include "SRF02.h"
SRF02 ussx(0x71, SRF02_CENTIMETERS);
SRF02 usfw(0x72, SRF02_CENTIMETERS);
SRF02 usdx(0x73, SRF02_CENTIMETERS);
int distfw = 0;
int distsx = 0;
int distdx = 0;
void setup() {
Serial.begin(9600); // Attiva la comunicazione I2C con i sensori us
Wire.begin();
}
void loop(){
avanti();
delay(1000);
}
void avanti(){
SRF02::update();
delay(100);
distsx = ussx.read();
if (distsx > 50)
{
Serial.print(distsx);
Serial.print(" Sopra i 50");
}
else
{
Serial.print(distsx);
Serial.print(" Sotto i 50");
}
}
E' piuttosto semplice: hai dichiarato int delle variabili che dovevano essere unsigned int
hsi quasi ragione
nel senso che originariamente avevo dichiarato la variabile come unsigned int ma mi aggiungeva questo 40 davanti, allora ho provato con un int (signed) ma mi sono dimenticato di riportare la variabile come in origine, cmq in entrambi i modi mi aggiunge questo 40... ps. uso l'ide 1.0.5
Edit: Ho notato che la prima lettura è corretta, cioè non mi mette il 40 davanti al valore letto, dalla seconda lettura in poi viene aggiunto questo 40.... Ora sto provando con unsigned int...
Grazie per la risposta
//Sketch per il rover 4wd settato come cingolato
#include "Wire.h"
#include "SRF02.h"
SRF02 ussx(0x71, SRF02_CENTIMETERS);
SRF02 usfw(0x72, SRF02_CENTIMETERS);
SRF02 usdx(0x73, SRF02_CENTIMETERS);
unsigned int distfw = 0;
unsigned int distsx = 0;
unsigned int distdx = 0;
void setup() {
Serial.begin(9600); // Attiva la comunicazione I2C con i sensori us
Wire.begin();
}
void loop(){
avanti();
delay(1000);
}
void avanti(){
SRF02::update();
delay(100);
distsx = ussx.read(); //da rivedere, come si passa la lettura a una variabile?
if (distfw > 40)
{
Serial.print(distsx);
Serial.print(" Sopra i 40");
}
else
{
Serial.print(distsx);
Serial.print(" Sotto i 40");
}
}
Ho tolto il ciclo if ed ho provato a stamapre via seriale la variabile distsx e il 40 è sparito, quindi sbaglio nel ciclo if...
Ti sei ricordato di modificare l'indirizzo di default (0x70) dei sensori? Direi di sì, altrimenti non funzionerebbe.
Prova anche ad inserire un intervallo di letture (sull'esempio è indicato setInterval(500))
Si l'indirizzo è settato all'inizio del listato, sono anche riuscito a cambiare loro l'indirizzo, l'intervallo di default è settato a 70ms, infatti ho dato un delay di 100 ms, la cosa strana è però che se stampo il valore letto è ok, se invece lo stampo nell' if mi aggiunge questo 40 davanti.
L' if di cui parlo è questo
if (distfw > 40)
{
Serial.print(distfw);
Serial.print(" Sopra i 40");
}
else
{
Serial.print(distfw);
Serial.print(" Sotto i 40");
}
contenuto in questa funzione
void avanti(){
SRF02::update();
delay(100);
distfw = usfw.read(); // assegna alla varibile la lettura del sensore us
if (distfw > 40)
{
Serial.print(distfw);
Serial.print(" Sopra i 40");
}
else
{
Serial.print(distfw);
Serial.print(" Sotto i 40");
}
}
Ok sono un deficente, praticamente quando scriveva sopra i 40 (o sotto i 40) mi scriveva il valore letto successivamente attaccato quindi mi veniva fuori una cosa del tipo: 50 sopra i 4045 sopra i 40....
Scusate per il disturbo specialmente a cyberhs, per il tempo dedicato.... 