Problema con trasmissione comandi bluetooth

Ciao a tutti, scrivo questo post perchè, come anticipato dal titolo, non riesco a far eseguire correttamente ad arduino delle istruzioni inviate via bluetooth, tramite app su cellulare. Dunque ho scritto un piccolo sketch ( aiutandomi e prendendo un po spunto dal web ), che dovrebbe far eseguire determinati movimenti ad un servo, in base al segnale bluetooth ricevuto.
In pratica finchè tengo premuto un pulsante, sull’ app dello smartphone, arduino riceve un determinato segnale che deve far aumentare la gradazione del servo. Viceversa se invece tengo premuto un altro pulsante, la gradazione deve diminuire; mentre quando non premo nulla il servo non deve fare nulla.
Con lo sketch che sono riuscito a mettere giù, il servo funziona come previsto, però va a scatti ed è molto molto lento. Non riesco a capire dove sia il problema, i cavi sono tutti collegati correttamente, con la GND del servo in comune con quella di arduino.
Vi allego il mio sketch, ringraziandovi fin da subito per la vostra disponibilità.

prova.ino (718 Bytes)

ciao tedagocolmajo,

a mia opinione usare una String per leggere un singolo carattere, per come lo fai nello sketch, è un spreco...ed usi tante risorse che per nulla.

detto questo...scrivi:

  while (bluetooth.available()) {
    message += char(bluetooth.read());
  }

e dopo:

  if (!bluetooth.available())
  {
    while (message != "")
    {
      while (message == "H") {
        grado++;
        message = "";
      }

      while (message == "L") {
        grado--;
        message = "";
      }

    }
  }

cioè...fintanto che c'è qualche cosa nella seriale resti li...ed "ingrandisci la Stringa"...poi se nella seriale non c'è nulla esegui tutta un'altra serie di while()...e solo dopo agisci sul servo...bruttissimo. prova a sostituire il tutto con:

  if (Serial.available()) {

    char c = Serial.read();
    if (c == 'H') {
      grado++;
      myservo.write( grado );
    }
    if (c == 'L') {
      grado--;
      myservo.write( grado );
    }
  }

Ciao ORSO2001, intanto grazie per la tua risposta...... Ho provato a fare come mi hai suggerito, però il comportamento del servo tende a peggiorare rispetto a prima. Con le modifiche che mi hai postato non aumenta la gradazione, ma si limita solo a "singhiozzare", mentre prima il grado aumentava però moolto lentamente.

Ciao,

sei sicuro di inviare un singolo carattere (BYTE) e senza intestazione o terminatore? ancora meglio puoi postare come hai scritto adesso lo sketch!?

OK ora lo posto

#include <Servo.h>  
#include <SoftwareSerial.h>

Servo myservo;   

int rxPin = 3;
int txPin = 2;
SoftwareSerial bluetooth(rxPin, txPin);
String message; 

int grado = 0;     

int pinServo = 10; 

void setup() {

  bluetooth.begin(9600); 
  
  myservo.attach( pinServo );  
  myservo.write( grado );  
 } 

 void loop() { 
  
   if (Serial.available()) {

    char c = Serial.read();
    if (c == 'H') {
      grado++;
      myservo.write( grado );
    }
    if (c == 'L') {
      grado--;
      myservo.write( grado );
    }
 }

 }

sicuro che devi leggere da Serial e non da bluetooth?

esatto...deve essere bluetooth...

Ok, ora in base ai vostri suggerimenti, ho corretto così:

#include <Servo.h>  
#include <SoftwareSerial.h>

Servo myservo;   

int rxPin = 3;
int txPin = 2;
SoftwareSerial bluetooth(rxPin, txPin);
String message; 

int grado = 0;     

int pinServo = 10; 

void setup() {

  bluetooth.begin(9600); 
  
  myservo.attach( pinServo );  
  myservo.write( grado );  
 } 

 void loop() { 
  
   if (bluetooth.available()) {

    char c = bluetooth.read();
    if (c == 'H') {
      grado++;
      myservo.write( grado );
    }
    if (c == 'L') {
      grado--;
      myservo.write( grado );
    }
 }
 }



il servo ora si muove però molto lentamente, come potrei ovviare a questo problema?

non conosco la libreria servo, ma molto banalmente prova a incrementare di valori maggiori a 1…
grado = grado + 10;
grado = grado - 10;

ho provato a seguire il tuo suggerimento purtroppo la situazione rimane invariata.

prova a fare un po' di debug...scrivi il loop cos' e dicci cosa stampa sul monitor seriale:

void loop() {

  if (bluetooth.available()) {

    char c = bluetooth.read();
    if (c == 'H') {
      grado++;
      myservo.write( grado );
      Serial.print(c);
      Serial.print(" ");
      Serial.println(grado);
    }
    if (c == 'L') {
      grado--;
      myservo.write( grado );
      Serial.print(c);
      Serial.print(" ");
      Serial.println(grado);
    }
  }
}

dovrebbe stamparti una unica linea con lettera ricevuta, uno spazio, ed il valore di grado...posta quello che ottieni

Appena provato, questo è ciò che mi compare sul monitor seriale se trasmetto il codice H con l'app. Altrettanto succede con il codice L solo che il grado va in decrescere, come da impostazioni.

H -H 1
H 2
H 3
H 4
H 5
H 6
H 7
H 8
H 9
H 10
H 11
H 12
H 13
H 14
H 15
H 16
H 17
H 18
H 19
H 20
H 21
H 22
H 23
H 24
H 25
H 26
H 27
H 28
H 29
H 30
H 31
H 32
H 33
H 34
H 35
H 36
H 37
H 38
H 39
H 40
H 41
H 42
H 43
H 44
H 45
H 46
H 47
H 48
H 49
H 50
H 51
H 52
H 53
H 54
H 55
H 56
H 57
H 58
H 59
H 60
H 61
H 62
H 63
H 64
H 65
H 66
H 67
H 68
H 69
H 70
H 71
H 72
H 73
H 74
H 75
H 76
H 77
H 78
H 79
H 80
H 81
H 82
H 83
H 84
H 85
H 86
H 87
H 88
H 89
H 90
H 91
H 92
H 93
H 94
H 95
H 96
H 97
H 98
H 99
H 100
H 101
H 102
H 103
H 104
H 105
H 106
H 107
H 108
H 109
H 110
H 111
H 112
H 113
H 114
H 115
H 116
H 117
H 118
H 119
H 120
H 121
H 122
H 123
H 124
H 125
H 126
H 127
H 128
H 129
H 130
H 131
H 132
H 133
H 134
H 135
H 136
H 137
H 138
H 139
H 140
H 141
H 142
H 143
H 144
H 145
H 146
H 147
H 148
H 149
H 150
H 151
H 152
H 153
H 154
H 155
H 156
H 157
H 158
H 159
H 160
H 161
H 162
H 163
H 164
H 165
H 166
H 167
H 168
H 169
H 170
H 171
H 172
H 173
H 174
H 175
H 176
H 177
H 178
H 179
H 180

quindi...trasmissione e ricezione OK.

sei sicuro dei collegamenti? che servo usi (link)? riesci a postare una foto di come hai cablato?

Ho fatto uno schizzo con paint, ecco qui:

il servo invece è un tower pro SG90 ecco un link di esempio:

https://www.google.it/search?q=tower+pro+sg90&source=lnms&tbm=isch&sa=X&ved=0ahUKEwin_pXg3vXWAhVD2BoKHaTTD94Q_AUICigB&biw=1439&bih=730#imgrc=DFn5Zy-r_2wk-M:

ciao…quel servo ce l’ho anch’io…ho provato lo sketch e funziona…quindi…o è un problema del cablaggio…i tui fili sono messi in ordine giusto ma forse non ben inseriti od interrotti…od il servo è rotto.

EDIT: mi sono accorto di aver provato il servo sul pin 9…tu usi il 10…ma non dovrebbe fare differenza

quindi a te si muove regolarmente ad una buona andatura e senza scatti?

Forse ho capito cos'intendi per scattoso....subito dopo ogni myservo.write(grado) metti un delay di 20-30 ms.

provato, niente da fare, gira lentamente, ogni tanto si ferma per una frazione di secondo, e poi riparte subito. Potrebbe dipendere da arduino che non riesce a decodificare e ad azionare il servo velocemente?

riesci a fare un video di quello che ti succede?