Arduino Leonardo non comunica in seriale

Ciao a tutti! Sto ancora lavorando a una scheda con l atmega 32u4 che dovrebbe funzionare più o meno come arduino Leonardo, infatti i programmi li faccio con l ide, li compilo come arduino Leonardo e uploado i .hex tramite avrdude. Il problema che sto avendo adesso come da titolo è la comunicazione seriale. La board è alimentata da arduino quindi i GND sono collegati, connetto tx a rx e rx a tx, lancio i classici Serial.read e Serial.println dopo aver inizializzata con Serial.begin ma nulla…, mi da sempre -1 (quindi credo che non riceva nulla).
C’è qualcosa che si deve sapere sulla seriale del Leonardo? Io nella scheda ho fatto dei collegamenti diretti ai pin rx e tx del micro e so che la board funziona sia perché blinka sia perché mi scrive con successo i valori di pressione di un sensore analogico sulla reprimere interna.
Qualcuno ha qualche idea o bug conosciuti sulla seriale del Leonardo?
Grazie a tutti!!

Edit: Mi sono ricordato adesso che ho lasciato connesso la VUsb, non vorrei che l’atmga per far funzionare il debug usb seriale sulla usb staccasse quella dei pin. Sebbene non credo sia questo dopo provo, magari risolvo

Subsea:
C'è qualcosa che si deve sapere sulla seriale del Leonardo? Io nella scheda ho fatto dei collegamenti diretti ai pin rx e tx del micro e so che la board funziona sia perché blinka sia perché mi scrive con successo i valori di pressione di un sensore analogico sulla reprimere interna.

Ti sei ricordato che la UART hardware della Leonardo è serial1 ? E' un errore che molti commettono, pensano di inviare/ricevere i dati dalla UART e invece lo stanno facendo sulla USB.

I pin 0 e 1 sono della seriale 1 percui Serial1.begin()
Ciao Uwe

Ummmm... Effettivamente no :grinning: è dire che l'avevo anche letto in un post del forum, avevo preparato lo sketch ma poi non l'ho caricato! In serata provo e vi faccio sapere :wink:

ok grandi notizie! Funzionava, o almeno così pareva... Ho provato con serial1 ma non andava, poi ho disabilitato la divisione per 8 dei miei 16 mhz di clock e andava. Poi ci ho collegato un modulo rf seriale e da allora mi invia numeri senza senso... Ho fatto diverse prove e non riesco a capirne il motivo, lascio gli sketch e i fuses che ho usato...

void setup() {
  Serial1.begin(9600);     
}

void loop() {  

  Serial1.print("hello");       // prints a label
delay(100);
 
}
void setup() {
        Serial.begin(9600);    
}

void loop() {

        if (Serial.available() > 0) {

                Serial.print("I received: ");
                Serial.println(Serial.read());
        }
}
0xDE 0x99 0xF3 //calcolati con il fuse calculator

La Leonardo DEVE lavorare a 16 MHz, tassativamente con il quarzo, altrimenti hai problemi con la USB, inoltre se cambi il clock senza informare il compilatore di questa cosa è normale che poi la seriale non funziona in quanto il calcolo del baud rate, per impostare i registri, è sbagliato.

Il mio Leonardo funziona a 16mhz con quarzo e I due conservatori da 22pf. Cosa intendi con informare il compilatore? Io imposto arduino Leonardo a livello hardware dovrebbero essere equivalenti.

Subsea:
Il mio Leonardo funziona a 16mhz con quarzo e I due conservatori da 22pf. Cosa intendi con informare il compilatore?

Che se cambi il clock il compilatore deve saperlo, o meglio deve saperlo il core di Arduino tramite il parametro F_CPU, altrimenti tutte le funzioni legate a delle temporizzazioni non funzionano in modo corretto, seriale inclusa.

Umh...quindi dovrei modificare il file board.txt? Ma usando lo stesso clock del Leonardo non dovrei essere già a posto? Ah, avevo provato anche coi fuses del Leonardo letti sempre dal board ma non è cambiato nulla...

Subsea:
Umh...quindi dovrei modificare il file board.txt? Ma usando lo stesso clock del Leonardo non dovrei essere già a posto?

Se lavori con il clock a 16 MHz non devi modificare nulla nel file board.txt, se usi un clock diverso devi inserire il valore del clock in f_cpu.
Però il 32u4 deve funzionare a 16 MHz, con quarzo, sulla Leonardo, o board similare, altrimenti la USB non funziona perché il core prevede l'uso in full speed (12 Mbps) con quel clock, se lo riduci oltre a non poter usare il full speed, dovresti andare in low speed (1.1 Mbps), è necessario modificare anche la parte di init della USB nel core per il nuovo clock.

Eh io vado a 16 mhz...quindi non dovrei modificaare nulla e la seriale dovrebbe lavorare, invece trasmette roba strana :sob: pensi che possa essere un problema di fuses? Quali sono quelli della Leonardo? gli sketch sono a posto? Sto andando a esclusione....

I fuse della Leonardo li trovi nel file board.txt e sono questi:

low_fuses=0xff
fuses=0xd8
extended_fuses=0xcb

Attenzione a giocare con i fuse perché rischi di bloccare il 32u4 se sbagli il setup del clock, poi tocca usare un programmatore HV che richiede la connessione di molti pin, cosa impossibile da fare con il 32u4 montato sul pcb.

:o grazie per I fuse astro. Ma... non è che l ho già bloccato? Per ora ti posso dire che blinka e scrive sulla eeprom dei valori analogici di un sensore che sembrano molto credibili. E per quanto riguarda I lock bit? Possono essere loro a far impazzire la seriale?

Niente Astro, ho riprovato anche coi fuse del Leonardo ma quando gli do un Serial1.print(10) mi restituisce "484948494849" e così via. Può essere che sia un problema di decodifica più che di trasmissione? Riprovo con i vecchi fuse (stando sempre attento al clock :wink: )
Intanto grazie mille Astro!!

Subsea:
Niente Astro, ho riprovato anche coi fuse del Leonardo ma quando gli do un Serial1.print(10)

Ma come è collegata la UART del 32u4 al PC dove leggi i dati ?

È collegata ad arduino con sopra lo sketch che avevo incollato sopra con il serial.read e leggo tutto dal serial monitor di arduino. Potrei provare più tardi con un convertitore usb seriale se lo trovo se il problema potrebbe essere quello!

Dal serial monitor puoi vedere solo quello che passa tramite la Vcom USB se non colleghi fisicamente la UART del 32u4 al PC.

Praticamente collego tx del 32u4 ad un arduino con un serial.read e un serial.print e apro il seriale. Il 32u4 non è collegato tramite usb solo uart (serial1)

Ho provato ora a usare la software Serial ma non cambia nulla... Mi scrive sempre dei valori senza senso. Potrebbe essere un problema del micro? Ma se blinka e mi fa le letture seriali in modo corretto come può essere?
Grazie mille ancora per il supporto :wink:

Ok credo di aver capito il problema: 49484948 non è altro che la cifra 10 che stavo scrivendo in codice ascii anziché decimale, bastava guardare una semplice tabella di conversione e l'arcano era svelato! Ora però, come faccio a scrivere in seriale cifre comprensibili (cioè se scrivo 10 voglio 10?) È possibile con i "suffissi" .hex .dec ecc?
Grazie ancora! :wink: