Salve a tutti, Come capirete da questo post sono totalmente alle prime armi nella programmazione di arduino, lo uso molto tramite Max e normalmente quando mi sono trovato a programmare direttamente lui mi sono basato su libri e cercando conversazioni su vari forum.
Il Problema e' che questa cosa e' talmente basilare che non riesco a trovarla da nessuna parte...
Ho comprato 2 sensori DYP ME007TX che sono sensori di prossimita, volevo leggerne il valore e con Max creare una specie di Theremin.
Grazie a questo articolo Arduino Forum sono riuscito ad ottenere un input seriale riguardo alla distanza e ad utilizzarlo con Max... magnifico; il problema e' che a me serve leggere 2 sensori, ho provato in vari modi ma non ci riesco!!!
Un sensore e' collegato sul pin digitale 3, il secondo sul 5.
Chiedo Umilmente aiuto!!! posto anche uno sketch contenente un mio tentativo fallito di risoluzione del problema, cosi' da sorbirmi costruttivi insulti XD
Questo e' lo sketch funzionante che mi restituisce un valore riguardo alla distanza in cm dal sensore. Il seriale che rientra ha la tag "distanza cm" a me interessava ottenere 2 valori da 2 sensori, (distanza1 cm) (distanza 2 cm)
/*sketch di lettura dei dati dal sensore DYP-ME007TX, sensore ad ultrasuoni che trasmette i dati direttamente
in seriale utilizzando lo schema
1st Byte : 0xFF (Start bit, Fixed value)
2ed Byte: H_Data (High 8 bit of the distance)
3rd Byte: L_Date (Low 8 bit of the distance)
4th Byte: Check Sum (0XFF+H_DATA+L_DATA=SUM, Check SUM is the low 8 bit of the SUM)
Dal datasheet sappiamo che il sensore completa il ciclo di invio di 4 byte in 50ms.
*/
#include <SoftwareSerial.h> //usiamo la libreria NewSoftSerial, ci permetterà di creare
//una porta seriale usando due pin digitali qualsiasi di arduino.
SoftwareSerial mySerial(3, 4); //creiamo la nostra nuova porta seriale "mySerial"
//e associamo 2 a RX e 3 a TX.
byte BITSTART = 0;
byte Hdata = 0; //inizializziamo le variabili necassarie,
byte Ldata = 0; //come da datasheet del sensore, Hdata e Ldata
byte CHKS = 0; //sono le letture che più ci interessano perchè
byte temp = 0; //contengono la distanza.
void setup() {
Serial.begin(9600); //inizializziamo la porta seriale di arduino per ricevere i dati a 9600bps
mySerial.begin(9600); //inizializziamo la seriale creata tramite la libreria newsoftserial a9600bps
}
void loop() {
if (mySerial.available() >= 4){ //verifichiamo che nel buffer seriale siano presenti i 4 byte mandati dal sensore
temp = mySerial.read(); //se si verifica la condizione leggiamo il primo byte e lo memorizziamo su temp
if (temp==0xFF) { //solo se leggiamo "0xFF" continuiamo la letture degli altri byte
BITSTART = temp;
Hdata = mySerial.read(); //continua la lettura e assegna alle
Ldata = mySerial.read(); //variabili le letture successive.
CHKS = mySerial.read(); //è il byte di checksum, da datasheet gli ultimi 8 bit della somma tra BITSTART, Hdata, Ldata.
mySerial.flush(); //svuotiamo il buffer della porta seriale per sicurezza
unsigned int misura = Hdata << 8; //facciamo un cast della misura e spostiamo verso sinistra di 8 posizioni il valore di Hdata(bit shifting).
misura = misura | Ldata; //uniamo Hdata e Ldata
unsigned int SUM = (BITSTART + Hdata + Ldata); //sommiamo le tre variabili BITSTART + Hdata + Ldata e le immagazziniamo sull'intero SUM
if (lowByte(SUM) == CHKS) { //verifichiamo che gli 8 bit più a destra coincidano col valore della variabile CHKS
//così verifichiamo che la trasmissione sia avvenuta senza errori.
Serial.print("distanza (cm): "); //stampa sul serial monitor il testo tra "".
Serial.println(misura/10); //stampa il valore della variabile misura dividendola per 10, ovvero convertendola in centimetri.
delay(10); //rimani fermo per 5 secondi.
}
}
}
}
Mentre Quest' altro e' stato il mio tentativo fallimentare di risoluzione del problema, compila ma da arduino non ritorna nulla:
/*sketch di lettura dei dati dal sensore DYP-ME007TX, sensore ad ultrasuoni che trasmette i dati direttamente
in seriale utilizzando lo schema
1st Byte : 0xFF (Start bit, Fixed value)
2ed Byte: H_Data (High 8 bit of the distance)
3rd Byte: L_Date (Low 8 bit of the distance)
4th Byte: Check Sum (0XFF+H_DATA+L_DATA=SUM, Check SUM is the low 8 bit of the SUM)
Dal datasheet sappiamo che il sensore completa il ciclo di invio di 4 byte in 50ms.
*/
#include <SoftwareSerial.h> //usiamo la libreria NewSoftSerial, ci permetterà di creare
//una porta seriale usando due pin digitali qualsiasi di arduino.
SoftwareSerial mySerial(3, 4); //creiamo la nostra nuova porta seriale "mySerial"
//e associamo 2 a RX e 3 a TX.
SoftwareSerial mySerial2(5, 6); //creiamo la nostra nuova porta seriale "mySerial"
//e associamo 2 a RX e 3 a TX.
byte BITSTART = 0;
byte Hdata = 0; //inizializziamo le variabili necassarie,
byte Ldata = 0; //come da datasheet del sensore, Hdata e Ldata
byte CHKS = 0; //sono le letture che più ci interessano perchè
byte temp = 0; //contengono la distanza.
void setup() {
Serial.begin(9600); //inizializziamo la porta seriale di arduino per ricevere i dati a 9600bps
mySerial.begin(9600); //inizializziamo la seriale creata tramite la libreria newsoftserial a9600bps
mySerial2.begin(9600); //inizializziamo la seriale creata tramite la libreria newsoftserial a9600bps
}
void loop() {
if (mySerial.available() >= 4){ //verifichiamo che nel buffer seriale siano presenti i 4 byte mandati dal sensore
temp = mySerial.read(); //se si verifica la condizione leggiamo il primo byte e lo memorizziamo su temp
if (temp==0xFF) { //solo se leggiamo "0xFF" continuiamo la letture degli altri byte
BITSTART = temp;
Hdata = mySerial.read(); //continua la lettura e assegna alle
Ldata = mySerial.read(); //variabili le letture successive.
CHKS = mySerial.read(); //è il byte di checksum, da datasheet gli ultimi 8 bit della somma tra BITSTART, Hdata, Ldata.
mySerial.flush(); //svuotiamo il buffer della porta seriale per sicurezza
unsigned int misura = Hdata << 8; //facciamo un cast della misura e spostiamo verso sinistra di 8 posizioni il valore di Hdata(bit shifting).
misura = misura | Ldata; //uniamo Hdata e Ldata
unsigned int SUM = (BITSTART + Hdata + Ldata); //sommiamo le tre variabili BITSTART + Hdata + Ldata e le immagazziniamo sull'intero SUM
if (lowByte(SUM) == CHKS) { //verifichiamo che gli 8 bit più a destra coincidano col valore della variabile CHKS
//così verifichiamo che la trasmissione sia avvenuta senza errori.
Serial.print("distanza (cm): "); //stampa sul serial monitor il testo tra "".
Serial.println(misura/10); //stampa il valore della variabile misura dividendola per 10, ovvero convertendola in centimetri.
delay(10); //rimani fermo per 5 secondi.
if (mySerial2.available() >= 4){ //verifichiamo che nel buffer seriale siano presenti i 4 byte mandati dal sensore
temp = mySerial2.read(); //se si verifica la condizione leggiamo il primo byte e lo memorizziamo su temp
if (temp==0xFF) { //solo se leggiamo "0xFF" continuiamo la letture degli altri byte
BITSTART = temp;
Hdata = mySerial2.read(); //continua la lettura e assegna alle
Ldata = mySerial2.read(); //variabili le letture successive.
CHKS = mySerial2.read(); //è il byte di checksum, da datasheet gli ultimi 8 bit della somma tra BITSTART, Hdata, Ldata.
mySerial2.flush(); //svuotiamo il buffer della porta seriale per sicurezza
unsigned int misura = Hdata << 8; //facciamo un cast della misura e spostiamo verso sinistra di 8 posizioni il valore di Hdata(bit shifting).
misura = misura | Ldata; //uniamo Hdata e Ldata
unsigned int SUM = (BITSTART + Hdata + Ldata); //sommiamo le tre variabili BITSTART + Hdata + Ldata e le immagazziniamo sull'intero SUM
if (lowByte(SUM) == CHKS) { //verifichiamo che gli 8 bit più a destra coincidano col valore della variabile CHKS
//così verifichiamo che la trasmissione sia avvenuta senza errori.
Serial.print("distanza2 (cm): "); //stampa sul serial monitor il testo tra "".
Serial.println(misura/10); //stampa il valore della variabile misura dividendola per 10, ovvero convertendola in centimetri.
delay(10); //rimani fermo per 5 secondi.
}
}
}
}
}
}
}
Vi Ringrazio in anticipo per l'aiuto =(