Salve a tutti.
Sto incontrando alcune difficoltà con un progetto riguardante il controllo di sterzo attuato dal servo SG90 della Tower Pro (quello fornito nello starter kit V5 di Arduino UNO) attraverso uno shield bluetooth che monta il modulo RN-42 di Roving; l'intero shield è di futura elettronica.
Per il controllo uso la app Roboremo, la quale permette di configurare telecomandi virtuali personalizzati.
Ho seguito passo-passo questa guida, che a mio parere sembra quella piu adatta allo scopo.
essa comprende anche questo sketch.
// Control servo motor over Bluetooth using RoboRemo app
// www.roboremo.com
// Hardware setup:
// BT module Arduino
// GND ------- GND
// VCC ------- 5V
// TX-O ------ pin0
// RX-I ------ pin1
// Servo Arduino
// GND ------- GND
// VCC ------- VCC
// signal ---- pin4
#define bluetooth Serial
#include <Servo.h>
Servo myServo;
char cmd[100];
int cmdIndex;
void exeCmd() {
// "servo" is the servo motor id
if(cmd[0]=='s' &&
cmd[1]=='e' &&
cmd[2]=='r' &&
cmd[3]=='v' &&
cmd[4]=='o' &&
cmd[5]==' ') {
int val = 0;
for(int i=6; cmd[i]!=0; i++) {
val = val*10 + (cmd[i]-'0');
}
// if cmd is "servo 1234", val will be 1234
myServo.writeMicroseconds(val);
}
}
void setup() {
delay(500); // wait for bluetooth module to start
bluetooth.begin(115200); // Bluetooth default baud is 115200
myServo.attach(4, 1000, 2000);
cmdIndex = 0;
}
void loop() {
if(bluetooth.available()) {
char c = (char)bluetooth.read();
if(c=='\n') {
cmd[cmdIndex] = 0;
exeCmd(); // execute the command
cmdIndex = 0; // reset the cmdIndex
} else {
cmd[cmdIndex] = c;
if(cmdIndex<99) cmdIndex++;
}
}
}
il problema che riscontro, è la mancata risposta dell' ATMEGA al segnale seriale in arrivo dal modulo.
il modulo dialoga verso il micro a 9600 baud fissi e la cosa che mi fa specie è che nello sketch manchi il comando Serial.begin (9600), cosa che se però aggiungo, mi porta al non potermi connettere attraverso il BT.
Posso confermare che i segnali arrivano chiaramente al modulo: lo noto dal led di trasmissione che risponde prontamente alla ricezione.
Tral'altro ho testato lo stesso modulo attraverso un semplice sketch per l'accensione di un led via BT.
Dallo sketch che vi ho mostrato, ho appurato che il sistema lavora discriminando tutti i segnali tranne quelli con un flag denominato "servo", che deve essere impostato come id sullo slider virtuale della app. Una volta rilevato il segnale servo, estrapola il valore in microsecondi e lo trasforma in impulso da mandare via pin 4 al servo. il tutto usando una sottoroutine che viene richiamata ad ogni ciclo di lettura della seriale.
Trovo la cosa utile ed intelligente, dato che in questo modo, creando altre routine che rilevano un flag diverso, potrei aggiungere controlli per altre funzioni.
secondo voi di cosa si tratta? Non ho una grande esperienza e non vorrei che ci sia qualche conflitto tra le librerie, un errore nello sketch o che semplicemente lo sketch stesso non si adatti bene al mio modulo, dato che nella guida usano un modulo BlueSmiRF.
Vorrei infine chiedervi una piccola delucidazione sul funzionamento in dettaglio di questa parte dello sketch, dato che ho solo intuito per logica la sua funzione, sopratutto nella parte del ciclo for:
if(cmd[0]=='s' &&
cmd[1]=='e' &&
cmd[2]=='r' &&
cmd[3]=='v' &&
cmd[4]=='o' &&
cmd[5]==' ') {
int val = 0;
for(int i=6; cmd[i]!=0; i++) {
val = val*10 + (cmd[i]-'0');
}
// if cmd is "servo 1234", val will be 1234
myServo.writeMicroseconds(val);
Vi ringrazio in anticipo e spero di non essermi dilungato troppo in dettagli superflui. Se vi serve altro posso darvi anche un manuale d'uso della app.