Go Down

Topic: [HOWTO] Guida (più o meno) completa all'utilizzo di Moduli Bluetooth (Read 244896 times) previous topic - next topic

pichard0203

Una volta che sei connesso il collegamento è bidirezionale, quindi SI.

Guglielmo
Ora, sto utilizzando un semplice bottone, e vorrei che una volta premuto, inviasse una stringa al dispositivo bluetooth connesso. Posto il codice:


Code: [Select]

const int pinBottone = 9;
int statoBottone = 0;    
                      

void setup() {

 Serial.begin(9600);
 
 pinMode (pinBottone, INPUT);
}



void loop() {

 statoBottone = digitalRead (pinBottone);


 if (statoBottone == HIGH) {
  
  Serial.println ("1")
   delay (300);
 }
}


Premendo il bottone sul monitor seriale appare "1", ma al telefono la stringa non arriva. Viceversa, digitando "1" con la tastiera a monitor seriale aperto, la stringa viene correttamente ricevuta.
Come posso risolvere?

EDIT: ho provato ad utilizzare anche una flag ma nulla, la stringa viene scritta sul monitor non ricevuta dal cellulare. Eppure la seriale in una connessione bluetooth è condivisa...
Sapete aiutarmi?

Code: [Select]
const int pinBottone = 9;
int statoBottone= 0;   
                           
byte flag = false;

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

  flag = false;

  pinMode (pinBottone, INPUT);

}



void loop() {
 
  statoBottone = digitalRead (pinBottone);

  if (statoBottone == HIGH) {
   
   flag = true;
   
 }



if (flag) {
  Serial.println ("1")
  delay (300);
  flag = false;
 }


}

gpb01

Mai usare la vera seriale con i moduli BT ...
... prima di tutti ci si preclude la possibilità di fare debug tramite essa e tramite monitor seriale e poi ... abbiamo detto decine di volte che i moduli BT collegati direttamente sulla seriale, spessissimo funzionano male o non funzionano affatto.

Crea una seriale virtuale sul pin 10 (RX) e 11 (TX) con la libreria SoftwareSerial, collega a tali pin il modulo BT e vedi come va.

Ovviamnete ...

10 (RX) <--- TX Bluetooth
11 (TX) ---> RX Bluetooth
GND ------ GND Bluetooth

Guglielmo
Search is Your friend ... or I am Your enemy !

pichard0203

Ho creato una seriale virtuale come mi hai detto (spero di aver fatto tutto correttamente). Ma ancora nulla, il problema rimane. Sto utilizzando una shield itead

Code: [Select]
#include <SoftwareSerial.h>
#define BT_TX_PIN 10
#define BT_RX_PIN 11
SoftwareSerial bt =  SoftwareSerial(BT_RX_PIN, BT_TX_PIN);

const int pinBottone = 9; //questa variabile è costante
int statoBottone= 0;     /*questa variabile NON è costante
                            ma può variare il proprio valore*/
byte flag = false;

void setup() {

   bt.begin(9600);
 
  //dichiaro il pin del bottone come un input:
  pinMode (pinBottone, INPUT);
  //definisco modalità pin
}



void loop() {
 


  // legge la posizione/stato del bottone
  // da notare che la variabile "int" cambia ogni volta valore
 
  statoBottone = digitalRead (pinBottone);

  // verifica se il bottone viene premuto.
  // se viene premuto, viene rilevato un segnale HIGH:
  if (statoBottone == HIGH) {
   
   bt.println ("1");       /*la comunicazione bluetooth, una volta
                           avviata, è bidirezionale: basta quindi
                           scrivere una lettera sulla seriale, e
                           automaticamente verrà inviata la suddetta
                           stringa al dispositivo connesso. Viceversa,
                           nel caso in cui si debba mandare un segnale
                           AD arduino, la stringa comparirà sul monitor
                           Seriale. Il monitor seriale viene letto da
                           entrambi i dispositivi connessi. */
  delay (300);
 }
}

gpb01

1. hai fatto il debouncing del bottone? Perché altrimenti i "ribalzi" si sprecano

2. hai messo una resistenza di pull-down per tenerlo normalmente a LOW? Altrimente è floating ed oscilla in continuazione tra LOW ed HIGH

3. nel modo che hai fatto, con il pin HIGH viene trasmesso in continuazione 0x31 0x0D (il carrattere 1 ed il Carriage return) ovvero due caratteri ed il tutto ripetuto ogni 3 decimi di secondo. E' questo che vuoi.

In ogni caso, se i collegamente sono fatti come si deve ed il BT è connesso ... DEVE funzionare ! Prova con un semplice emulatore di terminale BT per cellulare ...

Guglielmo
Search is Your friend ... or I am Your enemy !

pichard0203

#514
Mar 12, 2018, 10:56 pm Last Edit: Mar 12, 2018, 11:28 pm by pichard0203 Reason: Aggiunta di un allegato
1. hai fatto il debouncing del bottone? Perché altrimenti i "ribalzi" si sprecano

2. hai messo una resistenza di pull-down per tenerlo normalmente a LOW? Altrimente è floating ed oscilla in continuazione tra LOW ed HIGH

3. nel modo che hai fatto, con il pin HIGH viene trasmesso in continuazione 0x31 0x0D (il carrattere 1 ed il Carriage return) ovvero due caratteri ed il tutto ripetuto ogni 3 decimi di secondo. E' questo che vuoi.

In ogni caso, se i collegamente sono fatti come si deve ed il BT è connesso ... DEVE funzionare ! Prova con un semplice emulatore di terminale BT per cellulare ...

Guglielmo
1. Ho aggiunto il debouncing allo sketch. Lo allego sotto.

2. La resistenza di pull-down c'era già prima.

Questo sketch è il "debounce" presente negli Esempi, con l'aggiunta di un Serial.println e un bt.println:

Code: [Select]
#include <SoftwareSerial.h>
#define BT_TX_PIN 10
#define BT_RX_PIN 11
SoftwareSerial bt =  SoftwareSerial(BT_RX_PIN, BT_TX_PIN);

// constants won't change.
// set pin numbers:
const int buttonPin = 3;    
const int ledPin = 13;      

// Variables will change:
int ledState = HIGH;        
int buttonState;            
int lastButtonState = LOW;  


unsigned long lastDebounceTime = 0;  
unsigned long debounceDelay = 50;    

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

 Serial.begin (9600);
 bt.begin(9600);

  digitalWrite(ledPin, ledState);
}

void loop() {
  
  int reading = digitalRead(buttonPin);

  if (reading != lastButtonState) {

    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {

    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }

  digitalWrite(ledPin, ledState);
  Serial.println (ledState);    //<<<<<< QUESTO VIENE SCIRTTO
  bt.println (buttonState);     //<<<<<< QUESTO NON VIENE RICEVUTO DAL CELLULARE

  lastButtonState = reading;
}


Premendo il bottone, il Led cambia stato e viene scritto sul monitor seriale il Serial.println MA con il terminale bluetooth sul cellulare non viene ricevuto il bt.println

Allego lo screen dell'emulatore Android. La connessione è stabilita ma non viene ricevuto il segnale.

Non riesco a spiegarmi come sia possibile. Ho creato bene la seriale virtuale?

gpb01

Fai una prova ...
... al posto di questa riga:

Code: [Select]
bt.println (buttonState);     //<<<<<< QUESTO NON VIENE RICEVUTO DAL CELLULARE
... metti questo:

Code: [Select]
if (buttostate) bt.println ("High");
else bt.println ("Low");

... e dimmi se cambia qualche cosa.

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

... Sto utilizzando una shield itead ...
Non avevo notato questa affermazione ...
... quindi NON stai usando un modulino HC-5 che colleghi tu, stai usando una shield ... QUALE shield itead (metti il link)?   E su quali pin hai impostato la comunicazione sulla shield?

Guglielmo
Search is Your friend ... or I am Your enemy !

pichard0203

Grazie Guglielmo!
Ho provato con un modulino HC-06 e credo che il problema fosse nelle impostazioni della shield (ancora settate alle condizioni di fabbrica) perché ora funziona davvero tutto. Non è stato nemmeno necessario modificare le due righe di codice. Ti ringrazio ancora.

Riccardo

Ilnomade

Salve a tutti,
ho un problema con un modulo HM-11, ovvero usando arduino mega 2560 non riesco a comunicare i comandi AT. Tuttavia usando un cp210x connesso direttamente al modulo, ed usando l'applicazione forrnita dal produttore riesce a dare un minimo di comandi AT previsti dall'applicazione stessa. Quindi dovrei dedurre che il modulo in se problemi non dovrebbe averne, in più settando con l'applicazione e liberando il canale di comunicazione sono in grado di dare tutti i comandi che voglio tramite smartphone android.

Detto ciò impostarlo da telefono non mi interessa in quanto lo scopo sarebbe quello di passare dati prodotti dai sensori montati sull'arduino su pc tramite bluetooth. Sul pc monto un classico dongle usb bluetooth.

Chiudendo il discorso sull impostazione bisogna dire come monto l'hm-11:
arduino 3.3v --->hm-11 VCC
arduino GND ---> hm-11 GND
arduino RX1 (18) ---> hm-11 TXD
arduino TX1 (19) --->ripartitore di tensione resistivo R1=10k,R2=22k --> hm-11 RXD

Il problema è che il modulo non risponde ai comandi AT rimanendo completamente muto

Il codice che uso è il seguente:

Code: [Select]
#include <SoftwareSerial.h>
uint16_t baudRateSerial = 57600;
uint32_t baudRateBLE = 9600;
#define RxD 18
#define TxD 19
SoftwareSerial BTSerie(RxD,TxD);

void setup()
{
Serial.begin(baudRateSerial); //115200 se vogliamo
delay(500);
Serial.println("Pronti per comandi AT");
// Configuration du bluetooth
pinMode(RxD, INPUT);
pinMode(TxD, OUTPUT);
Serial.print("BaudRate Serial impostato a: ");Serial.println(baudRateSerial);
Serial.print("BaudRate Bluetooth impostato a: ");Serial.println(baudRateBLE);
BTSerie.begin(baudRateBLE); //57600
delay(500);
//avviabile();

delay(500);
Serial.println ("Richiesta a BT: AT+VERSION");
BTSerie.write("AT+VERSION"); //Richiedi la versione
Serial.write("AT+VERSION");
delay(1000);
BTSerie.write("\r\n");
Serial.write("\r\n");
Serial.println ("richiesta effettuata");
//avviabile();

}
void loop()
{
    // listen for communication from the BT module and then write it to the serial monitor
    if ( BTSerie.available() )   {  Serial.write( BTSerie.read() ); Serial.print("2");  }
 
    // listen for user input
   if ( Serial.available() )   {  BTSerie.write( Serial.read() ); Serial.print("1"); }
}


Ho fatto parecchie prove però sono abbastanza sicuro che i collegamenti siano corretti in quanto misurando con il tester il TX di arduino misurato prima di R1 e dopo R2 risulta da 5v circa e sempre col tester sul pin RX di arduino misuro esattamente 3.3v .

Essendo che non son un esperto, la mia unica ipotesi è che non arrivi sufficiente corrente alla canale di ricezione dati del HM-11; è possibile?

Ultimo dettaglio è vero che il modulo chiede da 3,6 a 6v per funzionare, e io lo alimento a 3,3v, però usando il CP210x uso la stessa tensione di alimentazione e li funziona...

cosa sbaglio?

EDIT:
dimenticavo, uso reistenze 10k,22k perchè provando con 800/2,2k e 1,2k/2,2k la tensione al pin rx dell HM risulta poco sopra ad 1v, e comunque anche in quel caso non funziona nella stessa maniera.
Ho provato un po tutte le combinazioni di baud rate ma non cambia ( a meno di aver saltato quella magica).
Domani mi arriva l'ardino pro mini da 3,3v, che è piu adatto allo scopo finale del progetto, e spero che si risolva il problema da solo; in tal caso benino ma vorrei riuscire a farlo andare anche sul MEGA, nel caso opposto non so più cosa inventarmi.

Go Up