Ainboa Posté(e) Avril 2, 2017 Partager Posté(e) Avril 2, 2017 Bonjour,pour ma futur salle dédiée au cinéma je me suis mis dans l'idée de fabriquer un distributeur de bonbon à choix multiple, le soucis c'est que quand on insert la pièce dans le monnayeur rien ne se passe ensuite, alors que je devrais pouvoir appuyer sur un bouton poussoir qui fait tourner un servo moteur à rotation continu, je vous mets le code que j'utilise ainsi qu'un schéma de mon câblage, une photo du distributeur et le matériel utilisé.Le matériel est :- Une redboard de chez sparkfun- 4 bouton poussoir- 4 servo moteur à rotation continu - un monnayeur 1€ Cebek c-5251 #include <Servo.h> Servo myservo1; int myservo1_repos = 93; int myservo1_action = 70; Servo myservo2; int myservo2_repos = 92; int myservo2_action = 70; Servo myservo3; int myservo3_repos = 95; int myservo3_action = 70; Servo myservo4; int myservo4_repos = 95; int myservo4_action = 70; const int buttonPin1 = 2; int buttonState1 = LOW; const int buttonPin2 = 3; int buttonState2 = LOW; const int buttonPin3 = 4; int buttonState3 = LOW; const int buttonPin4 = 5; int buttonState4 = LOW; const int coinInsert = 13; void setup() { pinMode(buttonPin1, INPUT_PULLUP); digitalWrite (buttonPin1, HIGH); pinMode(buttonPin2, INPUT_PULLUP); digitalWrite (buttonPin2, HIGH); pinMode(buttonPin3, INPUT_PULLUP); digitalWrite (buttonPin3, HIGH); pinMode(buttonPin4, INPUT_PULLUP); digitalWrite (buttonPin4, HIGH); pinMode(coinInsert, INPUT_PULLUP); digitalWrite(coinInsert, HIGH); myservo1.attach(8); pinMode(8, OUTPUT); myservo1.write(myservo1_repos); myservo2.attach(9); pinMode(9, OUTPUT); myservo2.write(myservo2_repos); myservo3.attach(10); pinMode(10, OUTPUT); myservo3.write(myservo3_repos); myservo4.attach(11); pinMode(11, OUTPUT); myservo4.write(myservo4_repos); } void loop() //Servo1 { if (digitalRead(coinInsert)==LOW) { buttonState1 = digitalRead(buttonPin1); if (buttonState1 == LOW) { myservo1.write(myservo1_action); delay(4000); myservo1.write(myservo1_repos); } break; } } //Servo2 { while (digitalRead(coinInsert) == LOW) { buttonState2 = digitalRead(buttonPin2); if (buttonState2 == LOW) { myservo2.write(myservo2_action); delay(4000); myservo2.write(myservo2_repos); } break; } } //Servo3 { while (digitalRead(coinInsert) == LOW) { buttonState3 = digitalRead(buttonPin3); if (buttonState3 == LOW) { myservo3.write(myservo3_action); delay(4000); myservo3.write(myservo3_repos); } break; } } //Servo4 { while (digitalRead(coinInsert) == LOW) { buttonState4 = digitalRead(buttonPin4); if (buttonState4 == LOW) { myservo4.write(myservo4_action); delay(4000); myservo4.write(myservo4_repos); } break; } } } Lien vers le commentaire Partager sur d’autres sites More sharing options...
delirium07 Posté(e) Avril 2, 2017 Partager Posté(e) Avril 2, 2017 Tres sympa comme projet .. bravo !! Lien vers le commentaire Partager sur d’autres sites More sharing options...
johweb Posté(e) Avril 2, 2017 Partager Posté(e) Avril 2, 2017 Tu as fait ton code toi-même ? Ou tu l'as récupéré sur un site ? A la lecture (un peu rapide je te l'accorde), il me semble qu'il faille appuyer sur le poussoir pendant que la pièce passe... Ou bien l'état du monnayeur reste bas pendant un certain temps ? (je ne connais pas cette pièce) Enfin, je pense qu'il est possible de factoriser une partie de ce code pour avoir le même résultat pour quelques lignes en moins (et donc moins de sources d'erreur). Si le code n'est pas en cause, revérifier le montage et les éventuelles soudures... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Ainboa Posté(e) Avril 2, 2017 Auteur Partager Posté(e) Avril 2, 2017 Je l'ai récupérer sur un site. Et c'est vrai que d'après ce que je vois c'est exactement ce que tu as vu en lisant le code. Le monnayeur ne reste pas bas, quand la pièce passe sa ne dure qu'une fraction de seconde. Pour le montage et les soudures j'ai déjà tout reverifier Lien vers le commentaire Partager sur d’autres sites More sharing options...
johweb Posté(e) Avril 2, 2017 Partager Posté(e) Avril 2, 2017 En cherchant un peu d'infos sur le monnayeur, je suis tombé sur ton post sur le forum arduino. Je pense qu'ils te seront d'une plus grande aide que moi... Sinon, tu as le lien de ton site source, peut-être qu'on peut y glaner quelques infos ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Donovan-88 Posté(e) Avril 2, 2017 Partager Posté(e) Avril 2, 2017 Tu n'as pas de rebond dans le signal lors de l'appuis des boutons? Lien vers le commentaire Partager sur d’autres sites More sharing options...
symio Posté(e) Avril 3, 2017 Partager Posté(e) Avril 3, 2017 Je pense qu'il y a pas mal d'erreur d'écriture dans ce programme. Déjà ça me paraît très bizarre de mettre les sorties de servo en mode digital out alors qu'un servo se gère via pwm.. Sinon très intéressant comme montage. Envoyé de mon F5321 en utilisant Tapatalk Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nebraan Posté(e) Avril 4, 2017 Partager Posté(e) Avril 4, 2017 (modifié) je suis pas un expert mais pourquoi un servo pour une vis sans fin? il me semblait que les servos ne pouvaient pas faire plusieurs tours sur eux même. Edit: ok je viens de voir que c'était a rotation continue... Modifié (le) Avril 4, 2017 par Nebraan Lien vers le commentaire Partager sur d’autres sites More sharing options...
Ainboa Posté(e) Avril 4, 2017 Auteur Partager Posté(e) Avril 4, 2017 C'est bon tout fonctionne, En faite c'était bien une erreur de câblage sur le relais j'envoyais du 5V pour que le signal qui rentre sur la arduino soit du 5V or il fallait que je le branche au 0V pour que la arduino comprenne. le bon code est le suivant #include <Servo.h> /*--------------------VenDuino--------------- Vending machine using FULL ROTATION servos. V0.32 2017 Ryan Bates, RetroBuiltGames.com copy and paste into arduino sketch I/O PIN# ServoA ~11 ServoB ~10 ServoC ~9 ServoD ~6 ButtonA 8 ButtonB 7 ButtonC 5 ButtonD 4 LEDready 13 LEDdispense 12 coinInsert - 3 A0-A4 Nokia5110 LCD */ #include <LCD5110_Graph.h> LCD5110 myGLCD(A0,A1,A2,A3,A4); extern uint8_t SmallFont[]; Servo servo1; int servo1_repos = 92; int servo1_action = 70; Servo servo2; int servo2_repos = 90; int servo2_action = 70; Servo servo3; int servo3_repos = 96; int servo3_action = 70; Servo servo4; int servo4_repos = 95; int servo4_action = 70; const int ServoB = 10; const int ServoC = 9; const int ServoD = 6; const int ButtonA = 8; const int ButtonB = 7; const int ButtonC = 5; const int ButtonD = 4; const int clockwise = 1700; const int counterclockwise = 1300; const int LEDready = 13; const int coinInsert = 12; long previousMillis = 0; long intervalIdle = 500; int LEDreadyState = LOW; int y1= 0; int y2= 10; //position shifters for LCD txt void setup() { servo1.attach(11); pinMode(11, OUTPUT); servo1.write(servo1_repos); servo2.attach(10); pinMode(10, OUTPUT); servo2.write(servo2_repos); servo3.attach(9); pinMode(9, OUTPUT); servo3.write(servo3_repos); servo4.attach(6); pinMode(6, OUTPUT); servo4.write(servo4_repos); myGLCD.InitLCD(); myGLCD.setFont(SmallFont); myGLCD.setContrast(70); pinMode(ButtonA, INPUT_PULLUP); pinMode(ButtonB, INPUT_PULLUP); pinMode(ButtonC, INPUT_PULLUP); pinMode(ButtonD, INPUT_PULLUP); pinMode(LEDready, OUTPUT); pinMode(coinInsert, INPUT_PULLUP); myGLCD.invert(true); myGLCD.print("VenDuino", CENTER, 1); myGLCD.print("by Ryan", CENTER, 10); myGLCD.print("(c) 2017", CENTER, 30); myGLCD.drawRoundRect(13, 0, 70, 8); myGLCD.drawRect(0, 20, 83, 47); myGLCD.update(); delay(1000); myGLCD.clrScr(); myGLCD.update(); } void loop() { //--Blink Ready LED--------------------------------------------------- unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= intervalIdle) { // save the last time you blinked the LED previousMillis = currentMillis; if (LEDreadyState == LOW){ // if the LED is off turn it on and vice-versa: LEDreadyState = HIGH; myGLCD.clrScr(); myGLCD.print("Please insert", CENTER, y1); myGLCD.print(" $0.25. ", CENTER, y2); myGLCD.invert(false); myGLCD.update(); } else LEDreadyState = LOW; digitalWrite(LEDready, LEDreadyState);// set the LED with the ledState of the variable: y1=y1 +5; y2=y2+5; //shift the text position down if ((y1==35) && (y2== 45)) //when the text almost goes off-screen, move it back up {y1=0; y2=10; } } //---Wait for Coin/Credit--------------------------------------------------------------- while (digitalRead(coinInsert)==LOW) { //if coin inserted stay in servo enable loop digitalWrite(LEDready, HIGH); myGLCD.clrScr(); myGLCD.update(); myGLCD.print("Please make", CENTER, 0); myGLCD.print(" a selection. ", CENTER, 10); myGLCD.drawRect(20, 20, 63, 47); myGLCD.drawRect(20, 20, 41, 47); myGLCD.drawRect(20, 20, 63, 34); myGLCD.update(); servoEnable(); } } void servoEnable(){ while (digitalRead(ButtonA) == HIGH || digitalRead(ButtonB) == HIGH || digitalRead(ButtonC) == HIGH || digitalRead(ButtonD) == HIGH) { //---------Servo A---------------------------------------------------- if ((digitalRead(ButtonA) == LOW) ) { for(int i=0; i<2; i++) {digitalWrite(LEDready, HIGH); delay(50); digitalWrite(LEDready, LOW); delay(50); } myGLCD.clrScr(); myGLCD.print("Vending", CENTER, 0); myGLCD.drawRect(20, 20, 63, 47); myGLCD.drawRect(20, 20, 41, 47); myGLCD.drawRect(20, 20, 63, 34); myGLCD.print("A1", 25, 24); myGLCD.update(); for(int i=0; i<250; i++) // change this to adjust +- full revolution { servo1.write(servo1_action); delay(20); servo1.write(servo1_repos); delay(0); // 18.5ms //delay(50); enable this line to slow servo rotation } break; } // when item is dispensed exit loop and return to wait for coin //---------Servo B---------------------------------------------------- if ((digitalRead(ButtonB) == LOW) ) { for(int i=0; i<2; i++) {digitalWrite(LEDready, HIGH); delay(50); digitalWrite(LEDready, LOW); delay(50); } myGLCD.clrScr(); myGLCD.print("Vending", CENTER, 0); myGLCD.drawRect(20, 20, 63, 47); myGLCD.drawRect(20, 20, 41, 47); myGLCD.drawRect(20, 20, 63, 34); myGLCD.print("B1", 46, 24); myGLCD.update(); for(int i=0; i<250; i++) { servo2.write(servo2_action); delay(20); servo2.write(servo2_repos); delay(0); // 18.5ms //delay(50); } break; } //---------Servo C---------------------------------------------------- if ((digitalRead(ButtonC) == LOW) ) { for(int i=0; i<2; i++) {digitalWrite(LEDready, HIGH); delay(50); digitalWrite(LEDready, LOW); delay(50); } myGLCD.clrScr(); myGLCD.print("Vending", CENTER, 0); myGLCD.drawRect(20, 20, 63, 47); myGLCD.drawRect(20, 20, 41, 47); myGLCD.drawRect(20, 20, 63, 34); myGLCD.print("C2", 25, 37); myGLCD.update(); for(int i=0; i<100; i++) { servo3.write(servo3_action); delay(20); servo3.write(servo3_repos); delay(0); // 18.5ms //delay(50); } break; } //---------Servo D---------------------------------------------------- if ((digitalRead(ButtonD) == LOW) ) { for(int i=0; i<2; i++) {digitalWrite(LEDready, HIGH); delay(50); digitalWrite(LEDready, LOW); delay(50); } myGLCD.clrScr(); myGLCD.print("Vending", CENTER, 0); myGLCD.drawRect(20, 20, 63, 47); myGLCD.drawRect(20, 20, 41, 47); myGLCD.drawRect(20, 20, 63, 34); myGLCD.print("D2", 46, 37); myGLCD.update(); for(int i=0; i<250; i++) { servo4.write(servo4_action); delay(20); servo4.write(servo4_repos); delay(0); // 18.5ms //delay(50); } break; } } } Lien vers le commentaire Partager sur d’autres sites More sharing options...
fabfadet Posté(e) Avril 27, 2017 Partager Posté(e) Avril 27, 2017 Super. Tres joli projet vraiment. Je pense même que je vais copier l'idée :-) Sinon, je me pose la même question que NEbraan. Qu'est ce qui a guidé ton choix vers un servo à rotation continue? Pourquoi n'est tu pas parti sur nos bons vieux stepper? CDLT Fab Lien vers le commentaire Partager sur d’autres sites More sharing options...
Ainboa Posté(e) Avril 28, 2017 Auteur Partager Posté(e) Avril 28, 2017 J'avais installer les servo car j'en avais en stock [emoji4] Par contre pas assez fiable sur la rotation donc j'ai enlever les servo et j'y ai mis des nema 17 avec une arduino et une ramps, le schéma à du coup été simplifier et j'ai réécrit une partie du code pour y intégrer les nema, je transfère mon code dans le weekend ainsi qu'un petit schéma. Voilà voilà en espérant que mon projet en inspire et surtout hésiter pas à partager vos amélioration [emoji6] Lien vers le commentaire Partager sur d’autres sites More sharing options...
dami1 Posté(e) Mai 1, 2017 Partager Posté(e) Mai 1, 2017 super idée rigolote Tu as fait découper le cadre au laser n'est ce pas ? Une petite vidéo peut être ? Bon WE Lien vers le commentaire Partager sur d’autres sites More sharing options...
Ainboa Posté(e) Mai 1, 2017 Auteur Partager Posté(e) Mai 1, 2017 Oui j'ai tout couper au laser, et pour la vidéo je ne peux pas pour le moment désolé mais dès que je peux je post. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant