Buongiorno a tutti, mi presento sono Alessandro.
Tutt'altro che esperto; sono siciliano; ho qualche base di elettronica e telecomunicazioni; arduino per me è un hobby, o meglio lo è da un mesetto
Ho un arduino UNO + ETH shield. la mia necessità è quella di leggere il livello di un sebatoio d'acqua da 3000lt. Ho valutato interruttori galleggianti, resistenze in serie, ecc.ecc per poi scegliere un sensore ad ultrasuoni... Mi sono detto, misuro la distanza a serbatoio vuoto e a serbatoio pieno e tramite delle conversioni mi calcolo quanta acqua ho!
Usando un HC-SR04 e la libreria di arduino il sistema funziona, sul monitor seriale leggo i valori di distanza senza problemi con un semplice sketch...E qui viene il bello, per sgravare arduino dai calcoli, per poter passare due cavi in meno e impegnare un solo PIN, ho comprato questo
Che altro non è che un sensore ad ultrasuoni che comunica i dati già belli e pronti in seriale...
Un inferno! Non sono riuscito a fargli sputare fuori altro che un 255 e un -1!
Per adesso potrebbe bastarmi leggere i dati e farli comparire sul serial monitor, nient'altro! ma adesso sono proprio impallato, ho letto di array dove memorizzare i dati, serial.flush, newserial, mi sono riempito la testa =(
Visto che sono testardo e non sono un tipo da "non ci resta che piangere", chiedo aiuto a voi che sicuramente riuscirete a sbloccarmi in 10min, l'esperienza paga e la competenza anche
Spero di non avervi tediato con i miei problemi e spero anche di risolverli.
Ciao a tutti.
Grazie.
Buongiorno a tutti e buon Ferragosto.
Mi chiedevo come mai nessuna risposta dopo 4gg, allora mi sono andato a rileggere la guida ufficiale di arduino di Massimo Banzi, al paragrafo come chiedere aiuto, e ho capito! Manca il codice! La community è come arduino, senza codice non va...
Io non ho messo codice perchè ne ho provati a decine! Dal più banale
Che mi serviva solo a verificare che il sensore funzionasse!
Il risultato sul serial monitor del precedente codice sono una serie di numeri negativi, prevalentemente -1 e qualche raro numero positivo...
Io penso che bisognerebbe far riempire la matrice delle letture, con un codice, che si attivi solo alla ricezione del bit di start(dal datasheet 0xFF), ma ho provato in mille modi.
Per altro da quanto ho letto si potrebbe anche pensare ad un codice che attivi il sensore(un digitalWrite(VccSensore, HIGH)) per 1 secondo(il ciclo di misurazione dovrebbe durare 50ms) legge i dati e poi lo mette in LOW.
Grazie comunque, se non altro per lo sfogo(che segue...)
Sto maledetto sensore sensore di bip....Lo schiaccerei sotto i piedi, bip bip... XD
Modifica da "char buffer[9] ;" a "unsigned char buffer[9], uno char può essere sia un carattere ASCII che un numero con valore compreso tra -128 e +127, nel tuo caso devi leggere solo valori positivi compresi tra 0 e 255, quindi devi usare un "unsigned char", cioè un valore puramente numerico senza segno.
Ciao,
i link degli esempi non mi si aprono, però dalle specifiche mi pare di capire che questo modulino invia sulla seriale 4 byte ogni 50 ms, così composti:
inizio: 0xFF
H_data
L_data
-CheckSum
A cosa ti serve un array di 9 elementi?
Comunque per cominciare potresti agire in questo modo:
Stai in ascolto sulla seriale (Serial.available() > 0)
Per semlicità puoi anche crearti 4 variabili anzichè l'array e leggerle così
c'è da capire poi l'interpretazione da dargli, visto che dicono che ha una risoluzione di 0.3 cm
Dovresti fare il controllo se il CheckSum è corretto, però per il momento evita questa parte
Ultima cosa: sei sicuro di aver collegato il pin Tx del sensore sul pin Rx di Arduino (e non su RX)?
P.S.: il tuo codice ha un po' di problemi, il principle è il delay a 5 secondi, che sicuramente ti fa perdere l'evento di ricezione dei dati, per sapere quando c'è qualcosa di nuovo sulla seriale usa il comando Serial.available() > 0 ed elimina il delay.
Grazie ad entrambi per le risposte .
astrobeed:
Ho cambiato il tipo di variabile, in unsigned char, i dati stampati sul serial monitor hanno cambiato segno, ma non senso... XD
Questo spezzone di codice in realtà è solo servito a verificare che comunque il sensore sti benedetti dati li sputa fuori...
Federico Vanzati:
In effetti i link non sono degli esempi, adesso non si aprono, ma quando si aprivano erano soltanto le immagini del modulo.
Le specifiche dicono chiaramente quanto da te riportato e l'array di 9 elementi è spuntato solo dopo che l'array da 4 si riempiva di -1, allora ho ingrandito solo per vedere cosa succedeva. Non sono un programmatore, di codice ne capisco poco ma l'esempio postato è stato solo l'ultima prova fatta...
anche il ritardo di 5 secondi, l'ho messo perchè senza mettere niente mi impallava tutto, ma ripeto era solo per vedere un risultato più concreto dei 255 o -1 visti finora.
Questo non l'ho capito... Il sensore è collegato al pin "0" di arduino(per la precisione RX<-0).
AlexP1:
Ho cambiato il tipo di variabile, in unsigned char, i dati stampati sul serial monitor hanno cambiato segno, ma non senso... XD
Questo spezzone di codice in realtà è solo servito a verificare che comunque il sensore sti benedetti dati li sputa fuori...
Sono senza senso perché non interpreti il pacchetto dati, il sensore invia una sequenza di 4 byte ogni 50 ms.
Il primo byte è sempre 0xff e serve per sincronizzare la ricezione, il secondo e il terzo byte costituiscono i due byte di un numero intero, il quarto byte è un checksum utile per verificare se il pacchetto è stato ricevuto in modo corretto.
Per ricavare la distanza devi usare solo i due byte centrali del pacchetto per ottenere un singolo valore intero (max 65536) in questo modo:
unsigned int distanza;
distanza = (unsigned int)buffer[1] << 8; // è indispensabile l'uso del cast perchè buffer[] è un variabile byte
distanza += buffer[2];
Ovviamente devi prima ricevere tutti i quattro byte per poter ricomporre il valore della distanza, dopo di che ricominci a riscrivere il buffer partendo da 0, usa il valore 0xff per sincronizzare l'operazione.
Quell'esempio l'ho già visto e provato...
Non funziona, non entra mai nel if Serial.available() >0!
Sono sicuro di questo perchè, se mando dei dati tramite il serial monitor arduino risponde con "I received: "valore ascii del pulsante della tastiera" e poi riceve anche un "10" che presumo sia l'invio.
Ho provato a mandare dei numeri col serial monitor ed il sensore collegato e, oltre a rispondere come sopra, aggiunge una serie di numeri...
Ho provato il consiglio che mi hai dato nella prima risposta, anche li non riesce a passare il serial.available.
non ci sono trucchi, vuol dire che non si è riempito il buffer sulla seriale.
Però se dici che arduino poi ti risponde, allora vuol dire che ci entra!
Magari la serie di numeri che aggiunge sono la risposta del sensore.
Sappi che se alla seriale colleghi il sensore l'unico input che ha Arduino è il sensore...perdi l'utilizzo della tastiera del pc. Non ne sono per niente sicuro, però stai usando la seriale per fare due cose:
comunicazione tra Arduino e PC
cominucazione Arduino e Sensore.
Generalmente questa cosa non è possibile perchè il tipo di comunicazione seriale utilizzata può avvenire solo tra 2 devices, ma è anche vero che il sensore trasmette soltanto e su arduino rimane libero il pin Tx per l'output su terminale. Non dovrebbero esserci problemi.
Volendo però potresti provare anche la liberia NewSoftSerial che emula una seriale su altri 2 pin, così ne hai a disposizione 2 separate per le due comunicazioni.
Non deve fare niente! Non deve fare niente! Eppure non funziona, il serial monitor se ne sta aperto per ore senza spuntare nulla!
Come detto in precedenza, il serial monitor sta fermo e zitto, il led rx su arduino ciclicamente da dei segni di vita, quindi il sensore manda i suoi dati.
Se contemporaneamente mando un dato dalla tastiera il serial monitor mi ritorna il valore ascii del carattere, più una serie di numeri che di sicuro vengono dal sensore, ma questo avviene solo quando a verificare la condizione di serial.available sono io con la tastiera.
Come ti ha detto Federico, non puoi usare lo stesso canale seriale per leggere il sensore e per dialogare col computer. E' come usare un vecchio telefono duplex, quando la linea l'aveva quello accanto a te, tu avevi il telefono muto
Devi separare i 2 canali: usi quello HW (pin 0 e 1 dell'Arduino) per comunicare con il PC e poi ne crei uno SW con NewSoftSerial per leggere il tuo sensore.
leo72:
Come ti ha detto Federico, non puoi usare lo stesso canale seriale per leggere il sensore e per dialogare col computer.
Nel caso specifico si può fare perché viene usato Rx di Arduino per ricevere i dati dal sensore e Tx, sempre di Arduino, per inviare i dati verso il pc.
Da notare che l'FTDI, o l'8u2 a seconda della scheda, è collegato con Rx e Tx tramite delle resistenze di disaccoppiamento che rendono primaria la connessione esterna rispetto alla USB.
Quello che è strano è che riesce a ricevere dati dal terminale seriale, se le connessioni sono giuste è impossibile perché la linea Rx viene tenuta a 1 logico fisso, in idle, dal sensore e l'interfaccia USB non può commutarla verso lo 0 logico con il sensore collegato.
superlol:
ora sinceramente non puoi usare seriale e usb insieme devi per forza usare la softserial (o newsoftserial che è meglio).
Ho già spiegato che nel suo caso non ci sono problemi per utilizzare la seriale in contemporanea sia per ricevere i dati dal sensore che per reinviarli al pc-
inoltre sicuro che non sia perchè l'acqua non riflette gli ultrasuoni ma bensì li accelera?
Buongiorno a tutti.
Stamattina ho ripreso a lavorare a questo dannato progetto...
Inizio con il ringraziarvi tutti. Poi preciso che, il dispositivo per adesso non misura acqua(cosa che farà dopo aver passato tutti i test...), ma misura 30cm di distanza(misurata con tanto di metro...) da lui ad un pezzo di lamiera.
Le cose sono un po' cambiate... Intanto la condizione di serial.available viene verificata e sul serial monitor vengono fuori una bella sfilza di numeri(e lettere...).
Tuttavia non è il giusto risultato... Questo credo sia dovuto ad un problema di sincronia, infatti guardando i serial.print si trovano spesso degli "FF" nella colonna che spetterebbe ad Hdata e poi parecchie righe risultano uguali, segno che l'arduino legge tanto velocemnte da leggere gli stessi dati due volte e assegna malamente i valori alle variabili.
Ho anche cercato di usare un
Se imposti a 9600, l'Arduino non può leggere troppo velocemente.
Il sensore ho letto (traducendo dal cinese) che restituisce la distanza in mm dell'ostacolo, quindi 30 cm=300 mm per cui dovresti avere H_DATA pari a 1 (0x01) e L_DATA intorno a 40-50 (0x28-0x32).
Prova mettendo un controllo per iniziare la lettura dei dati solo quando il carattere che appare nel buffer di ricezione è 0xFF (anche se potresti riceve L-DATA pari a $FF e sfalsarti questa cosa).
byte temp;
if (mySerial.available) {
temp=mySerial.read();
if (temp==0xFF) {
//leggi gli altri byte
}
}