Catégories
Moteur

Moteur : EMS Arduino

J’ai réalisé un petit EMS bon marché sur une base Arduino . (Coût du prototype environ 60 Euros avec les capteurs, les plaquettes de test et les composants).

Il est composé d’un module d’acquisition « Arduino Nano » à placer dans le compartiment moteur et d’un couple « Arduino Mega » / afficheur TFT de 3.5″, le tout dialoguant par une liaison série.

L’image ci dessous montre le prototype réalisé par câblage soudé sur des plaques de test. L’unité d’acquisition est implantée sur un circuit imprimé après validation lors des essais moteur.

Liste des mesures et capteurs associés

Nouvelle liste de capteurs suite aux premiers essais moteur ; abandon des capteurs TMP36GZ pour l’huile et l’eu et utilisation se sondes NTC 10k

  • Tension Batterie : Mesure par pont diviseur de tension)
  • Courant Batterie : Mesure non intrusive par capteur à effet Hall +/-30 A WCS1800
  • EGT : Thermocouple K + module MAX6675 interface SPI
  • Température Eau : Sonde NTC 10 K silicone diamètre 6mm
  • Température Huile : Sonde NTC 10 K silicone diamètre 6mm
  • Température compartiment Moteur : TMP36GZ (soudé sur le circuit d’acquisition)
  • Température Air admission : Capteur Peugeot d’origine : NTC (28 kOhms à 0°C / 876 Ohms à 100°C)
  • Pression Air admission : Capteur Peugeot d’origine : (25/369 kPa absolu 0.25/4.75 V)
  • Pression Huile : Capteur 1/4 NPT, 0/100 PSI, 0.5/4.5 V
  • Régime Moteur : Prise W tension alternateur

Ci dessous les capteurs utilisés. (De gauche à droite : pression huile, température eau ou huile, pression + température air admission)

Les sondes de température eau / huile , Sonde NTC 10 K silicone diamètre 6mm , sont placées dans des doigts de gant en aluminium (Photo en bas au centre)

Le capteur de pression d’huile est placé dans la partie basse du moteur sur une platine en aluminium. Il est relié au circuit d’huile par l’intermédiaire d’un tube de petit diamètre pour limiter les échanges thermique et diminuer la température de fonctionnement. (Photo de droite)

Schéma de l’unité d’acquisition

Nouveau schéma suite aux premiers essais moteur: (Modification des valeurs des résistances des filtres RC et utilisation de sondes NTC pour l’eau et l’huile). Le circuit a été validé sauf l’acquisition de vitesse à partir d’une phase de l’alternateur car celui ci n’est pas encore monté. L’acquisition vitesse est faite par un capteur à effet hall pour l’instant

Bien que l’ « Arduino Nano » possède un régulateur 5V intégré la tension 12V est abaissée par un régulateur 7805 en boitier TO-220 pour permettre une meilleure tenue en température.

Chaque capteur externe nécessitant une alimentation 5V est relié par une résistance de limitation afin d’éviter une perte totale de l’unité d’acquisition en cas de court circuit d’un capteur.

Les mesures analogiques (A0 à A7) sont filtrées par un circuit RC.

La varistance de mesure de la température d’admission est alimentée par un pont diviseur de tension (R10, R14) présentant une résistance équivalente de 2.6 kOhms. Cela donne une tension au borne du capteur à peu près linéaire (linéarité +/-4 ° entre 0 et 110 °C)

Même principe pour les varistances températures huile et eau.

La tension alternateur pour la mesure de vitesse moteur est redressée en mono-alternance et limitée à 5V par le circuit (D1, D6, R20, R21). Le signal est câblé sur l’entrée interruption INT0

La sortie Tx0 de l’unité d’acquisition est reliée à l’entrée Rx2 de l’unité d’affichage.

Unité d’affichage

Le module est composé d’un « Arduino mega » sur lequel est enfiché un afficheur TFT 3.5″ (non tactile). Une plaquette à trou, intégrant un bouton poussoir et une résistance reliés à l’entrée D51, est enfichée dans le connecteur inférieur. Ce bouton poussoir est utilisé pour changer de vue.

Un connecteur placé sur le coté permet de relier l’entrée ligne série Rx2 avec le module d’acquisition.

Ci dessous une photo du module TFT vue de dessous et de l’arduino Mega.

Fonctionnement

Acquisition des données

L’unité d’acquisition envoie toutes les 500ms un message avec les valeurs codées en ASCII sous forme d’entiers de 5 digits et séparés par un espace. La première donnée du message est un compteur incrémenté à chaque cycle. Les valeurs nécessitant des décimales sont transmises par multiple de 10 (Exemple : 1/10 Ampère pour la mesure de courant). La longueur totale du message est de 66 octets (Compteur + 10 mesures). Ce format permet de lire en clair les données transmises à l’aide du moniteur série de la console de développement « Arduino ».

Chaque mesure est définie dans l’unité d’acquisition par:

  • Des coefficients de mise à l’échelle a, b (Mesure=a.NbPoints+b)
  • Un coefficient de filtrage (Filt )
  • Une bande morte (DeadB)

Un système anti-bagotement évite des rafraîchissements intempestifs des afficheurs. ( Filtre du premier ordre puis envoi d’une nouvelle valeur si la variation par rapport à la dernière valeur envoyée est supérieure à la bande morte ou si le dernier envoi date de plus de 5 secondes)

Les tension des entrées de mesure de température par sonde NTC n’étant pas tout a fait proportionnelles aux températures réelles, des tables de correction sont définies dans le code et une interpolation linéaire est effectuée pour obtenir une précision inférieure à 1 degré.

Note : La non linéarité est du d’une part a l’utilisation d’un simple pont diviseur et d’autre part a la courbe d’évolution de la résistance des sondes en fonction de la température (cf formule ci dessous: Pour les sondes eau et huile B= 3950, pour la sonde air B=3440 : On a donc 2 tables de correction dans le code.

La mesure vitesse est effectuée par 2 interruptions. Une pour le comptage des impulsions de la broche Int0 et une pour générer un timer à 500mS. Chaque 500 ms , le système mémorise le nb d’impulsions et remet à zéro le compteur. On obtient une précision de 28 rpm. La valeur est arrondie à 10 rpm avant envoi.

Restitution des données

Coté module de visualisation, les mesures possèdent les paramètres suivants:

  • Nom, Unité
  • Nombre de digits et nombre de décimal pour l’affichage
  • Couleur d’affichage à l’état normal (Hors alarme)
  • Valeur d’échelle Min/Max et nombre de tics pour les jauges
  • Valeur de seuils d’alarmes (Très Bas, Bas, Haut, Très Haut)
  • Hystérésis pour les alarmes
  • Echelle et couleur de visualisation historique

Sur réception de message, le programme calcul l’état des alarmes en fonction des seuils et de l’hystérésis et enregistre chaque donnée pour une visualisation historique. (180 échantillons avec une période 10 secondes soit 1/2 heure)

Seuls les messages de 66 octets sont traités. Le compteur de vie en tête de message est vérifié à chaque cycle de réception et est affiché dans la partie supérieur droite de l’écran.

  • Gris pas de perte de message
  • Jaune perte d’un message
  • Rouge perte de plus de 10 messages

2 types d’afficheurs sont disponibles : Afficheur Numérique simple ou afficheur type Jauge (4 tailles disponibles : Très Grand, Grand, Moyen, Petit). Les jauges ont des secteurs de couleur Rouge /Jaune /Vert /Jaune /Rouge en fonction des seuils d’alarmes. La couleur de la valeur apparaît en Jaune ou Rouge en cas d’alarme.

Il est possible de définir plusieurs vues sur la base des 10 mesures disponibles. Un appui sur le bouton poussoir permet de passer à la vue suivante. Ci dessous une vue avec toutes les mesures affichées sous forme de jauge . (Tailles Moyen et petit)

Vue Historique

L’historique des mesures est disponible sous forme de courbes. Une liste d’échelles de visualisation ( numérotées 1 à 6) est prédéfinie dans le code. Chaque mesure est associée à une de ces échelles par codage. Une mesure non associée à une échelle n’est pas visualisée.

Ci dessous la vue historique avec toutes les mesures affichées.Note : La couleur des descriptifs de mesure permet d’associer la mesure aux courbes (Exemple OilP et OilT sont visualisées par des courbes jaunes)

La couleur des valeurs de mesure (Rouge ou jaune ou vert) dépend des seuils d’alarmes

Les échelles on une couleur spécifique par unité et plage de visualisation

Programmation et mise en oeuvre

Unité d’acquisition (ArduinoNano)

Le code est disponible dans le lien ci-dessous (Attention pas à jour avec la dernière version de circuit mise a jour a faire)

https://github.com/jacquesjeannier/EMS/blob/master/EMS.ino

Il faut au préalable installer la librairie SPI (Cf lien ci dessous)

https://github.com/PaulStoffregen/SPI

Unité de restitution (ArduinoMega)

Le code est disponible dans le lien ci dessous.

https://github.com/jacquesjeannier/EMSDISPLAY/blob/master/EMSDISPLAY.ino

Il faut au préalable installer les librairies MCUFRIEND_kbv (Tftglue) et Adafruit_GFX (Cf lien ci-dessous)

https://github.com/prenticedavid/MCUFRIEND_kbv

https://github.com/adafruit/Adafruit-GFX-Library

Circuit imprimé

Le prototype a permis de valider le principe mais a présenté une très mauvaise tenue aux vibrations lors des premiers essais moteur. J’ai donc réalisé un circuit imprimé pour avoir un système fiable pour les essais. Le schéma étant relativement simple, le CI a été réalisé en simple face. Un bornier Phoenix contact 2 étages a été utilisé pour avoir une carte compacte. (65 x 83 mm).

Implantation et typhon du circuit

Circuit après soudure

Repères de câblage du bornier

11 réponses sur « Moteur : EMS Arduino »

Bonjour Jacques,
suite à ton commentaire sur mon site, je visite maintenant ton blog.
Quel beau boulot tu as fait !
ça fait un moment que je cherche ce type d’EMS, ça fait rêver.
As-tu pu l’essayer sur le moteur tournant et obtenir toutes les mesures ?
Je serai prêt à modifier l’étude de mon tableau de bord pour cet EMS.
bien cordialement.
Thierry.

Bonjour Thierry.
Quelques mots sur les essais .
Pour l’instant l’ensemble a été testé sur table avec les capteurs température eau/huile/air, pression huile/air et la mesure de courant . Ça fonctionne. J’ai simulé le signal de l’alternateur avec une alimentation 24V 50 Hz et un potentiomètre pour faire varier la tension. (50 Hz correspond à 600 rpm dans notre cas avec un alternateur 5 paires de pôles). La mesure de RPM est correcte (ça marche avec une tension variant de 10 à 40 V crête voire plus). La seule incertitude sur cette mesure de vitesse c’est le niveau de distorsion harmonique de l’alternateur qui pourrait éventuellement perturber la mesure , mais je suis assez confiant. Au pire il faudra peut ajouter un petit filtrage. La mesure EGT a été testée par injection de tension (20 mv) et c’est OK. J’attends la sonde thermocouple. Coté tenue en température, j’ai fait quelques essais en mettant le circuit d’acquisition dans une boite en bois et en injectant de l’air chaud avec un sèche cheveux. La carte comporte un capteur de température juste à coté de l’arduino nano . J’ai chauffé à 85 °C pendant quelques minutes ça tient. Je vais mener un test un peu plus long. Pour la tenue aux vibrations, il faudra faire un circuit imprimé avec des connections courtes et cela devrait aller l’ideal serait de pourvoir monter le circuit sur le moteur pour avoir très peu de câbles. Le moteur n’ayant pas tourné je n’ai pas de retour in situ (peut être vers pâques si tout va bien). Le circuit peut facilement être adapté pour d’autres types de sondes. L’écran a une luminosité correcte.

Note : Pour 30 Euros sur Banggood ou eBay, il est possible d’approvisionner l’arduino nano avec une plaque à borne, l’arduino mega et le TFT donc c’est peu risqué en terme de coût.

Bonjour Jacques,
Merci, pour le partage des infos cela m’a permis d’acheter avec la référence JXFC 6C1Q 9K589 AB la platine pour la pompe à injection .
J’ai modestement commencé à faire un site avec « wordpress » mais j’ utilise la version gratuite, peux tu me dire l’abonnement que tu as choisi et éventuellement les avantages.
Cordialement
Jean-Claude

Bonjour Jacques ,
je découvre ton blog en recherchant des infos d’ EMS basé sur Arduino, et je dois dire que là je suis servi !! (code, schéma… ) merci beau boulot
Je suis également constructeur de Gaz’aile et je galèrais sur l’implantation d’un nouveau turbo (surtout le support et la position de la wastegate) suite à la casse du premier lors d’essai moteur… Je vois plein détails qui vont pas mal m’aider, merci pour le partage
Si possible, pourrais avoir le mot de passe pour voir les rubriques protegées .
Merci et félicitations pour ce beau boulot

Bonjour, Le système est en cours de test (le moteur a tourné hier mais j’ai de pb d’injecteurs). Suite au premiers tests je vois que les sondes TMP36GZ sont très sensibles à la capacité du câble (il faut ajouter une capacité de quelques nf sur la tête de sonde pour que cela marche) . Je vais donc remplacer ces sondes de température par des modèles de type NTC 10K. Pour le reste çà à l’air correct. Je publierai une mise à jour (schéma et code) dans les prochaines semaines. Attention, l’unité de visualisation fonctionne bien pour les tests mais pour la lecture en plein soleil il faudra prévoir un écran plus lumineux . Je te contacte par mail pour les autres informations.

Bonjour Jacques, tout d’abord je tenais a vous féliciter pour ce beau travail.
Cette partie EMS me plait et avec votre accord je voudrais l’intégrer sur mes futurs montages de mon Mini EFIS (voir mon site).

Je suis a la recherche pour faire aussi un système de moving map mais pas avec une tablette car on y voit rien en plein soleil, je suis entrain d’étudier ce cas avec une Raspberry Pi 4 avec Android et un LCD comme celui que j’utilise ayant une bonne luminosité mème en plein soleil.

Si vous voulez me contacter: 06 35 30 33 77

Cordialement,
Fred

Bonjour Fred pas de problèmes pour réutiliser cet EMS dans vos futurs montages. Pour information, j’ai modifié les valeur des composants de filtrage de mesure ainsi que les types sonde de température. J’ai aussi réalisé le circuit imprimé et testé l’ensemble. Je vais bientôt publier une mise à jour .

Jacques, d’après ce que j’ai compris cet EMS est basè sur un moteur diesel équipè d’un alternateur pour le compte tours.
Quelles sont les modifications a faire cotè électronique et cotè arduino pour les moteurs Rotax 80 et 100 CV qui sont utilisés en ULM tout en gardant les capteurs d’origine ?
Pouvez vous m’aider car de ce cotè la je flanche un peu ?

salut Jacky……..
nous travaillons avec un ami dans un service électronique, nous avons ou plutôt nous sommes entrain d’utiliser un morceau de ton code pour un ebike ou plutôt un hoverkart.
on s’occupe de la partie électronique avant de fabriquer le chassis
nous on dispose de trois capteurs a effet hall on arrive a fabriquer une variable en km/hr en incluant le diamètre de la roue.
cependant avec un filtre pass bas comme tu as mis le système beug un peu, nous pensons utiliser un trigger de schmitt pour lisser les bruits de decoupage du régulateur
q’en penses tu
nous avons aussi modifié le code du bouton poussoir qui n’était pas tres reactif
tu travail high level merci pour ce partage

Bonjour, j’avais mis en suspend mon projets pendant 2 ans je reprends maintenant. Je suppose que vous avez solutionné vos problèmes.

Répondre à BLANCHARD Vincent Annuler la réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *