Ciao a tutti, ho comprato un modulo bluetooth a cui ho collegato il mio cellulare android.
Ho impostato tramite uno switch che per ogni numero da 0 a 4 viene effettuata un'azione differente. Da monitor seriale funziona tutto regolarmente, ma se li invio tramite bluetooth c'è la sagra del random: ad esempio se scrivo 0 mi attiva 1 e 2 e ogni tanto mi arrivano dei numeri stampati come 1 e 9 quando invece ho impostato che stampi il numero inserito (quindi max 4).
Da che può dipendere?
E speri che siamo veggenti o abbiamo delle sfere di cristallo per indovinare che scheda BL, Arduino hai e che sketch usi? cosa mandi dal PC? sei sicuro che non non mandi anche NL e CR?
Ciao Uwe
Scusa, hai ragione. Come unica scusa posso dire che era parecchio tardi quando ho scritto il post
Uso un modulo hc-05, Arduino 1, lo sketch racchiude parecchie cose inutili quindi non lo posto, semplicemente ho
if(Serial.available()>0){
valore=Serial.read();
switch(valore) etc
valore assume un valore da 0 a 4 e tramite usb funziona regolarmente, ma col bluetooth no.
Al modulo ho collegato solamente terra, alimentazione, rxd e txd.
Il fatto che abbia collegato 5 microservo ai 5 volt di arduino e non ad una alimentazione esterna (con mia sorpresa ha funzionato) può influenzare?
lo sketch racchiude parecchie cose inutili quindi non lo posto
allora facciamo anche noi parecchie risposte inutili tra cui quella che Ti serve.
Ho chiesto un estratto da 3 righe dello sketch o ho chiesto lo sketch ?
Ciao Uwe
Mamma mia quanta acidità...
il codice è questo, ma come puoi notare l'unica cosa che serve è quella che ti ho detto.
#include <Servo.h>
Servo polliceServo;
Servo indiceServo;
Servo medioServo;
Servo anulareServo;
Servo mignoloServo;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
mignoloServo.attach(9);
anulareServo.attach(10);
medioServo.attach(11);
indiceServo.attach(12);
polliceServo.attach(13);
}
void loop() {
int minimo[5];
int massimo[5];
minimo[0] = 0;
massimo[0] = 75;
minimo[1] = 50;
massimo[1] = 120;
minimo[2] = 0;
massimo[2] = 115;
minimo[3] = 85;
massimo[3] = 130;
minimo[4] = 45;
massimo[4] = 100;
int i, j;
polliceServo.write(minimo[0]);
indiceServo.write(minimo[1]);
medioServo.write(minimo[2]);
anulareServo.write(minimo[3]);
mignoloServo.write(minimo[4]);
if (Serial.available() > 0) {
char val = Serial.read();
switch (val) {
case '0':
for (i = minimo[0]; i < massimo[0]; i++) {
polliceServo.write(i);
delay(20);
}
for (i = massimo[0]; i > minimo[0]; i--) {
polliceServo.write(i);
delay(20);
}
break;
case '1':
for (i = minimo[1]; i < massimo[1]; i++) {
indiceServo.write(i);
delay(20);
}
for (i = massimo[1]; i > minimo[1]; i--) {
indiceServo.write(i);
delay(20);
}
break;
case '2':
for (i = minimo[2]; i < massimo[2]; i++) {
medioServo.write(i);
delay(20);
}
for (i = massimo[2]; i > minimo[2]; i--) {
medioServo.write(i);
delay(20);
}
break;
case '3':
for (i = minimo[3]; i < massimo[3]; i++) {
anulareServo.write(i);
delay(20);
}
for (i = massimo[3]; i > minimo[3]; i--) {
anulareServo.write(i);
delay(20);
}
break;
case '4':
for (i = minimo[4]; i < massimo[4]; i++) {
mignoloServo.write(i);
delay(20);
}
for (i = massimo[4]; i > minimo[4]; i--) {
mignoloServo.write(i);
delay(20);
}
break;
}
Serial.println(val);
delay(1000);
}
}
Stai usando la seriale hardware che con quei moduli da dei problemi... usa la SoftwareSerial che oltre che funzionare bene, ti lascia anche la seriale libera per un eventuale debug.
metti un serial.println(val); dopo il
char val = Serial.read();
metti un
default:
serial.print "valore fuori dal range";
break;
nel switch case
vengono trasmesse solo i numeri 0 a 4 o altri numeri? come il 10 o il 13?
Ciao Uwe
Allora ho provato a scrivere un codice semplicissimo per verificare solo il funzionamento del componente, sia con la libreria SoftwareSerial che senza. Risultato? Random.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10,11); //RX, TX
void setup() {
// put your setup code here, to run once:
mySerial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
char val=mySerial.read();
mySerial.println(val);
delay(1000);
}
Ad esempio scrivo 0 ed esce *,1 ed esce #, scrivo 4 ed esce 9, scrivo 3 ed esce * scrivo 2 ed esce # (e non stampa sempre lo stesso valore con lo stesso numero). A volte esce anche un rombo con un punto interrogativo dentro.
Poi ho provato a stampare "ciao" senza utilizzare la variabile val e me lo stampa tranquillamente quindi c'è una sorta di modifica alla variabile che viene letta.
sei sicuro di avere il baudrate e i start/stopbit giusti?
Ciao Uwe
Non so se ho capito bene che intendi comunque girando sul web ho letto che tutti usano mySerial.begin(9600) e non saprei al posto di 9600 cosa dovrei usare in alternativa..
Possibile che sia colpa del componente?
Up
Nessuno sa aiutarmi?