{"id":59,"date":"2021-11-04T14:34:17","date_gmt":"2021-11-04T13:34:17","guid":{"rendered":"http:\/\/www.atout-cycle.fr\/?p=59"},"modified":"2021-11-04T18:13:54","modified_gmt":"2021-11-04T17:13:54","slug":"code-pour-vae-pilote-par-arduino","status":"publish","type":"post","link":"http:\/\/www.atout-cycle.fr\/?p=59","title":{"rendered":"Code pour VAE pilot\u00e9 par Arduino"},"content":{"rendered":"\n<p><a href=\"https:\/\/tricyclos.wordpress.com\/2019\/04\/07\/code-pour-un-vae-pilote-par-arduino\/#respond\">Publication de l&rsquo;article original le 0<\/a><a href=\"https:\/\/tricyclos.wordpress.com\/2019\/04\/07\/code-pour-un-vae-pilote-par-arduino\/\"><time datetime=\"2019-04-07T17:16:50+01:00\">7 avril 2019<\/time><\/a><\/p>\n\n\n\n<figure class=\"wp-block-image\" id=\"attachment_114\"><img src=\"https:\/\/tricyclos.files.wordpress.com\/2019\/04\/capture-de28099c3a9cran-de-2019-04-07-18-31-03-e1554659629338.png?w=770\" alt=\"Capture d\u2019\u00e9cran de 2019-04-07 18-31-03\" class=\"wp-image-114\"\/><figcaption>Code basique pour piloter un contr\u00f4leur de moteur pour VAE<\/figcaption><\/figure>\n\n\n\n<p>Apr\u00e8s des heures heureuses mais br\u00e8ves de code, voici un tout premier jet op\u00e9rationnel pour piloter une assistance \u00e9lectrique.<\/p>\n\n\n\n<p>J\u2019avais d\u00e9j\u00e0 essay\u00e9 de me mettre \u00e0 la t\u00e2che, mais avec des ambitions d\u00e9mesur\u00e9es. Il fallait que tout soit bien et beau, donc j\u2019avais m\u00eame pour projet d\u2019y int\u00e9grer directement un affichage LCD, pour voir la vitesse, le niveau des batteries, etc. Avec l\u2019exp\u00e9rience, on apprend que trop vouloir, c\u2019est aussi la voie royale vers la frustration et le d\u00e9couragement.&nbsp; Donc d\u2019autres fonctionnalit\u00e9s viendront s\u00fbrement, mais petit \u00e0 petit, chaque chose en son temps.<\/p>\n\n\n\n<h2>Comment utiliser le code :<\/h2>\n\n\n\n<ul><li>A t\u00e9l\u00e9charger sur une carte arduino ou un microcontr\u00f4leur capable de l\u2019interpr\u00e9ter (AtMega328 par exemple ?) Si vous d\u00e9butez, le pus simple est de passer par Arduino.<\/li><li>La carte arduino est \u00e0 brancher au levier de frein, au d\u00e9tecteur de p\u00e9dalage,&nbsp; et \u00e0 un potentiom\u00e8tre que vous fixerez sur votre guidon dans l\u2019id\u00e9al. S\u2019assurer que le levier de frein pour VAE que vous avez fonctionne dans le sens du code (frein activ\u00e9 = pas de courant, tension nulle vers l\u2019arduino ; sinon inversez cela dans le code)La s\u00e9curit\u00e9 avant tout<\/li><li>installer un driver de moteur BLDC, entre Arduino, la batterie et le moteur. Veiller \u00e0 ce qu\u2019il soit pourvu d\u2019un radiateur suffisant pour \u00e9viter de le griller<\/li><li>trouver une fa\u00e7on d\u2019alimenter votre Arduino et ce contr\u00f4leur de BLDC (ce derneir s\u2019alimente aussi en 5V en g\u00e9n\u00e9ral, ne pas confondre avec l\u2019entr\u00e9e de puissance \u00e0 24- 36-48 V !) On peut envisager un r\u00e9gulateur de tension partant de la batterie alimentant les deux, il faudrait en voir le rendement.<\/li><li>v\u00e9rifier tout les branchements : senseurs hall, c\u00e2bles de bobine moteur, alimentations, PAS, freins, potentiom\u00e8tre, plus un fil de signal PWM d\u2019arduino vers le driver BLDC.&nbsp; Si ledit driver ne sait interpr\u00e9ter que des commandes en tension, comme c\u2019est souvent le cas, recourir \u00e0 un<a href=\"https:\/\/tricyclos.wordpress.com\/2019\/01\/11\/pilotage-par-arduino-de-moteur-brushless\/\"> filtre passe bas et \u00e9ventuellement un amplificateur op\u00e9rationnel <\/a>le redressant.<\/li><li>S\u2019assurer que sur votre selle vous avez facilement acc\u00e8s au contact de la batterie avant de tester. Le code ne vous fera pas faux bond, mais on ne sait jamais ce qu\u2019un mauvais branchement peut engendrer.<\/li><\/ul>\n\n\n\n<h2>Ce que ce code fait :<\/h2>\n\n\n\n<p>Le plus simple pour le savoir est de lire le code. M\u00eame si vous n\u2019y connaissez rien, ce sera aussi l\u2019occasion de voir que coder en Arduino est plus facile que le mandarin. Mais je laisse au paresseux ici un r\u00e9sum\u00e9 :<\/p>\n\n\n\n<ul><li>Le code \u00ab&nbsp;\u00e9coute&nbsp;\u00bb ce que vous \u00eates en train de faire : p\u00e9daler (dans le bon sens), freiner ; il regarde aussi syst\u00e9matiquement le niveau d\u2019assistance que vous demandez selon la rotation du potentiom\u00e8tre sur votre guidon.<\/li><li>Tant que vous p\u00e9dalez ET ne freinez pas, il indique au contr\u00f4leur de moteur de tourner. Si vous freinez OU ne p\u00e9dalez pas,&nbsp; il lui dit de s\u2019arr\u00eater.<\/li><li>Il assure une certaine progressivit\u00e9 \u00e0 l\u2019acc\u00e9l\u00e9ration ou au freinage, jusqu\u2019\u00e0 arriver au un niveau d\u2019assistance requis (celui indiqu\u00e9 par le potentiom\u00e8tre, ou 0). Ce degr\u00e9 de progressivit\u00e9 peut \u00eatre chang\u00e9 en modifiant les variables ad\u00e9quates dans le code.<\/li><\/ul>\n\n\n\n<h2>Ce que le code ne fait pas encore :<\/h2>\n\n\n\n<ul><li>Il ne regarde pas la vitesse atteinte, et continue donc de faire tourner le moteur au del\u00e0 des 25km\/h r\u00e9glemtaires. En l\u2019\u00e9tat, il n\u2019est pas utilisable sur la voie publique. Il va sans dire qu\u2019il vous indique encore moins la vitesse atteinte.<\/li><li>Il n\u2019arr\u00eate pas le moteur si votre driver BLDC ne s\u2019arr\u00eate pas malgr\u00e9 une tension de signal tr\u00e8s faible. C\u2019est donc un inconv\u00e9nient b\u00e9nin avec certains drivers, de le voir continuer \u00e0 tourner au ralenti.<\/li><li>Il ne mesure pas le niveau de la batterie et ne vous l\u2019indique pas<\/li><li>Il ne sert pas le caf\u00e9 au lit avec des pains au chocolat.<\/li><li>Il n\u2019installe pas de virus tenaces sur les SUV alentours pour les transformer en briques.<\/li><\/ul>\n\n\n\n<h3>Les am\u00e9liorations \u00e0 venir :<\/h3>\n\n\n\n<ul><li>Prioritaire : La coupure totale et r\u00e9glementaire du moteur et notamment au del\u00e0 de 25km\/h. Cela signifie qu\u2019il faudra \u00e9toffer le code pour lui faire lire les signaux de tours par minute du driver. Aussi simple que \u00e7a puisse para\u00eetre, cela n\u2019a rien de simple de faire \u00e9couter une variable tout en demeurant attentif aux autres. La coupure totale requiert aussi de contr\u00f4ler l\u2019alimentation du pilote, avec transistor ou opto-coupleur, normalement c\u2019est simple<\/li><li>quitte \u00e0 introduire ces modifications, il serait utile d\u2019en faire b\u00e9n\u00e9ficier le cycliste en les affichant. Un \u00e9cran LCD requiert cependant beaucoup de broches et de codes, \u00e0 \u00e9tudier donc sans urgence<\/li><li>indication de niveau de batterie : cela peut se faire avec un pont diviseur de tension pour en permettre la lecture dirctement par arduino, qui peut l\u2019afficher de fa\u00e7on \u00e9l\u00e9mentaire avec des DEL, sans LCD.<\/li><\/ul>\n\n\n\n<h2>Le code :<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>\/*<br>Pilotage basique d\u2019assistance \u00e9lectrique pour v\u00e9lo.<br>A associer \u00e0 une carte de contr\u00f4le de moteur BLDC.<br>Mettre entre les deux un filtre passe bas Si ce driver BLDC ne lit pas les PWM :<br>Le filtre doit convertir le signal PWM en signal en tension correspondant \u00e0 l\u2019amplitude lue par votre contr\u00f4leur<\/p><p>Assurez vous d\u2019avoir un signal de frein concordant : tension basse quand on tire sur un des leviers de freins, et non l\u2019inverse !<\/p><p>circuit:<br>\u2013 potentiom\u00e8tre aliment\u00e9 en +5V, Gnd et analog input pin 0 (A0)<br>\u2013 10 Kohm resistor connected from ground to analog in pin 0 ??? A voir si n\u00e9cessaire<br>\u2013 PAS (d\u00e9tecteur de p\u00e9dalage) connect\u00e9 : 5V, Gnd et sa sortie en 8<br>\u2013 freins : vers broche 9<br>\u2013 sortie PWM vers broche 10<\/p><p>Cr\u00e9\u00e9 par Tristan Cousin le 7 avril 2019<br>Ce code est dans le domaine public.<br>*\/<br>\/\/ These constants won\u2019t change:<br>const int assistance = A0; \/\/ entr\u00e9e potar niveau d\u2019assistance<br>const int PAS = 8;<br>const int frein = 9; \/\/ broche du frein<br>const int sortiedriver; \/\/ broche d\u2019\u00e9mission du signal PWM (ensuite filtr\u00e9 passe bas pour un pilotage en tension<\/p><p>\/\/ These variables will change:<br>int pedalage; \/\/ \u00e9tat du p\u00e9dalage (1 ou 0)<br>int freinage; \/\/ \u00e9tat du frein (1 ou 0)<br>int nivassist; \/\/ niveau effectif d\u2019assistance<br>int cibleassist; \/\/ objectif vers lequel faire tendre l\u2019assistance,<br>\/\/ tranquilement pour un pilotage moins nerveux<br>int nervosite = 5; \/\/ temps en milliseconde d\u2019un cran d\u2019ajustement du niveau d\u2019assistance<br>\/\/ (\u00e0 hauteur d\u2019un 256\u00e8me de l\u2019assistance max) vers le niveau cibl\u00e9<br>int nervfreinage = nervosite\/2; \/\/ la vitesse de freinage est arbitrairement d\u00e9finie comme<br>\/\/ la le double de la \u00ab&nbsp;nervosite&nbsp;\u00bb \u00e0 l\u2019acc\u00e9l\u00e9ration.<br>void setup() {<br>\/\/ set the pins as output or inputs:<br>pinMode(sortiedriver, OUTPUT);<br>pinMode(frein, INPUT);<br>pinMode(PAS, INPUT);<br>}<\/p><p>void loop() {<\/p><p>\/\/ tant que les conditions sont r\u00e9unies, arduino demande au pilote du moteur d\u2019activer le moteur:<br>while ((digitalRead(PAS) == HIGH)&amp;&amp;(digitalRead(frein) == LOW))<br>{<br>fonctionassistance();<br>}<br>\/\/le frein est activ\u00e9 ou le p\u00e9dalier s\u2019arr\u00eate, les conditions en sont plus r\u00e9unies<br>cibleassist = 0;<br>if(nivassist&gt;cibleassist){<br>int nivassist = nivassist-1;<br>analogWrite(sortiedriver,nivassist);<br>delay(nervfreinage);<br>};<br>}<\/p><p>void fonctionassistance() {<br>\/\/ faire tourner le moteur en amenant la commande de vitesse de fa\u00e7on progressive vers ce que demande le potar :<br>int cibleassist = (analogRead(assistance)\/4);\/\/l\u2019entr\u00e9e analogique va de 0 \u00e0 1023, la sortie d<\/p><p>\/\/s\u2019il faut augmenter la vitesse<br>if(nivassist&lt;cibleassist){<br>int nivassist = (nivassist+1);<br>}<br>\/\/s\u2019il faut augmenter la vitesse<br>if(nivassist&gt;cibleassist){<br>int nivassist = (nivassist-1);<br>}<br>\/\/changer d\u2019un cran la commande de vitesse, temporiser un peu<br>analogWrite(sortiedriver,nivassist);<br>delay(nervosite);<\/p><p>}<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Publication de l&rsquo;article original le 07 avril 2019 Apr\u00e8s des heures heureuses mais br\u00e8ves de code, voici un tout premier jet op\u00e9rationnel pour piloter une assistance \u00e9lectrique. J\u2019avais d\u00e9j\u00e0 essay\u00e9 de me mettre \u00e0 la t\u00e2che, mais avec des ambitions d\u00e9mesur\u00e9es. Il fallait que tout soit bien et beau, donc j\u2019avais m\u00eame pour projet d\u2019y &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.atout-cycle.fr\/?p=59\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Code pour VAE pilot\u00e9 par Arduino&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[13,11],"tags":[],"_links":{"self":[{"href":"http:\/\/www.atout-cycle.fr\/index.php?rest_route=\/wp\/v2\/posts\/59"}],"collection":[{"href":"http:\/\/www.atout-cycle.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.atout-cycle.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.atout-cycle.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.atout-cycle.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=59"}],"version-history":[{"count":2,"href":"http:\/\/www.atout-cycle.fr\/index.php?rest_route=\/wp\/v2\/posts\/59\/revisions"}],"predecessor-version":[{"id":116,"href":"http:\/\/www.atout-cycle.fr\/index.php?rest_route=\/wp\/v2\/posts\/59\/revisions\/116"}],"wp:attachment":[{"href":"http:\/\/www.atout-cycle.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=59"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.atout-cycle.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=59"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.atout-cycle.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=59"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}