Publication de l’article original le 0
Après des heures heureuses mais brèves de code, voici un tout premier jet opérationnel pour piloter une assistance électrique.
J’avais déjà essayé de me mettre à la tâche, mais avec des ambitions démesurées. Il fallait que tout soit bien et beau, donc j’avais même pour projet d’y intégrer directement un affichage LCD, pour voir la vitesse, le niveau des batteries, etc. Avec l’expérience, on apprend que trop vouloir, c’est aussi la voie royale vers la frustration et le découragement. Donc d’autres fonctionnalités viendront sûrement, mais petit à petit, chaque chose en son temps.
Comment utiliser le code :
- A télécharger sur une carte arduino ou un microcontrôleur capable de l’interpréter (AtMega328 par exemple ?) Si vous débutez, le pus simple est de passer par Arduino.
- La carte arduino est à brancher au levier de frein, au détecteur de pédalage, et à un potentiomètre que vous fixerez sur votre guidon dans l’idéal. S’assurer que le levier de frein pour VAE que vous avez fonctionne dans le sens du code (frein activé = pas de courant, tension nulle vers l’arduino ; sinon inversez cela dans le code)La sécurité avant tout
- installer un driver de moteur BLDC, entre Arduino, la batterie et le moteur. Veiller à ce qu’il soit pourvu d’un radiateur suffisant pour éviter de le griller
- trouver une façon d’alimenter votre Arduino et ce contrôleur de BLDC (ce derneir s’alimente aussi en 5V en général, ne pas confondre avec l’entrée de puissance à 24- 36-48 V !) On peut envisager un régulateur de tension partant de la batterie alimentant les deux, il faudrait en voir le rendement.
- vérifier tout les branchements : senseurs hall, câbles de bobine moteur, alimentations, PAS, freins, potentiomètre, plus un fil de signal PWM d’arduino vers le driver BLDC. Si ledit driver ne sait interpréter que des commandes en tension, comme c’est souvent le cas, recourir à un filtre passe bas et éventuellement un amplificateur opérationnel le redressant.
- S’assurer que sur votre selle vous avez facilement accès au contact de la batterie avant de tester. Le code ne vous fera pas faux bond, mais on ne sait jamais ce qu’un mauvais branchement peut engendrer.
Ce que ce code fait :
Le plus simple pour le savoir est de lire le code. Même si vous n’y connaissez rien, ce sera aussi l’occasion de voir que coder en Arduino est plus facile que le mandarin. Mais je laisse au paresseux ici un résumé :
- Le code « écoute » ce que vous êtes en train de faire : pédaler (dans le bon sens), freiner ; il regarde aussi systématiquement le niveau d’assistance que vous demandez selon la rotation du potentiomètre sur votre guidon.
- Tant que vous pédalez ET ne freinez pas, il indique au contrôleur de moteur de tourner. Si vous freinez OU ne pédalez pas, il lui dit de s’arrêter.
- Il assure une certaine progressivité à l’accélération ou au freinage, jusqu’à arriver au un niveau d’assistance requis (celui indiqué par le potentiomètre, ou 0). Ce degré de progressivité peut être changé en modifiant les variables adéquates dans le code.
Ce que le code ne fait pas encore :
- Il ne regarde pas la vitesse atteinte, et continue donc de faire tourner le moteur au delà des 25km/h réglemtaires. En l’état, il n’est pas utilisable sur la voie publique. Il va sans dire qu’il vous indique encore moins la vitesse atteinte.
- Il n’arrête pas le moteur si votre driver BLDC ne s’arrête pas malgré une tension de signal très faible. C’est donc un inconvénient bénin avec certains drivers, de le voir continuer à tourner au ralenti.
- Il ne mesure pas le niveau de la batterie et ne vous l’indique pas
- Il ne sert pas le café au lit avec des pains au chocolat.
- Il n’installe pas de virus tenaces sur les SUV alentours pour les transformer en briques.
Les améliorations à venir :
- Prioritaire : La coupure totale et réglementaire du moteur et notamment au delà de 25km/h. Cela signifie qu’il faudra étoffer le code pour lui faire lire les signaux de tours par minute du driver. Aussi simple que ça puisse paraître, cela n’a rien de simple de faire écouter une variable tout en demeurant attentif aux autres. La coupure totale requiert aussi de contrôler l’alimentation du pilote, avec transistor ou opto-coupleur, normalement c’est simple
- quitte à introduire ces modifications, il serait utile d’en faire bénéficier le cycliste en les affichant. Un écran LCD requiert cependant beaucoup de broches et de codes, à étudier donc sans urgence
- 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’afficher de façon élémentaire avec des DEL, sans LCD.
Le code :
/*
Pilotage basique d’assistance électrique pour vélo.
A associer à une carte de contrôle de moteur BLDC.
Mettre entre les deux un filtre passe bas Si ce driver BLDC ne lit pas les PWM :
Le filtre doit convertir le signal PWM en signal en tension correspondant à l’amplitude lue par votre contrôleurAssurez vous d’avoir un signal de frein concordant : tension basse quand on tire sur un des leviers de freins, et non l’inverse !
circuit:
– potentiomètre alimenté en +5V, Gnd et analog input pin 0 (A0)
– 10 Kohm resistor connected from ground to analog in pin 0 ??? A voir si nécessaire
– PAS (détecteur de pédalage) connecté : 5V, Gnd et sa sortie en 8
– freins : vers broche 9
– sortie PWM vers broche 10Créé par Tristan Cousin le 7 avril 2019
Ce code est dans le domaine public.
*/
// These constants won’t change:
const int assistance = A0; // entrée potar niveau d’assistance
const int PAS = 8;
const int frein = 9; // broche du frein
const int sortiedriver; // broche d’émission du signal PWM (ensuite filtré passe bas pour un pilotage en tension// These variables will change:
int pedalage; // état du pédalage (1 ou 0)
int freinage; // état du frein (1 ou 0)
int nivassist; // niveau effectif d’assistance
int cibleassist; // objectif vers lequel faire tendre l’assistance,
// tranquilement pour un pilotage moins nerveux
int nervosite = 5; // temps en milliseconde d’un cran d’ajustement du niveau d’assistance
// (à hauteur d’un 256ème de l’assistance max) vers le niveau ciblé
int nervfreinage = nervosite/2; // la vitesse de freinage est arbitrairement définie comme
// la le double de la « nervosite » à l’accélération.
void setup() {
// set the pins as output or inputs:
pinMode(sortiedriver, OUTPUT);
pinMode(frein, INPUT);
pinMode(PAS, INPUT);
}void loop() {
// tant que les conditions sont réunies, arduino demande au pilote du moteur d’activer le moteur:
while ((digitalRead(PAS) == HIGH)&&(digitalRead(frein) == LOW))
{
fonctionassistance();
}
//le frein est activé ou le pédalier s’arrête, les conditions en sont plus réunies
cibleassist = 0;
if(nivassist>cibleassist){
int nivassist = nivassist-1;
analogWrite(sortiedriver,nivassist);
delay(nervfreinage);
};
}void fonctionassistance() {
// faire tourner le moteur en amenant la commande de vitesse de façon progressive vers ce que demande le potar :
int cibleassist = (analogRead(assistance)/4);//l’entrée analogique va de 0 à 1023, la sortie d//s’il faut augmenter la vitesse
if(nivassist<cibleassist){
int nivassist = (nivassist+1);
}
//s’il faut augmenter la vitesse
if(nivassist>cibleassist){
int nivassist = (nivassist-1);
}
//changer d’un cran la commande de vitesse, temporiser un peu
analogWrite(sortiedriver,nivassist);
delay(nervosite);}