<nowiki>'''2. Bibliographie :'''<br /><br />Lien download :<br /><br />'''sketch_escooter_feed_back_reel_V1.ino''' <br /><br />https://drive.google.com/file/d/0B_fB3GAsM02FSlRTWHdyRkhuUW8/view?usp=sharing<br /><br />'''escooter_ampli_SIMULINK.mdl'''<br /><br />https://drive.google.com/file/d/0B_fB3GAsM02FOW9OdmlhdDhJZGc/view?usp=sharing<br /><br />'''escooter feed back ISIS.DSN'''<br /><br />https://drive.google.com/file/d/0B_fB3GAsM02FOXdRWFN5OWRMQkE/view?usp=sharing<br /><br />En anglais<br /><br />https://forum.arduino.cc/index.php?topic=477397.0<br /><br />article : « Etude de trottinettes électriques 100W et 500W (Arduino), Revue 3EI 2017 »<br /><br />En attente<br /><br />'''3. Programme en boucle ouverte''' <br /><br />Pour tester la programmation, nous simulons le programme dans ISIS, comme on peut le voir sur la figure suivante. De plus, nous avons un afficheur LCD pour afficher des données (rapport cyclique correspondant à la PWM à 32Khz, le courant moteur, la tension moteur, l'action sur les boutons poussoirs. En effet, 4 boutons poussoirs sont utilisés.<br /><br />BP1 pour incrémenter manuellement le rapport cyclique, BP2 le décrémenter. BP3 mettre le rapport cyclique à 0, correspondant au contact frein. <br /><br />La vitesse du moteur est pratiquement proportionnelle au rapport cyclique<br /><br />https://i58.servimg.com/u/f58/17/56/35/17/a211.jpg<br /><br />Nous avons réalisé notre propre amplificateur de courant qui s'appelle un hacheur abaisseur mais il est possible d'acheter un shield<br /><br />Il existe de nombreuses cartes pour Arduino pour commander des moteurs DC surtout de faibles puissances et aussi de grandes puissances comme on peut l'observer sur les liens suivants. <br /><br />http://www.robotpower.com/products/MegaMotoPlus_info.html<br /><br />http://www.robotshop.com/en/dc-motor-driver-2-15a.html<br /><br />https://www.pololu.com/file/0J51/vnh3sp30.pdf<br /><br />https://i58.servimg.com/u/f58/17/56/35/17/a310.jpg<br /><br />mais, tous ces hacheurs shields mesurent le courant en interne mais il n'y a pas de limitation de courant. <br /><br />Pour avoir une limitation de courant il faut une boucle de courant analogique en utilisant des AOP ou CI spécialisée ou une boucle de courant numérique rapide.<br /><br />Mais quel doit être la valeur du courant de limitation ?<br /><br />Le choix de la valeur du courant est normalement pour le Service de fonctionnement 1 heure pour pouvoir effectuée des montées relativement longue sans atteindre la température critique du moteur.<br /><br />Dans notre cas, le courant de limitation devra etre de <br /><br />Imoteur limitation=Puissance/Ubatterie=500W/24 V=20A<br /><br />De plus, le transistor de puissance du hacheur ne peut supporter que 50A dans notre cas.<br /><br />Mais en boucle ouverte, il n'a pas de régulation de courant, pour ne pas avoir de dépassement du courant maximum, une rampe du rapport cyclique sera utilisé.<br /><br />Une routine d'interruption de 0.1 seconde sera utilisé pour faire la mesure de la tension est du courant (échantillon de mesure, sample ). Ce temps de sampler est arbitraire, mais ne permet pas d'être plus rapide que le temps de montée du courant car la constante de temps électrique du moteur étant de L/R= 1.5ms.<br /><br />Le fonctionnement en boucle ouverte avec une rampe de 25.5s (8bit et routine d'interruption de 0.1s) permet de bien comprendre la problématique du fonctionnement d'une commande à moteur DC.<br /><br />l'affichage se fera seulement tous les 0.2s pour avoir une stabilité des chiffres à l’écran. De plus, un filtrage numérique, se fera sur le courant et la tension sur 4 valeurs donc sur 0.4s.<br /><br />'''Algo boucle ouverte'''<br /><br />Routine d'interruption toutes les 0.1S<br /><br />Lire tension et courant<br /><br />Boucle loop (scrutation des boutons poussoirs) <br /><br />Si BP1=1 alors incrementer PWM<br /><br />Si BP2=1 alors décrementer PWM<br /><br />Si BP3=1 alors PWM=0<br /><br />Affichage des variables tous les 0.2s<br /><br />'''code'''<br /><br />{{<br /><br />// include the library code:<br /><br />#include <LiquidCrystal.h><br /><br />#include <SoftwareSerial.h><br /><br />#include <TimerOne.h><br /><br />#define SERIAL_PORT_LOG_ENABLE 1<br /><br />#define Led 13 // 13 pour la led jaune sur la carte<br /><br />#define BP1 30 // 30 BP1<br /><br />#define BP2 31 // 31 BP2 <br /><br />#define BP3 32 // 32 BP3<br /><br />#define LEDV 33 // 33 led<br /><br />#define LEDJ 34 // 34 led<br /><br />#define LEDR 35 // 35 led<br /><br />#define relay 36 // 36 relay<br /><br />#define PWM10 10 //11 timer2 <br /><br />LiquidCrystal lcd(27, 28, 25, 24, 23, 22); // RS=12, Enable=11, D4=5, D5=4, D6= 3, D7=2, BPpoussoir=26<br /><br />// Configuration des variables<br /><br />unsigned int UmoteurF = 0; // variable to store the value coming from the sensor<br /><br />unsigned int Umoteur = 0;<br /><br />unsigned int Umoteur2 = 0;<br /><br />unsigned int Umoteur3 = 0;<br /><br />unsigned int Umoteur4 = 0;<br /><br />unsigned int ImoteurF = 0; <br /><br />unsigned int Imoteur = 0;<br /><br />unsigned int Imoteur2 = 0;<br /><br />unsigned int Imoteur3 = 0;<br /><br />unsigned int Imoteur4 = 0;<br /><br />byte Rcy=0 ; //rapport cyclique 8bit<br /><br />unsigned int temps;<br /><br />// the setup function runs once when you press reset or power the board<br /><br />void setup() {<br /><br />pinMode(Led, OUTPUT); //led carte arduino<br /><br />pinMode(LEDV, OUTPUT);<br /><br />pinMode(LEDR, OUTPUT);<br /><br />pinMode(LEDJ, OUTPUT);<br /><br />pinMode (PWM10,OUTPUT); // broche (10) en sortie timer2<br /><br />// digitalWrite(LEDV,LOW);<br /><br />Timer1.initialize(100000); // initialize timer1, and set a 0,1 second period => 100 000<br /><br />Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt<br /><br />lcd.begin(20, 4); <br /><br />Serial1.begin(9600); <br /><br />TCCR2B = (TCCR2B & 0b11111000)</nowiki> , La routine d'interruption dure que 250 micro seconde, la boucle du programme principal qui scrute l'action de boutons poussoirs est de 13micros et le temps d'affichage de toutes les données est de 11ms. Donc, on peut améliorer la période d'échantillonnage donc la rapidité de la régulation du courant.
L'Arduino permet de faire l'instrumentation de la trottinette donc de connaitre la puissance, la consommation en A.h et W.h, de mesurer la vitesse, de connaitre la consommation en fonction des W.h/km, de mesurer la température du moteur et d'avoir une sécurité de fonctionnement.
Mais pour l'instant nous allons voir comment limiter le courant
'''4. Programme en boucle fermé, commande à courant limité'''
la période d’échantillonnage passera à 0.01 seconde (routine d'interruption)
si le courant est inférieur à la valeur désirée, alors la le rapport cyclique peut être augmenté ou diminué jusqu’à la valeur désirée qui est la consigne.
par contre si le courant moteur est supérieur à la valeur de limitation, il y a une diminution rapide du rapport cyclique.
pour ne pas avoir de dépassement de la valeur du rapport cyclique celui si sera saturé à 254 maximum et à la valeur minimum 6.
'''code'''
if (Imoteur<4000) // pas de limitation de courant à (20A*10)*20=4000
{if (consigne>Rcy) {Rcy=Rcy+1;} // rampe de de la Pwm +1*0.01seconde integrateur pur
if (consigne<Rcy && Rcy!=0) {Rcy=Rcy-1;} //la decrementation est faite seulement pour la poignée d'acceleration ou avec BP2
if ( Rcy>254) {Rcy=254;} //limitation du rapport cyclique
analogWrite(PWM10,Rcy); //frequence 32kHz timer2}
}
if (Imoteur>4000) { Rcy=Rcy-5; //pas de filtrage du courant, pour etre plus rapide
if ( Rcy<6) {Rcy=5;} //rcy n'est pas signé, ni la PWM donc Rcy minimun ne doit pas etre inferieur à 6
analogWrite(PWM10,Rcy); //frequence 32kHz timer2}
+, <nowiki>La mesure de la vitesse est effectuée avec un capteur effet hall SS495 ou A1324 qui permet de compter chaque tour de roue. Il suffit de rentrer la périmètre de la roue de la trottinette (130mm de rayon donc 0.816m dans le cas <br /><br />Pour avoir la vitesse, il suffit juste de diviser le nombre de tour de roue sur un temps arbitraire de 1s pour avoir une vitesse minimum de de 0.81m/s donc de 2.93 km/h. De plus, un filtrage moyen avec 3 valeurs sera utilisé pour afficher la vitesse. A 25km/h, il y aura 8.5 tours.<br /><br />Pour compter les tours, une routine d'interruptions extérieure sera utilisée sur l'entrée INT0 21 de la carte mega.<br /><br />http://www.locoduino.org/spip.php?article64<br /><br />Pour simuler la vitesse, un pulse sur l'entrée 21 sera utilisé avec un rapport cyclique de 10%.<br /><br />https://i58.servimg.com/u/f58/17/56/35/17/a018.jpg<br /><br />'''code'''<br /><br />void INT0b21() {<br /><br />Tspeed++; //interruption exterieure pour compter le nombre de tour<br /><br />}<br /><br />//dans le set up declarer la routine d'interruption lorsque le front 5V de la detection de l'aimant se fait<br /><br />attachInterrupt(digitalPinToInterrupt(21), INT0b21, RISING ); //interruption exterieur<br /><br />//dans loop<br /><br />if (temps09>=5) { //boucle de 1 seconde<br /><br />lcd.setCursor(13,2); // effacement de la vitesse<br /><br />lcd.print("kph ");<br /><br />lcd.setCursor(16,2); <br /><br />speed1=Tspeed*2937; //1tour*816*3.6/1s=2.937km/h<br /><br />speed2=speed1; //Tspeed (rate/seconde)<br /><br />speed3=speed2;<br /><br />speedF=(speed1+speed2+speed3)/3000; //pour mettre en kph<br /><br />lcd.print(speedF,1); //affichage au dixieme pres<br /><br />Tspeed=0; //reset compteur<br /><br />temps09=0; //reset time<br /><br />}<br /><br />Pour améliorer la précision de la mesure de la vitesse, il est possible que le temps échantillonnage de la mesure de la vitesse soit en fonction de la vitesse.<br /><br />exemple : <br /><br />pour les vitesses inferieures à 10km/h echantillon à 1seconde, mais au dessus de 10km/h echantillon à 2 secondes.<br /><br />11. Mesure distance pour connaitre l'autonomie <br /><br />La distance correspond au nombre de tour total de la roue multipliée par le périmètre de la roue.<br /><br />Donc il ne faut pas remettre à 0, le nombre de tour à chaque échantillon.<br /><br />Par contre, la remise à zéro de la distance sera effectuée lors l'appuie sur le reset de l'Arduino Mega.<br /><br />L'affichage de la distance s'effectuera au deuxième près.<br /><br />A 32km/h, il faudra 2 minutes pour faire 1km comme on peut l'observer sur la figure suivante :<br /><br />https://i58.servimg.com/u/f58/17/56/35/17/a019.jpg<br /><br />'''code'''<br /><br />void INT0b21() {<br /><br />Tspeed++; //interruption exterieure pour compter la vitesse<br /><br />nbrRate++;<br /><br />}<br /><br />lcd.setCursor(13,4); <br /><br />lcd.print("km "); //<br /><br />distance=(nbrRate*816)/1000; //distance m<br /><br />distance=distance/1000; //distance km<br /><br />lcd.setCursor(15,4); <br /><br />lcd.print(distance,1); <br /><br />on peut observer l'installation Electrique avec le hacheur, l'arduino, et l'afficheur lors de la mise au point du programme<br /><br />https://i58.servimg.com/u/f58/17/56/35/17/dsc_0613.jpg<br /><br />'''12. Synthèse''' <br /><br />L'espace RAM est utilisé que à 4% et l'espace ROM à 3%, pour un Arduino mega. Donc, on pourrait prendre un arduino un peu plus petit.<br /><br />Mais, il y a 8 cellules Lipo pour faire l'alimentation 24V pour alimenter le moteur via le hacheur. Par conséquent, la mesure de la tension de chaque élément sera sur l'Arduino avec un connecteur JST. Cette mesure permet de savoir si une cellule à une résistance interne qui commence à poser problème et pour savoir si l'équilibrage de chaque cellule a bien été effectué.<br /><br />Il est possible de passer à 36V avec 12 cellules aussi avec l'ardui mega sans utiliser de shield exterieur qui multiplexe 24 entrées analogiques sur l'entrée A0<br /><br />Il est possible d'envoyer toutes les données à un smarthphone via le bluetooth HC06 par les broches 20, 21, RX1 et TX1. Mais L'application sous android realisée sous JAVA Studio ne peut pas etre partagé sur ce forum. Cette partie ne sera pas explicitée.<br /><br />Apres avoir fait l'instrumentation de cette trotinnette, une etude devrait etre effectué sur la precision des mesures, il est possible de [http://www.fichier-pdf.fr/2015/09/07/instrumentation-vehicule-faible-consommation-eco-marathon/ lire]<br /><br />« Instrumentation d'un véhicule motorisé électrique faible consommation de type « éco marathon » Revue 3EI N°81, Juillet 2015<br /><br />http://www.fichier-pdf.fr/2015/09/07/instrumentation-vehicule-faible-consommation-eco-marathon/</nowiki> ,
…