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à.
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.
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?
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
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
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?