Arduino bluetooth smartphone

ciao a tutti, sto cercando di comandare 2 motori in cc con il mio smartphone tramite scheda bluetooth( bluetooth shield v1.1). uso una scheda controllo assi (Motor shield FE) . alimendo la scheda arduino dal pc e la scheda controllo assi con una pila da 9V.

il problema è che quando do alimentazione alla scheda i motori iniziano a girare prima come nel caso “d” e poi “s” e i motori continuano a girare finche non premo la q che sarebbe lo stop, non capisco perchè… se poi premo la q e fermo i motori poi funziona come dovrebbe ma ho un problema alla partenza quando do alimentazione per la prima volta.

#include <SoftwareSerial.h>
#define RxD 7
#define TxD 6
#define DEBUG_ENABLED 1
SoftwareSerial blueToothSerial(RxD,TxD);
char incoming;
 int pinDirA=2;
 int pinDirB=12;
 int pinPwmA=3;
 int pinPwmB=11;
 int vel=120;
 
void setup()
{
  pinMode( pinDirA,OUTPUT );
  pinMode( pinPwmA,OUTPUT );
  pinMode( pinDirB,OUTPUT );
  pinMode( pinPwmB,OUTPUT );
  Serial.begin(38400);
  setupBlueToothConnection();
 }





void setupBlueToothConnection()
{
  blueToothSerial.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
  blueToothSerial.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
  blueToothSerial.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
  blueToothSerial.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
  blueToothSerial.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
  delay(2000); // This delay is required.
  blueToothSerial.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable 
  Serial.println("The slave bluetooth is inquirable!");
  delay(2000); // This delay is required.
  blueToothSerial.flush();
}

void loop()
{
  incoming=blueToothSerial.read();
  switch (incoming)
  {
  case 'd':
   digitalWrite( pinDirA,HIGH );
   digitalWrite( pinDirB,LOW );
   analogWrite( pinPwmA,vel );
   analogWrite( pinPwmB,vel );
   blueToothSerial.println("DESTRA");
   break;
   case 'a':
   digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,vel );
   analogWrite( pinPwmB,vel );
   blueToothSerial.println("SINISTRA");
   break;
   case 's':
   digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,LOW );
   analogWrite( pinPwmA,vel );
   analogWrite( pinPwmB,vel );
   blueToothSerial.println("INDIETRO");
   break;
   case 'w':
   digitalWrite( pinDirA,HIGH );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,vel );
   analogWrite( pinPwmB,vel );
   blueToothSerial.println("AVANTI");
   break;
   case 'q':
    digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,0 );
   analogWrite( pinPwmB,0 );
   blueToothSerial.println("FERMO");
   break;
 }
 delay(100);
}

Ciao,
essendo il tuo primo post, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Quelle due :

pinMode(RxD, INPUT);
pinMode(TxD, OUTPUT);

non servono assolutamente a nulla, anzi, possono creare problemi ! La SoftwareSerial si inizializza da sola i pin come le occorrono !

ok grazie, ho rimosso le due righe che mi hai detto ma il problema persiste, qualche idea su come risolvere? (come ho detto nella presentazione non me ne intendo molto)ìì

quello che non capisco è perchè i motori partano quando collego l'alimentazione ad arduino senza mandare nessun comando dal telefono . prima fa il caso destra dopo un secondo fa sinistra e poi finche non gli do un altro comando i motori funzionano come nel caso sinistra.... nel programma non capisco cosa lo faccia andare cosi..

non ho detto che uso un arduino uno rev 3

Nel setup dopo aver definito i pin come Output li metterei anche a dei livelli oportunamente definiti in modo che il driver non alimenti il motore.

digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,0 );
   analogWrite( pinPwmB,0 );

blueToothSerial.begin(38400)
é una velocitá troppo alta per la seriale software. Al massimo 9600.

Ciao Uwe

Sono d'accordo con @uwefed.
Anche se non ne capisco quanto lui, personalmente quando ho problemi all'avvio di uno sketch, imposto i valori iniziali nel setup in modo da sapere bene quale sarà lo stato dopo il reset.

uwefed:

blueToothSerial.begin(38400)

é una velocitá troppo alta per la seriale software. Al massimo 9600.

No, no, Uwe, posso assicurare che un ATmega328P a 16 MHz, come sulla UNO, non ha alcun problema con la SoftwareSerial a 38400 ... che, oltretutto, è la velocità di default dei HC-05 quando sono in modalità AT :wink:

Guglielmo

buongiorno @AndreaGnozzi,

io, come già detto nei post precedenti al mio,imposterei dei valori iniziali per i motori (ad esempio tutto fermo) in modo tale da sapere da che punto parte il sistema, diciamo che metti il sistema in una fase conosciuta.questo lo puoi fare o settando già i valori per i motori nel setup oppure mettendo un caso di default allo swhitch case in modo tale che se nel loop arduino non riceve il comando da bluethoot mette i motori in stato di fermo,una volta ricevuto il comando si mettono nello stato previsto dal comando.

starà a te gestire tutti i casi in cui arduino riceve comandi "sbagliati", ricevuti magari schiacciando accidentalmente un tasto qualunque dello smartphone...

spero di essere stato chiaro.

buona giornata.

ho provato ad aggiungere questo:

 default :
   digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,0 );
   analogWrite( pinPwmB,0 );
   break;

ma non è cambiato nulla … appena metto l’alimentazione fa “d” poi fa “s” e continua finche non gli do un altro comando…
stessa cosa anche mettendo nel void setup. non so che dire, forse sarà la libreria boh, non capisco proprio. lascio la libreria in allegato.

keywords.txt (601 Bytes)

SoftwareSerial.cpp (13.3 KB)

SoftwareSerial.h (3.48 KB)

Se non fa ciò che c'è nel default pur non inviando nulla allora sei sicuro che il problema non sia nella comunicazione?
Hai provato a controllare il tutto da monitor seriale senza collegare i motori? Fai una stampa a video di quello che ricevi, magari all'inizio riceve cose strane

collegando solo la scheda arduino al pc , e facendo monitor seriale viene fuori la scritta : The slave bluetooth is inquirable!

ho provato poi a collegare anche il telefono per vedere se faceva la cosa di destra e sinistra e la fa ancora se collego il telefono con l'app mi viene fuori "destra" pochissimo dopo "sinistra"

Ma prima di fare:

incoming=blueToothSerial.read();

ci vogliamo chiedere se c'è qualche cosa da leggere o no ? ? ?

Magari una bella:

if (blueToothSerial.available()) { ...... }

Guglielmo

void loop()
{ 
  if (blueToothSerial.available()) {
  incoming=blueToothSerial.read();
  switch (incoming)
  {
  default :
   digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,0 );
   analogWrite( pinPwmB,0 );
   break;
   case 'w':
   digitalWrite( pinDirA,HIGH );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,vel );
   analogWrite( pinPwmB,vel );
   blueToothSerial.println("AVANTI");
   break;
    case 'd':
   digitalWrite( pinDirA,HIGH );
   digitalWrite( pinDirB,LOW );
   analogWrite( pinPwmA,vel );
   analogWrite( pinPwmB,vel );
   blueToothSerial.println("DESTRA");
   break;
    case 'a':
   digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,vel );
   analogWrite( pinPwmB,vel );
   blueToothSerial.println("SINISTRA");
   break;
   case 's':
   digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,LOW );
   analogWrite( pinPwmA,vel );
   analogWrite( pinPwmB,vel );
   blueToothSerial.println("INDIETRO");
   break;
   case 'q':
    digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,0 );
   analogWrite( pinPwmB,0 );
   blueToothSerial.println("FERMO");
   break;
 }
 delay(100);
}
 else
 {
  digitalWrite( pinDirA,LOW );
   digitalWrite( pinDirB,HIGH );
   analogWrite( pinPwmA,0 );
   analogWrite( pinPwmB,0 );
 }

}

intendi di fare una cosa del genere?

forse ho sbagliato, se intendi questo il problema c’è ancora.
grazie comunque per l’aiuto che mi state dando so che alla fine riusciremo a risolvere il problema !

Si, intendevo questo e ora, subito dopo la :

incoming=blueToothSerial.read();

metti una bella:

Serial.print("Ricevuto da bluetooth: ");
Serial.println(incoming);

così vedi quando e che comandi arrivano !

Guglielmo

AndreaGnozzi:
collegando solo la scheda arduino al pc , e facendo monitor seriale viene fuori la scritta : The slave bluetooth is inquirable!

ho provato poi a collegare anche il telefono per vedere se faceva la cosa di destra e sinistra e la fa ancora se collego il telefono con l'app mi viene fuori "destra" pochissimo dopo "sinistra"

Quindi appena ti colleghi allo smartphone ricevi destra e sinistra?
Se è così allora o inserisci un delay in modo da non leggere subito questi comandi, oppure non so, forse cambiando le lettere cambia qualcosa.
Ad ogni modo fai come dice guglielmo e riporta qui i risultati

ecco da dove arrivavano i comandi che non capivo ... questo è quello che riceve.

The slave bluetooth is inquirable!
Ricevuto da bluetooth: ¡
Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: O
Ricevuto da bluetooth: K
Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: O
Ricevuto da bluetooth: K
Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: +
Ricevuto da bluetooth: S
Ricevuto da bluetooth: T
Ricevuto da bluetooth: O
Ricevuto da bluetooth: A
Ricevuto da bluetooth: U
Ricevuto da bluetooth: T
Ricevuto da bluetooth: =
Ricevuto da bluetooth: 1
Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: +
Ricevuto da bluetooth: S
Ricevuto da bluetooth: T
Ricevuto da bluetooth: A
Ricevuto da bluetooth: U
Ricevuto da bluetooth: T
Ricevuto da bluetooth: O
Ricevuto da bluetooth: =
Ricevuto da bluetooth: 0
Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: O
Ricevuto da bluetooth: K
Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: O
Ricevuto da bluetooth: K
Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: 

Ricevuto da bluetooth: W
Ricevuto da bluetooth: O
Ricevuto da bluetooth: R
Ricevuto da bluetooth: K
Ricevuto da bluetooth: :
Ricevuto da bluetooth: S
Ricevuto da bluetooth: L
Ricevuto da bluetooth: A
Ricevuto da bluetooth: V

Fai una bella cosa, modifica la Serial.println() così:

Serial.println(incoming, HEX);

... così vedi anche i caratteri non stampabili (stampa il valore esadecimale del carattere).

A questo punto comunque devi capire perché la tua applicazione trasmette in BT dei caratteri a caso ... ::slight_smile:

Guglielmo

The slave bluetooth is inquirable!
Ricevuto da bluetooth: FFFFFFFF
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: 2B
Ricevuto da bluetooth: 53
Ricevuto da bluetooth: 54
Ricevuto da bluetooth: 57
Ricevuto da bluetooth: 4D
Ricevuto da bluetooth: 4F
Ricevuto da bluetooth: 44
Ricevuto da bluetooth: 3D
Ricevuto da bluetooth: 30
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: 2B
Ricevuto da bluetooth: 53
Ricevuto da bluetooth: 54
Ricevuto da bluetooth: 4E
Ricevuto da bluetooth: 41
Ricevuto da bluetooth: 3D
Ricevuto da bluetooth: 53
Ricevuto da bluetooth: 65
Ricevuto da bluetooth: 65
Ricevuto da bluetooth: 65
Ricevuto da bluetooth: 64
Ricevuto da bluetooth: 42
Ricevuto da bluetooth: 54
Ricevuto da bluetooth: 53
Ricevuto da bluetooth: 6C
Ricevuto da bluetooth: 61
Ricevuto da bluetooth: 76
Ricevuto da bluetooth: 65
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: 2B
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: 4F
Ricevuto da bluetooth: 4B
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: 4F
Ricevuto da bluetooth: 4B
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: 4F
Ricevuto da bluetooth: 4B
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: 4F
Ricevuto da bluetooth: 4B
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: 44
Ricevuto da bluetooth: 44
Ricevuto da bluetooth: 45
Ricevuto da bluetooth: 53
Ricevuto da bluetooth: 54
Ricevuto da bluetooth: 52
Ricevuto da bluetooth: 41
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: 45
Ricevuto da bluetooth: 52
Ricevuto da bluetooth: 52
Ricevuto da bluetooth: 4F
Ricevuto da bluetooth: 52
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A
Ricevuto da bluetooth: A
Ricevuto da bluetooth: A
Ricevuto da bluetooth: 53
Ricevuto da bluetooth: A
Ricevuto da bluetooth: 53
Ricevuto da bluetooth: 49
Ricevuto da bluetooth: 4E
Ricevuto da bluetooth: 49
Ricevuto da bluetooth: 53
Ricevuto da bluetooth: 54
Ricevuto da bluetooth: 52
Ricevuto da bluetooth: 41
Ricevuto da bluetooth: D
Ricevuto da bluetooth: A

da dove potrebbero arrivare ??? l'unica cosa che mi viene in mente è la libreria , potrebbero venire da la?

Chi è che trasmette sul bluetooth? Il tuo programma su smartphone immagino ...
... quindi c'è qualche cosa che non va li.

Considera che dove vedi D significa che ha ricevuto 0x0D (CR) e dove vedi A significa che ha ricevuto 0x0A (LF) quindi ... carriage return/line feed ... che ci può stare ... mi preoccupa di più quella serie di FFFFFFFF iniziali seguiti anche loro da CR/LF ::slight_smile:

Guglielmo

ad essere sincero non ho capito molto di quello che hai detto nell'ultimo messaggio ma comunque ho fatto monitor seriale senza collegare arduino al cellulare ma solo dopo aver collegato l'alimentazione