Go Down

Topic: [ RISOLTO ]Settare PWM da SerialMonitor + Bluetooth (Read 10032 times) previous topic - next topic

dxcoco2

Oct 31, 2013, 07:08 pm Last Edit: Nov 03, 2013, 10:31 pm by dxcoco2 Reason: 1
Ciao a tutti, grazie all'aiuto di alcuni di voi sono riuscito a far comunicare il mio HC05 con arduino e Android.
Adesso ho un problema al quale non sono riuscito a trovare nulla in merito....vi spiego:
Con il modulo HC05 montato su Arduino e tramite un'app che ho creato appositamente per Android, riesco a comandare 3 Led in maniera facile! Adesso volevo integrare nel mio progetto un Led con intensità variabile (sarà regolato da uno slidebar).
Il mio problema è che arduino resta in "ascolto" sulla seriale e capta certi caratteri che vanno ad attivare le varie funzioni.
vi posto il codice di arduino:

Code: [Select]
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11);
int led1= 13;
int led2= 2;
int led3= 3;
int led4= 4;
int pwm1= 11;

void setup()
{
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 pinMode(led4, OUTPUT);
 pinMode(pwm1, OUTPUT);


  mySerial.begin(9600);
  Serial.println("Controllo LED Bluetooth - Home Control V1.0");
  delay(1000);
}


void loop()
{
  while (mySerial.available())
  {
      char dato= mySerial.read();
      switch(dato)
      {
         case 'XXXXXXX': /---------------------------------------DA QUI IL PROBLEMA
        {
 digitalWrite(pwm1, dato);
          mySerial.println("Led Blu Spento");
          break;/-------------------------------------A QUI
        }    
        case 'A':
        {
 digitalWrite(led2, HIGH);
           mySerial.println("Led Blu Acceso");
          break;
        }
        case 'a':
        {
 digitalWrite(led2, LOW);
          mySerial.println("Led Blu Spento");
          break;
        }    
             case 'B':
        {
 digitalWrite(led3, HIGH);
          mySerial.println("Led Giallo Acceso");
          break;
        }
             case 'b':
        {
 digitalWrite(led3, LOW);
          mySerial.println("Led Giallo Spento");
          break;
         }
             case 'C':
        {
 digitalWrite(led4, HIGH);
          mySerial.println("Led Verde Acceso");
          break;
        }
            case 'c':
        {
 digitalWrite(led4, LOW);
          mySerial.println("Led Verde Spento");
          break;
        }    
                    case '9':
        {
 digitalWrite(led2, HIGH);
   digitalWrite(led3, HIGH);
     digitalWrite(led4, HIGH);
          mySerial.println("Led Accesi");
          break;
        }    
                             case '0':
        {
 digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
     digitalWrite(led4, LOW);
          mySerial.println("Led Spenti");
          break;
        }  
      }      
  }
}


Con il metodo "Case" vado a richiamare la funzione relativo al Byte ricevuto. Ora per poter trasmettere ad Arduino il valore (immaginiamo di poterlo digitare nel serial monitor....) come posso fare????
Vorrei mandare un comando "per intero" del tipo: pw-valore con valore uguale ad un numero che indica l'intensità....
Spero di essermi spiegato correttamente....
Confido in voi....grazie in anticipo

gpb01

#1
Oct 31, 2013, 07:16 pm Last Edit: Oct 31, 2013, 07:17 pm by gpb01 Reason: 1
Devi imparare a gestire, invece che comandi di UN carattere, comandi di N caratteri la cui fine è indicata da un terminatore, es un carattere di CR (0x0D).

Ovvero, dovrai creare un buffer per un array di caratteri; dovrai gestire un loop NON bloccante in cui controlli se c'è un carattere sulla seriale; se c'è ed è diverso la CR lo lo dovrai memorizzare nell'array (... controllando che ci sia ancora spazio); se c'è ed è CR dovrai considerare concluso il comando ed iniziare ad esaminare la stringa che hai ricevuto per capire il comando ricevuto.

Non banalissimo, ma neanche complesso ... ;)

Comincia a provare a buttarlo giù e vediamo ...

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

Altrimenti ... puoi usare questa libreria QUI, che io trovo molto comoda e molto potente ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

dxcoco2

Ciao guglielmo. Intanto grazie per aver risposto, però devi considerare che non tutti, io compreso, riescono a comprendere cio che hai detto. ... utile sarebbe un esempio o un link dove viene spiegato in maniera semplice e comprensibile come si fa.

Hai un idea semplice da potermi proporre?

gpb01

#4
Oct 31, 2013, 10:10 pm Last Edit: Oct 31, 2013, 10:29 pm by gpb01 Reason: 1
Se scarichi la libreria che ho indicato puoi ...

... uno, usarla così come è e già da sola funziona e gli fai fare quello che serve a te ( ... è spiegata QUI)

... due, guardare come è scritta ed all'interno c'è proprio una funzione (SerialCommand::readSerial()) che fa esattamente quello che ti ho descritto ... più tante altre cose ;)

Per qualsiasi dubbio .. chiedi ...

Guglielmo
Search is Your friend ... or I am Your enemy !

dxcoco2

Grazie! Sono riuscito ad elaborare comandi con più lettere/numeri...adesso però...come posso fare per far scrivere via Bluetooth i comandi? Prima usavo la SoftwareSerial, ma non riesco ad implementarla con questo codice....

Posso scrivere (per capirsi) sulla serialmonitor via bluetooth??

gpb01

Magari se posti il codice completo e ci fai capire come è fatto adesso .... forse riusciamo a dare delle risposte ... perché ora come ora ... non si capisce più bene come è fatto il tuo programma ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

dxcoco2

Il codice è quello che mi hai postato con qualche modifica

Code: [Select]


//EZB ezb = new EZB();
//ezb.Uart.SendSerial(Digital.DigitalPortEnum.D8, Uart.BAUD_RATE_ENUM.Baud_9600, "a");

// Demo Code for SerialCommand Library
// Steven Cogswell
// May 2011

#include <SerialCommand.h>



#define arduinoLED 13 // Arduino LED on board
int led1= 13;
int led2= 2;
int led3= 3;
int led4= 4;
int btcnt= 6;
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by
int convar = 0;        // determina se il dispositivo è connesso

SerialCommand sCmd; // The demo SerialCommand object

void setup() {
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(btcnt, OUTPUT);

  digitalWrite(led2, LOW); // default to LED off
  digitalWrite(led3, LOW); // default to LED off
  digitalWrite(led4, LOW); // default to LED off
  digitalWrite(btcnt, LOW); // default to LED off

  Serial.begin(9600);

  // Setup callbacks for SerialCommand commands
  sCmd.addCommand("1", LED_A); // LED Blu on
  sCmd.addCommand("2", LED_a); // LED Blu off
   sCmd.addCommand("LED_B", LED_B); // LED Giallo on
  sCmd.addCommand("LED_b", LED_b); // LED Giallo off
   sCmd.addCommand("LED_C", LED_C); // LED Verde on
  sCmd.addCommand("LED_c", LED_c); // LED Verde off
 
  sCmd.addCommand("HELLO", sayHello); // Echos the string argument back
  sCmd.addCommand("P", processCommand); // Converts two arguments to integers and echos them back
  sCmd.setDefaultHandler(unrecognized); // Handler for command that isn't matched (says "What?")
  Serial.println("Ready");
}

void loop() {
  sCmd.readSerial(); // We don't do much, just process serial commands
  if (mySerial.available())
    Serial.write(mySerial.read());
    sCmd.addCommand = mySerial.read();
}

void LED_A() {
  Serial.println("LED Blu Acceso");
  digitalWrite(led2, HIGH);
}
void LED_a() {
  Serial.println("LED Blu Spento");
  digitalWrite(led2, LOW);
}
void LED_B() {
  Serial.println("LED Giallo Acceso");
  digitalWrite(led3, HIGH);
}
void LED_b() {
  Serial.println("LED Giallo Spento");
  digitalWrite(led3, LOW);
}
void LED_C() {
  Serial.println("LED Verde Acceso");
  digitalWrite(led4, HIGH);
}
void LED_c() {
  Serial.println("LED Verde Spento");
  digitalWrite(led4, LOW);
}


void sayHello() {
  char *arg;
  arg = sCmd.next(); // Get the next argument from the SerialCommand object buffer
  if (arg != NULL) { // As long as it existed, take it
    Serial.print("Hello ");
    Serial.println(arg);
  }
  else {
    Serial.println("Hello, whoever you are");
  }
}


void processCommand() {
  int aNumber;
  char *arg;

  Serial.println("We're in processCommand");
  arg = sCmd.next();
  if (arg != NULL) {
    aNumber = atoi(arg); // Converts a char string to an integer
    Serial.print("First argument was: ");
    Serial.println(aNumber);
  }
  else {
    Serial.println("No arguments");
  }

  arg = sCmd.next();
  if (arg != NULL) {
    aNumber = atol(arg);
    Serial.print("Second argument was: ");
    Serial.println(aNumber);
  }
  else {
    Serial.println("No second argument");
  }
}

// This gets set as the default handler, and gets called when no other command matches.
void unrecognized(const char *command) {
  Serial.println("What?");
}


non riesco a capire come posso fare per inviare comandi trramite modulo bluetooth....devo collegarlo al pin 0 e 1?

gpb01

#8
Nov 01, 2013, 06:06 pm Last Edit: Nov 01, 2013, 06:08 pm by gpb01 Reason: 1
Aha ... ok ... quindi, se capisco bene, tu fino ad ora stavi usando la porta seriale mandando i comandi tramite la USB del PC ... mentre ora li vorresti mandare tramite il bluetooth ... giusto ?

Tre sono le strade ...

1. la più semplice e banale ... carichi il programma, stacchi la USB e colleghi il bluetooth ai pin 0 e 1 ... ovvero sempre alla Serial. Praticamente non cambia nulla.

2. un po' più complesso (ma non tanto),  devi vedere come fa la SerialCommand a leggere una stringa comando (invece di UN carattere) e implementare tu la stessa logica leggendo il bluetooth dalla SoftwareSerial

3. più complesso, modificare la SerialCommand affinché usi la SoftwareSerial e non la Serial. Ti avviso che, con Arduino, non è banale cercare di usare un'altra libreria all'interno di una libreria ... ci sono thread aperti come QUESTO dove te ne puoi rendere conto ...

Vedi tu ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

dxcoco2

Ok credo che opterò per la 2^.... la 1^ però devo avvisarti che non funziona comunque...non lampeggiano nemmeno RX e TX su Arduino all'invio del segnale...

dxcoco2

Niente da fare anche per la seconda opzione!
Quello che mi chiedo è: come mai se scollego USB e collego HC05 al pin 0 e 1 non funziona la serial????

gpb01


Quello che mi chiedo è: come mai se scollego USB e collego HC05 al pin 0 e 1 non funziona la serial????


Questo è strano ...
... se il modulo bluetooth sei già riuscito a farlo funzionare e sai che è connesso e se il programma con la seriale del PC funziona ... salvo problemi di velocità (... impostata correttamente la velocità della seriale ?) DEVE funzionare uguale.

Occhio, se usi la SerialCommand, DEVI inviare il carattere terminatore (... se ben ricordo CR) anche via Bluetooth eh ... altrimenti non funziona !!!

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

Riporto la domanda di dxcoco2 messa in un altro thread ma pertinente a questo ...


Ciao a tutti. Ho un problema che non riesco a risolvere. Secondo voi come posso verificare se i pin 0 e 1 di arduino funzionano? Vi spiego meglio!
Ho un modulo HC05 che con la libreria software serial va benissimo. Ma se lo collego ai pin 0 e 1 riesco solo a ricevere quello che viene scritto in risposta dal serial monitor.
Quindi se mando un comando (es  "1") non accade nulla....come mai??
Search is Your friend ... or I am Your enemy !

gpb01

Potresti chiarire cosa intendi con questa affermazione ?


Ma se lo collego ai pin 0 e 1 riesco solo a ricevere quello che viene scritto in risposta dal serial monitor.


Cioè, esattamente cosa succede ??? Cosa ricevi ? Dove ? Il PC è collegato o meno alla USB ? Il serial monitor dell'IDE è aperto ?

Senza tutte queste informazioni è difficile capire quello che succede ...

Guglielmo

Search is Your friend ... or I am Your enemy !

uwefed

ho cancellato il topic doppio.

@dxcoco2 che modello di Arduino usi?
Ciao Uwe

Go Up