{ Autres sujets du projet :
[Résolu] Mosfet/circuit ne marche pas bien
Chargeur de batterie plomb }
Bonjour, pour un projet de scooter électrique sur base de vélo, j'utilise un arduino. Il y a a deux message car limite de caractères.
L'arduino sert à gérer le moteur, les clignotants et l'affichage du pourcentage de la batteries, de l distance du trajet et de la vitesse instantanée.
1- Partie moteur
2- Partie clignotants
3- Partie batterie
4- Partie compteur de vitesse
Je vais parler uniquement du "circuit de commande" car le reste ne concerne que de la puissance et donc, étant assez simple, je suis sûr du circuit. Les schemas et photos sont en lien pdf
Mon problème de programmation est de mettre tous les codes ensembles pour n'en faire qu'un seul car cela ralentit tous le programme. Mes codes en "solo" fonctionnent très bien mais quand j'essaye de les réunir, tout le programme est ralenti et donc la mesure de vitesse ne se pase plus correctement. Je pense que c'est parce qu'il y a beaucoup de conditions ( if / else if ).
1- Partie moteur :
/* PWM pour moteur à courant continu avec réglage de la souplesse de conduite (2 potentiomètres).
* On utilise un mosfet n sur le PWM 3 pour commander le moteur
* Ainsi qu'une poignée accélératrice dont les valeurs min sont 170 et max 870 pour la puissance, et un potentiometre normal pour régler la souplesse de conduite.
Version 1.4, Incroyables Expériences
*/
void setup() // Boucle d'initialisation.
{
pinMode(3, OUTPUT); // Broche 3 réglée comme sortie numérique.
}
float r=0; // Initialisation du rapport cyclique réel à 0.
float s=30; // Initialisation de la souplesse de conduite.
int a=0; // Initialisation du rapport cyclique demandé à 0.
int b=0; // Initialisation de la mémoire du rapport cyclique demandé.
int c=70; // Initialisation du seuil de sécurité (plus il est élevé, moins la sécurité est efficace).
void loop() { // Boucle principale
a = constrain(a, 170, 870); // Fixation des valeurs extrêmes de l'accélérateur. Cette instruction n’est pas nécessaire si les valeurs de l’accélérateur lues varient bien entre 0 et 1023.
analogWrite(3,r/1023*254); // Création du PWM.
a=analogRead(0); // Lecture du rapport cyclique demandé. (poignée accélératrice)
s=analogRead(1); // Lecture de la souplesse de conduite demandée. (potentiometre tableau de bord)
if(a>b+c){ // Vérification d'une accélération trop brutale (d'origine volontaire ou non).
digitalWrite(3,LOW); // Arrêt immédiat du moteur.
while(a>c){ // Attente d'un rapport cyclique très faible pour redémarrer.
a=analogRead(0); // Lecture continue du rapport cyclique demandé.
}
}
b=a; // Mémorisation du rapport cyclique demandé.
if(a>r){ // Vérification de la croissance du rapport cyclique demandé.
delay(20); // Délai responsable de la souplesse de conduite.
r=r+s/20+2; // Calibrage empirique de la souplesse de conduite.
}
if(a<r){ // Vérification de la décroissance du rapport cyclique demandé.
r=a; // Diminution immédiate du rapport cyclique réel le cas échéant.
}
}
2-Partie clignotants code
* - 1 interrupteur 3 positions ET UN AUTRE 2 POSITIONS
* - 1 arduino
* - des fils
*
*bien cabler les leds dans l'ordre sinon ce ne sera plus un chenillard : schema clignotant visuel ci dessous
*
* pin13 pin12 pin11 pin10 pin6 pin7 pin8 pin9
* 0 0 0 0 0 0 0 0
* Led4G Led3G Led2G Led1G Led1D Led2D Led3D Led4D
*
* pour plus de confort, rajout de leds entre sorties des interrupteurs pour faire leds temoins
*/
//définie les pins de déclenchement des clignotants et d'arrêt de ceux-ci
int clignotantgauche = 0;
int clignotantdroit = 1;
int warning = 2;
//définie toutes les pins pour clignotants
int Led1D = 6;
int Led2D = 7;
int Led3D = 8;
int Led4D = 9;
int Led1G = 10;
int Led2G = 11;
int Led3G = 12;
int Led4G = 13;
void setup() {
//définie les pins de déclenchement comme entrées = INPUT
pinMode(clignotantgauche, INPUT_PULLUP);
pinMode(clignotantdroit, INPUT_PULLUP);
pinMode(warning, INPUT_PULLUP);
//Définie les pins clignotants comme sortie = OUTPUT
pinMode(Led1D,OUTPUT);
pinMode(Led2D,OUTPUT);
pinMode(Led3D,OUTPUT);
pinMode(Led4D,OUTPUT);
pinMode(Led1G,OUTPUT);
pinMode(Led2G,OUTPUT);
pinMode(Led3G,OUTPUT);
pinMode(Led4G,OUTPUT);
}
void loop() {
while(digitalRead(clignotantgauche) == 1){ // si on active le clignotant gauche chenillard vers la gauche
digitalWrite(Led1G, HIGH);
delay(100);
digitalWrite(Led2G, HIGH);
delay(100);
digitalWrite(Led3G, HIGH);
delay(100);
digitalWrite(Led4G, HIGH);
delay(100);
digitalWrite(Led1G, LOW);
delay(100);
digitalWrite(Led2G, LOW);
delay(100);
digitalWrite(Led3G, LOW);
delay(100);
digitalWrite(Led4G, LOW);
delay(100);
}
while(digitalRead(clignotantdroit) == 1){ //si l'on active le clignotant droit chenillard vers la droite
digitalWrite(Led1D, HIGH);
delay(100);
digitalWrite(Led2D, HIGH);
delay(100);
digitalWrite(Led3D, HIGH);
delay(100);
digitalWrite(Led4D, HIGH);
delay(100);
digitalWrite(Led1D, LOW);
delay(100);
digitalWrite(Led2D, LOW);
delay(100);
digitalWrite(Led3D, LOW);
delay(100);
digitalWrite(Led4D, LOW);
delay(100);
}
//partie warning
while(digitalRead(warning) == 1){ //si l'on active le second switch les deux chenillard s'allument en meme temps
digitalWrite(Led1D, HIGH);
digitalWrite(Led1G, HIGH);
delay(100);
digitalWrite(Led2D, HIGH);
digitalWrite(Led2G, HIGH);
delay(100);
digitalWrite(Led3D, HIGH);
digitalWrite(Led3G, HIGH);
delay(100);
digitalWrite(Led4D, HIGH);
digitalWrite(Led4G, HIGH);
delay(100);
digitalWrite(Led1D, LOW);
digitalWrite(Led1G, LOW);
delay(100);
digitalWrite(Led2D, LOW);
digitalWrite(Led2G, LOW);
delay(100);
digitalWrite(Led3D, LOW);
digitalWrite(Led3G, LOW);
delay(100);
digitalWrite(Led4D, LOW);
digitalWrite(Led4G, LOW);
delay(100);
}
}