Ricezione segnali bluetooth

Ciao a tutti,
sono riuscito ad accendere/spegnere un led via bluetooth con l'app per android "Arduino bluetooth control device", e, con la stessa app sono riuscito anche a far muovere un motore a corrente continua e a fargli cambiare direzione grazie ad un ponte h.
Vorrei adesso far muovere lo stesso motore con un'app che consenta anche di regolare la velocità (come due potenziometri), ma ho problemi nel ricevere i segnali bluetooth provenienti dai vari pulsanti dell'app stessa.
Ho provato con le applicazioni "Arduino BT joystick" e "bluetooth RC controller", ma ho ottenuto solo scarsi risultati, e soltanto con la seconda, nel senso che, collegando il monitor seriale e usando la funzione "Serial.read()", ottengo una serie di "83", anche se premendo i pulsanti, i valori cambiano.
Con lo sketch seguente, non sono riuscito ad accendere un LED (per fare una prova), mentre togliendo l'istruzione else, ci sono riuscito.

void setup() {
Serial.begin(9600);
pinMode(9, OUTPUT);
}

void loop() {
  char c = Serial.read();

if(Serial.available()){
Serial.println(Serial.read());
}

if(c == 70){
digitalWrite(9, HIGH);
}
else{
  digitalWrite(9, LOW);
}
}

Ora le mie domande sono due:

1)Qualcuno di voi conosce qualche applicazione per questo genere di cose? (il mio obiettivo è quello di fare una macchina bluetooth comandata da un'app).

2)Come posso vedere i valori inviati dall'applicazione bluetooth sul monitor seriale?

Daniele03:
2)Come posso vedere i valori inviati dall’applicazione bluetooth sul monitor seriale?

Con un semplice programma che mette in comunicazione la Serial (il monitor seriale di Arduino) con la SoftwareSerial (con cui parli con il modulo BT) … una manciata di righe di codice :slight_smile: :

#include <SoftwareSerial.h>

#define  SS_RX 10            // RX PIN to receive  data
#define  SS_TX 11            // TX PIN to transmit data

SoftwareSerial ssSerial(SS_RX, SS_TX);

void setup()
{
  delay (2000);
  //
  Serial.begin(9600);        // Initialize USB Serial port
  //
  Serial.println("--- Ports ready ---");
  Serial.println("");
}

void loop()
{
  if (ssSerial.available() > 0) Serial.write(ssSerial.read());
  if (Serial.available() > 0) ssSerial.write(Serial.read());
}

Guglielmo

Ok, grazie mille, domani ci provo.

Ho provato a fare quello che mi hai detto, ma aprendo il monitor seriale e connettendo il bluetooth con l'applicazione non ottengo nessun risultato in ogni caso, l'unica cosa che appare scritta è "--- Ports ready ---".
Per quanto riguarda il circuito, ho collegato vcc del modulo HC-05 ai 5V, GND a GND, RXD del modulo sul pin 11 e il TXD sul pin 10.
Ho sbagliato qualcosa?

No, non hai sbagliato, i collegamenti sono giusti:

TX Bluetooth —> RX SoftwareSerial (10)
RX Bluetooth <— TX SoftwareSerial (11)

La velocità a cui è settato il modulo è 9600 ? Perché altrimenti devi aggiustare il codice per la tua velocità.

Comunque, per toglierti ogni dubbio, scaricati BTinterface (… è un terminale seriale) … io lo uso regolarmente proprio per provare le connessioni :wink:

Guglielmo

Grazie per la risposta rapida, per vedere (e eventualmente cambiare) la velocità del modulo, devo entrare in modalità AT? O posso cambiarla dal monitor seriale?

Se non l’hai cambiata, il modulo HC-05, di default, lavora a 9600 baud mentre va a 38400 in modalità comandi (AT).

Per verificare le impostazioni occorre entrare in modalità AT.

Guglielmo

ok, nel frattempo ho controllato e ti confermo quello che dici, sono entrato in modalità AT e la velocità è 9600,ora devo uscire(partita di pallavolo), appena ho tempo provo quel programma che mi hai suggerito.

Ciao a tutti,
ho provato l'applicazione che mi hai proposto, e, collegando un LED ad Arduino con lo sketch sotto riportato, sono riuscito a farlo accendere e spegnere.
Quello che non sono riuscito a fare, è vedere i segnali che l'applicazione manda.
Sono riuscito a far accendere e spegnere il LED, perché, come sai, l'applicazione è anche un terminale.
Ora, come faccio a vedere i valori dei segnali che l'applicazione manda?
Ho provato con la funzione "if(Serial.available()){ Serial.println(Serial.read())}, ma il monitor seriale riporta altri valori (anche se, come ho già detto, il LED si accende e spegne).
Come posso fare?

void setup() {
Serial.begin(9600);
pinMode(2, OUTPUT);
}

void loop() {
char c = Serial.read();

if (c == 'A'){
  digitalWrite(2, HIGH);
}
if (c == 'a'){
  digitalWrite(2, LOW);
}
}

Quel loop() è concettualmente sbagliato ...
... NON si effettua mai una Serial.read() se non si è prima verificato se c'è qualche cosa da leggere ... non ti pare ?

Quindi ... devi mettere una if ( serial.available() > 0) { ....... }

Detto questo, dopo l'assegnazione di 'c' metti una Serial.print(c) e vedi quello che hai ricevuto.

Guglielmo

Mi scuso per la risposta in ritardo, volevo dire che con lo sketch, mi limito ad accendere e spegnere un LED via bluetooth (e funziona).
Quello che non riesco a fare è visualizzare sul serial monitor i giusti segnali che il bluetooth manda.
Come ho già detto, ho provato a leggere, appunto, i segnali, con lo sketch seguente, includendo, qui, la condizione "if(Serial.available){[...]".
Il problema è che vengono riportati dei numeri (solo alcune volte quando invio dei segnali).
So quale segnale invio perché, ripeto, come sai, l'applicazione è anche un terminale.
Ho provato ad usare anche un' altra applicazione, composta da alcuni bottoni, che inviano 'A' alla prima pressione, 'a' alla seconda, 'B', 'b', 'C', 'c'... a seconda che siano il primo, secondo, terzo...
(il nome dell'applicazione è "Arduino Bluetooth Control Device", disponibile sul play store).
Nonostante i segnali mandati siano questi (perché li ho trovati e testati), con questo sketch, non riesco a vedere le lettere, ma, anche questa volta, dei numeri.

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

void loop() {
if(Serial.available()){
 Serial.println(Serial.read()); 
  }
}

... perché invece di continuare in questo modo NON hai fatto come ti ho detto io mettendo la Serial.print(c) ?

Correggi il tuo programma come ti avevo detto (con il Serial.available() e il Serial.print() della variabile c) e vedi quello che succede .. poi ne riparliamo e ti spiego perché vedi i numeri.

Guglielmo

Ho provato anche con quest'altro sketch (medesimi risultati).
Lo sketch è il seguente:

void setup(){
Serial.begin(9600);
}
 void loop(){
char c = Serial.read()
if(Serial.available()){
Serial.println(c);
}
}

Ma scusa ... che ti ho detto ? :o ... Che NON devi leggere da seriale se prima non verifichi che ci sia un carattere disponibile !!!!

void loop() {
  char c;
  if (Serial.available() > 0) {
     c = Serial.read();
     Serial.println(c);
  }
}

Guglielmo

Oooooops... scusa....credevo che con la funzione "if(Serial.available())" fosse incluso, ma mi sbagliavo:-[.
Domani provo e vedo.

Ho provato a fare come mi hai detto, e funziona (ma tu già lo sapevi :grinning: ).
Ti ringrazio davvero molto, e ti chiedo ancora scusa perché non ho capito subito ciò che cercavi di dirmi.

Non avevo dubbii ... :smiley:

... così come hai fatto, stai passando alla print() una variabile di tipo "char" il che richiama quella implementazione del metodo per i caratteri.
Quando gli passavi, invece che la variabile char, direttamente il risultato del metodo read() della classe Serial, in realtà gli passavi un "int" (basta che vai a vedere cosa ritorna la read()) e quindi veniva richiamata l'implementazione per gli int :wink:

Comunque ... prova questo programmino e vedrai quanti diversi modi hai di stampare il carattere ...

void setup() {
  // put your setup code here, to run once:
  delay(1000);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  char c;
  c = 0x41; // codice ASCII del carattere 'A'
  Serial.println(c);
  Serial.println(c,DEC);
  Serial.println(c,OCT);
  Serial.println(c,HEX);
  Serial.println(c,BIN);
  delay(3000);
}

Guglielmo

ragazzi mi aiutate ho un problema non riesco ad comunicare con un hc-05 quando è in modalità AT

Giggir:
ragazzi mi aiutate ho un problema non riesco ad comunicare con un hc-05 quando è in modalità AT

@Gigger: il croos-posting è proibito da regolamento, punto 13, e tu hai posto la stessa domanda anche QUI dove, per altro ti hanno già dato una risposta ... e non è affatto carino/educato che tu molli uno che ti ha risposto e poni la stessa domanda da un'altra parte. Quindi, cortesemente, continui di la.

Inoltre, dato che non lo hai ancora fatto, ti chiedo di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto :wink:) e di leggere con attenzione il REGOLAMENTO. Grazie.

Guglielmo