Ce fauteuil roulant a un moteur droit et gauche et se pilote comme un robot ou un char.
Par contre, il faut des accélérations et des décélérations faibles, avec des limitations de vitesses en fonction de l’handicap.
Les accélérations et les décélérations peuvent être gérer comme le sujet de la trottinette de puissance 500W
https://forum.arduino.cc/index.php?topic=473015.0
Les hacheurs abaisseurs qui commandent les moteurs ne permettent pas d’avoir une marche arrière, ni un freinage électrique. Par contre, il sera possible d’avoir une marche arrière avec des relais.
Il n’y a pas besoin de faire un asservissement de vitesse des moteurs, car il n’y a pas beaucoup de différence de vitesse entre les 2 moteurs donc c’est le pilotage du joystick qui fera cette correction.
Dans un premier temps, nous allons présenter quelques programmes simples qui permettent de gérer le joystick et les 2 moteurs.
Voici, le fauteuil roulant et le schéma ISIS qui permet de simuler l’afficheur LCD, le joystick et les 3 moteurs. Evidemment, le schéma électrique avec la commande des moteurs est bien différent.
La simulation permet de minimiser les erreurs de programmations.
On peut télécharger le fichier ISIS ici
nano fauteuil roulant.DSN - Google Drive
Il y a plusieurs façons de gerer le joystick et commander les moteurs:
- un joystick précis et une manipulation fine de celui-ci permet de faire un commande linaire.
- un joystick qui est manipulé assez brusquement donc en tout ou rien.
- un joystick qui est manipulé moins brusquement donc utilise une matrice avec une plus ou moins grande précision.
Les PWMs des broches 11 et 3 seront utilisés utilisant le timer2, pour avoir une frequence de hachage de 32kHz qui permet de minimiser l’ondulation du courant dans les moteurs DC de 300W.
Le bon compromis est entre 20khz et 32 khz donc 64kHz c’est trop important, 8khz c’est trop faible.
Le timer1 sera utilisé pour faire une routine d’interruption pour faire des mesures tous les 0.01s et un affichage tous les 0.1s pour débuguer le programme.
https://playground.arduino.cc/Main/TimerPWMCheatsheet
Voici la façon linéaire de gérer le joystick à partir d’un Arduino nano
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <TimerOne.h>
LiquidCrystal lcd(2, 8, 4, 5, 6, 7); // LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#define motorD 3 // timer2
#define motorG 11 // timer2
#define y_axis A0 // mesure du joystick en x
#define x_axis A1 // mesure du joystick en y
#define Led13 13
int x_hiz=0;
int y_hiz=0;
int PWMD=0;
int PWMG=0;
byte temps=0;
int xprecedent;
int yprecedent;
int increD;
int increG;
void setup() {
Serial.begin(9600);
Timer1.initialize(10000); // initialize timer1, and set a 0,1 second period => 100 000 pour 0.01s 10 000
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
lcd.begin(20, 4); //modifier pour un afficheur 20x4
TCCR2B = (TCCR2B & 0b11111000) | 0x01; //pin 10 32khz http://playground.arduino.cc/Main/TimerPWMCheatsheet
pinMode(motorD,OUTPUT);
pinMode(motorG,OUTPUT);
pinMode(Led13,OUTPUT);
}
// Interruptions tous les 0.01s fait par le timer1
void callback() {
temps++;
//clignotement de la led 13 à 50Hz=2/0.01s
digitalWrite(Led13, !digitalRead(Led13));
//Bouton joystik est à (512,512) au milieu lorsqu'il n'est pas acivé,
//il n'y a pas de marche arriere car les reducteurs freines assez rapidement le fauteuil
// mesure de joystick
x_hiz= analogRead(x_axis);
if (x_hiz<=512) {x_hiz=513;} //petite zone morte entre 512 et 520 de la commande moteur
x_hiz= map(x_hiz,512,1023,0,255); //converti le 10 bit du CAN en 8bit du PWM
if (x_hiz>PWMD) {increD=1;}
else {increD=-5;} //decrementation plus rapide que l'incremetation
y_hiz= analogRead(y_axis);
if (y_hiz<=512) {y_hiz=513;}
y_hiz= map(y_hiz,512,1023,0,255);
//limitation de la valeur PWM
if ((increD==1) && (PWMD<40)) {PWMD=40;} //à cause du couple de charge ce n'est pas la peine d'avoir PWM<40 car le moteur ne bougera pas tant que le couple moteur n'est pas superieur à celui de la charge
if ((PWMD<254) && (increD==1)) {PWMD=PWMD+increD;} //limitation de la PWM
if ((PWMD>5) && (increD==-5)) {PWMD=PWMD+increD;}
//il faudrait faire l'acceleration et decleration sur la PWMG
PWMG=y_hiz;
analogWrite(motorD, PWMD); //PWM pin 3 comandé par x
analogWrite(motorG, PWMG); //PWM pin 11 comandé par y
} //fin routine
void loop() {
//affiche tous les 0.1s mais mesure tous les O.O1s
if (temps>=10) {
temps=0;
lcd.setCursor(0,0);
lcd.print("JOY");
lcd.setCursor(5,0);
lcd.print("PWM");
lcd.setCursor(11,0);
lcd.print("inc");
lcd.setCursor(0,1);
lcd.print("x");
lcd.print(x_hiz);
lcd.print(" ");
lcd.setCursor(5,1);
lcd.print(PWMD);
lcd.print(" ");
lcd.setCursor(11,1);
lcd.print(increD);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("y");
lcd.print(y_hiz);
lcd.print(" ");
lcd.setCursor(5,2);
lcd.print(PWMG);
lcd.print(" ");
} //fin if (temps>10
}//fin loop
Le problème est qu’il faut faire une calibration du joystick car le point central du joystick correspond rarement à 512.
Donc, voici la façon tout ou rien de gérer le joystick.
Il n’y a pas besoin de faire de calibration du joystick et cette gestion est plus sécuritaire par rapport à la gestion précédente.
void callback() {
temps++;
//clignotement de la led 13 à 50Hz=2/0.01s
digitalWrite(Led13, !digitalRead(Led13));
//Bouton joystik est à (512,512) au milieu lorsqu'il n'est pas acivé,
//il n'y a pas de marche arriere car les reducteurs freines assez rapidement le fauteuil
// mesure de joystick
x_hiz= analogRead(x_axis); //lecture du joystick
y_hiz= analogRead(y_axis);
//gestion du joystick tout ou rien
if (x_hiz>900) {increD=1;} else {increD=-5;} //decrementation plus rapide que l'incremetation
if (y_hiz>900) {increG=1;} else {increG=-5;} //
//limitation de la valeur PWMD
if ((increD==1) && (PWMD<40)) {PWMD=40;} //à cause du couple de charge ce n'est pas la peine d'avoir PWM<40
if ((increD==-5) && (PWMD<40)) {PWMD=0;} //car le moteur ne bougera pas tant que le couple moteur n'est pas superieur à celui de la charge
if ((PWMD<254) && (increD==1)) {PWMD=PWMD+increD;} //limitation de la PWM
if ((PWMD>5) && (increD==-5)) {PWMD=PWMD+increD;}
// limitation de la valeur PWMG
if ((increG==1) && (PWMG<40)) {PWMG=40;}
if ((increG==-5) && (PWMG<40)) {PWMG=0;}
if ((PWMG<254) && (increG==1)) {PWMG=PWMG+increG;}
if ((PWMG>5) && (increG==-5)) {PWMG=PWMG+increG;}
analogWrite(motorD, PWMD); //PWM pin 3 comandé par x
analogWrite(motorG, PWMG); //PWM pin 11 comandé par y
} //fin routine
voici la simulation avec la commande tout ou rien, ou il faut que la valeur de la conversion numerique analogique des voies x et Y soit supérieures à 900 pour que la PWM s'incremente.
Nous sommes en train de finir l’écriture de la présentation du matériel, des convertisseurs moteurs et de la gestion de la batterie qui est effectué par un BMS Bluetooth et affichage par smartphone. De même, comment est gérer les relais pour la marche arrière et la protection des moteurs et la limitation de courant dans les moteurs comme pour la trottinette.
les 2 programmes precedents en fichier attaché
dcmotor_joystick.ino (2.87 KB)