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)
#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.
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 estachevé, 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 !
Le déclenchement par la RTC ne fait pas sonner la cloche.
En effet j'ai oublié cette tache, merci.
Je rajoute la sonnerie:
#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
}
}
}
}
Fada34:
... 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
AMHA , il y a peut être(surement) moyen de simplifier un peu mécaniquement ton "usine à gaz" 8)
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...
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...
Bonsoir
Ok
J'imagine déjà un peu mieux ta mecanique
Post qq photos , c'est tours plus facile de reflechir "avec de la matiére"
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?
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 !)
Bonjour,
Pas beaucoup de commentaires sur mon bout de code ...
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:
#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.
J'ai bien dis au servo de se mettre en position initiale et nickel le servo se positionne bien dés le départ.
Merci,
#include <Servo.h>
#include <Wire.h>
#include <DS3231.h>
Servo monservo; //création de l'objet Servo
int pos = 0; // valeur initiale de la variable "pos" du servo
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
monservo.write(pos); // met le servo en position initiale
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
}
}
}
}