Jump to content
  • This is not a forum but a community!

    20100521_GTX_0003.JPGWe all love this mythical and popular car, because we sailed in one being childrens, because someone in the family had one or just because it always made us want it... because it's endearing, whatever we say.
    Its great success is certainly due to the fact that with a simple mechanics, with little or no electronics, it is easy to maintain by yourself without expensive tools, without forgetting that the parts are not expensive and always easy to find. Even today, for some homes, students and people with "little budget", it is a source of great comfort at a lower price: far from car loans and garage mechanics, which are becoming more and more inaccessible. The small engines models (the most common) are very robust and still consume very little, sometimes less than recent "equivalent" cars, which makes it by definition just as ecological, if not even more by the simple fact that we we always use it instead of buying new ones ... At the level of the official technical control, benefiting from its "seniority", it does not undergo the modern standards much too restrictive, the tranquility is assured.
    Today it is still an interesting car for everyday use, especially and clearly from an economic point of view.
    Collectors are also beginning to take an interest in this 30-year-old "granny": restoration, maintenance or refurbishment, repairs, etc ... make it possible to find "newer than new" models for the pleasure of the eyes and to see this French heritage thus safeguarded.
    We have created this community to bring together all those who are interested and who wish to take part in this adventure to preserve their Renault Super 5, whether by maintenance, repair or restoration: you will find in this community all useful information and tips on these topics.

    The forum is freely accessible in its entirety: there is no need to contribute, buy, neither pay anything to integrate the community and participate.
    To be able to ask questions and share your interest, all you have to do is register and present yourself properly!
    You do not have to have a Super 5: an interest in auto mechanics is enough

    Welcome !

    (This message disappears if you register into the forum)

    [Translated from french using GoogleTranslation tool]

     

totojest

Commandes de chauffage contrôlées par Arduino

33 posts in this topic

Recommended Posts

Bonjour à tous,

 

Les commandes de chauffage sur la S5, c’est une véritable calamité. Les miennes pètent à tour de bras et ça devient compliqué d’en trouver.

 

Ayant démonté le TDB de la S5, j’ai vu que la pose de servomoteurs ne serait pas si compliquée sur le bloc chauffage (bien entendu avec quelques adaptations) et me suis dit que je pourrais ainsi m’affranchir des engrenages plastiques habituels...

 

Pas question de faire un système de clim auto ou quoi, l’idée de ce topic est de faire quelque chose accessible pour tous, idéalement sans démonter le tableau de bord, et garder même la façade de commandes d’origine.

 

Je sais qu’on a un topic déjà consacré aux micro contrôleurs Arduino, Raspberry, etc... mais j’aimerais bien comparer lequel serait le plus à même de faire ce genre de boulot très simple. Voici les données de départ du projet:

- 1 microcontroleur (Arduino Uno car je sais qu’on peut l’alimenter en 12V et qu’il pourrait même supporter du 14V, et derrière gérer lui même l’alimentation des servitudes)

- 3 servomoteurs pour les 3 volets du bloc chauffage (2 d’entre eux sont couplés pour le mixage d’air, c’est d’ailleurs peut-être l’occasion de

- 1 ou 2 potentiomètres pour la commande de chauffage et de mixage d’air (cette dernière n’ayant besoin que de 4 positions, on ne peut se contenter que de 4 résistances, à voir en fonction du tarif).

 

Si vous avez des fournisseurs chez qui je pourrais me procurer tout ça relativement rapidement compte tenu de la situation, ce serait cool :D Ce topic pourra aboutir sur un tuto bien évidemment avec partage du code, mise en oeuvre... Donc toutes vos suggestions sont bienvenues pour mener le projet à bien.

  • Like 1

Share this post


Link to post
Share on other sites

Bonne idée même si je suis incapable de la faire. Pour les pièces regarde chez RadioSpares, ils livrent toujours mais très certainement avec un délais supplémentaire.

Share this post


Link to post
Share on other sites

Merci @five34500 pour le conseil. Je l'ai finalement commandé directement sur le site Arduino. C'est expédié d'Italie, mais avec la livraison en 1 jour ouvré (que j'avais prise pour anticiper un éventuel retard), il est déjà à la maison :blink: Je suis pas du tout prêt à commencer à bosser dessus, mais je pense que je vais quand même pas tarder à tenter l'installation des servomoteurs. Ils sont vraiment petits, j'espère que ça ira pour ce que je veux faire.

 

Pour le moment j'ai juste commandé un Arduino Uno et 3 servomoteurs. Je simulerai les entrées avec de simples résistances dans un premier temps, j'ai un potard chez moi, mais je suis chez mes parents... Heureusement que j'ai quand même un peu de composants avec moi.

 

A suivre, très bientôt j'espère donc! :)

Share this post


Link to post
Share on other sites

Si t'as pris un arduino, en ajoutant un capteur de température tu peux faire un système de chauffage qui régule la température. J'ai déjà utilisé le capteur DS18S20 qui étant numérique est beaucoup plus fiable et simple à utiliser/mettre en place qu'un capteur analogique (thermistance, etc...).
Je suis curieux de voir surtout comment tu vas mettre te servos en place pour que ca ait assez de force pour commander les câbles des volets.
Le potard câblé directement derrière les boutons d'une commande standard ca a l'air pas mal... :top:
Hate de voir la suite ! :) 

Share this post


Link to post
Share on other sites
il y a une heure, Zorro_X a dit :

Je suis curieux de voir surtout comment tu vas mettre te servos en place pour que ca ait assez de force pour commander les câbles des volets.

Possibilité de récupérer des moteurs sur des Renault avec commande électrique des volets de chauffage?

Share this post


Link to post
Share on other sites

Les volets en eux même ne sont pas difficiles à manœuvrer, les commandes pêtent bien souvent à cause des contraintes exercées sur les cables en eux même. Je vous dirais si les servomoteurs montés en direct sur le bloc de chauffage fonctionnent, sinon il faudra passer par des réducteurs (et donc carrément prendre un servomoteur monté sur des bagnoles pour limiter les frais)

Share this post


Link to post
Share on other sites
Il y a 3 heures, totojest a dit :

Les volets en eux même ne sont pas difficiles à manœuvrer, les commandes pêtent bien souvent à cause des contraintes exercées sur les cables en eux même. Je vous dirais si les servomoteurs montés en direct sur le bloc de chauffage fonctionnent, sinon il faudra passer par des réducteurs (et donc carrément prendre un servomoteur monté sur des bagnoles pour limiter les frais)

ca dépend du servomoteur, il faut en choisir des "bons" qui exercent à un couple adapté.

arf ! je viens de comprendre : tu ne veux pas utiliser la commande par câble mais poser tes servomoteurs directement là où le câble agit (?) En effet, t'as peut-être moins de couple à fournir pour fonctionner comme ça. Par contre l'adaptation risque d'être un peu plus compliquée.

Share this post


Link to post
Share on other sites

C'est possible avec une commande manuelle comme sur espace 3 par exemple.

Share this post


Link to post
Share on other sites

Bon aujourd’hui j’ai pu m’y mettre un peu plus sérieusement. J’ai analysé le comportement des volets du bloc chauffage et ai trouvé les positions à adopter pour chacun des comportements désirés. Il y a moyen d’avoir une meilleure répartition de l’air qu’avec les commandes à câble...

 

 Sinon il m’est venu une idée, et là j’ai besoin de la connaissance des pros de l’Arduino: existe-t-il un relais « normalisé » qui permettrait de faire passer le courant correspondant à la consommation du ventilateur? Donc piloté sur du 5V de l’Arduino? Car à la manœuvre des volets il faut limiter le flux d’air pour éviter de peter les servomoteurs, donc couper le ventilo...

Share this post


Link to post
Share on other sites
il y a 40 minutes, totojest a dit :

existe-t-il un relais « normalisé » qui permettrait de faire passer le courant correspondant à la consommation du ventilateur? Donc piloté sur du 5V de l’Arduino? Car à la manœuvre des volets il faut limiter le flux d’air pour éviter de peter les servomoteurs, donc couper le ventilo...

oui, absolument, ce sont des relais de puissance tout comme ceux pour les feux des sup'. Il faut juste que t'en trouves des alimentés 5V et avec la bonne tension/courant à relayer (genre 12V/10A). Après t'en trouveras de 3 sortes :

. "mécaniques" : le classique electro-aimant qui actionne un contact lorsque le courrant passe ;

. solides : je ne sais pas comment ça fonctionne mais il n'y a pas de mouvement mécanique donc ca ne s'use pas ;

. MOSFET : c'est une sorte de gros transistor de puissance bien mieux isolé qui sert très bien de relais solide.

Par contre tu vas avoir un problème d'alim si tu comptes alimenter ton relais + 3-4 servomoteurs avec ton arduino. Tu devrais te trouver une alim 12V->5V de 1-3A (genre chargeur USB d'allume-cigares) pour faire les alims de puissance en-dehors de l'arduino (et utiliser l'arduino uniquement pour commander).

Share this post


Link to post
Share on other sites

C'est bien que tu me parles de ça, car je pensais que le Uno était capable de subvenir aux besoins électriques de ces 4 servitudes... Bon déjà dans un premier temps, il n'est pas question d'intégrer le relais de puissance dans ma version de test. Je couperai manuellement la ventilation quand je changerai les positions des volets, et comme de toute façon mon ventilo n'est pas un foudre de guerre, je pense pas que ça fasse grand mal. C'est juste que pour les versions "normales", ce ne sera pas la même chose, et qu'il faudra le prendre en compte dans le code...

Share this post


Link to post
Share on other sites

Le meilleur montage pour un relais de puissance c'est via un transistor de commande, ca te permet de ne pas "gaspiller" du jus sur la résistance du relais en utilisant l'alim extérieure.
Par contre attention, si tu branches ton arduino avec la prise alim qu'il y a  dessus, il me semble qu'il faut absolument mettre une tension supérieure à 7V pour que le régulateur de tension intégré puisse faire son job correctement, car si tu mets en-dessous, la tension régulée (et donc qui alimentera ton arduino) sera < 5V.
Par contre si t'as un bon transfo dont les 5V sont garantis et stables (genre surtout pas un chargeur USB qui fait du 6-7V pas très stables) tu peux alimenter ton arduino "à l'envers", c'est à dire en branchant la masse et le +5V directement sur les PINs de la carte (et pas sur la prise alim).

Share this post


Link to post
Share on other sites
il y a 40 minutes, Zorro_X a dit :

Le meilleur montage pour un relais de puissance c'est via un transistor de commande, ca te permet de ne pas "gaspiller" du jus sur la résistance du relais en utilisant l'alim extérieure.
Par contre attention, si tu branches ton arduino avec la prise alim qu'il y a  dessus, il me semble qu'il faut absolument mettre une tension supérieure à 7V pour que le régulateur de tension intégré puisse faire son job correctement, car si tu mets en-dessous, la tension régulée (et donc qui alimentera ton arduino) sera < 5V.
Par contre si t'as un bon transfo dont les 5V sont garantis et stables (genre surtout pas un chargeur USB qui fait du 6-7V pas très stables) tu peux alimenter ton arduino "à l'envers", c'est à dire en branchant la masse et le +5V directement sur les PINs de la carte (et pas sur la prise alim).

Cool, bon à savoir. J'ai bien l'intention de lui coller le 12V du + après contact, donc il ne va pas manquer de tension... J'espère qu'il est capable de tenir le 14V sur la longueur quand même... Et pas bête l'idée du triac, j'allais privilégier le montage "oldschool" avec un relais, mais si ça peut économiser une alim (qui interviendra dans une version 2 pour utiliser un Arduino Easy, bien moins cher...) c'est bon à prendre. J'ai pas tout le matos que je veux avec moi :unsure:

 

Bon et sinon, un premier compte rendu de mes analyses du jour. J'ai étudié le bloc de ventilation et la possibilité d'intégration des servomoteurs. Ca ne devrait pas poser problème pour 2 d'entre eux, le 3ème impliquera un peu plus de travail :(

 

Mais pourquoi 3 servomoteurs quand on n'a que 2 commandes de chauffage me direz vous? La réponse en image:

DSCF7677.JPG.ed5e97a07c36344e4b173599e9e31eac.JPG

 

La commande la plus à gauche, c'est le mixage chaud froid. Il tourne sur 85°, en position 0°, c'est plein froid, en position 85° (dans le sens horaire, et comme positionné sur la photo), c'est pleine chaleur.

 

Concernant la répartition de l'air, il y a donc deux volets. Les deux tournent sur 135°. Celui du bas gère la répartition aux pieds, celui du haut la répartition entre l'envoi d'air en pleine face ou vers le parebrise.

 

Pour celui du bas, à 0° il est fermé (pas d'air aux pieds, et ça correspond à la position "pleine face" sur la commande), à 45° il est complètement ouvert (ça correspond à la position "tout vers les pieds"), à 90° il est moyennement ouvert (position "parebrise et pieds"), et à 135° il est de nouveau fermé (position "parebrise").

 

Pour celui du haut, à 0° il dirige l'air vers les aérateurs latéraux (position "pleine face" sur la commande), à 45° il ferme l'accès aussi bien aux aérateurs qu'au parebrise (position "tout vers les pieds"), à 90° il est moyennement ouvert (position "parebrise et pieds"), et à 135° il est complètement ouvert vers le parebrise.

 

Les deux volets de mixage ont un carré de 6mm de côté et sont profonds de 32mm. Sachant ça, je vais pouvoir fabriquer un support pour l'axe de chacun de leur servomoteur. L'intégration du servomoteur va surement nécessiter une découpe de la console centrale :nosweat:

DSCF7669.JPG.4e3638a0d3c1db981e8e2c523ff07b32.JPG

 

Le servomoteur est en appui assez prononcé sur la console centrale, en sachant qu'elle n'est pas correctement enquillée dans ses logements (à en voir la patte au premier plan). Regardez comme ça dépasse sur les pédales, et comment la patte de fixation de la console centrale dépasse par rapport au logement métallique dans lequel elle doit normalement se loger (au niveau du pli en V, juste à côté du gros fil rouge):

DSCF7670.JPG.c7d0ce0401c8f4d5017d2d5614f48600.JPG

 

Bref, même si ma console n'est plus à ça près, ça me fait un peu chier (ça reste une double DIN :ki:) C'est donc un truc à étudier de mon côté. Sinon pour les 2 autres, pas de soucis particulier je pense, on est dans une zone dégagée sous le tableau de bord normalement.

 

Avant de conclure, je reviens juste sur la commande des volets de mixage qui sont synchronisés par cette roue dentée:

DSCF7678.JPG.41708749d4f48c7cded7f59c5951b16e.JPG

 

Elle se déclipse assez facilement (je suis passé par le conduit d'aération de l'aérateur côté conducteur), et si vous remarquez bien, en face de chaque zone crantée, il y a un repère (un point creusé pour le volet des pieds, et un point qui ressort pour le volet parebrise/aérateurs frontaux). Comme une distri, ces repères sont bien utiles pour synchroniser les volets. A savoir que ça correspond à la position "pleine face" et que les repères identiques sont présents sur les roues dentées des volets. Attention, il y a 3 repères sur les roues des volets, un trou, un trait et un point qui dépasse, on aligne bien entendu le trou avec le trou et le point qui dépasse avec le point qui dépasse. Autre truc cool, c'est qu'il y a un repère aussi sur la partie fixe du bloc de chauffage:

DSCF7673.JPG.4d32b42b85ba2afc094d346b83577195.JPG

 

DSCF7672.JPG.9987217011e58b84610b714927c4a7be.JPG

 

Là on voit bien les points qui dépassent pour le volet parebrise/aérateurs latéraux, même s'ils ne sont pas alignés :ki:

DSCF7668.JPG.539e703eb784264f115cde9cebdefb59.JPG

 

Et j'oubliais le verso de la poulie de synchronisation pour vous montrer comment elle est fichue et qu'elle est simplement clipsée au bloc. (Ca me fait penser qu'il faudra que je bouche le trou laissé par la poulie pour éviter les fuites d'air...)

DSCF7675.JPG.e3f87dfbca2e913a9380d1561bbee5c5.JPG

 

Voilà voilà pour le moment!

  • Like 1

Share this post


Link to post
Share on other sites
Il y a 4 heures, totojest a dit :

J'espère qu'il est capable de tenir le 14V sur la longueur quand même...

ca reste à vérifier, je crois que la tension recommandée si mes souvenirs sont bons c'est 9-12V...

 

Il y a 4 heures, totojest a dit :

Et pas bête l'idée du triac,

je n'avais pas parlé de triac, mais de transistor "de base", utilisé comme un relais de puissance pour alimenter la résistance de ton vrai relais de puissance (si t'utilises un relais mécanique). Par contre si t'utilises un MOSFET en effet il n'y en aurait pas besoin.

 

Sympa toutes ces photos & explications :jap: 

Tu devrais mesurer le couple nécessaire pour faire tourner tes engrenages si tu peux, ca t'évitera des - mauvaises - surprises avec tes servos...

Share this post


Link to post
Share on other sites

Mine de rien tu as bien avancé ! Les choses se précises pour continuer et j ai hâte de lire la suite !

Share this post


Link to post
Share on other sites

Quelques avancées silencieuses par ici, j’ai fabriqué les pattes de fixation de mes 3 servomoteurs, ils sont en place, en prise directe, j’ai fait un test de ça et vient avec un programme disponible sur Internet et ça semble être pas mal, le volet sur lequel j’ai testé bouge :top: Par contre j’ai une incohérence dans les valeurs des butées, quand je lui demande un balayage entre 0 et 85 degrés il se limite à une variation d’angle d’environ 45 degrés...

 

Bon comme la voiture est toujours en chantier et que je suis reparti chez moi, je n’ai plus de quoi avancer sur place. J’ai pris mon Arduino et un servomoteur pour faire des tests, mais je crains ne pas être prêt avant un bon moment...

Share this post


Link to post
Share on other sites
il y a 19 minutes, totojest a dit :

quand je lui demande un balayage entre 0 et 85 degrés il se limite à une variation d’angle d’environ 45 degrés...

oui, ca m'est arrivé aussi. C'était il ya  plus de 2 ans, mais si je me souviens bien, le problème venait de la façon dont le servo interprête la commande et ca fait comme un décalage. J'avais résolu le problème "à tâtons", en mettant des valeurs extrèmes pour voir à quelle valeur correspondait quelle position, sans considérer que c'était des degrés et je m'étais débrouillé comme ça.
En fait ca dépend du modèle de servos, j'avais des servomoteurs pour modélisme, mais j'avais pris par la suite un servomoteur "plus adapté" (recommandé pour arduino), forcément plus cher, mais ca marchait plus comme on s'y attendait.

Share this post


Link to post
Share on other sites

Merci Zorro, ça confirme mes intentions de faire une calibration « à la main ». Pourtant j’ai acheté ces servomoteurs sur le site d’Arduino en même temps que mon Uno, c’est curieux...

 

Bon je voulais vous partager une vidéo sur le fonctionnement de mon servomoteur sur la voiture mais je n’arrive pas à l'uploader depuis le téléphone. Encore un peu de patience donc :ki:

Share this post


Link to post
Share on other sites
Il y a 1 heure, totojest a dit :

Pourtant j’ai acheté ces servomoteurs sur le site d’Arduino en même temps que mon Uno, c’est curieux...

ah oui, là c'est bizarre... 😕 
T'as un paramétrage/init à faire au début, c'est peut-être de là que vient le problème. Faut aussi regarder les valeurs qu'il est sensé prendre en entrée, des fois c'est genre -90/90° et pas 0/180°, etc...

Share this post


Link to post
Share on other sites

Joli chantier qui me plaît bien !

Tu souhaites gérer la vitesse de ventilation aussi ?

Share this post


Link to post
Share on other sites
Le 13/05/2020 à 15:30, Zorro_X a dit :

ah oui, là c'est bizarre... 😕 
T'as un paramétrage/init à faire au début, c'est peut-être de là que vient le problème. Faut aussi regarder les valeurs qu'il est sensé prendre en entrée, des fois c'est genre -90/90° et pas 0/180°, etc...

Probablement, mais c'est pas compliqué à tester sur un bureau avec mon ordi, je vais bien finir par trouver les bonnes valeurs :D

 

Le 15/05/2020 à 12:04, rapid35 a dit :

Joli chantier qui me plaît bien !

Tu souhaites gérer la vitesse de ventilation aussi ?

Non, je gère pas la ventilation, en tout cas pas dans la version de base de mon chantier. Je reste sur un truc soft pour le moment sur lequel tout le monde pourra faire la modif le jour où on aura épuisé tout le stock de console de chauffage...

 

J'ai enfin réussi à uploader ma vidéo de test d'ailleurs:

https://dai.ly/k4wJU1NKoV0wVrw3WI0

  • Like 1

Share this post


Link to post
Share on other sites

Le projet commence enfin sur l'aspect logiciel... Pour l'instant, quelque chose de très simple qui commandera la partie mixage chaud/froid (que j'ai simplifié par "chauffage" dans le code). Je prépare la suite avec les entrées de commande de mixage d'air (pieds/tête/parebrise), mais je n'ai pas encore testé, je dois me renseigner davantage sur les valeurs d'entrée à choisir (4 valeurs de résistance), et il faudra convertir ces valeurs de commande en valeur d'angle pour les servomoteurs associés (pas encore codé, pour le moment j'ai juste recopié la valeur d'entrée pour pouvoir l'afficher sur la console).

 

#include <Servo.h>

Servo servomixh;        // création de l'objet servomixh (servomoteur mixage haut)
Servo servomixb;        // création de l'objet servomixb (servomoteur mixage bas)
Servo servochau;        // création de l'objet servochau (servomoteur chauffage)

int cmdchau = 0;        // Entrée analogique sur laquelle est connectée le potentiomètre de commande de chauffage
int cmdmix = 1;         // Entrée analogique sur laquelle est connectée la valeur d'entrée de la résistance pour le mixage d'air
int valchau;            // Variable contenant la valeur de position du potentiomètre de chauffage (et qui sera convertie en position du servo chauffage)
int valmix;             // Variable contenant la valeur de la résistance de commande de mixage d'air
int valmixh;            // Variable contenant la valeur de position du servo mixage haut
int valmixb;            // Variable contenant la valeur de position du servo mixage bas
int pin_servomixh = 6;  // Pin 6 sur lequel est branché le servo de mixage haut sur l'Arduino
int pin_servomixb = 5;  // Pin 5 sur lequel est branché le servo de mixage bas sur l'Arduino
int pin_servochau = 3;  // Pin 3 sur lequel est branché le servo de chauffage sur l'Arduino
bool mode_debug = true; // Mode débug (true or false)


void setup() {
  Serial.begin(9600);       // Ouvre le port série                   
  while(!Serial){;}     
  servomixh.attach(pin_servomixh);// attache le servo mixage haut à son pin spécifié
  servomixb.attach(pin_servomixb);// attache le servo mixage bas à son pin spécifié
  servochau.attach(pin_servochau);// attache le servo chauffage à son pin spécifié
}

void loop() {
  valchau = analogRead(cmdchau);           // Lit la valeur actuelle du potentiomètre (valeur comprise entre 0 et 1023)
  valchau = map(valchau, 0, 1023, 95, 10); // Mise à l'échelle pour renvoyer la position entre 10 et 95°
  servochau.write(valchau);                // Déplace le servo chauffage à la position spécifiée
  valmix = analogRead(cmdmix);             // Lit la valeur de résistance choisie pour le choix de la sortie de l'air
  valmixh = valmix;                        // A CHANGER: Conversion de la commande d'entrée mixage en position du servo mixage haut
  valmixb = valmix;                        // A CHANGER: Conversion de la commande d'entrée mixage en position du servo mixage bas
  servomixh.write(valmixh);                // Application de la position au servo mixage haut
  servomixb.write(valmixb);                // Application de la position au servo mixage bas 

  if (mode_debug) {                        // Si on est en mode débug (true), on affiche les éléments suivants
      Serial.print("CHAUFFAGE : ");
      Serial.print(valchau);               // Valeur de commande choisie pour le chauffage (sur l'échelle de 10 à 95°)
      Serial.print(" | Position reelle chauffage : ");
      Serial.println(servochau.read());    // Position du servomoteur chauffage
      Serial.print(" | MIXAGE : ");
      Serial.print(valmix);                // Valeur de commande choisie pour le mixage
      Serial.print(" | Position reelle mixage haut : ");
      Serial.println(servomixh.read());    // Position du servomoteur mixage haut
      Serial.print(" | Position reelle mixage bas : ");
      Serial.println(servomixb.read());    // Position du servomoteur mixage bas
      delay(1000);                         // Attente d'1 sec entre chaque rafraichissement des valeurs
  } else {                                 // Sinon, en usage normal
    delay(15);                             // Rafraichissement toutes les 15ms
  }
}

Je vous donnerai un aperçu en photos/vidéos un peu plus tard, quand j'aurai peaufiné la partie mixage d'air. Je donne le code pour donner déjà un aperçu de mon avancement et éventuellement le faire relire par ceux qui ont l'habitude :D (C'est comme ça qu'on fait au boulot aussi...)

Share this post


Link to post
Share on other sites

Bon, voici un code qui s'approche grandement de la version définitive de la version 1 "tous publics", comprenez ceux qui veulent garder une console centrale d'origine. Il me restera juste à travailler le mouvement des servomoteurs qui est trop rapide selon moi (et qui vu les volets à déplacer risque de les fatiguer prématurément). Les valeurs des angles seront à définir aussi, c'est pour ça que je les ai déclarées au préalable afin de n'avoir qu'un seul endroit où les changer si besoin... Je suis assez content de ce résultat, car il permet vraiment de réduire le nombre de composants au strict minimum: plus besoin de résistances comme ce que j'avais imaginé pour la commande de mixage, 4 fils les remplaceront facilement, et l'adaptation de la console de chauffage d'origine n'en sera que plus facile.

#include <Servo.h>

Servo servomixh;        // création de l'objet servomixh (servo mixage haut)
Servo servomixb;        // création de l'objet servomixb (servo mixage bas)
Servo servochau;        // création de l'objet servochau (servo chauffage)

int cmdchau = 0;        // Entrée analogique sur laquelle est connectée le potentiomètre de commande de chauffage
int cmdmix = 1;         // Entrée analogique sur laquelle est connectée la valeur d'entrée de la résistance pour le mixage d'air
int valchau;            // Variable contenant la valeur de position du potentiomètre de chauffage (et qui sera convertie en position du servo chauffage)
int valmix;             // Variable contenant la valeur de commande de mixage d'air (utilisée uniquement pour le débug)
int valmixh;            // Variable contenant la valeur de position du servo mixage haut
int valmixb;            // Variable contenant la valeur de position du servo mixage bas
int entredeux;          // Compteur pour savoir si le bouton est bloqué entre deux positions (quand il atteind une certaine valeur on considère que le bouton n'est pas correctement en place et on adoptera une position de sécurité)
int anghpleinface = 10; // Valeur d'angle en mode pleine face pour le servo de mixage haut
int angbpleinface = 10; // Valeur d'angle en mode pleine face pour le servo de mixage bas
int anghpleinpied = 55; // Valeur d'angle en mode plein pieds pour le servo de mixage haut
int angbpleinpied = 55; // Valeur d'angle en mode plein pieds pour le servo de mixage bas
int anghparebpied = 100;// Valeur d'angle en mode parebrise, pieds et face pour le servo de mixage haut
int angbparebpied = 55; // Valeur d'angle en mode parebrise, pieds et face pour le servo de mixage bas
int anghparebrise = 145;// Valeur d'angle en mode plein parebrise pour le servo de mixage haut
int angbparebrise = 10; // Valeur d'angle en mode plein parebrise pour le servo de mixage bas
int pin_servomixh = 6;  // Pin 6 sur lequel est branché le servo de mixage haut sur l'Arduino
int pin_servomixb = 5;  // Pin 5 sur lequel est branché le servo de mixage bas sur l'Arduino
int pin_servochau = 3;  // Pin 3 sur lequel est branché le servo de chauffage sur l'Arduino
int pin_pleinface = 8;  // Pin 8 sur lequel est branché la commande de mixage pleine face
int pin_pleinpied = 9;  // Pin 9 sur lequel est branché la commande de mixage plein pieds
int pin_parebpied = 10; // Pin 10 sur lequel est branché la commande de mixage parebrise, pieds et face
int pin_parebrise = 11; // Pin 11 sur lequel est branché la commande de mixage plein parebrise

// Initialisation
void setup() {
  Serial.begin(9600);                    // Ouvre le port série                   
  while(!Serial){;}     
  servomixh.attach(pin_servomixh);       // attache le servo mixage haut à son pin spécifié
  servomixb.attach(pin_servomixb);       // attache le servo mixage bas à son pin spécifié
  servochau.attach(pin_servochau);       // attache le servo chauffage à son pin spécifié
  pinMode(pin_pleinface,INPUT_PULLUP);   // on déclare le pin "pleine face" comme un pin d'entrée "pullup"
  pinMode(pin_pleinpied,INPUT_PULLUP);   // on déclare le pin "plein pieds" comme un pin d'entrée "pullup"
  pinMode(pin_parebpied,INPUT_PULLUP);   // on déclare le pin "parebrise, pieds et face" comme un pin d'entrée "pullup"
  pinMode(pin_parebrise,INPUT_PULLUP);   // on déclare le pin "plein parebrise" comme un pin d'entrée "pullup"
  valmixh = 30;                          // on initialise des valeurs pour les volets non nulles pour ne pas forcer sur les servomoteurs
  valmixb = 30;
  valchau = 30;
  entredeux = 0;                         // on considère que la position entre deux n'est pas par défaut
  
}

// Boucle d'analyse
void loop() {
  // SERVO CHAUFFAGE
  valchau = analogRead(cmdchau);           // Lit la valeur actuelle du potentiomètre (valeur comprise entre 0 et 1023)
  valchau = map(valchau, 0, 1023, 95, 10); // Mise à l'échelle pour renvoyer la position entre 10 et 95°
  servochau.write(valchau);                // Déplace le servo chauffage à la position spécifiée

  
  // SERVO MIXAGE
  boolean pleinface = digitalRead(pin_pleinface); // On définit sur quelle position la commande de mixage est placée (attention, le booleen est à 0 quand on est sur la position)
  boolean pleinpied = digitalRead(pin_pleinpied);
  boolean parebpied = digitalRead(pin_parebpied);
  boolean parebrise = digitalRead(pin_parebrise);

  // Définition des angles à adopter pour chacun des servos en fonction de la commande demandée
  if (!pleinface)         // Mode plein face
  {
    valmixh = anghpleinface;
    valmixb = angbpleinface;
    entredeux = 0;
    valmix = 1;
  }
  else if (!pleinpied)   // Mode plein pieds
  {
    valmixh = anghpleinpied;
    valmixb = angbpleinpied;
    entredeux = 0;
    valmix = 2;
  }
  else if (!parebpied)   // Mode parebrise, pieds et face
  {
    valmixh = anghparebpied;
    valmixb = angbparebpied;
    entredeux = 0;
    valmix = 3;
  }
  else if (!parebrise)   // Mode plein parebrise
  {
    valmixh = anghparebrise;
    valmixb = angbparebrise;
    entredeux = 0;
    valmix = 4;
  }
  else                   // Sécurité: Si on laisse le bouton coincé entre deux positions, on adoptera le mode "parebrise" par défaut après un temps d'attente
  {
    entredeux = entredeux + 1;
    valmix = 5;
  }

  // Sécurité:
  if (entredeux>=15) // Quand on a atteint un certain quota (et donc après un certain temps, 15 secondes ici), on passe en mode "parebrise" par sécurité
  {
    valmixh = anghparebrise;
    valmixb = angbparebrise;
    valmix = 6;
  }

  // Application des valeurs aux servomoteurs
  servomixh.write(valmixh);                // Application de la position au servo mixage haut
  servomixb.write(valmixb);                // Application de la position au servo mixage bas 

  // Débug
  Serial.print(" // CHAUFFAGE : ");
  Serial.print(valchau);               // Valeur de commande choisie pour le chauffage (sur l'échelle de 10 à 95°)
  Serial.print(" | Position reelle chauffage : ");
  Serial.println(servochau.read());    // Position du servomoteur chauffage
  Serial.print(" | MIXAGE : ");
  Serial.print(valmix);                // Valeur de commande choisie pour le mixage
  Serial.print(" | Position reelle mixage haut : ");
  Serial.println(servomixh.read());    // Position du servomoteur mixage haut
  Serial.print(" | Position reelle mixage bas : ");
  Serial.println(servomixb.read());    // Position du servomoteur mixage bas
  Serial.print(" | ENTRE DEUX : ");
  Serial.print(entredeux);             // Valeur du compteur d'entre deux
  
  delay(1000);                         // Attente d'1 sec avant de relancer la boucle
}

 

Bon, et une fois que la version 1 sera finie (tutoriel d'adaptation de la console inclus), je m'attelerai à une V2 spéciale Automatic. Car je vais réutiliser des boutons d'une console de chauffage d'Espace 2, mais comme elle est plus large que la console de S5, je vais devoir "compresser" la place pour la fonctionnalité de mixage d'air... à deux boutons poussoirs et 3 diodes :ki: Les boutons permettront de choisir le mode de mixage désiré, et les diodes d'afficher le flux d'air paramétré (avec une combinaison d'allumage si par exemple on veut que l'air arrive à la fois aux pieds et à la tête).

 

Encore une fois, je vous montrerai tout ça en images bien entendu... En attendant, je file me coucher!

  • Like 1

Share this post


Link to post
Share on other sites

hello !
Ca s'annonce bien tout ça, surtout si ca fait le job ! Une fois la mécanique en place tu vas pouvoir t'amuser bien plus ! :top:

 

Question codage, pour améliorer la lisibilité vu que tu fais en C, je te proposerai de faire plutôt un petit tableau de structs et une liste de constantes, quelque chose du genre :

#include <Servo.h>

// Différents modes
enum VALMIX_MODE
{
  MIX_PLEINE_FACE,
  MIX_PLEIN_PIEDS,
  MIX_PAREBRISE_PIEDS_FACE,
  MIX_PLEIN_PAREBRISE,
  
  MIX_NB,                          // Nombre de modes disponibles
  MIX_DEFAULT = MIX_PLEINE_FACE,   // Mode par défaut  
};

// Structure d'une entrée de configuration
struct  ENTRY_CONFIG
{
  int haut;
  int bas;  
};

Servo servomixh;        // création de l'objet servomixh (servo mixage haut)
Servo servomixb;        // création de l'objet servomixb (servo mixage bas)
Servo servochau;        // création de l'objet servochau (servo chauffage)

int cmdchau = 0;        // Entrée analogique sur laquelle est connectée le potentiomètre de commande de chauffage
int cmdmix = 1;         // Entrée analogique sur laquelle est connectée la valeur d'entrée de la résistance pour le mixage d'air
int valchau;            // Variable contenant la valeur de position du potentiomètre de chauffage (et qui sera convertie en position du servo chauffage)
VALMIX_MODE valmix=MIX_DEFAULT;    // Variable contenant la valeur de commande de mixage d'air (utilisée uniquement pour le débug)
int entredeux;          // Compteur pour savoir si le bouton est bloqué entre deux positions (quand il atteind une certaine valeur on considère que le bouton n'est pas correctement en place et on adoptera une position de sécurité)


// tableau des configurations possibles
ENTRY_CONFIG configuration[MIX_NB] =
{
//    haut  bas   
  {   10,   10  },    // MIX_PLEINE_FACE 
  {   55,   55  },    // MIX_PLEIN_PIEDS
  {   100,  55  },    // MIX_PAREBRISE_PIEDS_FACE
  {   145,  10  },    // MIX_PLEIN_PAREBRISE
};

int pin_servomixh = 6;  // Pin 6 sur lequel est branché le servo de mixage haut sur l'Arduino
int pin_servomixb = 5;  // Pin 5 sur lequel est branché le servo de mixage bas sur l'Arduino
int pin_servochau = 3;  // Pin 3 sur lequel est branché le servo de chauffage sur l'Arduino
int pin_pleinface = 8;  // Pin 8 sur lequel est branché la commande de mixage pleine face
int pin_pleinpied = 9;  // Pin 9 sur lequel est branché la commande de mixage plein pieds
int pin_parebpied = 10; // Pin 10 sur lequel est branché la commande de mixage parebrise, pieds et face
int pin_parebrise = 11; // Pin 11 sur lequel est branché la commande de mixage plein parebrise

// Initialisation
void setup() {
  Serial.begin(9600);                    // Ouvre le port série                   
  while(!Serial){;}     
  servomixh.attach(pin_servomixh);       // attache le servo mixage haut à son pin spécifié
  servomixb.attach(pin_servomixb);       // attache le servo mixage bas à son pin spécifié
  servochau.attach(pin_servochau);       // attache le servo chauffage à son pin spécifié
  pinMode(pin_pleinface,INPUT_PULLUP);   // on déclare le pin "pleine face" comme un pin d'entrée "pullup"
  pinMode(pin_pleinpied,INPUT_PULLUP);   // on déclare le pin "plein pieds" comme un pin d'entrée "pullup"
  pinMode(pin_parebpied,INPUT_PULLUP);   // on déclare le pin "parebrise, pieds et face" comme un pin d'entrée "pullup"
  pinMode(pin_parebrise,INPUT_PULLUP);   // on déclare le pin "plein parebrise" comme un pin d'entrée "pullup"
  valchau = 30;
  entredeux = 0;                         // on considère que la position entre deux n'est pas par défaut
  
}

// Boucle d'analyse
void loop() {
  // SERVO CHAUFFAGE
  valchau = analogRead(cmdchau);           // Lit la valeur actuelle du potentiomètre (valeur comprise entre 0 et 1023)
  valchau = map(valchau, 0, 1023, 95, 10); // Mise à l'échelle pour renvoyer la position entre 10 et 95°
  servochau.write(valchau);                // Déplace le servo chauffage à la position spécifiée

  
  // SERVO MIXAGE
  boolean pleinface = digitalRead(pin_pleinface); // On définit sur quelle position la commande de mixage est placée (attention, le booleen est à 0 quand on est sur la position)
  boolean pleinpied = digitalRead(pin_pleinpied);
  boolean parebpied = digitalRead(pin_parebpied);
  boolean parebrise = digitalRead(pin_parebrise);


  // Définition des angles à adopter pour chacun des servos en fonction de la commande demandée
  if (!pleinface)         // Mode plein face
  {
    entredeux = 0;
    valmix = MIX_PLEINE_FACE;
  }
  else if (!pleinpied)   // Mode plein pieds
  {
    entredeux = 0;
    valmix = MIX_PLEIN_PIEDS;
  }
  else if (!parebpied)   // Mode parebrise, pieds et face
  {
    entredeux = 0;
    valmix = MIX_PAREBRISE_PIEDS_FACE;
  }
  else if (!parebrise)   // Mode plein parebrise
  {
    entredeux = 0;
    valmix = MIX_PLEIN_PAREBRISE;
  }
  else                   // Sécurité: Si on laisse le bouton coincé entre deux positions, on adoptera le mode "parebrise" par défaut après un temps d'attente
  {
    entredeux++;
  }

  // Sécurité:
  if (entredeux>=15) // Quand on a atteint un certain quota (et donc après un certain temps, 15 secondes ici), on passe en mode "parebrise" par sécurité
  {
    valmix=MIX_DEFAULT;
  }

  // Application des valeurs aux servomoteurs
  servomixh.write(configuration[valmix].haut);                // Application de la position au servo mixage haut
  servomixb.write(configuration[valmix].bas);                // Application de la position au servo mixage bas 

  // Débug
  Serial.print(" // CHAUFFAGE : ");
  Serial.print(valchau);               // Valeur de commande choisie pour le chauffage (sur l'échelle de 10 à 95°)
  Serial.print(" | Position reelle chauffage : ");
  Serial.println(servochau.read());    // Position du servomoteur chauffage
  Serial.print(" | MIXAGE : ");
  Serial.print(valmix);                // Valeur de commande choisie pour le mixage
  Serial.print(" | Position reelle mixage haut : ");
  Serial.println(servomixh.read());    // Position du servomoteur mixage haut
  Serial.print(" | Position reelle mixage bas : ");
  Serial.println(servomixb.read());    // Position du servomoteur mixage bas
  Serial.print(" | ENTRE DEUX : ");
  Serial.print(entredeux);             // Valeur du compteur d'entre deux
  
  delay(1000);                         // Attente d'1 sec avant de relancer la boucle
}

 

Ca te permettra de pouvoir définir et ajuster autant de modes que tu veux plus facilement...
Après, c'est clairement un programme de test, mais le défaut principal de ce code c'est que tu repositionnes les servos même s'ils sont déjà dans la bonne position. Dans un truc comme ça tu risques de les entendre "grogner" en permanence. Le mieux c'est de leur envoyer l'ordre/commande/consigne seulement lorsque c'est nécessaire (au moment du changement de position) plutôt que tous les cycles.

 

Du coup ca donnerait plutôt un truc comme ceci (avec l'ajout de "prev_valmix") :

#include <Servo.h>

// Différents modes
enum VALMIX_MODE
{
  MIX_PLEINE_FACE,
  MIX_PLEIN_PIEDS,
  MIX_PAREBRISE_PIEDS_FACE,
  MIX_PLEIN_PAREBRISE,
  
  MIX_NB,                          // Nombre de modes disponibles
  MIX_DEFAULT = MIX_PLEINE_FACE,   // Mode par défaut  
};

// Structure d'une entrée de configuration
struct  ENTRY_CONFIG
{
  int haut;
  int bas;  
};

Servo servomixh;        // création de l'objet servomixh (servo mixage haut)
Servo servomixb;        // création de l'objet servomixb (servo mixage bas)
Servo servochau;        // création de l'objet servochau (servo chauffage)

int cmdchau = 0;        // Entrée analogique sur laquelle est connectée le potentiomètre de commande de chauffage
int cmdmix = 1;         // Entrée analogique sur laquelle est connectée la valeur d'entrée de la résistance pour le mixage d'air
int valchau;            // Variable contenant la valeur de position du potentiomètre de chauffage (et qui sera convertie en position du servo chauffage)
VALMIX_MODE valmix=MIX_DEFAULT;    // Variable contenant la valeur de commande de mixage d'air (utilisée uniquement pour le débug)
VALMIX_MODE prev_valmix=MIX_NB;    // Valeur précédente pour détecter les changements : mis à une valeur invalide pour forcer l'init au 1er cycle
int entredeux;          // Compteur pour savoir si le bouton est bloqué entre deux positions (quand il atteind une certaine valeur on considère que le bouton n'est pas correctement en place et on adoptera une position de sécurité)


// tableau des configurations possibles
ENTRY_CONFIG configuration[MIX_NB] =
{
//    haut  bas   
  {   10,   10  },    // MIX_PLEINE_FACE 
  {   55,   55  },    // MIX_PLEIN_PIEDS
  {   100,  55  },    // MIX_PAREBRISE_PIEDS_FACE
  {   145,  10  },    // MIX_PLEIN_PAREBRISE
};

int pin_servomixh = 6;  // Pin 6 sur lequel est branché le servo de mixage haut sur l'Arduino
int pin_servomixb = 5;  // Pin 5 sur lequel est branché le servo de mixage bas sur l'Arduino
int pin_servochau = 3;  // Pin 3 sur lequel est branché le servo de chauffage sur l'Arduino
int pin_pleinface = 8;  // Pin 8 sur lequel est branché la commande de mixage pleine face
int pin_pleinpied = 9;  // Pin 9 sur lequel est branché la commande de mixage plein pieds
int pin_parebpied = 10; // Pin 10 sur lequel est branché la commande de mixage parebrise, pieds et face
int pin_parebrise = 11; // Pin 11 sur lequel est branché la commande de mixage plein parebrise

// Initialisation
void setup() {
  Serial.begin(9600);                    // Ouvre le port série                   
  while(!Serial){;}     
  servomixh.attach(pin_servomixh);       // attache le servo mixage haut à son pin spécifié
  servomixb.attach(pin_servomixb);       // attache le servo mixage bas à son pin spécifié
  servochau.attach(pin_servochau);       // attache le servo chauffage à son pin spécifié
  pinMode(pin_pleinface,INPUT_PULLUP);   // on déclare le pin "pleine face" comme un pin d'entrée "pullup"
  pinMode(pin_pleinpied,INPUT_PULLUP);   // on déclare le pin "plein pieds" comme un pin d'entrée "pullup"
  pinMode(pin_parebpied,INPUT_PULLUP);   // on déclare le pin "parebrise, pieds et face" comme un pin d'entrée "pullup"
  pinMode(pin_parebrise,INPUT_PULLUP);   // on déclare le pin "plein parebrise" comme un pin d'entrée "pullup"
  valchau = 30;
  entredeux = 0;                         // on considère que la position entre deux n'est pas par défaut
  
}

// Boucle d'analyse
void loop() {
  // SERVO CHAUFFAGE
  valchau = analogRead(cmdchau);           // Lit la valeur actuelle du potentiomètre (valeur comprise entre 0 et 1023)
  valchau = map(valchau, 0, 1023, 95, 10); // Mise à l'échelle pour renvoyer la position entre 10 et 95°
  servochau.write(valchau);                // Déplace le servo chauffage à la position spécifiée

  
  // SERVO MIXAGE
  boolean pleinface = digitalRead(pin_pleinface); // On définit sur quelle position la commande de mixage est placée (attention, le booleen est à 0 quand on est sur la position)
  boolean pleinpied = digitalRead(pin_pleinpied);
  boolean parebpied = digitalRead(pin_parebpied);
  boolean parebrise = digitalRead(pin_parebrise);


  // Définition des angles à adopter pour chacun des servos en fonction de la commande demandée
  if (!pleinface)         // Mode plein face
  {
    entredeux = 0;
    valmix = MIX_PLEINE_FACE;
  }
  else if (!pleinpied)   // Mode plein pieds
  {
    entredeux = 0;
    valmix = MIX_PLEIN_PIEDS;
  }
  else if (!parebpied)   // Mode parebrise, pieds et face
  {
    entredeux = 0;
    valmix = MIX_PAREBRISE_PIEDS_FACE;
  }
  else if (!parebrise)   // Mode plein parebrise
  {
    entredeux = 0;
    valmix = MIX_PLEIN_PAREBRISE;
  }
  else                   // Sécurité: Si on laisse le bouton coincé entre deux positions, on adoptera le mode "parebrise" par défaut après un temps d'attente
  {
    entredeux++;
  }

  // Sécurité:
  if (entredeux>=15) // Quand on a atteint un certain quota (et donc après un certain temps, 15 secondes ici), on passe en mode "parebrise" par sécurité
  {
    valmix=MIX_DEFAULT;
  }

  // si changement de position détecté
  if ( valmix != prev_valmix )
  {
  	// Application des nouvelles valeurs aux servomoteurs
  	servomixh.write(configuration[valmix].haut);                // Application de la position au servo mixage haut
  	servomixb.write(configuration[valmix].bas);                // Application de la position au servo mixage bas 
  
    	// mise à jour de la valeur précédente
  	prev_valmix = valmix;
  }

  // Débug
  Serial.print(" // CHAUFFAGE : ");
  Serial.print(valchau);               // Valeur de commande choisie pour le chauffage (sur l'échelle de 10 à 95°)
  Serial.print(" | Position reelle chauffage : ");
  Serial.println(servochau.read());    // Position du servomoteur chauffage
  Serial.print(" | MIXAGE : ");
  Serial.print(valmix);                // Valeur de commande choisie pour le mixage
  Serial.print(" | Position reelle mixage haut : ");
  Serial.println(servomixh.read());    // Position du servomoteur mixage haut
  Serial.print(" | Position reelle mixage bas : ");
  Serial.println(servomixb.read());    // Position du servomoteur mixage bas
  Serial.print(" | ENTRE DEUX : ");
  Serial.print(entredeux);             // Valeur du compteur d'entre deux
  
  delay(1000);                         // Attente d'1 sec avant de relancer la boucle
}

 

D'une manière générale il faut éviter de faire des write inutilement (ca prend du temps), donc il faudrait faire un truc dans le même genre pour la commande de mix du chauffage chaud/froid...

  • Like 1

Share this post


Link to post
Share on other sites

Merci Zorro, je vais tester ça. Le côté rafraîchissement de l’état de position pouvait être utile si le volet se déplace un peu de lui même mais je préfère la méthode «  action que s’il y a changement du paramètre de commande » :D 

 

Je vais m’y atteler aujourd’hui. J’espère que d’ici ce soir la V1 sera terminée :) 

  • Like 1

Share this post


Link to post
Share on other sites

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

By using this site, you agree to our terms Terms of Use of use and privacy policy Privacy Policy.