Problema con trasmissione comandi bluetooth

Guardati e provati gli esempi allegati alle librerie per vedere se hanno la stessa sintassi ... ::slight_smile:

Guglielmo

ciao...ho dato un occhio a questa libreria...se non ho capito male devi impostare i microsecondi per il pwm e non i gradi...

EDIT: ecco...mentre scrivevo io...ti aveva già scritto Guglielmo

Ok ora mi metto a studiarli e a provarli, per ora ringrazio per la disponibilità :slight_smile: .... Vi aggiornerò su come procede

Rieccomi qui, mi sono studiato gli esempi contenuti nelle cartelle delle librerie, e ho buttato giù uno sketch.
Ahimè però il risultato non è stato quello sperato, lo sketch viene caricato senza problemi in arduino, però il servo si limita a gracchiare e a fare movimenti quasi nulli. Questo è lo sketch che ho utilizzato:

#include <ServoTimer2.h>

#include <AltSoftSerial.h>

   

int rxPin = 8;
int txPin = 9;
AltSoftSerial bluetooth(rxPin, txPin);
String message; 

#define pinServo 11      

ServoTimer2 myservo; 
 

void setup() {
  
  bluetooth.begin(9600); 
  
  myservo.attach( pinServo );

  
 } 


 int valore_partenza = 1500;
 
 
 void loop() { 
  
if (bluetooth.available()) {

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



Potreste, per favore, dargli un'occhiata e dirmi se vedete qualcosa di anomalo e che non va bene?  ;) 

P.S. il "valore di partenza" che vale 1500, il 1500 sarebbe espresso in millisecondi.

Guarda, fai una bella cosa, prendi un esempio banale della ServoTimer2 e, con lausilio di sue Serial.println() scopri i valori dei microsecondi per posizionare il servo tutto da una parte (-90° o 0° se preferisci partire da 0) e tutto dall'altra parte (+90° o 180° se parti da 0°).

Fatto questo ti fai una bella map() che trasforma la posizione in gradi che tu vuoi impostare nel valore dei microsecondi e usi il valore della map() per posizionare il servo.

Perché NON puoi sperare di variare la posizione variandi di 1 msec. per volta ...

Guglielmo

Ho scritto uno sketch seguendo i tuoi preziosi consigli, però il servo non si muove, ho sicuramente sbagliato qualcosa, nonostante abbia provato a modificare più volte lo sketch la situazione non cambia. Questo è il mio sketch, spero che almeno voi riusciate a trovare l'errore... ci sto davvero perdendo l'anima :confused:

#include <ServoTimer2.h>

#include <AltSoftSerial.h>

   
int rxPin = 8;
int txPin = 9;
AltSoftSerial bluetooth(rxPin, txPin);
String message; 

int grado = 0;
int partenza = 0;

#define pinServo 11      

ServoTimer2 myservo; 
 

void setup() {
  
  bluetooth.begin(9600); 
  
  myservo.attach( pinServo );
  
 } 

 void loop() { 

partenza = 1500;
grado = map(partenza, 1000, 2000, 0, 180);

  
if (bluetooth.available()) {

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

Scusa è ma ...

  1. tu devi convertire i gradi in microsecondi e NON il viceversa

  2. lo devi fare OGNI volta che aumenti o diminuisci i gradi visto che devi impostare i microsecondi aggiornati

Guglielmo

ok ho corretto, ora il servo esegue correttamente i comandi; però è tornato ad essere lento nei movimenti come quando succedeva all'inizio del topic, quando usavo nello sketch la classica libreria myservo.... sono però sparite le "interferenze", nel senso che ora il suo movimento è lineare senza singhiozzamenti... rimane però ancora molto lento... può essere dovuto allo sketch? :

#include <ServoTimer2.h>

#include <AltSoftSerial.h>

   
int rxPin = 8;
int txPin = 9;
AltSoftSerial bluetooth(rxPin, txPin);
String message; 

int grado = 0;
int microsecondi = 0;

#define pinServo 11      

ServoTimer2 myservo; 
 

void setup() {
  
  bluetooth.begin(9600); 
  
  myservo.attach( pinServo );
  
 } 

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

    char c = bluetooth.read();
    if (c == 'H') {
      grado ++;
      myservo.write( microsecondi );
      microsecondi = map(grado, 0, 180, 1000, 2000);
      
      delay(60);
  
      
    }
    if (c == 'L') {
      grado --;
      myservo.write( microsecondi );
      microsecondi = map(grado, 0, 180, 1000, 2000);
      
      delay(60);
    }
  }
}

ciao...a questo punto elimina i delay(60)...o al massimo mettili a (10)

Ho provato a seguire questa strada ma niente... non cambia nulla.... Comunque sto provando a sperimentare un altro metodo per ricevere i segnali bluetooth e azionare il servo, se si rivelerà efficace ve lo allego qui sotto :wink: