Aller au contenu

Distributeur de bonbon


Ainboa

Messages recommandés

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;
  }
}
  }


 

 

Sans titre.png

20170401_113431.png

Lien vers le commentaire
Partager sur d’autres sites

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

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

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

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

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) par Nebraan
Lien vers le commentaire
Partager sur d’autres sites

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

  • 4 weeks later...

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

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...