Pages: [1]   Go Down
Author Topic: Inviare una stringa da seriale  (Read 1433 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 3
Posts: 115
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, sto facendo la mia tesina per la maturità e una possibiltà(che dovevo appunto collaudare) era quella di semicontrollare un braccio robot attraverso la voce. Il programma da utilizzare mi è venuto in mente mentre studiavo italiano l altro giorno (dragon naturally speaking) così mi sono precipitato a programmare un po' ed effettivamente è una cosa possibile che non pensavo fosse così intuitiva. il mio problema sta nell' inviare ad arduino da computer, attraverso il serial monitor una parola, o meglio una stringa in modo che a seconda della parola lui faccia una serie di azioni. ho provato ad inviare un solo carattere e funziona ma appena ne metto due eccco che non capisce più nulla(si sa che non è colpa dell ardu ma del programmatore che è una enorme pippa  smiley-roll-sweat ).
in ogni caso vi chiedo gentilmente se conoscete un metodo per inviare una stringa all' arduino via serial.read o non so ,magari anche a pacchetti non so prima il 1°carattere poi il 2° e così via , ad esempio max 6 caratteri e arduino legge sempre quei sei caratteri. Vi ringrazio in anticipo.
questo è un codice che si trova in giro e al posto di a dovrei metterci una stringa

int led=101;
int a;

void setup()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
}

void loop()
{
if (Serial.available() > 0) {
 a = Serial.read();
 if (a == '1') {
   digitalWrite(led, HIGH);
                            }
                          } 
  if (a == '2') {
   digitalWrite(led, LOW);
  }
}
Logged

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1740
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, sto facendo la mia tesina per la maturità e una possibiltà(che dovevo appunto collaudare) era quella di semicontrollare un braccio robot attraverso la voce. Il programma da utilizzare mi è venuto in mente mentre studiavo italiano l altro giorno (dragon naturally speaking) così mi sono precipitato a programmare un po' ed effettivamente è una cosa possibile che non pensavo fosse così intuitiva. il mio problema sta nell' inviare ad arduino da computer, attraverso il serial monitor una parola, o meglio una stringa in modo che a seconda della parola lui faccia una serie di azioni. ho provato ad inviare un solo carattere e funziona ma appena ne metto due eccco che non capisce più nulla(si sa che non è colpa dell ardu ma del programmatore che è una enorme pippa  smiley-roll-sweat ).
in ogni caso vi chiedo gentilmente se conoscete un metodo per inviare una stringa all' arduino via serial.read o non so ,magari anche a pacchetti non so prima il 1°carattere poi il 2° e così via , ad esempio max 6 caratteri e arduino legge sempre quei sei caratteri. Vi ringrazio in anticipo.
questo è un codice che si trova in giro e al posto di a dovrei metterci una stringa

int led=101;
int a;

void setup()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
}

void loop()
{
if (Serial.available() > 0) {
 a = Serial.read();
 if (a == '1') {
   digitalWrite(led, HIGH);
                            }
                          } 
  if (a == '2') {
   digitalWrite(led, LOW);
  }
}
ciao,
GINGARDU aveva ovviato al problema, cerca il topic (è recente).
Mi potresti passare il codice che hai fatto per dragon naturally speaking (10.1??? è la versione che ho) visto che volevo fare un progettino carino.....
Logged

Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield.
Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586

Offline Offline
Full Member
***
Karma: 3
Posts: 115
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a grazie mille adesso cerco meglio perchè prima ho cercato in quelli recenti ma non avevo trovato nulla che mi interessasse , per dragon comunque la parta "intuitiva" sta nel fatto che basta parlare lui scrive e poi dici accapo e lui lo invia (poi vedrò di non utilizzare l' ide d'arduino per colloquiare via seriale ma magari un programmino in python dove non serve dire "invio" per inviare sulla seriale.
Se riesci a mettermi il link del topic mi fai un immenso favore grazie in anticipo.
Logged

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1740
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

a grazie mille adesso cerco meglio perchè prima ho cercato in quelli recenti ma non avevo trovato nulla che mi interessasse , per dragon comunque la parta "intuitiva" sta nel fatto che basta parlare lui scrive e poi dici accapo e lui lo invia (poi vedrò di non utilizzare l' ide d'arduino per colloquiare via seriale ma magari un programmino in python dove non serve dire "invio" per inviare sulla seriale.
Se riesci a mettermi il link del topic mi fai un immenso favore grazie in anticipo.
al momento non trovo il topic e devo fare pure i compiti smiley-sad
Logged

Arduino UNO r3, Arduino MEGA 1280, adafruit motor shield, bluetooth module, enc28j60 shield.
Ultimi acquisti: un sacco di componenti elettronici, ATTEN AT 8586

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 37
Posts: 1298
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova con questo:
Code:
int led=101;
int a;
const unsigned long TimeOut = 10;                    // timeout 10 ms
unsigned long T = 0;                                 // timer

String SerRx;                                        // buffer ricezione

void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
}

void loop() {

SerRx = "";                                     // azzera buffer ricezione

  T = millis();                                   // timer partito

  while (millis() - T < TimeOut) {                // attesa timeout
    while (Serial.available() > 0) {              // ricezione da Serial Monitor
      SerRx += char(Serial.read());               // aggiungi carattere al buffer
      T = millis();                               // reset timer
    }
  }

  SerRx.trim();                                   // elimina spazi iniziali e finali
  SerRx.toUpperCase();                            // converti in maiuscolo

  if (SerRx == "ON") digitalWrite(led, HIGH);
  else if (SerRx == "OFF") digitalWrite(led, LOW);
  else if (SerRx == "XXX") <altra azione>;
  else if (SerRx == "ABC") <altra azione>;


}


Ettore Massimo Albani
« Last Edit: September 19, 2012, 06:42:30 pm by cyberhs » Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 115
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie mille troppo gentile smiley pero non ho capito una cosa perché quando metti i caratteri dentro la stringa di ricezione fai += ? Ponendolo uguale non fai la stessa cosa ? Ma soprattutto perché eliminiamo gli spazi iniziali e finali ?  smiley-cry piango ancora della mia ignoranza ....
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

x += y è una forma contratta per x = x+y
Usando le stringhe la somma equivale alla concatenazione, per cui "A" + "B" = "AB"

Gli spazi iniziali e finali vengono eliminati perché " A" (nota lo spazio iniziale) non è uguale a "A". La prima è una stringa composta dai caratteri ASCII 32 e 65, la seconda solo dal carattere ASCII 65.
Logged


Offline Offline
Full Member
***
Karma: 3
Posts: 115
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

aaaaaaaaaaaa ecco perchè leggendo i valori inviati mi dava quei numeri li D: grazie ancora tanto fra un po' tornerò sicuro hahaha
Logged

Pages: [1]   Go Up
Jump to: