Salve ragazzi,
non riesco a far funzionare il sensore a ultrasuoni a 3 pin ME007TX.
La cosa buffa e' che ne ho 2 e non funzionano.
Mi sembra strano che siano tutti 2 bruciati.
Questo e' il mio codice e ritorna sempre 0.
Consigli?
//HC RS04 Sensore ultrasuoni
//Giuseppe Caccavale
const int triggerPort = 9;
const int echoPort = 10;
const int led = 13;
void setup() {
pinMode(triggerPort, OUTPUT);
pinMode(echoPort, INPUT);
pinMode(led, OUTPUT);
Serial.begin(9600);
Serial.print( "Sensore Ultrasuoni: ");
}
void loop() {
//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );
long durata = pulseIn( echoPort, HIGH );
long distanza = 0.034 * durata / 2;
Serial.print("distanza: ");
//dopo 38ms è fuori dalla portata del sensore
if( durata > 38000 ){
Serial.println("Fuori portata ");
}
else{
Serial.print(distanza);
Serial.println(" cm ");
}
if(distanza < 10){
digitalWrite(led, HIGH);
}
else{
digitalWrite(led, LOW);
}
//Aspetta 1000 microsecondi
delay(1000);
}
Non un elettronico ma basta leggere che quei sensori sono a trasmissione SERIALE e NON i classici ultasonic con i pin echo e trigger.
Quindi NON usare quella libreria.
nid69ita:
Non un elettronico ma basta leggere che quei sensori sono a trasmissione SERIALE e NON i classici ultasonic con i pin echo e trigger
e quale codice mi consigli?
Ne ho provati alcuni ma tutti OUT OF RANGE
NON è il solito ultrasonic !!
Perchè comprare un sensore senza avere info dal venditore ? Hai un link a dove hai comprato ?
Qui forse hanno risolto:
http://forum.arduino.cc/index.php?topic=88388.msg798351#msg798351
nid69ita:
NON è il solito ultrasonic !!
Perchè comprare un sensore senza avere info dal venditore ? Hai un link a dove hai comprato ?
Qui forse hanno risolto:
Ultrasonic Sensor single pin TR - #9 by Joaoffr - Sensors - Arduino Forum
ti ringrazio tantissimo mi sei stato d'aiuto, ora legge qualcosa 
Ragazzi,
ogni tanto vedo che legge qualche valore strano specialmente se alimento arduino con una batteria a 9 volt.
Con la presa usb del pc sembra stabile anche se ogni 10 secondi circa salta qualche valore pazzerello... come mai?
Batteria 9V= 350mAh gia solo Arduino ciuccia 450/500mA
Le batterie da 9V fanno cacare. Prova solo con 4 stilo 1,5 e già dovrebbe migliorare
nid69ita:
Batteria 9V= 350mAh gia solo Arduino ciuccia 450/500mA
Le batterie da 9V fanno cacare. Prova solo con 4 stilo 1,5 e già dovrebbe migliorare
ecco questione di amper quindi.
Grazie mille nid 
nid69ita:
Batteria 9V= 350mAh gia solo Arduino ciuccia 450/500mA
Le batterie da 9V fanno cacare. Prova solo con 4 stilo 1,5 e già dovrebbe migliorare
scusami ancora, ma sembra aver comunque problemi.
Sto alimentando tutto con un alimentatore 9v e 1A ma ogni tanto con intervalli anche du 5-10 minuti segnala qualcosa come se ci fosse una mosca che girasse ma non c'e' nulla neanche i fantasmi!
Ecco il codice:
#include <VirtualWire.h>
#define TX_pin 12
#define LED_pin 13
//#define PB_pin 3
int prec_Stato=-1;
const char *msg_ON = "LED_ON";
const char *msg_OFF = "LED_OFF";
//SENSOR
#include <SoftwareSerial.h>
// TX_PIN is not used by the sensor, since that the it only transmits!
#define PING_RX_PIN 6
#define PING_TX_PIN 7
SoftwareSerial mySerial(PING_RX_PIN, PING_TX_PIN);
long inches = 0, mili = 0;
byte mybuffer[4] = {0};
byte bitpos = 0;
//END SENSOR
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
pinMode(LED_pin,OUTPUT);
digitalWrite(LED_pin, LOW);
vw_set_tx_pin(TX_pin); // Imposto il pin per la trasmissione
vw_setup(3000); // Bits per sec
}
int getDistance()
{
bitpos = 0;
while (mySerial.available()) {
// the first byte is ALWAYS 0xFF and I'm not using the checksum (last byte)
// if your print the mySerial.read() data as HEX until it is not available, you will get several measures for the distance (FF-XX-XX-XX-FF-YY-YY-YY-FF-...). I think that is some kind of internal buffer, so I'm only considering the first 4 bytes in the sequence (which I hope that are the most recent! :D )
if (bitpos < 4) {
mybuffer[bitpos++] = mySerial.read();
} else break;
}
mySerial.flush(); // discard older values in the next read
mili = mybuffer[1]<<8 | mybuffer[2]; // 0x-- : 0xb3b2 : 0xb1b0 : 0x--
inches = 0.0393700787 * mili;
return mili/10;
}
void loop()
{
int buttonState = 0;
if (getDistance() <= 130)
{
buttonState = 1;
} else
{
buttonState = 0;
}
if (buttonState==HIGH)
{
// Serial.println("ACCENDO");
vw_send((uint8_t *)msg_ON, strlen(msg_ON));
}
else
{
// Serial.println("SPENGO");
vw_send((uint8_t *)msg_OFF, strlen(msg_OFF));
}
///// vw_wait_tx(); // Aspetta che il processo in background di spedizione sia completo
digitalWrite(LED_pin, buttonState);
prec_Stato=buttonState;
delay(1000);
}
Il codice controlla la distanza se e' minore di 130 accende il led sul ricevitore di un altro arduino.
Come vedete tutto il loop ha 1000 millisecondi di delay.
Cosa potrebbe essere questa instabilita?
ho provato con un altro sensore.. sembra ok... strano pero'
Sicuro di non aver cambiato nulla ?
Prova a controllare tra i due moduli le saldature dei pin
nid69ita:
Sicuro di non aver cambiato nulla ?
Prova a controllare tra i due moduli le saldature dei pin
sono identici.
Ho levato e messo l'altro e sembra non avere sbalzi.
Le saldature sembrano ok su entrambi
Allora il primo è posseduto da un fantasma 
Scherzo. Boh, prova a controllarli con una lente di ingrandimento, se magari trovi qualche componente non ben saldato.
nid69ita:
Allora il primo è posseduto da un fantasma 
Scherzo. Boh, prova a controllarli con una lente di ingrandimento, se magari trovi qualche componente non ben saldato.
mannaggia sta facendo il pazzo anche questo! Pero con meno frequenza rispetto l'altro.
Possibile??? Eppure lo alimento a 5v diretto.
Possibile e' problema di comunicazione o codice?
Non lo fa sempre lo fa ad intervalli anche lontani.
Ho 2 arduini. Uno ha il sensore ultrasuoni dove se la distanza e' minore di tot manda il segnale al ricevitore per accendere un led e muovere un motorino.
TI posto il codice aggiornato solo del trasmettitore, dovrebbe bastare:
#include <VirtualWire.h>
#define TX_pin 12
#define LED_pin 13
int prec_Stato=-1;
const char *msg_ON = "LED_ON";
const char *msg_OFF = "LED_OFF";
//SENSOR
#include <SoftwareSerial.h>
// TX_PIN is not used by the sensor, since that the it only transmits!
#define PING_RX_PIN 6
#define PING_TX_PIN 7
SoftwareSerial mySerial(PING_RX_PIN, PING_TX_PIN);
long inches = 0, mili = 0;
byte mybuffer[4] = {0};
byte bitpos = 0;
//END SENSOR
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
pinMode(LED_pin,OUTPUT);
digitalWrite(LED_pin, LOW);
vw_set_tx_pin(TX_pin);
vw_setup(6000);
}
int getDistance()
{
bitpos = 0;
while (mySerial.available())
{
if (bitpos < 4)
{
mybuffer[bitpos++] = mySerial.read();
} else break;
}
mySerial.flush(); // discard older values in the next read
mili = mybuffer[1]<<8 | mybuffer[2];
inches = 0.0393700787 * mili;
return mili/10;
}
void loop()
{
int buttonState = 0;
Serial.println(getDistance());
if (getDistance() <= 100)
{
// Serial.println("ACCENDO");
vw_send((uint8_t *)msg_ON, strlen(msg_ON));
digitalWrite(LED_pin, 1);
} else
{
// Serial.println("spengo");
vw_send((uint8_t *)msg_OFF, strlen(msg_OFF));
digitalWrite(LED_pin, 0);
}
// vw_wait_tx(); // Aspetta che il processo in background di spedizione sia completo
delay(1000);
}
cosa sbaglio?
Non posso fare prove non avendo quel modulo. Non mi pare ci siano errori.
Però, per essere sicuri, avendo 2 sketch, prova a "spegnere" il trasmittente e lasciare acceso solo il ricevente.
Non dovrebbe MAI ricevere nulla. Se riceve qualcosa... è il ricevente a vedere i fantasmi 
a parte che mi sembra anche quasi normale che un sensore da due lire ogni tanto dia di matto.....
in quello sketch viene fatto l'input dei 4 byte che il sensore invia, ma non vengono controllati se sono corretti
( 4 ° byte=checksum )
quindi aggiungerei almeno questo controllo, perlomeno siamo sicuri che non dipende da un'errata lettura della seriale
mili = mybuffer[1] << 8 | mybuffer[2];
unsigned int chk_sum = (mybuffer[0] + mybuffer[1] + mybuffer[2] );
if (lowByte(chk_sum) == mybuffer[3] ) {
// il dato è corretto
}
else {
//il dato non è corretto
}
Mi sembra strano che possa essere il ricevitore anche perche il comando di accensione sta in un IF dove legge esattamente il valore stringa del comando ricevuto:
#include <Servo.h>
#include <VirtualWire.h>
#define LED_pin 13
#define RX_pin 11
int flagon = 0;
Servo myservo;
int pos = 0;
void setup()
{
pinMode(LED_pin, OUTPUT);
digitalWrite(LED_pin, LOW);
vw_set_rx_pin(RX_pin);
vw_setup(6000);
vw_rx_start();
myservo.attach(7);
Serial.begin(9600);
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
buf[buflen]='\0';
//Serial.print("Comando Ricevuto (" +String(buflen)+" car.): ");
//Serial.println((char *)buf+String("//"));
if (strncmp((char *)buf,"LED_ON",buflen)==0)
{
//ACCENDO LED
//Serial.println("ACCENDO");
flagon = 1;
myservo.write(0);
digitalWrite(LED_pin, HIGH);
}
if (strncmp((char *)buf,"LED_OFF",buflen)==0)
{
//SPENGO LED
if (flagon ==0)
{
// Serial.println("SPENGO");
myservo.write(170);
digitalWrite(LED_pin,LOW);
} else
{
//Serial.println("SPENGO TIMER");
delay(25000);
myservo.write(170);
digitalWrite(LED_pin,LOW);
}
flagon = 0;
}
}
}
Dovrei provare il controllo che ha suggerito Brunello... magari risolve il problema 
Stai usando dei moduli radio che potrebbero ricevere anche interferenze. Quello che ti ho detto io di provare è spegnere il trasmittente, perchè ?
Perchè il ricevente potrebbe riceve qualcosa ma NON dal tuo trasmittente ma da qualche altra apparecchiatura, quindi un segnale di disturbo. Certamente il controllo che ti ha detto @Brunello ti dovrebbe risolvere.
nid69ita:
Stai usando dei moduli radio che potrebbero ricevere anche interferenze. Quello che ti ho detto io di provare è spegnere il trasmittente, perchè ?
Perchè il ricevente potrebbe riceve qualcosa ma NON dal tuo trasmittente ma da qualche altra apparecchiatura, quindi un segnale di disturbo. Certamente il controllo che ti ha detto @Brunello ti dovrebbe risolvere.
provato sembra essere solo il trasmettitore.
Con il loop di 1 secondi ogni tanto spara qualche valore nonostante e' stato aggiunto il controllo di brunello dove se il valore e' errato mi ritorna comunque un valore sopra i 200:
248
248
--->117
249
248
249
249
248
--->118
249
249
249
248
248
249
248
248
248
248
288
249
249
248
248
248
248
248
248
249
249
--->118
248
248
248
248
248
248
249
248
248
248
248
248
248
249
248
249
249
248
249
248
249
--->100
248
248
249
249
249
248
249
Anzi no ragazzi!
Ho riprovato e ogni tanto mi segna tipo -986!