Info per comunicazione seriale..

Ciao a tutti. Mi chiamo Riccardo e sono nuovo del forum e del mondo Arduino.. Provengo dal mondo Pic e Basic (a livello MOLTO amatoriale, si intende :D ) ma vedo sempre di più la bellezza di questo piccolo ""aggeggio infernale"" e della programmazione in C/C++!! Vengo al dunque.. Stò cerncando di inviare un byte (0-255) alla scheda per impostare il valore pwm su una delle uscite analogiche! Il problema è che quando invio il dato, la seriale dell'arduino mi restituisce solo la prima cifra! Cioè.. Se invio 255 mi restituisce 2, se invio 35 mi restituisce 3 e via dicendo. Come mai? Come faccio a inviare il dato 125, ad esempio, e fare in modo che venga letto come tale?

if (Serial.available()> 0) {
        command = Serial.read();
        if (command != 0) {
          pwm_speed = command;
          command = 0;
          Serial.print ("Velocità impostata a ");
          Serial.println (pwm_speed, DEC);
          }

Se devi inviare un dato da 0 a 255 devi fare Serial.write(numero) e non Serial.print(numero) perchè questa lo spedisce come stringa. La prima invece lo codifica in binario quindi basta che lo trasformi da hex a int con (int)numero_ricevuto

Grazie.. E questo vale per la parte arduino. Dal lato pc? Come faccio ad inviare un valore numerico, byte, dal serial monitor dell'ide? Se invio 75 lui legge prima 7 e poi 5. Come mai?

Devi specificare prima il linguaggio Se utilizzi visual basic o c# : http://msdn.microsoft.com/en-us/library/ms143551.aspx#Y100

Questo prog ti permette di inviare numeri esadecimali: http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_-in-C_2300_-.NET.aspx

Frose mi sono spiegato male.. Dal Serial Monitor dell'IDE di Arduino. Come si fà, usando l'IDE a inviare un valore numerico??

Ho provato anche con altri programmi ad inviare byte all'Arduino, ma legge sempre valori separati.. 255 -->> 2 5 5, 65 -->> 6 5, 84 -->> 8 4!!! Stò impazzendo per niente?

come detto prima il serial converte il numero in stringa, quindi un carattere per ogni cifra. Usando il serial monitor, visto che parsa solo caratteri ascii, non vedrai il numero ma il carattere ascii corripondente (se definito)

Mhh… Credo di capire. Quindi come potrei fare?

Perchè anche provando con Hyperterminal di Windows ho lo stesso problema! Non è per insistere, ma proprio non ci salto fuori… :frowning:

dunque per scrivere puoi usare Serial.print(78, BYTE) --> gives "N" perchè N è il vapre 78 nella tabella ascii anche l'iperterminal non va bene per leggere byte, devi usare un programma fatto da te che converta il valore in byte in ascii, altrimenti hiperterminal/seriale arduino come fanno a sapere quali dati sono in char e quali in byte?

Ok, fin li ci siamo. Ma come li mando dal pc all'Arduino? Io devo inviare dal PC il valore x all'uscita analogica (PWM x) dell'Arduino! E' questo il problema. Devo variare il valore pwm dal computer per variare la velocità di un motore!

allora tu leggi un chr da arduino e lo usi come intero.

per inviare da pc, o hai culo che il valore corrisponde a un carattere odevi scriverti un programma apposta.

Perfetto.. adesso ho capito! Grazie!

Qui stanno chiedendo la stessa cosa. Il "problema", se così si può chiamare, dipende dalla comunicazione seriale che, per l'appunto, manda 1 carattere alla volta.

Devi agire lato Arduino e scriverti una funzione che legga carattere per carattere dalla seriale e poi "ricomponga" i valori in un numero, ed usare quello per comandare il motore.

Ah, piccola precisazione: le uscite dell'Atmega sono digitali. I pin con la dicitura PWM sono pin digitali che "simulano" un'uscita analogica mediante modulazione dell'impulso.

Seguiro il post… si, si è stata una mia imprecisione! Grazie dell’appunto! Provero’…

rubino25: Stò cerncando di inviare un byte (0-255) alla scheda per impostare il valore pwm su una delle uscite analogiche! Il problema è che quando invio il dato, la seriale dell'arduino mi restituisce solo la prima cifra! Cioè.. Se invio 255 mi restituisce 2, se invio 35 mi restituisce 3 e via dicendo. Come mai? Come faccio a inviare il dato 125, ad esempio, e fare in modo che venga letto come tale?

Arduino riceve dati sulla seriale un byte alla volta (in realtà c'è un buffer da 128byte, ma adesso pensiamo ad altro). Se leggi la documentazione troverai che Serial.read() restituisce il valore sotto forma di un intero corrispondente al primo byte disponibile sulla seriale. Quindi se il tuo PC spedisce sulla seriale un numero espresso come stringa di 3 caratteri (ad es. il 255 di cui parli), Arduino riceverà 3 byte diversi, uno per ogni cifra. Ecco perchè Serial.read() resituisce 2 anzichè 255, solo il 3 anzichè 35 e così via. Se continui a far leggere ad Arduino quel che c'è sulla seriale, otterrai anche il due 5 successivi al 2 di 255 ed il 5 successivo al 3 del 35.

Se vuoi semplificarti la vita (o complicartela ... dipende) puoi far si che il PC invii il valore numerico in questione come un singolo byte, quindi un valore (espresso dal byte corrispondente) che va da 0 a 255. In questo modo ad Arduino basterà leggere un byte e convertirlo nel valore decimale all'occorrenza. Ma non inviare il numero come sequenza di 3 byte dove ognuno corrisponde ad una sola cifra! Se invece devi spedire valori che vanno oltre questo range allora un singolo byte non ti basta, ne dovrai spedire più d'uno e Arduino dovrà ricomporli insieme per interpretare il valore corretto.

Comunque sulla seriale avrai sempre e solo bytes, indipendentemente dal fatto che questi byte codifichino (nelle intenzioni del programmatore) dei valori numerici, dei caratteri ascii o qualunque altro codice binario.