Possibilité de l'arduino - Début en programmation embarquée

Bonsoir à tous

Pour ceux qui me connaisse déjà, je suis sur un projet avec l'arduino Mega pour gérer mon Aquarium récifal.

J'ai testé plusieurs partie de ce que je souhaite faire séparément mais je bute sur l’assemblage de tout sa.

Mon principal souci c'est la commande des servo moteur avec le gestion du reste de l'application. Les servos me servent à faire des oscillateurs de pompe de brassage dans l'aquarium. Les servos moteurs doivent être relativement linéaire dans leurs déplacements.

Pour le moment j'ai 2 servo-moteurs à commander, mais je vais aller jusqu’à 4.

Donc en faite je voudrais savoir si la puissance de calcul de l'arduino mega devrais pas être un souci.

Voila ce que je veux qu'il fasse:

Donc gestion des 4 servomoteurs.
Gestion de l'heure à la minute prêt, inutile d'aller à la seconde.
Gestion de mon afficheur clavier et voyant en I2C. Gestion de celui-ci par micro-contrôleur donc moins rapide que la DS1307.
Gestion des capteurs de niveau d'eau et commande des pompes en fonction de leur état.
-Niveau d'eau Osmosé (mini maxi)
-Niveau d'eau de mer (très mini, mini, maxi de la décantation et maxi bac)
Gestion de l’éclairage ( 5 commandes).
-Gestion de driver gradable de LED plus tard.
Gestion de la température avec commande de ventilateurs et monter de la rampe d’éclairage en cas de surchauffe.
Gestion de monter et descente de la rampe d’éclairage (commande manuel). Capteur haut et bas.
Gestion de la présence secteur (entrée relais) pour la commande des pompes au retour de tension.
Gestion des pompes doseuse ( 4 Moteur 12V). Fonctionne quelques fois dans la journée par intermittence et jamais en même temps.
Possibilité de modifier les variables au clavier (heure / vitesse des servo ainsi que leur butée jour et nuit / heure d’éclairage etc...)
Sauvegarde des variables en EEPROM.

Ensuite Gestion de 2 autres entrées analogique, PH et Redox (lorsque j'aurais fabriquer les cartes)

Possibilité plus complète de paramétrage par logiciel sur PC par envoie de trame sur port COM puis par Ethernet lorsque j'aurais le shield. Interrogation des variables, modification des variables.

Donc voila, est-ce que le processeur est capable de traiter tout sa, est-ce que cela vous semble possible. Sachant que j’interroge ou surveille pas tout les composants dans le même tour de boucle.

Interrogation de l'heure toutes les minutes,
interrogation ou envoie de l'afficheur tout les 100 millisecondes (1 commande sur l'I2C à chaque fois).

Le plus rapide c'est les servo avec en moyenne un top de 1° tout les 50 à 300 millisecondes pour les 4 servo.

Actuellement je peine pas mal avec la gestion des millis et mon I2C du coup la commande de mes servo ne sont pas du tout fluide.

Merci de vos informations. Lorsque l'on a l'habitude de travailler à des logiciels sur PC, l'embarqué semble bien léger, mais peut être que c'est juste une question de méthodologie.

Ils sont ou les timer :slight_smile: et les threads :slight_smile:

Es-tu sûr, que des servos sont le bon type de moteur pour cette application?
Quel type de servos utilises tu et comment les pilotes tu?

Korman

J'utilise des servo-moteur classique avec la bibliothèque "servo.h".

Tout les tests que j'ai effectué sur un seul ou 2 servo-moteurs sont concluants, d'ailleurs ils marchent en se moment même (2 servos) avec un arduino mega qui ne fait que sa pour le moment. Pas de gestion de la DS1307 ou de l'afficheur.

Donc séparément cela marche parfaitement. Mais mon intégration n'est pas encore top top. La DS1307 (heure) marche bien, l'afficheur seul marche bien.

Pour le moment j'ai intégré seulement ces 3 fonctions (heure / 2 servo-moteur / l'afficheur) ainsi que l'EEPROM et le Serial pour le débogage et l'envoie de trame pour le paramétrage des variables si besoin.

L'arduino envoie des trames série uniquement si je lui demande quelque chose. Et par contre je vérifie la présence de donnée sur le Serial tout les 300 ms il me semble.

Juste se que je voudrais savoir c'est si l'arduino est capable de gérer tout sa.

Christophe37:
Juste se que je voudrais savoir c'est si l'arduino est capable de gérer tout sa.

Oui, même un Uno est capable de gérer tout ça. Tes problèmes indiquent plutôt, que la méthode ou l'implémentation n'est pas la bonne - un peu comme si on transportait les courses dans le cendrier de la voiture et on se complaind que la voiture est trop petite pour les courses.

Korman

Fais des modules séparés pour chaque fonction, ce sera plus simple à gérer et à coder, de plus si une panne apparait ce ne sera pas tout ton système qui sera en rade.

Au niveau de la méthodologie, tu devrais implémenter chaque fonctionnalité indépendamment comme cela est dit au-dessus puis te faire une frise temporelle afin d'avoir sous les yeux ce qui doit se faire, quand et combien de temps ça dure.
Ensuite seulement tu peux intégrer tout. C'est assez important de savoir la fréquence de réalisation d'une action et plutôt que d'attendre un temps donné, pense aux interruptions timer.

Si vraiment t'as besoin d'un système préemptif... mais je vois pas pourquoi ce serait nécessaire dans ton cas, tu peux te tourner vers Femto OS ou similaire. Mais tu perdras les avantages de l'IDE Arduino...

Merci de vos réponses, cela me rassure, lors de ma formation ont a pas abordé l'embarqué de façon plus importante, c'est bien dommage, surtout pour l’orientation final de la formation, l'industrie.

En tout cas merci à vous, mais si vous avez des liens en français si possible pour expliquer comment gérer sa, se serait sympa, je suis trop mauvais en anglais, je me fais une formation à la maison car cela me manque trop, mais reprendre les cours après 20 ans c’était déjà pas facile, j’avoue que les matières générales les moins payante pour l'examen ont été mise de coté.

Par contre je retiens l'idée des interruptions timers, car j'ai cherché dans cette direction mais je suis toujours tomber sur la fonction "millis", vous pourriez développer ou m'indiquer un lien qui explique sa.

Merci encore, car je commençais à regarder du coté des FEZ mais avec ce que j'ai besoin comme entrée sortie il me faudrait la Cobra qui est quand même bien plus cher ou les plus petite avec les carte d’extension IO en I2C ce qui revenais au même.

J'ai trouvé, la gestion des interruptions Timer.

C'est exactement ce que je cherchais. On peut utilisé combien de timer ? Je vais chercher.
4 timers serait parfait mais bon...

Christophe,

au sujet des interruptions:

Si les évènements sont souvent par rapport à la durée de ta boucle centrale ou si la précision de la durée doit être dans l'ordre de grandeur de moins de 0.01ms, les interruptions sont le bon choix.

Sinon, il est souvent préférable de maintenir une liste de tâches et de vérifier a chaque itération de ta boucle centrale ce qui est à faire maintenant. Dans ce cas ci, il est une bonne idée d'éviter la functions delay() pour des attentes trop longues. Pour un bon exemple comment ça fonctionne vas voir l'exemple Blink Without Delay.

Korman

Merci Korman, c'est exactement le lien que j'avais regardé, mais j'ai peut être tout simplement fait des erreurs dans mon code qui du coup le plante. En tout cas maintenant je sais qu'il est sensé fonctionner malgré les informations que j'ai besoin de traiter. Il est difficile de juger de la puissance de calcul du contrôleur lorsque l'on y est pas du tout habitué, pour moi je lui en demandait peut être trop, mais apparemment non il peut largement encaissé sa.

En ce qui concerne la classe "MsTimer2" cela a l'air de convenir parfaitement mais le .h et bizarre, j’avais jamais vu de namespace en C++ (En .net oui mais pas en C++) du coup je peut pas instancier plusieurs fois cette classe, ou je mi prend mal, pour faire mes 4 timers.

J'ai essayé de faire simplement:

MsTimer2 Montimer1;
MsTimer2 Montimer2; etc..

Mais sa cela marche pas. Bon je suis au boulot donc j'ai pas regarder plus que sa.

J'ai vu que le Atmega1280 aurait 4 timer 16Bits et 2 de 8 bits, si je comprend bien, avec la bibliothèque MsTimer2 on utilise le timer 2.

Je vais analyser le code source de MsTimer2 pour voir comment on l'utilise mais il y a peut être des explications déjà effectuées sur se sujet?

Christophe37:
J'ai vu que le Atmega1280 aurait 4 timer 16Bits et 2 de 8 bits, si je comprend bien, avec la bibliothèque MsTimer2 on utilise le timer 2.

Je vais analyser le code source de MsTimer2 pour voir comment on l'utilise mais il y a peut être des explications déjà effectuées sur se sujet?

Christophe,

as-tu besoin de 3 montres pour être à 9:00 au boulot, à 12:15 au resto et à 20:15 devant la télé pur le match de foot?

Oublie les timers et les interruptions. Si je te comprends bien, la majorité de tes besoins de mesure de temps ne passe pas à moins de 1ms. Tu peut donc gérer le tout avec le timer système et la fonction millis(), ou probablement avec now() de la librairie Time. Ce qui serait beaucoup plus utile est un module horloge avec pile ou récepteur DCF77.

Peut-être tu pourrais poster le code qui te fais des soucis pour voir s'il y a des améliorations évidentes.

Merci, je vais continuer dans se sens avec la fonction millis.

Je regarde sa se week-end car il faut que j'avance dessus, si j'ai un souci j'essaierais de faire une explication avec mon code, mais vu que j'essaie de crée des classes pour chaque groupe de fonctions c'est vite éparpillé.