Consiglio sul codice: Controllo PWM tramite la porta seriale

MGuruDC:
Speravo in uno sforzo da parte di chi ha aperto il topic...

Eh... troppo spesso mi sono lamentato anch'io di questa cosa. Vuoi per distrazione, vuoi per caduta d'interesse, vuoi per mancanza di tempo, chi apre un thread poi si scorda di controllarlo e/o di rispondere ai reply. :cold_sweat:

Beh signori.. io ce l'ho messa tutta ma quella roba a me non serve nemmeno ci ho provato e qualche risultato l'ho avuto ma se l'autore non si applica non posso farci nulla XD

Speravo in uno sforzo da parte di chi ha aperto il topic...
È argomento fondamentale, meglio evitare la solita "pappa pronta"

IO LAVORO E VADO A LETTO PRESTO, SAPETE PERCHE'? PERCHE' IO OGNI GIORNO ALZO UNA TONNELLATA E MEZZA AL GIORNO DI CASSETTE D'UVA. MI DISPIACE SE NON STO TUTTO IL TEMPO SUL COMPUTER A CONTROLLARE LE RISPOSTE SUL FORUM COME VOI, ma ho solo questo momento, la sera, per dedicarmi ai miei hobbie.

Mi dispiace, pensavo che ci fosse gente senza questi inutili pregiudizi

Bah veramente era solo un invito ad approfondire... ma prendila come ti pare
boh

@stefanolavori: non era una critica a te sul fatto che non rispondi spesso, ma verso di noi che ti abbiamo dato il codice già fatto invece che darti dei consigli, lasciarti provare a fare il codice, e se poi ancora non funzionava darti una mano a sistemarlo.

Perchè a trovarsi "la pappa pronta", sopratutto con codice così semplice, si rischia di fare copia-incolla senza capire realmente cosa si sta facendo, e non impari nulla di nuovo.

Per esempio, adesso nella funzione che ti ho scritto, sapresti spiegarmi riga per riga cosa faccio e sopratutto perchè?

stefanolavori:

Speravo in uno sforzo da parte di chi ha aperto il topic...
È argomento fondamentale, meglio evitare la solita "pappa pronta"

IO LAVORO E VADO A LETTO PRESTO, SAPETE PERCHE'? PERCHE' IO OGNI GIORNO ALZO UNA TONNELLATA E MEZZA AL GIORNO DI CASSETTE D'UVA. MI DISPIACE SE NON STO TUTTO IL TEMPO SUL COMPUTER A CONTROLLARE LE RISPOSTE SUL FORUM COME VOI, ma ho solo questo momento, la sera, per dedicarmi ai miei hobbie.

Mi dispiace, pensavo che ci fosse gente senza questi inutili pregiudizi

Concordo con gli altri era solo per dire che se avessi partecipato in maniera diversa avremmo imparato una cosa nuova dico imparato perchè anche io sono ignorante su questa cosa :slight_smile:
E conoscendo gli altri ti posso assicurare ma già l'hanno detto che non erano critiche :slight_smile:
Siamo tutti amici qui :slight_smile:

Ne ho citato uno per i tre che hanno detto questa cosa.

Devo descrivere una funzione che mi scrivi o una che hai già scritto?

Intanto posso descriverti questa:

int leggiNumero(){                          //Apro la funzione dichiarandone un  int e il suo nome
  char lettera;                                //Dichiaro una variabile char, di nome lettera
  int risultato=0;                             //Dichiaro una variabile int che inizializzo con 0 di nome risultato
  int numeroCifra=0;                        //Dichiaro un'altra int che inizializzo con 0 di nome numeroCifra
  do{                                             //Uso l'istruzione iterativa (spero si dica così) do - while (fai, se)
    lettera = Serial.read();                 //Assegno alla variabile lettera il char letto nella Seriale
    if (lettera >='0' && lettera <= '9'){  //Uso un'istruzione if il cui contenuto si può tradurre: se lettera è uguale  o //////////////////////////////////maggiore di zero e (&&= operatore and) lettera è uguale o minore di 9
      risultato = (10*numeroCifra) + lettera-'0';  //Esegui l'operazione: 10 per numeroCifra più lettera meno 0
      numeroCifra++;                        //Incremento rápido di numeroCifre
    }                                              //Chiudo l'istruzione if e while
  }while (lettera!='\n');                     //Uso while ed eseguo l'espressione: se lettera non è uguale a \n ritorno ad
  return risultato;                           // int della funzione leggiNumero il risultato ottenuto
}

Hai creato questa funzione per ottenere un valore corretto (e non con numeri separati o con altre conversioni o casting) da poi stampare sul pin 10 con analogWrite.

Non prendetemi a male, ragazzi, ma mi fa molto fastidio vedere come voi, senza sapere cosa faccio, vi permettete di giudicare una persona.

tranquillo, ora per mezzora ognuno dirà la sua ma vai tranquillo che non muore nessuno :slight_smile:

sì intendevo quella funziona. Hai capito perchè l'if non usa 0 e 9 ma '0' e '9', e perchè faccio risultato = (10*numeroCifra) + lettera-'0';?
comuqnue sembra che tu conosca abbastanza bene il C, di solito chi arriva in questo forum non sa nemmeno cos'è un if :slight_smile:

Penso di aver capito perchè fai risultato = (10*numeroCifra) + lettera-'0';, penso sia l'espressione algebrica per convertire il numero arrivato ad Arduino nel numero decimale che scriviamo sul monitor seriale.
Secondo me, la differenza tra 0 - 9 e '0' - '9', sia che il primo viene recepito come carattere e quindi da interpretare, mentre il secondo come vero e proprio numero.

Nonostante conosca le basi del c, devo ancora affrontare gli array, i puntatori, enum, struct, socket e una miriade di altre cose. Ed ancora non riesco a comprenderne appieno la logica.

hai ragione e per quel che posso chiedo scusa....

Perdonati :slight_smile:

Attenzione, il serial monitor di Arduino non invia il carattere '\n' alla fine della stringa quando si preme "send" e non mi risulta possibile istruirlo in tal senso...
Bisogna usare un altro carattere oppure cambiare metodo.

c'è la spunta "aggiungi new line" o qualcosa del genere

allora se scrivi 0 e 9 hai i numeri, se scrivi '0' e '9' hai i caratteri, cha valgono un numero dettato dalla tabella ascii (eccola: http://www.asciitable.com/, lo '0' è il 48, il '9' il 57)

ahhh ,mi sono accorto di un grosso errore., effettivamente risultato = (10numeroCifra) + lettera-'0'; non ha senso dovrebbe essere risultato = risultato10 + lettera-'0'; ovvero "sposta risultato a sinistra lasciando le unità vuote, e sommaci il valore letto" se fai la prova su un foglio di carta vedi che piano piano, succede
numero 130:
010+1=1
1
10+3=13
13*10+0=130

dovrebbe essere:

 do{                                             //Uso l'istruzione iterativa (spero si dica così) do - while (fai, se)
    lettera = Serial.read();                 //Assegno alla variabile lettera il char letto nella Seriale
    if (lettera >='0' && lettera <= '9'){  //Uso un'istruzione if il cui contenuto si può tradurre: se lettera è uguale  o //////////////////////////////////maggiore di zero e (&&= operatore and) lettera è uguale o minore di 9
      risultato = risultato*10 + lettera-'0';  //Esegui l'operazione: 10 per numeroCifra più lettera meno 0
      numeroCifra++;                        //Incremento rápido di numeroCifre
    }                                              //Chiudo l'istruzione if e while
  }while (lettera!='\n');

Buonanotte.

Potrei farlo con il NetBeans e Linux con serial.control.
Ho ancora un problema, se può aiutare vi ringrazio.

questo codice e NetBeans, che premono 1,2,3,4,5,6 invierà il valore in esso che clearcut
(Se 0 invia un primer, primer 2 invia 25, premere 3 per 50 e manda gli altri e analizzare)

#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>   /* Standard input/output definitions */
#include <string.h>  /* String function definitions */
#include <unistd.h>  /* UNIX standard function definitions */
#include <fcntl.h>   /* File control definitions */
#include <errno.h>   /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */

int vel;
int dir;
char envio[2] = { ' ' } ;
char* status = 0;
int count = 0;
int flags = 0;
int fd, j;
int enviodados; 

// abrir porta serie
int abrir_porta_serie(char *port) {
  struct termios options;
  fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd == -1) {
    printf("impossivel a comunicaçao \nligar a porta serial \n", port);
    }
    else {
    tcgetattr(fd, &options); // Get the current options for the port...
    cfsetispeed(&options, B9600 ); // Set the baud rates
    cfsetospeed(&options, B9600);
    options.c_cflag |= (CLOCAL | CREAD); // Enable the receiver and set local mode...
    tcsetattr(fd, TCSANOW, &options); // Set the new options for the port...
    }
  return(fd);
}


// envio de dados
int envio_de_dados(int fd) {
  int count;
 count = write(fd, envio , strlen(envio));
 return(count);
}

int main() {


    /* Abrir a porta de dados*/
    char port[50] = "/dev/ttyUSB0";
    fd = abrir_porta_serie(port);
    float opcao;
        int weight;
    for(;;){
    printf("intruduza uma tecla: " );
    scanf("%f", &opcao);

    if(opcao== 1){
        enviodados = 0;
    }
    else if (opcao == 2){
        enviodados = 25;
    }
    else if (opcao == 3){
        enviodados = 50;
    }
    else if (opcao == 4){
        enviodados = 100;
    }
    else if (opcao == 5){
        enviodados = 175;
    }
    else if (opcao == 6){
        enviodados = 225;
    }

    sprintf( envio, "%d ",  enviodados );
    printf("dados enviados %s \n ", envio);
       //sprintf( direcao, "%dS ", dir );


/*_________________________________________________________________________________________*/
   /*inicio dos dados a serem transmitidos*/
 
  envio_de_dados(fd);
  weight = envio_de_dados(fd);
      }
  close(fd);
  return 0;
}

il mio problema e il primo dopo la Arduino e il valore che riceviamo è sempre quello di essere trattati e spediti. lui è quello di mantenere in memoria e quando si invia una stampa, perché sempre lo stesso.

Ho usato il codice per leggere il Arduino e le seguenti:

#include <ctype.h>

int recebido;
char dados[4];
int i=0;

void setup() {
	Serial.begin(9600);	// opens serial port, sets data rate to 9600 bps
        pinMode(9, OUTPUT);     
}

void loop() {
 
      
      // send data only when you receive data:
      if (Serial.available()>4) {

      while(isdigit((dados[i++] = Serial.read())));
      
      recebido = atoi(dados);
     
      analogWrite(9,recebido);
      Serial.print("dir: ");
      Serial.println(recebido);
      delay(500);
     
    }
    
    else 
   {
     analogWrite (9, 0);
   }
   
}


l'immagine qui sopra mostra quello che inviare e ricevere.
mando sia nella console Linux, e quello che ottiene è la console serialcomunication Arduino.

cosa ho bisogno per ottenere e rendere i dati variabili aggiornato ogni volta che l'invio di nuovi dati. ajuar se puoi ringraziarmi.

dispiace per il mio italiano, ma non parla italiano e ho usato Google Translate per tradurre.

possibile visualizzare informazioni dettagliate su questo argomento. http://arduino.cc/forum/index.php/topic,69727.0.html

angel3love saluti

lesto:
c'è la spunta "aggiungi new line" o qualcosa del genere

°_°
ommioddio... non ci avevo mai fatto caso...
devo dormire di più :fearful:

@angel3love

Penso che tu debba pulire l'array "dados" e riportare a 0 l'indice "i" prima di cominciare a ricevere una nuova stringa

I think you should clean the "dados" array and reset the "i" index before starting a new string reception.

Ciao

MGuruDC:
@angel3love

Penso che tu debba pulire l'array "dados" e riportare a 0 l'indice "i" prima di cominciare a ricevere una nuova stringa

I think you should clean the "dados" array and reset the "i" index before starting a new string reception.

Ciao

just reset the i index before every while, and add a '\0' at the end of the string at the end of the while, or the atoi will get crazy

già risolto il problema;)

Lascio qui per vedere il codice, e può aiutare qualcuno

#include <ctype.h>

int recebido;
char dados[4];
int i=0;

void setup() {
	Serial.begin(9600);	// opens serial port, sets data rate to 9600 bps
        pinMode(9, OUTPUT);     
}

void loop() {
      // send data only when you receive data:
      if (Serial.available()) 
          {
          dados[i] =  Serial.read();
          if (isdigit(dados[i]))
               i++;
          else
          if (i > 0) // Make sure we have some digits
              {
              dados[i] = '\0';  //  Add null terminator
              recebido = atoi(dados);
              i = 0;
     
              analogWrite(9,recebido);
              Serial.print("dir: ");
              Serial.println(recebido);
              delay(5);     
             }
        else 
             {
            analogWrite (9, 0);
             }
       }
}

grazie per il vostro aiuto

angel3love saluti

Grazie a tutti, funziona a meraviglia.