Sommario:
2025 Autore: John Day | [email protected]. Ultima modifica: 2025-01-13 06:57
Per puro massimalismo, ho configurato il mio modulo Bluetooth (slave) HC-06 su una velocità di trasmissione di 1, 382, 400 baud con il comando AT+BAUDC. Da quando l'Arduino connesso ad esso non è stato in grado di utilizzare il modulo con la libreria SoftwareSerial. Ho provato a ripristinare la velocità di trasmissione con il seriale hardware di Arduino (pin 0 e 1) senza fortuna.
Ho anche provato a Google l'argomento senza trovare una soluzione accettabile. Forse usare la porta seriale integrata di un computer avrebbe potuto essere una soluzione (con lo spostamento del livello logico da 12V a 3V3), ma il mio computer non ha questa porta obsoleta, quindi ho dovuto trovare un'altra soluzione.
Passaggio 1: cosa ti servirà
- Scheda Arudino/Genuino con l'MCU Atmel ATMEGA328P-PU predefinito (@16MHz).
- Un modulo Bluetooth HC-06 in ascolto su 1, 382, 400 baud
- IDE arduino di base da
Passaggio 2: la soluzione
Si noti che questo Instructable e la soluzione sono realizzati per uno scenario da 1, 382, 400 baud (AT+BAUDC). La soluzione non funzionerà per nessun altro baud rate. Per gestire altri casi, fare riferimento ai passaggi a partire dal passaggio 3.
La soluzione è davvero semplice.
- Collega il pin VCC di HC-06 al pin 5V di Arduino.
- Collega il pin GND di HC-06 al pin GND di Arduino.
- Collega il pin RXD di HC-06 al pin 2 di Arduino.
- Lasciare scollegato il pin TXD dell'HC-06 (o collegarlo al pin 8).
- Carica lo schizzo hc06reset.ino.
- Il programma imposterà HC-06 in modalità 115, 200 baud (AT+BAUD8).
- Usa il tuo modulo HC-06 recuperato come prima.
Passaggio 3: dietro le quinte…
La libreria SoftwareSerial fornita con Arduino IDE è in grado di trasmettere al massimo 115, 200 bit/secondo, quindi non è abbastanza veloce per comunicare con la velocità di 1, 382, 400 baud desiderata. Dato che una scheda Arduino predefinita funziona a 16 MHz, il bitrate massimo teorico non compresso è di 16.000.000 bit/sec. Siamo a posto finora!
In base alla mia comprensione di SoftwareSerial.cpp, la comunicazione seial viene eseguita impostando un pin di uscita High (=1) o Low (=0) rispetto a un ritardo (che deriva dalla velocità di trasmissione) tra le modifiche.
- Il pin di uscita è alto per impostazione predefinita (significa nessun dato), quindi
- viene trasmesso un bit di Start (che abbassa il pin), quindi
- 8 bit di dati trasmessi da LSB a MSB, (+5V quando il bit 1 e 0 altrimenti) quindi
- viene trasmesso uno Stop bit (che porta il pin in alto)
In questo modo viene trasmesso 1 byte utilizzando 10 bit.
Il messaggio che dobbiamo inviare è AT+BAUD8 (senza \n, \r alla fine). Questo comando riporta l'HC-06 a 115, 200 baud rate che può essere gestito dalle normali librerie.
Per inviare bit con velocità 1, 382, 400 bit/sec, per ogni bit abbiamo un tempo di 1/1, 382, 400 secondi (che è circa 723,38 ns) per ogni bit. Arduino funziona su 16.000.000 Mhz, quindi ogni ciclo dura 1/16.000.000 secondi, ovvero 62,5 ns per ciclo.
Usando il codice assembly AVR possiamo usare il comando OUT per impostare il pin di uscita alto o basso e NOP per aspettare esattamente un ciclo della CPU. Entrambi i comandi consumano esattamente 1 ciclo di CPU. In questo modo il tempo di 723.38 ns bit può essere coperto da 11-12 istruzioni arduino per bit trasmesso. Una cosa da considerare: il comando OUT imposta un intero byte in una volta, quindi dobbiamo selezionare una PORTx dove questo non è un problema. L'utilizzo di ATMEGA328P-PU ad esempio PORTD (pin 0-7) di Arduino è perfetto per questa condizione. Dopo aver impostato il bit, deve trascorrere solo il tempo corretto che viene eseguito da 10 a 11 NOP e il gioco è fatto.
Puoi trovare i dettagli di calcolo nel file Excel sottostante. Questo file ha generato le istruzioni di montaggio richieste per il programma. Dopo aver incollato il codice generato, è stato necessario effettuare solo alcune sostituzioni.
Passaggio 4: ulteriori possibilità di lettura/miglioramento
- Forse è possibile creare una libreria SoftwareSerial più veloce utilizzando la tecnica descritta nel passaggio precedente.
- FedericoK2 ha realizzato un ottimo strumento che genera il codice di ripristino HC-06 per ogni possibile bitrate. Accedi al sito qui: https://tools.krum.com.ar/save_your_hc-06/ Grazie FedericoK2