Go Down

Topic: Envoie de donné par "serial" (Read 1 time) previous topic - next topic

Qly1

Bonjour.

J'ai actuellement un probleme dans mon programme arduino.
En effet je souhaiterais envoyé une variable sur le port série a l'aide de serial.write mais cela ne fonctionne pas.

Mon programme releve un temps T1 et un temps T2 et j'aurais besoin d'envoyé la différence de temps noté T=T2-T1 a un programme qui tourne sur python.

Dans le programme Arduino j'ai écrit Serial.write(T) mais ce que je recois sur mon programme python c'est la lettre T et non pas sa valeur :(

Si quelq'un pouvait m'aider se serait sympa :)

Talus

*farfouille dans ses dossier*

dans un projet j'avais comme ca pour recup des valeur depuis arduino :
Code: [Select]

Serial.print(my_rand, DEC);


en fait faut préciser le genre de data que tu envoie, par défaut c'est de l'ASCII
http://arduino.cc/en/Serial/Print

ekaki

Bonsoir,

Et les temps sont exprimés sous quel type dans les variables ?
Pas sous forme de characters j'imagine ?
Parce qu'avec certains types cela va coincer il me semble.

Talus


Bonsoir,

Et les temps sont exprimés sous quel type dans les variables ?
Pas sous forme de characters j'imagine ?
Parce qu'avec certains types cela va coincer il me semble.


perso moi je dit le contenu des vars ce sont des chiffre, le type ca change juste l'espace mémoire que ca prend

que tu fasse
char c = '*';
char c = 42;
int c = 42;

dans les trois cas si tu demande a faire Serial.print(c, BYTE); tu aura une * d'envoyer sur le série

tu peut très bien stocker des mesure dans un char si tu sait que ca peut largement y tenir
après certe tu a des type spécifique, mais ca reste des nombre ^^

Qly1

Bonsoir.
Je vous remercie pour ces réponse aussi rapide :)

Les temps T1 et T2 me sont renvoyé par la fonction  micros().
T1 et T2 sont défini comme des entier ( Int).

Par contre serial.print me permet d'envoyer la variable au niveau de la console mais j'ai besoin de l'avoir sur le port série car mon programme en python utilise serial.read.

Je ne peux malheureusement pas faire de teste aujourd'hui car le matériel que j'utilise se trouve pour l'instant a l'université et je n'y aurais accés que demain après midi.

Talus

oui ca l'envoie sur la console, si on ouvre la console ^^
si on la laisse fermer ca laisse le port COM libre pour qu'un autre programme puissent l'utiliser

par exemple moi je faite mes interfaçage avec l'ordi en C et C++

PS pour tes entier tu pourrais même utiliser des entier non signer (unsigned int), a moins que tu puissent avoir des temps negatif

ekaki

Si ce sont des 'int' que tu envoies, d'expérience :
Code: [Select]
int T = ?;  // avec pour ? la valeur, bien entendu
void setup()
{
  Serial.begin(9600);  // etc.
}
void loop()
{
  Serial.print("T = ");
  Serial.println(T);  // println pour le retour chariot
}

Cela devrait fonctionner.

Après, si c'est pour envoyer autrement que par le port série sur un autre port série; par exemple pour envoyer sur un LCD série cela ne fonctionnera pas, il faudra transformer le contenu de la variable en 'char' et gérer avec un buffer le transfert.
Il me semble aussi qu'en utilisant la librairie "serial" cela ne soit aussi simple que dans mon exemple (à confirmer par un spécialiste).

fdufnews

Quote
Les temps T1 et T2 me sont renvoyé par la fonction  micros().
T1 et T2 sont défini comme des entier ( Int).

Pour info, micros( )retourne des unsigned long.

Qly1

Merci a tous sa marche enfin.
Le probleme était que j'utilisais la fonction serial.write au lieu de serial.print.
En effet je pensais que serial.print ne permettait que d'afficher la valeur dans la console sans possibilitée de la récupérer.



Super_Cinci

j'ai galéré quelques heures avec un dialogue série entre un arduino et VB6. C'est au niveau du récepteur qu'il faut traiter la donnée en nombre, car '*' ou 42, sur le port série, ce sera toujours 42 qui sera envoyé. Si ton soft qui la récupère traite en ascii, alors tu auras '*', mais si tu vas un peu plus dans le hard, tu retrouveras ton 42.

Pour info, VB6 ne traite le port série qu'en word (ou 16 bits) par défaut. Il faut donc imposer quelque part de traiter les données dès la réception (ou émission)... en byte...

Qly1

La premiere partie qui était d'envoyer une donnée sur le port série est opérationnel.

Le probleme maintenant c'est que ce que le nombre que j'envoie varie entre 3 et 36000 or serial.read ne lie qu'un bit a la fois donc j'obtiens par exemple
2
5
4
1
au lieu de 2541.
J'ai vu qu'il était possible de passer par un tableau mais je me demande si cela ne vas pas trop ralentir le programme qui a besoin de tourner rapidement.


osaka

#11
Oct 24, 2011, 03:10 am Last Edit: Oct 24, 2011, 03:16 am by osaka Reason: 1

ne lie qu'un bit a la fois


petit correction sans doute pas fait exprès : "ne lie qu'un byte(octet) à la fois".

Sinon tu envoie des donnée sur le port série via pyton et tu l'affiche comment ?
J'ai du mal à saisir certaine chose avec l'arduino et le port série, comme le fait qu'il envoie le correspondant ascii 'T' au lieu de la véritable valeur de la variable T via Serial.write qui est censé faire un l'envoi d'un flux binaire de la variable (2 byte ici pour un entier) ...

Il est pourtant bien indiqué que pour envoyé la représentation (ascii je suppose) d'une valeur il faut utilisé print à la place de write (et c'est pas ce qu'il voulait) ..., à moins qu'à la réception du coté pyton il fasse également sa propre interprétation du flux ?
http://arduino.cc/en/Serial/Write
Et encore je vois pas comment dans le cas présent il interprèterait la valeur de la variable avec le nom de la variable, qui disparait une fois le code compilé et correspondrait plutôt à une adresse mémoire une fois exécuté ?
Je trouve également étrange qu'avec read on ai l’impression de recevoir 4 caractère au lieu de 2 byte tout court (qu'il affiche la correspondance peut importe), donc voir également l'envoi côté pyton ?
Cette liaison série avec l'arduino me perturbe lol, faudra que je fasse des testes avec autres chose que le programme arduino un jours. :D

fdufnews

Tu veux envoyer les chiffres 2 5 4 1 ou bien l'unsigned long 2541?

Dans le premier cas il faut utiliser Serial.print()
Dans le deuxième cas il faut utiliser Serial.write() en passant par un tableau.

Pour envoyer 36000 il faut à minima utiliser un unsigned int. Dans ce cas il faut faire un cast car micros() retourne des unsigned long.

Qly1

Ce que je veux envoyé c'est bien l'unsigned long 2541.

Je vous explique le fonctionnement du programme.
J'utilise un telemetre a Ultrason SRF 06.
J'envoie dans une boucle infini une impulsion.
Quand je recois en retour l'impulsion de sortie renvoyé par le telemetre  je note le temps T1
Et quand l'impulsion est terminé je note le temps T2.
Je calcule ensuite T=T2-T1 et c'est cette valeur que je dois envoyer sur python car T sera proportionnelle a la distance .

fdufnews

#14
Oct 24, 2011, 12:56 pm Last Edit: Oct 25, 2011, 08:43 am by fdufnews Reason: 1
La méthode la plus élégante définir une union entre un unsigned long et un tableau de 4 unsigned char. (désolé je suis au boulot j'ai pas le temps de développer)
La méthode plus simple copier les 4 octets de l'unsigned long par une boucle:

Code: [Select]

unsigned char octet[4];
temp = T
for (i=0;i<3;i++)
{
   octet[i]= (unsigned char)(temp & 0xFF);
   temp>>=8;
}

Go Up