Go Down

Topic: distributeur de grillon par un débutant (Read 731 times) previous topic - next topic

Fada34

Bonjour,

Mon projet est de réaliser un distributeur de grillon pour nourrir mon pogona (lézard) lors de mes absences. Je sais qu'il existe énormément de distributeurs type croquettes avec une vis sans fin mais les grillons sont vivants et fragiles, j'ai donc décidé de créer mon propre distributeur et donc de me mettre à essayer de programmer mon premier ARDUINO…

Le grand principe serait de déplacer des récipients contenant la dose quotidienne via un servomoteur (je pense que 5 rotations du servo devrait suffire pour une dose).
Je voudrais programmer une horaire fixe à laquelle se déclenchera le nourrissage, dès que le déplacement du récipient sera terminé (5 mouvement du servo) un solénoïde (remplacé par une LED sur le schéma) tapera 5 fois sur le récipient pour s'assurer que les grillons tombent bien et cela servira aussi de signal sonore via une clochette sur ce même solénoïde.

Un bouton servira aussi à déclencher le solénoïde-clochette au besoin.
Un autre bouton servira à déclencher les mouvements du servo pour nourrir en dehors de la programmation si nécessaire.

Le matériel (pas encore reçu): un arduino UNO + module DS3231 + un servo 9g + 1 solenoide (12v mais je l'alimenterai via un relai et une alim 12v)


Mon projet de cablage :


Et enfin mon code :
Code: [Select]

#include <Servo.h>
#include <Wire.h>
#include <DS3231.h>

Servo monservo;                //création de l'objet Servo
int pos = 0;                  // mettre le servo en position initiale
RTClib RTC;                    // utile pour heure ???
const int cloche = 2;          // la clochette est sur la broche 2
const int boutoncloche = 3;    // le bouton clochette est sur la broche 3
const int boutonavance = 4;     // le bouton avance est sur la broche 4
int etatboutoncloche;
int etatboutonavance;

void setup() {
 
pinMode(cloche, OUTPUT);                    // met la broche 2 en sortie
pinMode(boutoncloche, INPUT);               // met la broche 3 en entrée
pinMode(boutonavance, INPUT);               // met la broche 4 en entrée
monservo.attach(9);                         //servo relié a la broche 9
Serial.begin(57600);
Wire.begin();                              //demarrage liaison série
}


void loop() {

DateTime now = RTC.now();

if((now.hour() == 17) && (now.minute() == 30) && (now.second() == 00))   //heure minutes seconde de declenchement: 12h30m00s
 

for(int compteur = 0; compteur < 5; compteur++)   //permet d'exécuter 5 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                        // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                         // attendre 50ms pour servo arrive position
  }
}
}


// utilisation manuelle de la cloche

etatboutoncloche = digitalRead(boutoncloche);       // verification de l'état du boutoncloche
if(etatboutoncloche == HIGH)                                   // enclenchement du bouton cloche
for(int compteur = 0; compteur < 5; compteur++)    //permet d'exécuter 5 fois le code ci-dessous
{
digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
 delay(100);
digitalWrite(cloche, LOW);                       
 delay(100);
}


// avance manuelle
etatboutonavance = digitalRead(boutonavance);       // verification de l'état du boutonavance
if(etatboutonavance == HIGH)                       // enclenchement du bouton avance

for(int compteur = 0; compteur < 5; compteur++)   //permet d'exécuter 5 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
}

}
}


Pourriez-vous svp  m'indiquer si je fais de grosses erreurs de code ? N'ayant pas encore le matériel je ne peux pas le tester. J'imagine qu'il y a beaucoup de possibilités pour simplifier mon code mais je préfère partir sur du basique que je peux comprendre plutôt que sur des optimisations que je ne maîtriserai pas.

Merci,

al1fch

#1
Nov 19, 2018, 10:12 pm Last Edit: Nov 19, 2018, 10:13 pm by al1fch
Bonjour et bienvenue sur le forum !

Il n'est pas  superflu, à l'arrivée sur le forum de prendre connaissance du 'mode d'emploi' de celui-çi
Il est décrit dans plusieurs messages épinglée en tête du forum principal.

Entre autres choses il est indiqué que les sous-forums ne sont pas destinés à poser les questions générales.
En particulier ce sous forum exclusivement dédié a ce qui est achevé, fini.(voir le titre)

->Faire déplacer ce message : En bas à gauche  du message publié figure un lien 'Report to Moderator.', l'auteur du message et lui seul demande au modérater le déplacement dans le forum général

De temps à autre le modérateur fait le ménage, mieux vaut prendre les devants !

Fada34

Merci du conseil, demande de déplacement effectuée.

jfs

Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Zlika

Bonjour,

Le déclenchement par la RTC ne fait pas sonner la cloche.
Si ça coince, forcez. Si ça casse, ça devait probablement être réparé, de toute façon.

Fada34

Bonjour,

Le déclenchement par la RTC ne fait pas sonner la cloche.
En effet j'ai oublié cette tache, merci.
Je rajoute la sonnerie:

Code: [Select]

#include <Servo.h>
#include <Wire.h>
#include <DS3231.h>

Servo monservo;                //création de l'objet Servo
int pos = 0;                  // mettre le servo en position initiale
RTClib RTC;                    // utile pour heure ???
const int cloche = 2;          // la clochette est sur la broche 2
const int boutoncloche = 3;    // le bouton clochette est sur la broche 3
const int boutonavance = 4;     // le bouton avance est sur la broche 4
int etatboutoncloche;
int etatboutonavance;

void setup() {
 
pinMode(cloche, OUTPUT);                    // met la broche 2 en sortie
pinMode(boutoncloche, INPUT);               // met la broche 3 en entrée
pinMode(boutonavance, INPUT);               // met la broche 4 en entrée
monservo.attach(9);                         //servo relié a la broche 9
Serial.begin(57600);
Wire.begin();                              //demarrage liaison série
}


void loop() {

DateTime now = RTC.now();

if((now.hour() == 17) && (now.minute() == 30) && (now.second() == 00))   //heure minutes seconde de declenchement: 12h30m00s
 

for(int compteur = 0; compteur < 5; compteur++)   //permet d'exécuter 5 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                        // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                         // attendre 50ms pour servo arrive position
  }
  for(int compteur = 0; compteur < 5; compteur++)    //permet d'exécuter 5 fois le code ci-dessous
{

 
digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
 delay(100);
digitalWrite(cloche, LOW);                       
 delay(100);
}
}
}


// utilisation manuelle de la cloche

etatboutoncloche = digitalRead(boutoncloche);       // verification de l'état du boutoncloche
if(etatboutoncloche == HIGH)                                   // enclenchement du bouton cloche
for(int compteur = 0; compteur < 5; compteur++)    //permet d'exécuter 5 fois le code ci-dessous
{
digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
 delay(100);
digitalWrite(cloche, LOW);                       
 delay(100);
}


// avance manuelle
etatboutonavance = digitalRead(boutonavance);       // verification de l'état du boutonavance
if(etatboutonavance == HIGH)                       // enclenchement du bouton avance

for(int compteur = 0; compteur < 5; compteur++)   //permet d'exécuter 5 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
}

}
}


Merci de vos avis,

Artouste

#6
Nov 20, 2018, 09:17 pm Last Edit: Nov 20, 2018, 09:21 pm by Artouste
...
Le grand principe serait de déplacer des récipients contenant la dose quotidienne via un servomoteur (je pense que 5 rotations du servo devrait suffire pour une dose).

Je voudrais programmer une horaire fixe à laquelle se déclenchera le nourrissage, dès que le déplacement du récipient sera terminé (5 mouvement du servo) un solénoïde (remplacé par une LED sur le schéma) tapera 5 fois sur le récipient pour s'assurer que les grillons tombent bien et cela servira aussi de signal sonore via une clochette sur ce même solénoïde.
Bonsoir
Explique un peu mieux la cinématique de ton "système" telle que que  tu l'envisage :smiley-mr-green:

AMHA , il y a peut être(surement)  moyen de simplifier un peu mécaniquement ton "usine à gaz" 8)

Fada34

J'avance encore un peu la construction et vous post quelques photos demain.
Le principe est un carrousel en canette de coca dont la rotation est effectuée via le servo: chaque aller retour du servo fera avancer le carrousel de 1/32eme de tour, chaque 1/8 de tour, une des 8 canette sera en position pour que les grillons tombent...
J'aurai pu partir sur un moteur pap mais techniquement je le sentais moins...

Artouste

J'avance encore un peu la construction et vous post quelques photos demain.
Le principe est un carrousel en canette de coca dont la rotation est effectuée via le servo: chaque aller retour du servo fera avancer le carrousel de 1/32eme de tour, chaque 1/8 de tour, une des 8 canette sera en position pour que les grillons tombent...
J'aurai pu partir sur un moteur pap mais techniquement je le sentais moins...
Bonsoir
Ok 
J'imagine déjà un peu mieux ta mecanique :smiley-mr-green:

Post qq photos , c'est tours plus facile de reflechir "avec de la matiére"

Fada34

Voici donc quelques photos de mon futur distributeur à grillons:

Il est constitué d'un seau avec dans sa partie basse une demi bouteille pour servir d'entonnoir et guider les grillons jusqu'au terrarium:


à l'intérieur, vers la moitié, il y a un disque en bois avec une ouverture donnant vers l'entonnoir/bouteille:



au dessus est disposé une roue avec 8 trou correspondants aux 8 canettes utilisées pour le stockage des grillons:


sur le dessous de cette roue, il y a 32 encoches collées:


Le système permettant au servo de faire avancer la roue:

J-M-L

J'y connais rien... mais si vous mettez plein directement dans le terrarium "8 doses" de grillons, votre lézard va se morfaler et tout attraper en une fois et ne rien laisser pour plus tard?

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Fada34

il ne faut pas mettre tout les grillons pour 2 raisons principales:
- les pogonas sont de vrai morfales surtout jeunes: en 2 jours max il n'y aura plus rien
- il ne faut en principe pas laisser de grillons en liberté dans le terrarium car ils peuvent s'attaquer au lézard quand il dors (c'est vorace les grillons !)

J-M-L

OK -> alors c'est une bonne idée de sortir l'Arduino :-)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Fada34

Bonjour,
Pas beaucoup de commentaires sur mon bout de code :smiley-confuse: ...

Ayant fait quelques légères modifs (4 cycles de servo au lieu de 5, déplacement de certaines accolades pour ne pas faire sonner la cloche a chaque avance du servo), je repost le code:

Code: [Select]

#include <Servo.h>
#include <Wire.h>
#include <DS3231.h>

Servo monservo;                //création de l'objet Servo
int pos = 0;                  // mettre le servo en position initiale
RTClib RTC;                    // utile pour heure ???
const int cloche = 2;          // la clochette est sur la broche 2
const int boutoncloche = 3;    // le bouton clochette est sur la broche 3
const int boutonavance = 4;     // le bouton avance est sur la broche 4
int etatboutoncloche;
int etatboutonavance;

void setup() {
 
pinMode(cloche, OUTPUT);                    // met la broche 2 en sortie
pinMode(boutoncloche, INPUT);               // met la broche 3 en entrée
pinMode(boutonavance, INPUT);               // met la broche 4 en entrée
monservo.attach(9);                         //servo relié a la broche 9
Serial.begin(57600);
Wire.begin();                              //demarrage liaison série
}


void loop() {

DateTime now = RTC.now();

if((now.hour() == 17) && (now.minute() == 30) && (now.second() == 00))   //heure minutes seconde de declenchement: 12h30m00s
 

for(int compteur = 0; compteur < 4; compteur++)   //permet d'exécuter 4 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                        // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                         // attendre 50ms pour servo arrive position
  }

}
  for(int compteur = 0; compteur < 5; compteur++)    //permet d'exécuter 5 fois le code ci-dessous
{
digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
 delay(100);
digitalWrite(cloche, LOW);                       
 delay(100);
}
}


// utilisation manuelle de la cloche

etatboutoncloche = digitalRead(boutoncloche);       // verification de l'état du boutoncloche
if(etatboutoncloche == HIGH)                        // enclenchement du bouton cloche
for(int compteur = 0; compteur < 5; compteur++)    //permet d'exécuter 5 fois le code ci-dessous
{
digitalWrite(cloche, HIGH);                     //declenchement de la cloche via solenoide
 delay(100);
digitalWrite(cloche, LOW);                       
 delay(100);
}


// avance manuelle
etatboutonavance = digitalRead(boutonavance);       // verification de l'état du boutonavance
if(etatboutonavance == HIGH)                       // enclenchement du bouton avance

for(int compteur = 0; compteur < 4; compteur++)   //permet d'exécuter 4 fois le code ci-dessous

{
 for (pos = 0; pos <= 180; pos += 1)  // va de 0° à 180° par pas de 1
   {
    monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
  for (pos = 180; pos >= 0; pos -= 2)  // va de 180° à 0° par pas de 2
    {
      monservo.write(pos);              // dit au servo de prendre la position 'pos'
    delay(50);                       // attendre 50ms pour servo arrive position
  }
}

}
}


Je ne peux pas tester ce code complet dans tinkercad car la librairie du RTC n'est pas présente.
Par contre en enlevant la partie "horloge" cela fonctionne mais mon solénoïde semble s'initialiser à 90° au lieu de 0°... bizarre je lui dit pourtant: int pos = 0;     pour mettre le servo en position initiale.

Si vous avez des pistes ... Merci

J-M-L

appuyez sur ctrl-T dans l'éditeur de code Arduino avant de copier le code pour poster... ce sera indenté et on y verra quelque chose...

si vous voulez mettre votre servo à la position de départ, il faut le dire dans le setup() --> rajoutez un
Code: [Select]
monservo.write(pos); à la fin du setup
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up