Aller au contenu

ARDUINO l'automatisation à la portée des bricoleurs


Messages recommandés

Bonjour

 

Ayant eu la chance de découvrir un post relatant le pilotage d’automatismes par une carte Arduino, je me suis à mon tour lancé dans l’aventure. Et si celle-ci vous intéresse …

 

Tout d’abord intéressé par le pilotage de mes oscillateurs persos (voir ici), je me suis vite rendu compte de la simplicité de la chose à aller plus loin.

Et c’est ainsi que j’ai poursuivi le développement pour piloter mon osmolation, avec quelques sécurités supplémentaires à ce que j’ai déjà (niveau trop haut, niveau trop bas).

Puis arrêt de la pompe de remontée sur niveau trop bas, ou bien de manière temporisée pour le nourrissage ou la maintenance.

Est ensuite né le projet de pilotage du RAH en fonction du pH.

La suite logique sera l’affichage d’informations sur un écran.

 

Bref, beaucoup de choses sont possibles autour de cette carte à 30€, et les besoins ou l’imagination en permettront encore bien d’autres.

 

Pour rassurer ceux qui ne maîtrisent presque rien en électronique. Rassurez vous, mes compétences étaient presque nulles. Je savais tout juste utiliser un fer à souder, et différencier un transistor d’une résistance (quoi que !). Je n’ai aucun moyen de contrôle sophistiqué, juste un multimètre à 15€. Je ne connaissais rien au langage de programmation "C" avant cette aventure, et même si je suis loin de tout maîtriser, j’apprends et je progresse. Sympa non ? Et cela à faible coût.

De nombreux forums permettent d’apprendre, tant sur les Arduinos qu’en électronique.

 

Mais il faut par contre un peu de dextérité manuelle et de la patience, dès que l’on veut sortir de l’ordinaire.

Egalement, un point très important à garder à l’esprit : Que se passe-t-il si le système tombe en panne ? Quel impact cela aura-t-il sur le bac ? Toujours prévoir un secours. Par exemple sur panne de l’Arduino, la pompe de remontée doit rester en route. Sur panne d’une interface pH, je veux qu’un pH-mètre du commerce coupe le système RAH piloté par l’Arduino, etc…

 

Franck

 

 

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 69
  • Created
  • Dernière réponse

Top Posters In This Topic

Pour rassurer ceux qui ne maîtrisent presque rien en électronique...

Non, Bubule, c'est trop tard... La dépression est déjà là... Plus rien ne pourra me rassurer... C'est cuit...

(plus sérieusement, merci d'avoir pris le temps de rédiger ce post et de partager cette information avec nous :clinoeil: )

Lien vers le commentaire
Partager sur d’autres sites

Super idée.

On peut même y ajouter un module pour contrôler des drivers de LED en PWM.

Le seul souci est que l'arduino sort du 0-5V en pwm et les principaux drivers (notamment les meanwell) veulent du 0-10V.

Un gars a fait une solution dédiée ici : http://www.reefcentral.com/forums/showthread.php?t=1847680

C'est sur base Arduino on peut donc l'adapter sans problème.

Il y a une page google code avec le schéma, le PCB et le sketch arduino :

http://code.google.com/p/typhon-reef/source/browse/#svn/trunk/hardware/typhon

 

En tout cas super idée.

Lien vers le commentaire
Partager sur d’autres sites

il y a un long post sur ce sujet en ce moment sur un autre forum ( je sais pas si j'ai le droit de mettre le lien ?) mais apparament l'arduino n'a que peut de limite.

 

Super idée.

On peut même y ajouter un module pour contrôler des drivers de LED en PWM.

Le seul souci est que l'arduino sort du 0-5V en pwm et les principaux drivers (notamment les meanwell) veulent du 0-10V.

Un gars a fait une solution dédiée ici : http://www.reefcentral.com/forums/showthread.php?t=1847680

C'est sur base Arduino on peut donc l'adapter sans problème.

Il y a une page google code avec le schéma, le PCB et le sketch arduino :

http://code.google.com/p/typhon-reef/source/browse/#svn/trunk/hardware/typhon

 

En tout cas super idée.

cedus ton premier lien ne marche pas ? tu peux voir pour corriger ca car je suis curieux de le voir
Lien vers le commentaire
Partager sur d’autres sites

Bonjour

 

Les différences entre une platine Arduino et un automate programmable :

Un automate programmable est plus cher. Sa taille est aussi plus imposante. Ses entrées / sorties ne sont pas configurables à souhait comme une Arduino où l’on peut configurer chaque pin (connecteur) soit comme une entrée, soit comme une sortie. Soit tout ou rien (TOR), soit analogique (tension variable), soit numérique (PWM).

La programmation me semble plus puissante sur l’Arduino, car c’est un langage typiquement informatique, et non limité au langage souvent simplifié des automates. Ses capacités me semblent limitées à celles du programmeur.

Par contre les automates disposent d’entrées sorties directement utilisables en puissance. Je veux dire que les sorties sont directement capables de commander un relais ou un contacteur, sans passer par un montage d’amplification comme on est contraints de le faire avec une Arduino. (Triac, Mosfet, que je présenterais un peu plus tard). Les automates sont aussi moins sensibles aux parasites industriels. Mais je ne pense pas que ce soit un souci dans nos bacs.

Depuis quelques mois que je surf sur les différents forums traitants des Arduinos, j’y rencontre de nombreux projets très pointus alliant actions et communications. Des modules Ethernet ou Xbee ont déjà été développés et commercialisés (Voir ici en bas de page). Mais cela est déjà trop pointu pour moi. Peut-être que d’autres Cap-Récifalistes plus compétents pourrons nous présenter leurs réalisations.

Bref, pour résumer, je pense que l’Arduino a un potentiel plus grand qu’un automate à moindre coût financier, mais pas nécessairement à moindre coût de développement.

Mais comme il s’agit d’un produit Open, rien ne nous empêche de les partager. C’est ce que je tente de faire.

 

Hello, génial ce sujet !

 

Entre les balises code ça ne fonctionne pas ?

Non, l’insertion modifie le code. Je pense qu’il faudrait plutôt un fichier texte.

Je referais un essai ce soir.

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Excellente idée que ce post ! Je vais suivre attentivement.

 

@Cedus, je n'ai pas encore lu le thread sur RC mais concernant les drivers Meanwell, il existe me semble t'il deux modèles un D et un P.

D'après le peu d'infos que j'ai glanées pour le moment, le P semble dimmable en PWM alors que pour le D c'est en 0-10V. Pour l'arduino il me semble plus simple de choisir le P, non ?

 

Lien vers le commentaire
Partager sur d’autres sites

@raz

 

J'ai vérifié mon lien et il fonctionne. RC est souvent en maintenance. Tu as du te connecter à un moment où ce n'était pas accessible. Voici également le lien d'un automate fait à base d'Arduino par le même type :

http://www.reefcentral.com/forums/showthread.php?t=1847680

 

@scrab

Effectivement le D a besoin d'une source analogique 0-10V pour varier l'intensité alors que le P a besoin d'un signal PWM (Pour Dompail : Pulse width modulation).

Sauf que... apparemment les gars sur RC ont remarqué qu'on pouvait faire varier le D avec un PWM (même si la progression a l'air plus logarithmique que linéaire) et le que le P pouvait accepter un signal analogique ! Mais si tu veux faire du PWM autant passer par un P directement, tu es sûr que ça marchera.

 

Lien vers le commentaire
Partager sur d’autres sites

Salut, ton système ressemble beaucoup a un PIC avec une programmation plus ou moins facilité... Les PIC sont utilisés depuis des années, neo3plus les utilises dans ces divers montage (genre digi+++).

 

Dans le même style tu peut trouver du coté du langage GRAPHCET et autre petit logiciel simplifié du genre...

 

Mais il est toujours bon de voir de nouveau projet :clinoeil:

Lien vers le commentaire
Partager sur d’autres sites

Allez, pour commencer, le programme de gestion des oscillateurs/

 

Ce programme gère deux oscillateurs à base de servomoteurs tels que ceux-ci :

bubule_20110314084815.jpg

Le programme gère de manière totalement indépendante chaque oscillateur tant au niveau vitesse qu’au niveau course.

Il y est intégré 3 phases.

- Phase standard de jour avec vitesses et débattements propres

- Phase nocturne avec vitesses et débattements indépendants

- Phase nourrissage temporisée sur appui sur un bouton poussoir qui bloque les oscillateurs en une position durant un temps tous deux programmables.

La LED de la carte clignote durant la phase nourrissage

Dans mon cas :

L’oscillateur 1 est raccordé sur la broche N°6 (pin 6)

L’oscillateur 2 est raccordé sur la broche N°7 (pin 7)

Le bouton poussoir est raccordé sur la broche d’entrée N°1 (pin15)

 

Pour déterminer les adresses disponibles (pin) voir le schéma de la carte ici.

 

A noter que ce programme intègre une horloge créée à partir de l'instruction interne millis() qui démarre à l'initialisation ou à la mise sous tension. Celle-ci génère les phases jour/nuit pour le changement de paramètres oscillateurs.

Elle n'est pas sauvegardée.

J'ai donc rajouté une option de remise à l'heure après détection de l'extinction de l'éclairage. (Ça fera l'objet d'un autre post).

Si vous disposez d'une horloge secourue externe, nul besoin d'utiliser celle-ci, utilisez celle qui vous arrange...

 

Le code :

 

En version texte, la mise en page est un peu désordonnée, mais si vous copiez/collez l'ensemble dans le logiciel Arduino, çà semble reprendre la bonne forme

//  Programme de pilotage oscillateurs de brassage

     // Bubule - Décembre 2010


//*************************************************************//

#include  // Intègre la librairie servomoteurs

// Déclaration des entrées

  boolean nourrissage = 15;   // Broche Entrée 1 (pin15) déclarée " NOURRISSAGE "


// Déclaration des variables et constantes horloge
 int top = 0;                // Impulsion top toutes les 100ms
 int top05s = 0;             // Impulsion top05 toutes les 500ms (0.5sec)
 int topsec = 0;             // Impulsion topsec toutes les secondes
 boolean frontMtop05s;       // Front montant de l'impulsion top 05sec
 int comptNbH;               // Compteur d'impulsion fonction du nombre d'heure de l'horloge
 unsigned long ancien_millis;// Mémoire de l'horloge millis pour création tops servos
 unsigned long refTemps;     // Mémoire de l'horloge millis pour horloge
 int heure =19;              // Heures de l'horloge >>>> Permet de remettre l'horloge à l'heure sur init
 int minute = 44;            // Minutes de l'horloge >>> Permet de remettre l'horloge à l'heure sur init
 int seconde = 0;            // Secondes de l'horloge                           
 int Periode;                // Défini la période jour(1) ou nuit(0)

// Déclaration des variables et constantes oscillateur 1
 int bute_J_AV_oscil_1 = 10; // limite débattement avant phase "jour" Oscillateur 1
 int bute_J_AR_oscil_1 = 110;// limite débattement arrière phase "jour" Oscillateur 1
 int bute_N_AV_oscil_1 = 10; // limite débattement avant phase "nuit" Oscillateur 1
 int bute_N_AR_oscil_1 = 80; // limite débattement arrière phase "nuit" Oscillateur 1

 int bute_AV_1;              // Variable contenant la butée avant en fonction de la phase horaire
 int bute_AR_1;              // Variable contenant la butée arrière en fonction de la phase horaire
 int vit_J_oscil_1 = 150;    // Vitesse d'oscillation "jour" Oscillateur 1
 int vit_N_oscil_1 = 4;      // Vitesse d'oscillation "nuit" Oscillateur 1
 int vit_1;                  // Variable contenant la vitesse d'oscillation en fonction de la phase horaire

 int tps_nourrissage = 5;    // Temps de pause oscillateurs positionnés pour éviter un envoi des aliments vers la surverse (en minutes)
 int posi_nourrissage_1 = 10;// Position oscillateur 1 pendant la phase de nourissage
 int attente_nourrissage = 0;// Variable temps de nourrissage

 long calculV_1;             // Calculateur vitesse oscillateur 1
 int sens_1 = 0;             // Sens d'oscillation oscillateur 1
 int pos_servo_1;            // Position du servo de l'oscillateur 1
 Servo servo_oscil_1;        // Consigne variable du servo d'oscillateur N°1 (valeur comprise entre 0 et 180)

// Déclaration des variables et constantes oscillateur 2
 int bute_J_AV_oscil_2 = 30; // limite débattement avant phase "jour" Oscillateur 2
 int bute_J_AR_oscil_2 = 110;// limite débattement arrière phase "jour" Oscillateur 2
 int bute_N_AV_oscil_2 = 45; // limite débattement avant phase "nuit" Oscillateur 2
 int bute_N_AR_oscil_2 = 100;// limite débattement arrière phase "nuit" Oscillateur 2

 int bute_AV_2;              // Variable contenant la butée avant en fonction de la phase horaire
 int bute_AR_2;              // Variable contenant la butée arrière en fonction de la phase horaire
 int vit_J_oscil_2 = 300;    // Vitesse d'oscillation "jour" Oscillateur 2
 int vit_N_oscil_2 = 3;      // Vitesse d'oscillation "nuit" Oscillateur 2
 int vit_2;                  // Variable contenant la vitesse d'oscillation en fonction de la phase horaire

 int posi_nourrissage_2 = 110;// Position oscillateur 2 pendant la phase de nourissage

 long calculV_2;             // Calculateur vitesse oscillateur 2
 int sens_2 = 0;             // Sens d'oscillation oscillateur 2
 int pos_servo_2;            // Position du servo de l'oscillateur 2
 Servo servo_oscil_2;        // Consigne variable du servo d'oscillateur N°2 (valeur comprise entre 0 et 180)



// Sortie LED
 const int led_int = 13;     // LED sur carte en Pin 13
 int etat_led = LOW;         // Force la LED de carte à 0



void setup() {


 // Adressage des entrées et mise en oeuvre des pull-up
 pinMode (nourrissage, INPUT);     // Déclaration de l'entrée 1 (NOURISSAGE)
 digitalWrite(nourrissage, HIGH) ; // Activation du pullup de l'entrée 1 (pin 15)




 // Initialise la liaison série
 Serial.begin(19200);
  delay(50);

 // Initialise la position du servo d'oscillateur 1
 pos_servo_1 = bute_J_AV_oscil_1; 
 // Attache le servo oscilateur 1 à la sortie 6 ( A modifier en fonction de votre sortie utilisée)
 servo_oscil_1.attach(6);

 // Initialise la position du servo d'oscillateur 2
 pos_servo_2 = bute_J_AV_oscil_2; 
 // Attache le servo oscilateur 2 à la sortie 7( A modifier en fonction de votre sortie utilisée)
 servo_oscil_2.attach(7);

}



void loop() {




// Création d'une impulsion temporisée (top) pour déplacements oscillateurs sur la base de l'horloge interne millis()  
   if (millis() >= ancien_millis) { // Vérifie que le temps millis() est supérieur à l'ancienne valeur mémorisée (100ms écoulées)                                                
         ancien_millis += 100;      // incrémente de 100ms
         top = 1;                   // création d'un top toutes les 100ms (RAZ en fin de programme)
            }
   if (millis() < 100) ancien_millis = 0;   // >> risque à l'init et au retour à zéro de l'horloge interne millis() sur débordement.

// Création d'une impulsion temporisée toutes les 500ms (0.5sec)  
   if (top == 1) top05s = top05s ++ ;
   if (top05s >= 5) top05s = 0;


// HORLOGE 
   if (millis() >= refTemps){
      refTemps += 1000;
      seconde++;           // Incrémentation des secondes
      topsec = 1;          // Monte le bit topsec toutes les secondes
     if (seconde >= 60) {  // à chaque 60 secondes
         minute++ ;        // Incrémentation des minutes
         seconde = 0; 
       if (minute >= 60) {
           heure++ ;       // Incrémentation des heures
           minute = 0 ;
         if (heure >=24) {
               heure = 0 ; // réinitialise l'horloge toutes les 24h
            }
           }
          }
         }




// Phase jour / Phase nocturne
       if (heure >= 11 && heure < 21 ) // si dans la période
                      Periode = 1; // Phase diurne (entre 11h et 21h)
               else {Periode = 0;} // Phase nocturne


// Inscription des valeurs en fonction des phases jour / nuit
   if (Periode == 1){ //Phase "jour"
   // pour oscillateur 1
     bute_AV_1 = bute_J_AV_oscil_1;  // Butée AV
     bute_AR_1 = bute_J_AR_oscil_1;  // Butée AR
     vit_1 = vit_J_oscil_1;          // Vitesse oscillateur 1
   // Pour oscillateur 2
     bute_AV_2 = bute_J_AV_oscil_2;  // Butée AV
     bute_AR_2 = bute_J_AR_oscil_2;  // Butée AR
     vit_2 = vit_J_oscil_2;          // Vitesse oscillateur 2
           }
   if (Periode == 0){ //Phase "nocturne"
   // pour oscillateur 1
     bute_AV_1 = bute_N_AV_oscil_1;  // Butée AV
     bute_AR_1 = bute_N_AR_oscil_1;  // Butée AR
     vit_1 = vit_N_oscil_1;          // Vitesse oscillateur 1
   // pour oscillateur 2
     bute_AV_2 = bute_N_AV_oscil_2;  // Butée AV
     bute_AR_2 = bute_N_AR_oscil_2;  // Butée AR
     vit_2 = vit_N_oscil_2;          // Vitesse oscillateur 2
           }

// OSCILLATEUR 1
// Calculateur vitesse Oscillateur 1     
       calculV_1 = calculV_1 + (top * vit_1) ; //incrément Vitesse "jour" Oscillateur 1  
   if (calculV_1 >= 1000){  //demande mouvement d'un pas (1°) sur servo oscillateur 1
       calculV_1 = 0 ;      // RAZ calcul incrément
 // Incrémente ou Décrémente en fonction du sens (sens_1)      
          if (sens_1 == 1 ) { pos_servo_1 = pos_servo_1 + 1 ;}
          if (sens_1 == 0 ) { pos_servo_1 = pos_servo_1 - 1 ;}
         }

// Changement de sens oscillateur 1
  if (pos_servo_1 >= bute_AR_1){sens_1 = 0 ;}
  if (pos_servo_1 <= bute_AV_1){sens_1 = 1 ;}

// Attache la variable du servo oscilateur 1
  if (attente_nourrissage == 0){servo_oscil_1.write(pos_servo_1) ; } // Si temps de nourrissage pas en cours       
    else {servo_oscil_1.write(posi_nourrissage_1) ;}                 // Sinon, Force le positionnement de l'oscillateur 1 durant le comptage


// OSCILLATEUR 2
// Calculateur vitesse Oscillateur 2
       calculV_2 = calculV_2 + (top * vit_2) ; //incrément Vitesse "jour" Oscillateur 2
   if (calculV_2 >= 1000){  //demande mouvement d'un pas (1°) sur servo oscillateur 2
       calculV_2 = 0 ;      // RAZ calcul incrément
 // Incrémente ou Décrémente en fonction du sens (sens_2)      
          if (sens_2 == 1 ) { pos_servo_2 = pos_servo_2 + 1 ;}
          if (sens_2 == 0 ) { pos_servo_2 = pos_servo_2 - 1 ;}
         }

// Changement de sens oscillateur 2
  if (pos_servo_2 >= bute_AR_2){sens_2 = 0 ;}
  if (pos_servo_2 <= bute_AV_2){sens_2 = 1 ;}

// Attache la variable du servo oscilateur 2
  if (attente_nourrissage == 0){servo_oscil_2.write(pos_servo_2); } // Si temps de nourrissage pas en cours       
    else {servo_oscil_2.write(posi_nourrissage_2);}                 // Sinon, Force le positionnement de l'oscillateur 2 durant le comptage

// BOUTON POUSSOIR NOURRISSAGE
 // Phase nourrissage  
  if (((digitalRead (nourrissage) == 0)||(attente_nourrissage != 0) == 1) && top == 1) {attente_nourrissage = attente_nourrissage ++ ;} // Si demande de pause nourrissage, incrémente l'attente nourrissage et compte les tops (100ms)
     if (attente_nourrissage >= tps_nourrissage * 700){   // fin du temps de pause nourrissage atteint 
          attente_nourrissage = 0 ;                       // RAZ du compteur
           }                 
 // temoin période nourrissage en cours : avec la LED de la carte (sortie 13)      
      if (attente_nourrissage > 0 && top05s == 4) etat_led = HIGH;
           else etat_led = LOW;



    delay(50);


// Remise à zéro des impulsions "Top"
 top = 0; 
 topsec = 0;



  digitalWrite(led_int, etat_led);           





}

 

 

 

 

Je n'ai pas réussi à introduire un fichier texte (.wks). Ça m'a planté Firefox

C'est dommage car la mise en page en pâti, et il n'y a plus de couleur

 

 

 

Franck

Lien vers le commentaire
Partager sur d’autres sites

je suis en train de suivre un sujet sur un autre forum ou ils experimentent un automate a base d'arduino avec un ecran tactil pour des réglages autonome ( plus besoin du pc une fois le programme chargé )

ils ont deja bien avancé, il y a

- l'heure reglable,

- temporisation de l'éclairage reglable,

- controle de servomoteur pour l'oscillation réglable,

- l'osmolation je crois aussi,

- prise de temperature, ( je sais plus si ils ont fait le systeme pour gerer les chauffage et le refroidissement mais au pire c'est pas le plus compliqué )

et ils sont en train de voir pour integrer une sonde ph et des pompes doseuses

je crois que le cout du module de base ( ecran, carte, relais, module de gestion de l'horloge, servomoteur ) coute a peu pres 90 euro

ils faut ensuite rajouter les pompe perislatique ( 25 euro piece ) la sonde ph ( 25 euro aussi si ils valide celle trouvé )

en gros pour une carte qui gere la lumiere, l'osmolation, la température, l'oscillation, 3 pompes doseuses, et le ph on s'en sort pour 200 euro et quelques heures de travail.

meme pas le prix d'une pompe doseuse

Lien vers le commentaire
Partager sur d’autres sites

Ah oui ! Quand même !

 

Ils ont bien avancé. Ca me donne des idées pour la suite. J'ai même découvert qu’un voisin champenois était très impliqué dans le projet :mdr3: .

Et quand je vois le prix d’un ensemble Arduino mega + écran + accessoires à 40€ sur EB… çà tente…

 

Lien vers le commentaire
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Share


×
×
  • Créer...

Information importante

En poursuivant votre navigation, vous acceptez l’utilisation des cookies pour vous proposer des contenus adaptés à vos centres d’intérêt et réaliser des mesures pour améliorer votre expérience sur le site. Pour en savoir plus et gérer vos paramètres, cliquez ici