Bonjour à tous,
Je reviens vous embêter avec mon programme qui avance bien, mais pas autant que je le voudrais.
Pour mémoire il s'agit d'un projecteur laser. L'idée est d'utiliser un laser similaire à ceux que l'on utilise pour faire du son et lumière, et de s'en servir pour balayer chaque pixel d'une image, le but étant d'insoler un support sensible aux UV, notamment certains procédés photographiques anciens.
Voilà pour la fonction. Pour la manière de faire, j'ai une carte arduino qui pilote un laser en PWM, et une paire de galvos via un DAC 16bits.
le programme est découpé en quatre sous programmes:
Serial gère la réception des données. C'est une implémentation maison, assez proche de celle de GRBL, qui permet le flow control avec Xon et Xoff.
Planner analyse les coordonnées reçues, les enregistrent, les préparent et les mettent à disposition du driver.
Driver gère l'envoi en temps réel (ou presque) des coodonnées (puissance laser et coordonnées X et Y)
I2C s'occupe d'envoyer les coordonnées au DAC.
Je crois que j'ai fait pas mal d'optimisations, la quasi totalité des calculs sont appelés depuis la boucle principale. J'ai mis en place des buffers qui permettent de prendre le plus d'avance possible et de vider les ISR, pour le driver (coordonnées de positionnement d'avance) et le serial (vidage du buffer RX aussitôt que possible)
Malgré cela j'ai des pertes de données: si je monte le baudrate au-dessus de 28800, les points affichés ne correspondent pas à ce qu'ils devraient être. Comme je ne vois pas ce que je pourrais améliorer d'autre, je suis prêt à prendre les idées que vous pourriez avoir.
Je ne pense pas que le problème vienne du coté PC ,Qt étant visiblement un ensemble de librairie réputées.
Cela peut venir des variables, qui utilisent autour de 71% de la mémoire RAM. Mais je ne sais pas dans quelle mesure cela peut jouer.
Et vous, qu'en pensez-vous?
PS: je joins le code, mais il est aussi disponible sur gituhub.
arduino-projecteur-laser.zip (19.1 KB)