Bonjour à tous!
Vous vous souvenez peut-être qu'il y a quelques mois, j'étais venu vous embêter avec des histoires de contrôle de flux et de gros volumes de données via liaison série? C'était là.
Et bien, ça a avancé, puisque j'ai maintenant un protocole de communication qui fonctionne. Enfin presque, pour une raison que je n'ai pas encore pu éclaircir, les valeurs int envoyées depuis un linux en 32 bits ne passent pas, alors qu'en 64bits c'est ok. Je pense que c'est ma somme de contrôle qui bloque, mais c'est un détail.
Voilà ce qui m'amène: mon projet (pour mémoire un projecteur laser permettant d'insoler des supports sensibles, tels que papier photo, cyanotype, gomme bichromatée, etc) expédie donc de gros volumes de données, à une Arduino Due, via liaison série. le post goulet est clairement la liaison série. Bien que j'ai mis en place, sur les conseils d'un membre du forum de bon conseil (voir l'autre fil) un protocole de communication qui me permette d'économiser des octets, je reste terriblement bridé: une coordonnée étant composée d'au minimum quatre octets (octet d'en-tête, deux octets de valeur (ce sont des int coupés en deux), et une somme de contrôle), je ne peux techniquement pas aller plus vite que 2880 coordonnées par seconde. (à 115200 bauds, on peut transmettre 11520 octets par seconde, soit 2880 chaînes de quatre octets).
La solution à mon problème existe, et elle est assez simple: se passer d'Arduino. Je m'explique. Puisque j'ai écris un programme coté PC qui analyse une image, et que les miroirs qui commandent le laser en position sont commandés analogiquement par une valeur qui oscille entre ±5v, je pourrais utiliser tout simplement la carte son de l'ordinateur qui exécute le programme. Au lieu d'envoyer les données via sérial, je génère une forme d'onde en mappant la direction X vers la voie droite, et la direction Y vers la voie gauche. Les premiers essais que j'ai fait dans ce sens sont concluants, j'aurais d'ailleurs dû y penser plus tôt! Ainsi j'utilise la totalité de la course du laser (avec l'Arduino je ne le commande qu'entre 0 et 5V, ce qui limite le débattement utile et induit des effets indésirables aux positions extrêmes), et je peux utiliser une fréquence d'échantillonage bien supérieure, soit 44100Hz, voir plus en fonction de l'ordinateur utilisé.
Le problème qui se pose est le suivant: une carte son gère une sortie stéréo, or j'ai besoin de trois voies: deux pour la position, et une pour l'intensité du laser. Je peux jouer sur la vitesse de balayage pour compenser l'absence de PWM et gérer l'intensité de l'insolation, mais il faut quand même que je puisse allumer et éteindre le laser au début et à la fin du mouvement.
Je pense qu'il doit exister une solution simple pour faire ça avec des composants simples, mais comme je suis une bille en électronique, je n'ai aucune idée de la manière d'y parvenir/ L'idée serait de faire un petit circuit avec quelques composants, qui allume le laser dès qu'il y a des variations de position (c'est à dire un "son" qui provient du PC), et l'éteint dès que les dernières coordonnées ont été envoyées...
Quelqu'un saurait comment je peux réaliser ça?
PS: j'ai bien conscience que ma question ne relève pas directement de l'environnement Arduino puisque je prévois de ne plus en utiliser dans ce projet, mais puisque j'ai initié le projet avec et que je sais que certains parmi vous pourront m'aider, je crois que ça reste le meilleur endroit pour demander!