problema scrittura sketch controllo servo da app(Risolto)

Ciao a tutti ragazzi, sono Eduardo e chiedo il vostro aiuto.
Dato che sono un principiante vi chiedo cortesemente di essere il più chiari che potete.
Allora io per questo progetto uso un’Arduino Mega 2560 e un modulo bluetooth hc-06 per permettermi di comandare il movimento di n°5 servo (sg 90) in modo da emulare il movimento delle dita di una mano.
Inizialmente ho cercato su internet ragazzi che già avessero fatto programmi simili, ma nessuno comandato da applicazione, alcuni da joystich mentre altri usavano un guanto con sensori che inviava il movimento da fare. Sono riuscito a trovare il comando di un servo con Arduino che però ripeteva ciclicamente la stessa operazione. Il mio intento, come credo di aver fatto intendere, è quello di decidere io che movimento fare dando in input un carattere a cui verranno collegati movimenti specifici.
Ora chiedo a voi cosa ha di sbagliato questo sketch e in che modo poterlo correggere, sperando in un’aiuto repentino e appena posso tenterò in qualsiasi modo di imparare a programmare Arduino, dato che la cosa a me interessa tanto ma non ho tempo per poterlo fare ora.
Già mi è stato detto che gli apici da usare devono essere singoli e non doppi per i caratteri.
Questo è lo sketch:

#include <Servo.h>
Servo myservoa;
Servo myservob;
Servo myservoc;
Servo myservod;
Servo myservoe;
int posa = 0;
int posb = 180;
int message;
int b;


void setup ()
{
Serial.begin(9600); 
Serial3.begin(9600);
myservoa.attach(8);  
myservob.attach(9);
myservoc.attach(10);
myservod.attach(11);
myservoe.attach(12);
}


void loop()
{
 while(Serial3.available()){
   message+=char(Serial3.read());
 }
 if(!Serial3.available())
 {
   if(message ==""){
     Serial.println(message);
     (message! =="");
   }
 } 
 if (message == 'A') {
   myservoa.write(posb);
 }
 if (message == 'a') {
   myservoa.write(posa);
 }
 if (message == 'B') {
   myservob.write(posb);
 }
 if (message == 'b') {
   myservob.write(posa);
 }
 if (message == 'C') {
   myservoc.write(posb);
 }
 if (message == 'c') {
   myservoc.write(posa);
 }
 if (message == 'D') {
   myservod.write(posb);
 }
 if (message == 'd') {
   myservod.write(posa);
 }
 if (message == 'E') {
   myservoe.write(posb);
 }
 if (message == 'e') {
   myservoe.write(posa);
 }
 if (message == 'F') {
   myservoa.write(posb);
   myservob.write(posb);
   myservoc.write(posb);
   myservod.write(posb);
   myservoe.write(posb);
 }
 if (message == 'f') {
   myservoa.write(posa);
   myservob.write(posa);
   myservoc.write(posa);
   myservod.write(posa);
   myservoe.write(posa);
 }
 if (message == 'G') {
   myservob.write(posb);
   myservoc.write(posb);
 }
 if (message == 'g') {
   myservob.write(posa);
   myservoc.write(posa);
 }
 if (message == 'H') {
   myservob.write(posb);
   myservoe.write(posb);
 }
 if (message == 'h') {
   myservob.write(posa);
   myservoe.write(posa);
 }
 if (message == 'I') {
   myservoa.write(posb);
   myservob.write(posb);
   myservoe.write(posb);
 }
 if (message == 'i') {
   myservoa.write(posa);
   myservob.write(posa);
   myservoe.write(posa);
 }
 if (message == 'J') {
   myservoa.write(posb);
   myservob.write(posb);
   myservoc.write(posb);
   myservod.write(posb);
 }
 if (message == 'j') {
   myservoa.write(posa);
   myservob.write(posa);
   myservoc.write(posa);
   myservod.write(posa);
 }
 if (message == 'K') {
   myservoc.write(posb);
   myservob.write(posb);
   myservoe.write(posb);
 }
 if (message == 'k') {
   myservoc.write(posa);
   myservob.write(posa);
   myservoe.write(posa);
 }
 if (message == 'L') {
   myservod.write(posb);
   myservoe.write(posb);
 }
 if (message == 'l') {
   myservod.write(posa);
   myservoe.write(posa);
 }
}

Questo è l’errore che ottengo:

sketch may28a.ino 
ISO C++ forbids comparision between pointer and integer

Ciao,
essendo il tuo primo post, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO

… poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More → Modify) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Grazie.

Guglielmo

P.S.: Senza i tag CODE … guarda cosa succede nel tuo programma … ::slight_smile:

ciao

Se non sbaglio (eventualmente correggetemi :wink: ) si deve usare l’apice singolo e non il doppio apice per il confronto

if (message == "A") {<== da cosi

if (message == 'A') {<== a così

Tra l’altro non capiscpo perché la variabile message la dichiari come int (quindi usi 2 byte di memoria) quando lo usi comunque per memorizzare un char.

ciao
pippo72

Assolutamente SI.
Doppio apice=stringa in stile C (vettore/array di char terminato da NULL ovvero '\0' ovvero 0)
Singolo apice=carattere

Poi, il programma è quasi del tutto errato. Molti errori e non di sintassi.

  1. se dichiari la variabile message all'inizio è globale, poi nella loop() ad un certo punto la ridichiari, da quel momento la message locale nasconde la globlale e non essendo inizializzata ha dentro un valore a caso.
  2. viene fatto un ciclo while per leggere tanti caratteri ma NON si può usare quella forma in una singola variabile message. Se message è un oggetto String si può, ma fatto così stai solo accumulando (sommando) i valori di ogni carattere dentro a message.
    Che poi a che serve se lavori sul singolo carattere ?
  3. che cosa ti frega se non stai ricevendo nulla ? La loop() è molto veloce, rischi di stampare a video nulla molto velocemente. Se ricevi, analizzi il char e fai qualcosa, altrimenti NON fare nulla.

Consiglio di leggere prima un libro introduttivo sul C.

Quindi la message a inizio dichiarala char.
poi

void loop()
{
  if(Serial3.available())
  { message=Serial3.read();
    switch(message)
    { case 'A': 
        myservoa.write(posb);
        break;
      case 'a': 
        myservoa.write(posa);
        break;
      case 'B':
... eccetera
      case 'F':
        myservoa.write(posb);
        myservob.write(posb);
        myservoc.write(posb);
        myservod.write(posb);
        myservoe.write(posb);
        break;
... eccetera
    } // fine switch
  } // fine if
} // fine loop