/* * vitvitAnnexe 3 (Electronique de commande) Accoudoir pivotant V04 pour MY HUMAN KIT * Remarque : Pour éviter tout incident de fonctionnement en cas de rupture d'un fil, les entrée des boutons poussoirs sont par défaut à 5 volts au repos et la déconnexion d'un fil ne provoquera pas la mise en route du moteur. De la même façon, les entrées de détection de fin de course sont à 5 volts au repos et la déconnexion d'un fil est alors assimilée à une détection de fin de course qui empêchera la mise en route du moteur dans cette direction. Lorsque l'on appuie sur les deux boutons en même temps, rien ne se passe. Le switch de fermeture automatique à la mise sous tension du système ainsi que le potentiomètre de réglage de la vitesse de rotation de l'accoudoir sont à régler en fonction des souhaits de l'utilisateur. Programme à téléverser sur l'Arduino /* Pilotage du bras rotatif (compilé et testé sous Arduino 1.8,1) ylc 05/02/2018 pour Seb L. chez MHK Fonctionnalités : A la mise sous tension : (en option) remise en position fermée de l'accoudoir s'il est ouvert. Le programme recoit une commande d'ouverture ou de fermeture. Celles-ci est activée si la fin de course correspondante n'est pas détectée. L'ouverture ou la fermeture se poursuit tant que l'ordre est maintenu ou jusqu'à fin de course. La vitesse d'ouverture ou fermeture est ajustable par potentiomètre. * * Les MicroSteps sont mis en position par defaut à HIGH (5V). La possibilité de déactiver les moteurs par l'entrée Enable n'est pa utilisé, elle est mise à LOW(0); * Dir Moteur (DIR) =>D2 Step Moteur (STEP) =>D3 Int Activation Fermeture(AFD) =>D5 BP Fermeture (Int F) =>D6 BP Ouverture (Int O) =>D7 Fin Course Fermeture (Fc F) =>D8 Fin Course Fermeture (Fc O) =>D9 MicroStep Mode(MS2) =>D10 ; full step (0,0), half step (1,0), 1/4 step (0,1), MicroStep Mode(MS1) =>D11 ; and 1/8 step (1,1 : default) Enable (EN) =>D12 ; Low = Out Enable ; HIGH = Out Disable Pot Vitesse (CTRL V) =>A5 */ #include //Moteur // Pin 3 = Commande Pas moteur // Pin 2 = Commande Sens moteur AccelStepper nema17(AccelStepper::DRIVER, 3, 2); const int vitmax = 8000; // vitesse moteur maxi const int vitmin = 200; // vitesse moteur mini const int vitauto = 500; // vitesse moteur lors de la fermeture automatique initiale //Switch Activation fermeture auto const int p_auto = 5; // pin activation de fermeture automatique // Bouton de commande const int com_fer = 6; // pin de reception commande de fermeture const int com_ouv = 7; // pin de reception commande d-ouverture //Fin de course const int lim_fer = 8; // pin de reception contact limite de fermeture const int lim_ouv = 9; // pin de reception contact limite d-ouverture // Ajout CF const int MS2 = 10; const int MS1 = 11; const int EN = 12; //Potentiometre controle de vitesse const int p_pot = A5; // pin potentiomètre réglage vitesse moteur //Variable de temps unsigned long oldmilli = 0; // stockage temps de la mesure précédente unsigned long milli = 0; // stockage du temps présent const unsigned long delai = 1000; // intervalle des lectures du potentiomètre (1 sec) // Affectation des variables int pot = 0; // valeur actuelle du potentiomètre int oldpot = 0; // valeur précédente du potentiomètre static float vit = 0.0; // vitesse du moteur (pas/sec) static int dir = 0; // sens de rotation moteur (-1=arrière, 0=arrêt, 1=avant) static float rota = 0.0; // valeur positive ou négative de rotation moteur //-------------------------------------- void setup() { // Ajout CF pinMode(MS1,OUTPUT); pinMode(MS2,OUTPUT); pinMode(EN,OUTPUT); digitalWrite(MS1,HIGH); digitalWrite(MS2,HIGH); digitalWrite(EN,LOW); nema17.setMaxSpeed(8000); nema17.setAcceleration(500); Serial.println("Accoudoir pivotant v 1.41"); // les entrées des commandes de mouvement sont à 5v au repos (pulldown interne). // Une action sur le bouton met l'entrée a 0v; Entrée à GND (0v). pinMode(com_ouv,INPUT_PULLUP); pinMode(com_fer,INPUT_PULLUP); // les entrées des switchs de fin de course sont à 0v au repos. Entrée à GND (0v). // una action sur le fin de course ouvre le circuit et met l'entrée à 1;(pullup interne). pinMode(lim_fer,INPUT_PULLUP); pinMode(lim_ouv,INPUT_PULLUP); // l'entrée d'activation de fermeture auto est à 5v si non activée (pullup interne) pinMode(p_auto,INPUT_PULLUP); // mise sous tension : si demandé, on met l'accoudoir en position fermée si ouvert if (digitalRead(p_auto) == false) { // si fermeture auto activée... vit = vitauto; // on met la vitesse de fermeture auto if (digitalRead(lim_fer) == false) { // si pas déjà en position fermée dir = -1; // sens de rotation moteur sens_moteur(); do { nema17.runSpeed(); } // on ferme l'accoudoir while (digitalRead(lim_fer) == 0); // jusqu'à contact de fin de course } } } //-------------------------------------- void loop() { // pour ne pas ralentir la boucle, on lit le potentiomètre une fois par (valeur du delai) milli = millis(); // récup du temps présent if (milli - oldmilli > delai) { // si lect.précédente remonte a plus longtemps que délai choisi... lect_potar(); } // test si demande de mouvement if (digitalRead(com_ouv) == false && digitalRead(com_fer) == false){ // on ne fait rien car on a appuyé sur les deux boutons dir = 0; // pas de commande reçue } else { if (digitalRead(com_ouv) == false) { // on vient de mettre a la masse l'entrée dir = 1; // commande d'ouverture reçue sens_moteur(); action(); } else if (digitalRead(com_fer) == false) { // on vient de mettre a la masse l'entrée dir = -1; // commande de fermeture reçue sens_moteur(); action(); } else { dir = 0; // pas de commande reçue } } } //-------------------------------------- void sens_moteur() { rota = vit * dir; nema17.setSpeed(rota); // initialise le sens de rotation du moteur } //-------------------------------------- void lect_potar() { pot = analogRead(p_pot); // ...lecture valeur potentiomètre // J'ai ajouté le chiffre 10 car sinon le fait que l'on mutliplie par ~8 les valeurs reçues // provoque un passage quasi permanent. cela est du que la valeur lu n'est jamais fixe (+/-1); // En ajoutant une zone morte de +/- 10 on règle le problème. // on peur réduire la valeur if (pot oldpot+5) { // on ne calcule la vitesse que si changement de valeur vit = map(pot, 0, 1023, vitmin, vitmax); // ajuste la vitesse entre valeurs mini et maxi choisies oldpot = pot; // stockage valeur potentiomètre } } //-------------------------------------- void action() { // rotation moteur // Si le bras n'est pas en butée gauche ou droite // false ; le fin de course n'est pas appuyé, l'entrée est à GND (0) // true ; le fin de course est appuyé, l'entrée est a 5V, resitance pull-up interne if ((dir == 1 && digitalRead(lim_ouv) == false) // selon sens demandé... || (dir == -1 && digitalRead(lim_fer) == false)) { // ... action si contact fin de course corresp. non détecté nema17.runSpeed(); // actionne le moteur } } /**************************************************************************/