Go Down

Topic: TIPE (Read 2 times) previous topic - next topic

Super_Cinci

#20
Nov 03, 2011, 08:51 am Last Edit: Nov 03, 2011, 08:54 am by Super_Cinci Reason: 1
A savoir que la méthode print(var) ou println(var) convertit var en chaîne de caractères, et dans le cas où var est un float, la chaine de caractères représentera un nombre à virgule, mais avec seulement deux décimales, c'est comme ça... Si tu envoies ta valeur avec write(), ce sont les 4 octets du float qui seront envoyés (et encore, il faut essayer car les fonctions arduino sur le port série sont bien trop orientées texte!), mais le terminal arduino les interprètera comme une chaîne de 4 caractères, donc illisible, tu auras l'impression qu'il te dit des gros mots...

La seule solution serait d'utiliser un processing qui traite les 4 octets reçus sous forme de float, ou se faire un terminal perso qui traite des octets et non pas des caractères (ça existe peut être, faudrait googliser la chose).

Je viens de regarder comment j'utilisais mon port série entre arduino et VB6 :

Code: [Select]

void Serial_write_16(word value){  // écrit un word sur le port série
 Serial.write(lowByte(value));  //poids faible
 Serial.write(highByte(value)); // poids fort
}


Effectivement, j'envoie deux octets et non pas une variable de 16 bits. Du coup, pour envoyer un float, peut-être faudrait faire un truc genre :

Code: [Select]

void Serial_write_32(float value){  // écrit un float sur le port série
 byte valToSend;
 for (byte i = 0; i <= 3; i++) {
   valToSend = mem[@value + i];                //          (1)
   Serial.write(valToSend);  //envoi un octet
 }
}

(1) : comprendre @ comme renvoyant l'adresse en mémoire de la variable value, mem[a] est emprunté ici au TurboPascal et renvoie la valeur à l'adresse a, désolé, je ne maîtrise pas du tout les pointeurs en C ou C++...

Ce code devrait envoyer les 4 octets composant la variable value...

Ensuite, il faut recevoir ces 4 octets comme un float...

osaka

Tien j'ai vu que pour palier aux différent problème de précision et temps de calcul de l'arduino certains utilisaient des entiers qu'ils divisent par le nombre de décimal ensuite.

Code: [Select]

servo.write(90+ampE*sin(i*4*3.1415/numP));


par exemple ici tu multiplierai par 31415 au lieu de 3.1415 et du divisera le résultat par 10000 de l'autre côté.
Donc utilise un unsigned long (tu utiliseras pleinement les 4 octet) plutôt qu'un float. (quand tu initialises un float fais plutôt 0.0 au lieu de 0)

LaurentD

mon dieu, je viens de retrouver ce topic...
Merci pour vos réponses, j'ai entre temps réussi à solutionner mon problême de transmission et je me suis contenté de la précision au 10e de degrés qui est déjà pas mal pour une chaîne de mesure amateur.
Merci pour vos réponses qui m'ont éclairée (paradoxalement) pour un autre topic que j'avais lancé sur la liaison série

barbudor


Tien j'ai vu que pour palier aux différent problème de précision et temps de calcul de l'arduino certains utilisaient des entiers qu'ils divisent par le nombre de décimal ensuite.

Code: [Select]

servo.write(90+ampE*sin(i*4*3.1415/numP));


par exemple ici tu multiplierai par 31415 au lieu de 3.1415 et du divisera le résultat par 10000 de l'autre côté.
Donc utilise un unsigned long (tu utiliseras pleinement les 4 octet) plutôt qu'un float. (quand tu initialises un float fais plutôt 0.0 au lieu de 0)


Une division entière peut être plus rapide qu'une multiplication flottante. A vérifier car pas forcément évident car la division sur un processeur entier est une opération itérative.
Tout comme quand on pose la division à la main on divise 10 par 10 de manière itérative, le processeur va diviser bit par bit.
Donc sur un long ca fait 32 boucles de division binaire.
Ca coute très cher en temps CPU !

La meilleur solution est d'approximer par des fractions dont le numérateur est une puissance de 2.

PI = 3.1415 = 31515/1000 = 3217/1024
Donc le plus rapide est de multiplier par 3217 et de faire >>10 ce qui équivaut à une division par 1024 effectué en 1 seule instruction assembleur.
Imbattable.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Go Up