HC-06 con arduino mega

Salve, sto cercando di fare esperienza con il bluetooth, ho collegato TX e RX alle seriale 3 di arduino mega, il tx del modulo al pin 17 RX di mega, RX del modulo, tramite resistenze, al pin 16 TX di mega.
Per comunicare col modulo ho usato l'app per android Serial Bluetooth. Dall'app mi collego al modulo e la luce rossa rimane fissa. Scrivo una parola nell'app e premendo invio dovrebbe apparire scritta sul monitor seriale del pc, ma non accade.
In cosa sbaglio?

String message = "";
char incomingChar;
int comando_letto = 0;

void setup() {
  Serial3.begin(9600);
  Serial.begin(9600);
}

void loop() {
       
  if (Serial3.available()){ // Se la porta seriale contiene un carattere 
    char incomingChar = Serial3.read(); // lo immagazzina nella variabile
    if (incomingChar != '\n'){  // Se il carattere è diverso da invio
      message += String(incomingChar);  // Aggiunge il carattere al precedente
    }
    if (incomingChar == '\n') comando_letto = 1;
  }
  
  if (message !="" && comando_letto==1){
  
    Serial.print(message);
    comando_letto = 0;
    message="";
  }
  
  delay(20);
}

Il programma che hai scritto è corretto, per cui se non ti compare nulla il problema è altrove.

L'app impostata a 9600?
I collegamenti errati?
La resistenza perché, mi sfugge il perché, da quanti ohm?

Ciao.

Non è che vanno scambiati Tx e Rx?... Bisogna vedere che cosa intendono per Tx e Rx da una parte e dall'altra. Per Arduino Tx è uscita, ma per il modulo probabilmente Tx è il segnale da trasmettere e Rx è il segnale ricevuto! Mi sembra di ricordare che mi sia proprio capitato così!

@Datman: ma ha scritto:

Ho idea che il problema (avendone usati parecchi senza problemi) è quel "tramite resistenza" ... collegata come? di che valore?

Guglielmo

Qui, per esempio, dicono esplicitamente di non incrociare Tx e Rx:

 ARDUINO     HC05
Rx (pin 0) —> Rx   Remember it is one to one connection here, not cross connection!
Tx (pin 1) —> Tx
+5v        —> VCC
GND        —> GND
+3.3V      —> KEY

Ennessima bojata ... fosse solo per il fatto che la collegano alla seriale HW ... che 90 volte su 100 NON funziona (problema di livelli di tensione che la vera seriale richiede). Vai a cercare le decine di thread sull'argomento qui sul forum :wink:

Guglielmo

1 Like

Boh! Io ricordo che mi è capitato! Come puoi escludere che qualche produttore faccia proprio così?
Per quanto riguarda la seriale HW, forse il problema è che c'è collegata già l'interfaccia USB, che viene a trovarsi in parallelo.

NON ci credo ... i produttori fanni i moduli HC-05/06 tutti uguali da anni ... e, spesso, ci mettono anche il disegnino delle freccette con il verso dei dati. :grin:

image

Guglielmo

Hai ragione... Devo andare a vedere le freccette su quelli che ho.

Probabile ... comunque, che non vada su 0 e 1, è cosa nota :wink:

Per il collegamento del pin RX del modulo (che è quello che ha problemi) Io ho sempre messo un piccola partitore per abbassare i 5V a circa 3V o dintorni :wink:

Guglielmo

Con "tramite resistenze" immagino (spero) che tu intenda il classico partitore con resistenze R e 2R (es. 5k e 10k) per portare TX di Arduino, che è a 5V, ai 3.3V che richiede il modulo:

Ricorda però che l'HC-06, che sinceramente non ho mai usato, è il "fratello minore" dell'HC-05: leggo che ha minori comandi AT disponibili, non può fare da master, e resta sempre in modalità AT se non è presente una connessione Bluetooth attiva.

Qui qualcosa non mi torna. Sugli HC-05 il LED non resta acceso fisso ma lampeggia velocemente se è acceso e pronto a connettersi, 2 lampeggi veloci ogni 5 secondi se è connesso il Bluetooth, e 1 ogni 2 secondi se è in AT mode.

Prova ad usare questo codice, che dovrebbe replicare via seriale la comunicazione Bluetooth:

#include <SoftwareSerial.h>
#define Rxpin 2 // Tx per Bluetooth Rx per Arduino
#define Txpin 3 // Rx per Bluetooth Tx per Arduino
char  BluetoothBuffer;
char  SerialBuffer;
SoftwareSerial Bluetooth(Rxpin, Txpin);

void setup() {
  Serial.begin(9600);
  Bluetooth.begin(9600);
}

void loop() {
  if (Bluetooth.available() > 0) {
    BluetoothBuffer = Bluetooth.read();
    Serial.print(BluetoothBuffer);
  }
  if (Serial.available() > 0) {
    SerialBuffer = Serial.read();
    Bluetooth.print(SerialBuffer);
  }
}

PS: comunque si, per quanto ne so vanno incrociati i segnali, TX del Bluetooth all'RX di Arduino e viceversa.

EDIT: il codice che ho postato usa la SoftwareSerial sui pin 2 e 3, quindi se vuoi provarlo sul tuo devi usare la Serial3 invece della SoftwareSerial. Ma visto che comunque lavori a 9600, per sicurezza una prova con la SoftwareSerial la farei comunque (ovviamente spostando il modulo dai pin 16/17 a 2/3...). ;-)

Ci vorrebbe un ponticello per isolare il Tx dell'interfaccia USB dall'Rx del microcontrollore quando non è necessaria la connessione USB...

Appunto, normalmente si fa quello ... ma se non ce lo conferma, possiamo dire poco.

La paura mia è che ci sia la solita incompatibilità di livelli con le vere seriali hardware, che, sui livelli LOW ed HIGH, sono ... un poco più permalose dei pin di GPIO usati dalle emulazioni software (con le quali funziona nel 100% dei casi) ... :roll_eyes:

Guglielmo

Ma per favore :grin: ... si usa la AltSoftSerial sui pin 46 e 48 della MEGA e va che è una meraviglia :wink:

Guglielmo

Ah, beh... Io penso sempre ad Arduino Uno! :slight_smile:

Si, ma anche li, NON è cosa furba ... specie su schede nuove in cui fai decadere la garanzia ...
... sulla UNO usi i pin 8 e 9, sempre con la stessa libreria o usi il 10 ed 11 con la pessima SoftwareSerial :grin:

Guglielmo

Perché "pessima"? Io l'ho usata molto spesso, la comunicazione a 9600 funziona correttamente...

Esatto, a 9600 ... è lentissima e, peggio, tiene disabilitati gli interrupt per tempi veramente eccessivi ... prova quella che ho indicato e vedrai la differenza :wink:

Guglielmo

1 Like

@Datman: tu che sei diventato un amante degli SMD ... guardati QUESTA simpatica modifica da fare direttamente sul modulo :wink:

Guglielmo

Ah, sì! L'idea è ottima per non correre rischi con i moduli acquistati e messi da parte! Devo farla! Giusto l'altro giorno stavo mettendo resistenze smd tagliando piste su un provapile cinese per fare la taratura! :slight_smile: