- Rémi,
Bonjour à tous! Une nouvelle fois je fais appel à vous pour me tirer d'affaire sur mon projet Alors voilà, on va y aller étape par étape:
-
le besoin : j'ai un coffre fort, la clé, l'autorisation de l'ouvrir (ben oui quand même), mais pas la combinaison. La serrure est une fichet bauche, soit trois cylindres de 20 chiffres chacuns (36° par clic). Donc 20x20x20 -> 8000 possibilités, autant dire que je cherche à automatiser la tâche… en plus c'est un bon challenge
-
le matériel : j'ai opté pour trois moteurs pas à pas NEMA, un par cylindre de combinaison. Un arduino Uno et deux shields de adafruit pour gérer les moteurs. Plus accessoirement un servomoteur pour tester la clé, après le servomoteur n'est pas indispensable)
-
la situation : après avoir un peu galéré à brancher mes moteurs… j'ai à peu près trouvé le moyen de sortir toutes mes combinaisons :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> #include <string.h> int i=0 , j=0 , h=0; main() { for (i=0; i<220; i+=20) { for (j=0; j<220; j+=20) { for (h=0; h<220; h+=20) {printf("%d %d %d \n", i, j, h); }}} } |
20 par 20 parceque mes pas sont de 1.8° donc pour arriver à faire un clic à chaque fois, et vous vous en doutez, à la place de printf, ben je voudrais dire "moteur1/2/3".
- Le problème : C'est la que le bât blesse… Je n'arrive pas à faire faire ce que je veux à mes moteurs. j'arrive bien à les faire tourner en utilisant la librairie d'exemples je peux bidouiller un peu pour qu'ils fassent plus ou moins de tours, plus ou moins vite, mais impossible d'utiliser ma formule, ni de leur imposer de faire x pas, un délais puis de nouveau x pas. Rien ne se passe
Voilà, j'en suis là, moins quelques cheveux, je vous joins le code que j'ai et qui ne marche pas, des suggestions?
Je vous mets le code que j'ai mis, vous constaterez que c'est plus ou moins l'exemple Accel_MultiStepper de la librairie remis à ma sauce.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | // Shows how to run three Steppers at once with varying speeds // // Requires the Adafruit_Motorshield v2 library // https://github.com/adafruit/Adafruit_Motor_Shield_V2_Library // And AccelStepper with AFMotor support // https://github.com/adafruit/AccelStepper // This tutorial is for Adafruit Motorshield v2 only! // Will not work with v1 shields #include <AccelStepper.h> #include <Wire.h> #include <Adafruit_MotorShield.h> #include "utility/Adafruit_PWMServoDriver.h" #include <stdio.h> #include <string.h> Adafruit_MotorShield AFMSbot(0x61); // Rightmost jumper closed Adafruit_MotorShield AFMStop(0x60); // Default address, no jumpers // Connect two steppers with 200 steps per revolution (1.8 degree) // to the top shield Adafruit_StepperMotor *myStepper1 = AFMStop.getStepper(200, 1); Adafruit_StepperMotor *myStepper2 = AFMStop.getStepper(200, 2); // Connect one stepper with 200 steps per revolution (1.8 degree) // to the bottom shield Adafruit_StepperMotor *myStepper3 = AFMSbot.getStepper(200, 1); // you can change these to DOUBLE or INTERLEAVE or MICROSTEP! // wrappers for the first motor! void forwardstep1() { myStepper1->onestep(FORWARD, SINGLE); } void backwardstep1() { myStepper1->onestep(BACKWARD, SINGLE); } // wrappers for the second motor! void forwardstep2() { myStepper2->onestep(FORWARD, DOUBLE); } void backwardstep2() { myStepper2->onestep(BACKWARD, DOUBLE); } // wrappers for the third motor! void forwardstep3() { myStepper3->onestep(FORWARD, INTERLEAVE); } void backwardstep3() { myStepper3->onestep(BACKWARD, INTERLEAVE); } // Now we'll wrap the 3 steppers in an AccelStepper object AccelStepper stepper1(forwardstep1, backwardstep1); AccelStepper stepper2(forwardstep2, backwardstep2); AccelStepper stepper3(forwardstep3, backwardstep3); void setup() { AFMSbot.begin(); // Start the bottom shield AFMStop.begin(); // Start the top shield stepper1.setMaxSpeed(100.0); stepper1.setAcceleration(1000.0); stepper2.setMaxSpeed(100.0); stepper2.setAcceleration(1000.0); stepper3.setMaxSpeed(100.0); stepper3.setAcceleration(1000.0); int i=0 , j=0 , h=0; for (i=0; i<220; i+=20) { for (j=0; j<220; j+=20) { for (h=0; h<220; h+=20) { stepper1.move(i); stepper2.move(j); stepper3.move(h); delay(100); }}} } void loop() { } |