Carissimi,
Apro questo topic per chiedere un consiglio, visto che vorrei collegare Arduino UNO ad una cella di carico CP34 della Flintec, dotata di digitalizing unit e adattatore per conversione da RS422 a RS232.
Per semplicità allego l'immagine della digitalizing unit collegata all'adapter UA 77.1
Quello che mi lascia perplesso, anche perché ho contattato la ditta e non mi ha saputo rispondere, è l'aperaggio "max 60 mA".
Secondo voi che significa? Le chiavi di lettura sono due:
non è possibile collegare un alimentatore con un amperaggio superiore a 60 mA
il consumo massimo di corrente dell'unità è di 60 mA
Ho timore di danneggiare il tutto nel momento collegassi un alimentatore sbagliato, quindi preferisco chiedere a chi è più esperto di me.
Se si riferisce ai pin di alimentazione devi attaccare un alimentatore da almento 100mA o più.
Anche collegando un alimentatore da 3A il circuito assorbe solo la corrente necessaria al suo funzionamento senza fare danni.
Grazie tante per il chiarimento.
Intuivo fosse così, perché l'altra ipotesi non aveva senso, ma prima di bruciare tutto mi son voluto sincerare che non stessi prendendo un granchio.
Buongiorno a tutti,
Ho installato sull'arduino un adattatore max3232 e fatto dei test con uno sketch. Tutto funziona.
Parallelamente, ho collegato la cella di carico al PC e l'ho testata con Putty. Tutto funziona anche in questo caso.
Come ultimo test ho collegato Arduino tramite USB e max3232 allo stesso PC ed ho fatto un test di scambio dati tra Arduino IDE e Putty. Nessun problema.
Il problema sopraggiunge nel momento in cui tento di collegare la cella di carico ad Arduino ed è sicuramente legato alla mia scarsa conoscenza del protocollo seriale.
Prima di incollare lo sketch, spiego come voglio che il tutto funzioni.
L'Arduino UNO sarà collegato a (1) un PC tramite la classica porta USB e (2) una cella di carico tramite l'adattatore max3232. Il PC invierà, a cadenza periodica (stabilita dall'operatore), un comando ad Arduino (stringa "N"). Se il comando è corretto, l'Arduino provvederà a sua volta ad inviare un comando alla cella di carico. Il comando che sto provando nello sketch è "GN", che corrisponde a "get net", ossia legge il peso sulla cella di carico.
Utilizzando putty la risposta immediata della cella di carico la leggo sul display ed è composta da 8 caratteri.
Nel momento in cui provo ad utilizzare lo sketch, il risultato che ottengo equivale ad una serie di caratteri senza senso: ⸮⸮⸮º⸮rj@
Dov'è che sbaglio secondo voi?
La configurazione del software serial è corretta, altrimenti nel test con putty non avrebbe funzionato. Sto utilizzando le impostazioni di default del protocollo seriale (9600 e 8N1): le stesse che uso in Putty per comunicare con la cella, senza inciampare nel problema.
#include <SoftwareSerial.h>
SoftwareSerial RS232Serial(12, 13); //RX, TX
void setup() {
Serial.begin(9600);
RS232Serial.begin(9600);
}
void loop() {
if(Serial.available()){
String request = Serial.readStringUntil(13);
if (request[0] == 'N'){ // se il comando inviato ad arduino è N, prosegue inviando un ulteriore comando alla cella di carico
RS232Serial.println("GN"); // invia il comando "get net" alla cella di carico
delay(1000); // il delay è arbitrario, per ora ho messo 1 sec per sicurezza
char iData[8];
int iDataIndex = 0;
while(RS232Serial.available() > 0){
//Serial.println(iDataIndex);
iData[iDataIndex] = RS232Serial.read();
iDataIndex++;}
Serial.write(iData);
}
}
}
Dopo aver fatto alcuni test aggiungo un dettaglio molto importante.
Secondo me non sta leggendo dalla seriale a cui è connessa la cella di carico, da qui la serie di caratteri strani.
Non so se è un dettaglio importante, ma se collego la cella di carico a Putty ed invio il comando manualmente, la lettura della cella di carico appare sempre nella prima riga del terminale e va a sovrascrivere il testo già presete come se fosse in "overtype mode".
Probabilmente è errato lo script laddove comunica con la cella di carico per leggerne i dati?
Ciao. Non ho mai usato la RS232, quindi il mio appunto riguarda lo sketch senza averlo provato.
Nel ciclo che legge dalla RS232 come condizione verifichi solo la disponibilità di caratteri in entrata. Così però è rischioso perché se per qualche motivo arrivano troppi caratteri sfori oltre la capacità dell'array. Inoltre credo convenga anche qui identificare un carattere di fine trasmissione per essere sicuri che i dati arrivati siano completi e sensati.
Ciao, grazie per il consiglio. Il carattere di fine trasmissione è il punto ("."), però c'è anche da dire che il numero di caratteri inviati dalla cella di carico è sempre lo stesso e pari a 8.
Mi consigli quindi di fare un check sul carattere di fine trasmissione o controllare il numero di caratteri?
Il mio problema, comunque, allo stato attuale, consiste nella impossibilità di leggere dalla cella di carico e non riesco a capire come mai.
Magari mi sto ponendo problemi inutili, ma in linea di principio secondo me l'ideale sarebbe verificare entrambe le condizioni.
Cioè aspetti il carattere di fine trasmissione controllando di non ricevere più di 8 caratteri altrimeni sfori l'array.
In teoria:
se arrivato a 9 non trovi il punto vuol dire che c'è stato un problema nella trasmissione / ricezione
se arrivato al punto hai meno di 8 caratteri vuol dire che c'è stato un problema nella trasmissione / ricezione
Comunque, come prova potresti anche provare uno sketch semplice semplice in cui nel setup() mandi RS232Serial.println("GN") e nel loop() metti solo
if (RS232Serial.available() > 0){
Serial.println(RS232Serial.read(),HEX);
}
Ti ringrazio, sistemerò sicuramente lo sketch come suggerisci.
Seguendo il tuo secondo suggerimento, per ora ho fatto uno sketch semplice che si occupa di stampare in HEX quello che riceve dalla cella di carico.
La cosa strana è che riesco a ricevere una risposta dalla cella solo se utilizzo un cavo incrociato.
Se invece utilizzo una adattatore USB-Seriale per fare i test con il PC riesco a comunicare con la cella senza che io inserisca nel mezzo un cavo incrociato.
Però ricordo che quando montai la cella e la provai con il PC, feci un errore di collegamento ed invertii RX con TX: in tal caso il cavo USB-Seriale non funzionava.
Come mai per ottenere una risposta dalla cella, su arduino devo incrociare i cavi, mentre su PC funziona tutto senza porre un cavo incrociato nel mezzo?
Questi quesiti mi lasciano perplesso.
Ad ogni modo, andando per esclusione, ho quindi fatto una serie di test:
collegamento alla cella SENZA cavo incrociato - l'invio della richiesta non genera alcuna risposta
collegamento CON cavo incrociato - l'invio della richiesta genera una risposta, che però è incomprensibile
partendo dal test 2, ho scollegato il cavo incrociato dalla cella e non ottengo risposta
Un esempio di output che ottengo è il seguentre:
B5829AC2BAAA726A
Ho provato un convertitore HEX-to-ASCII di quelli che si trovano in rete, ma l'output è incomprensibile.
Dov'è che sbaglio secondo voi?
Spero di essere stato chiaro nell'esporre il problema.
Devo risolvere il problema per lavoro, ma mi sta tenendo bloccato da giorni.
Grazie in anticipo a chi proverà a darmi una mano.
Sulla parte hardware non sono pratico, quindi sui cavi non so che dire. Sospetto (ma è appunto solo un sospetto) che il pc risolva alcuni problemi per conto suo.
Riguardo i dati che ricevi, così al volo non ho trovato un senso...
Per fare un confronto prova a postare una serie di dati validi che ricevi con l'altro sistema.
Ho risolto il problema di connettività.
Nonostante l'adattatore RS232 che avevo comprato specificasse che non vi fosse alcuna distinzione nell'alimentazione tra 3.3 e 5 V, evidentemente qualche differenza c'è eccome.
Una volta spostata l'alimentazione su 5 V tutto ha cominciato a funzionare correttamente.
Ad ogni modo, ho modificato radicalmente lo script cercando di seguire il consiglio di fratt.
Non ho inserito il check sul carattere punto perché non saprei, ora come ora, come scriptarlo.
Il tempo di attesa tra l'invio della richiesta e la lettura è di 20 ms poiché da datasheet la cella di carico impiega 4 ms per rispondere. Mi sono tenuto quindi leggermente più largo.
Posto il codice chiedendo se secondo voi può essere in qualche modo ottimizzato.
Chiedo anche un altro ragguaglio.
La cella di carico può ricevere comandi per la tara e lo zero.
Se invio uno dei due comandi tramite Arduino, la risposta della cella di carico conferma l'esecuzione del comando. Tuttavia, alla prima lettura del peso netto, continua ad essere inclusa la tara.
Questo no succede se collego la cella di carico al PC con PuTTY; in altri termini, una volta effettuata la tara (comando ST), ad ogni richiesta di peso netto che invio (comando GN) ottengo la lettura corretta.
Il dubbio è: possibile che la tara si resetti se cessa la comunicazione tra Arduino e cella?
Forse PuTTY mantiene la connessione sempre aperta?
Se questo è plausibile, c'è modo di farlo anche con Arduino?
Ho risolto anche il problema relativo alla tara.
A quanto pare la cella di carico risponde in maniera differente a seconda che io utilizzi "\r" o"\n".
Ossia, per la tara devo usare "\r", mentre per la lettura del peso netto lo "\n".
La cosa simpatica è che questo non è indicato in alcun modo nella documentazione del produttore.