Go Down

Topic: Distributeur de croquettes avec servo ARDUINO ONE (Read 16774 times) previous topic - next topic

ARTNOW

Voici mon travail concernant un distributeur de croquettes avec un arduino one et un servo, le servo fait tomber environ 100 g de croquettes pour mes trois chats  et cela 2 fois par jours à 8h00 et à 18h00 .

Pour cela j'ai après plusieurs essais infructueux utilisé une boite de whisky métallique, ouverte à la dremel en partie haute pour former une trémie et j'ai utilisé le couvercle en partie basse (avec une découpe latérale)pour faire tomber les coquettes grâce au servo.

Je tiens à remercie toutes les personnes du forum qui m'ont aidé à mener à bien ce projet, c'est ma première réalisation je débute en arduino à 46 ans. (Je suis autodidacte en électronique, informatique et modélisme).

VIDEO DU DISTRIBUTEUR DE CROQUETTES

Code: [Select]
#include <Servo.h>
#include <DS3231.h>
#include <Wire.h>
DS3231 clock;
RTCDateTime dt;
Servo myservo;
int pos = 0; // variable pour la position 0 du servo
int b;
int bp = 2; // un bouton poussoir sur la borne (2)
// schema : (-) -------[R 10 Kohm]--------O BP O------------ (+)
//          (2)--------------------------/


void setup() {
    // initialise les leds aux pin 12 et 13 en sorties.
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600); // lecture sur interface serie
  myservo.attach(9);    // entree servo sur borne (9)
  myservo.write(pos);   // positionne le servo à zéro
  pinMode(bp, INPUT);   // broche (2) en entrée pour le bouton poussoir
  clock.begin();

  // Mise a zero alarmes

  clock.armAlarm1(false);
  clock.armAlarm2(false);
  clock.clearAlarm1();
  clock.clearAlarm2();

  // pour le reglage manuel de la date et heure (Year, Month, Day, Hour, Minute, Second)
  // enlever les // devant clock ci dessous
//clock.setDateTime(2015, 11, 30, 16, 02, 00);
  // Manual (YYYY, MM, DD, HH, II, SS

  // heures de la journee pour le declenchement des cycles de distribution
  // une alarme à9H00 le matin et une a 18h00 le soir
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  clock.setAlarm1(0, 8, 00, 00, DS3231_MATCH_H_M_S);//MATCH_H_M_S ===>  seconde, minute, heure et jour de la semaine
  clock.setAlarm2(0, 18, 00, DS3231_MATCH_H_M);         //MATCH_M ===>  minute, heure et jour de la semaine

  // prise en compte alarme
  checkAlarms();
}
void checkAlarms()
{
  RTCAlarmTime a2;  
  RTCAlarmTime a1;
 
  if (clock.isArmed1())
  {
    a1 = clock.getAlarm1();
    Serial.print("Alarme 1 declenchee ");
    switch (clock.getAlarmType1())
    {
    case DS3231_MATCH_H_M_S:
      Serial.print("Quand il sera : ");
      Serial.println(clock.dateFormat(" H:i:s", a1));
            break;

    }
  } else
  {
    Serial.println("Alarm1 is disarmed.");
 //////////////////////////////////////////////////////////////////    
  if (clock.isArmed2())
  {
    a2 = clock.getAlarm2();
    Serial.print("Alarme 2 declenchee ");
    switch (clock.getAlarmType2())
    {
   case DS3231_MATCH_H_M_S:
      Serial.print("Quand il sera : ");
    Serial.println(clock.dateFormat(" H:i:s", a2));
      break;

    }
  } else
  {
    Serial.println("Alarm2 is disarmed.");
  }
delay (1000);
  //*******************************************************************
}
}


void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(30);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(30);              // wait for a second
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(10);              // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  delay(10);              // wait for a second
  dt = clock.getDateTime();
  Serial.println(clock.dateFormat("d-m-Y H:i:s - l", dt));
  if (clock.isAlarm1())
  {
    distribution ();
    Serial.println("ALARM 1 DECLENCHEE DONC DISTRIBUTION!");
  }
  //*********************************************************************
  if (clock.isAlarm2())
  {
    distribution ();
    Serial.println("ALARM 2 DECLENCHEE DONC DISTRIBUTION!");
  }
  delay(1000);
  //*******************************************************************
  //distribution manuelle
  if ( digitalRead(bp) == HIGH) {
    delay(30);
    distribution ();
    delay(100);
  }
}

void distribution() {
  // GESTION DU SERVO SUR SORTIE (9)
   for (int i = 0; i <= 5; i++) // le chiffre 1 pour 2 cycles
    for (pos = 0; pos <= 102; pos += 6) // va de 0 degrees a 190 degrees
    { // avec des pas de 1 degre
      myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
      delay(40);                       // pause  15ms
    }
  for (pos = 102; pos >= -0; pos -= 8) // va de  190 degres a  0 degrees
  { // avec des pas de 4 degrees donc retour rapide
    myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
    delay(10);                       // pause  15ms
  }
}

elektrax

boite de whisky, j'avais lu whiskas  :)

tres beau travail, ce qu'il me faudrait pour les miens et les chat errants de ma campagne

ARTNOW


maxpeigne

Félicitation!

J'avais pensé à un projet similaire mais j'ai tout le temps eut peur qu'une croquette ne vienne se coincer dans le mécanisme de distribution -> fasse forcer le servo qui essaie de se faire -> RIP le servo.

As tu eus ce problème?

ARTNOW

Félicitation!

J'avais pensé à un projet similaire mais j'ai tout le temps eut peur qu'une croquette ne vienne se coincer dans le mécanisme de distribution -> fasse forcer le servo qui essaie de se faire -> RIP le servo.

As tu eus ce problème?
Bonjour, non d'une manière générale , le système fonctionne plutôt bien la tringlerie fait tampon si une croquette bloque le retour chariot elle se cintre naturellement et permet au servo d'arriver à sa position fermée.J'ai remarquer que certains servo fonctionnais mieux que d'autres pour cette application , il faut un servo avec un bon couple et la fermeture doit être tonique pour casser la ou les éventuelles croquettes récalcitrantes .

ARTNOW

#5
Oct 28, 2015, 08:54 pm Last Edit: Mar 17, 2016, 12:21 pm by ARTNOW
Salut tous le monde , projet fini ouf ......voici des photos:


48h de test après   :  3 chats heureux qui commencent à connaitre les horaire du service et qui accourent au moment ou les croquettes tombent .......

Génialisime  , ça me donne envie de faire encore d'autre projets .

Merci encore pour celles et ceux qui m'ont aider .

bye-bye. ;)


ARTNOW

#6
Dec 12, 2015, 01:58 pm Last Edit: Feb 09, 2016, 10:20 pm by ARTNOW
bonjour , voici une petite video du projet fini.

https://youtu.be/v8W8ewHfWuw

ARTNOW

#7
Feb 22, 2016, 12:09 pm Last Edit: Feb 22, 2016, 12:18 pm by ARTNOW
Bonjour, j'ai mis au propre le programme, et surtout j'ai ajouté un potentiomètre à l'arrière du distributeur pour effectuer des réglage de quantité de croquettes à distribuer , car , en fonction des croquettes , formes et taille j'étais obligé d'effectuer des réglages de nombre d'aller-retour du servo et de course du servo , maintenant , j'ai juste à tourner le potentiomètre sur une des 6 graduations marquées et les doses de croquettes sont ajustés.
Code: [Select]
//Distributeur de croquettes pour chats
// Programme libre de droits
// ARTNOW44 (c)
// 2016


#include <Servo.h>
#include <DS3231.h>
#include <Wire.h>
DS3231 clock;
RTCDateTime dt;
Servo myservo;
int pos; // variable pour la position du servo
int bp = 2; // un bouton poussoir sur la borne (2)
int sensorValue = analogRead(A0);// Lecture de la valeur du potentiometre
int potard = sensorValue;// stockage de la valeur du potentiometre dans potard
//****************************************************************************************
// schema bouton poussoir : (-) -------[R 10 Kohm]--------O BP O------------ (+)
//                          (2)--------------------------/
//****************************************************************************************
// Cablage du DS 3231 :
// GND > GND  
// VCC > +5v
// SDA > A4
// SCL > A5
//****************************************************************************************
// Cablage du servo :
// NOIR > GND  
// ROUGE> +5v
// BLANC> 9
//****************************************************************************************
// Cablage du potentiometre pour Nb de cycle du servo :
//   +  ---()*****
//   A0 ---()**P**
//   -  ---()*****
//****************************************************************************************
void setup() {
    Serial.begin(9600);
    myservo.write(10); //Important pour mettre le servo en position origine si coupure de courant
    // initialise les leds aux pin 12 et 13 en sorties (déco)
  pinMode(12, OUTPUT);// des leds pour le fun
  pinMode(13, OUTPUT);// des leds pour le fun
  Serial.begin(9600); // lecture sur interface serie
    myservo.attach(9);    // entree servo sur borne (9)
  pinMode(bp, INPUT);   // broche (2) en entrée pour le bouton poussoir
  
  clock.begin();

  // Mise a zero alarmes
  clock.armAlarm1(false);
  clock.armAlarm2(false);
  clock.clearAlarm1();
  clock.clearAlarm2();

  // pour le reglage manuel de la date et heure
  // (ANNEE, MOIS, JOUR, HEURES, MINUTES, SECONDES
  
   // enlever les // devant clock ci dessous
//clock.setDateTime(2016, 02, 21, 16, 43, 00);


  // heures de la journee pour le declenchement des cycles de distribution
  // une alarme à8H00 le matin et une a 18h00 le soir
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  clock.setAlarm1(0, 8, 00, 00, DS3231_MATCH_H_M_S);//MATCH_H_M_S ===>  seconde, minute, heure et jour de la semaine
  clock.setAlarm2(0, 18, 00, DS3231_MATCH_H_M);         //MATCH_M ===>  minute, heure et jour de la semaine

  // prise en compte alarme
  checkAlarms();
}
void checkAlarms()
{
  RTCAlarmTime a2;  
  RTCAlarmTime a1;


  if (clock.isArmed1())
  {
    a1 = clock.getAlarm1();
    Serial.print("Alarme 1 declenchee ");
    switch (clock.getAlarmType1())
    {
    case DS3231_MATCH_H_M_S:
      Serial.print("Quand il sera : ");
      Serial.println(clock.dateFormat(" H:i:s", a1));
            break;

    }
  } else
  {
    Serial.println("Alarm1 is disarmed.");

    
    
 //////////////////////////////////////////////////////////////////    
  if (clock.isArmed2())
  {
    a2 = clock.getAlarm2();
    Serial.print("Alarme 2 declenchee ");
    switch (clock.getAlarmType2())
    {
   case DS3231_MATCH_H_M_S:
      Serial.print("Quand il sera : ");
    Serial.println(clock.dateFormat(" H:i:s", a2));
      break;

    }
  } else
  {
    Serial.println("Alarm2 is disarmed.");
  }
delay (1000);
  //*******************************************************************
}
}


void loop() {//Gestion des leds pour le fun
  
  digitalWrite(13, HIGH);   // Allume la led en sortie 13
  delay(30);              // pause 30ms
  digitalWrite(13, LOW);    // Extinction de la LES EN SORTIE 13
  delay(30);              // pause 30ms
  
  digitalWrite(12, HIGH);   // Allume la led en sortie 12
  delay(10);              // pause 10ms
  digitalWrite(12, LOW);    // Extinction de la LES EN SORTIE 12
  delay(10);              // pause 10ms
  
  dt = clock.getDateTime();
  Serial.println(clock.dateFormat("d-m-Y H:i:s - l", dt));
  if (clock.isAlarm1())
  {
    distribution ();
    Serial.println("ALARM 1 DECLENCHEE DONC DISTRIBUTION!");
  }
  //*********************************************************************
  if (clock.isAlarm2())
  {
    distribution ();
    Serial.println("ALARM 2 DECLENCHEE DONC DISTRIBUTION!");
  }
  delay(1000);
  
  //*******************************************************************
  //distribution manuelle
  if ( digitalRead(bp) == HIGH) {//Demande de distribution manuelle avec le BP
    delay(30);
    distribution ();
    delay(100);
}
}
void distribution() {
    int sensorValue = analogRead(A0);
    int potard = sensorValue;
    potard = map(potard, 0,1023, 0,6);// Conversion des valeurs de lecture du potentiometre en Nb de 0 à 6
 
  // GESTION DU SERVO SUR SORTIE (9)
   for(int i=0; i <=(potard); i++)  //  nombre d'aller retour du servo
    //Serial.print (i);
    for (pos = 0; pos <= 120; pos += 6) // va de 0 degrees a 120 degrees
    { // avec des pas de 6 degrés
      myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
      delay(50);                       // pause  50ms
    }
  for (pos = 120; pos >= -0; pos -= 8) // va de  120 degres a  0 degrees
  { // avec des pas de 8 degrés donc retour rapide
    myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
    delay(10);                       // pause  10ms
    
    }
                  
  }


achess

#8
Feb 23, 2016, 12:27 am Last Edit: Feb 23, 2016, 12:59 am by achess
Bonjour,
Merci pour le partage et bravo pour cette belle réussite.

Pas mal le coups du potentiomètre.

Le distributeur, c'est pour les rationner ?
Un chat plus gourmand ou dominant peut empêcher un autre d'accéder.
Si ils sont pucés, tu peut ajouter un détecteur RFID pour donner des rations individualisées ?

Manque plus que le schéma de câblage ;)



ARTNOW

Bonjour,
Merci pour le partage et bravo pour cette belle réussite.

Pas mal le coups du potentiomètre.

Le distributeur, c'est pour les rationner ?
Un chat plus gourmand ou dominant peut empêcher un autre d'accéder.
Si ils sont pucés, tu peut ajouter un détecteur RFID pour donner des rations individualisées ?

Manque plus que le schéma de câblage ;)



Bonjour ACHESS , oui c'est pour rationner les 3 chats et en cas d'absence .
Pour ceux qui connaissent les chats , si on laisse un saladier plein de coquettes , il vont s'en occuper très rapidement , par ennui ou par gourmandise , voir les deux !!
Même avec 10 jours d'absence pas de soucis le distributeur à une capacité de 2 semaines de nourriture .
Pour le RFID , c'est une bonne idée mais en fait pas utile vu que les 3 bestiaux arrivent à s'arranger à l'amiable :) .

C'est pratique aussi pour l'heure à la maison quand la machine distribue le matin il est 8h00 et le soir on sait au bruit des croquettes qui tombent qu'il est 18h00.

C'est rigolo aussi de voir le ou les chats courir vers le distributeur .
Pour le schéma , je vais poster ça bientôt .
Merci pour ton encouragement .
à+

achess

J'ai eu 2 chattes à une époque ou la dominatrice attaquait toujours l'autre qui était craintive. Avec un RFID, il aurait fallu un système pour entraver l'une pendant que l'autre mangeait. :smiley-confuse:

J'ai eu une chèvre qui empêchait  sa fille à coups de cornes d'accéder la nourriture (réaction de sevrage naturelle mais problématique). J'ai usé de stratagème avec 2 mangeoires séparées.
Fallait voir le manège entre les 2 mangeoires, la fille s'éloignait quand la mère arrivait et pouvait éviter les coups en vache. ;)

ARTNOW

Bonsoir , oui il faut ménager la chèvre et le chou comme ont dit ..... :).

voici le schéma tout frais ....

a+





marc13bdr

Bonjour pourrait tu nous indiquer quel type de servo as tu utilisé? si tu as un lien pour voir , ca m'interresse.
Merci d'avance

ARTNOW

Bonjour Marc13bdr , il s'agit d'un TRAXXAS 2055 récupéré sur une voiture RC , mais tu le trouvera ici par exemple ..  :)


http://www.amazon.fr/Traxxas-TRA2055-servo-couple--lev-/dp/B0006O5HT4/ref=sr_1_2?ie=UTF8&qid=1459249316&sr=8-2&keywords=Traxxas+2055


yannherledan

Bonsoir , oui il faut ménager la chèvre et le chou comme ont dit ..... :).

voici le schéma tout frais ....

a+





pour les schémas arduino je te recommande le logiciel Fritzing, c'est plus rapide pour faire les shémas

Go Up