Derniere révision : 16 mai 2007

Cette page vous a  t'elle interessee ? Certaines parties du texte ne sont pas comprehensible ? vous avez quelque chose à ajouter, vous savez le faire avec window ou mac et vous pouvez ajouter un morceau de texte, faites le moi savoir merci. A force de revision le document devient confus.fontaine@look.ca



Culture électronique

Culture de végétaux controlé par ordinateur

Introduction
Comment
Théorie
Shéma électronique
Augmenter le nombre de sorties
Montage
Programation
   Programation en C
   Programation avec Cron
Arrosage
Acquisition de données
 Sonde SHT71
Tracer des courbes avec Gnuplot
Alimentation électrique
 Communication avec l'exterieur
Conclusion




Introduction :
L'idée de base est de pouvoir faire des saisons dans une enceinte pour la culture de plantes, grace à un ordinateur on peut controler de nombreux appareils éléctriques d'une manière précise et  programmable (sur un an); et obtenir des données.

Dans l'exemple de ce document on controle la lumière, le chauffage,  l'arrosage et la ventilation, la temperature, l'humidite (je n'ai pas encore trouver le materiel qui produit correctement et pas chers de l'humidite).

Il faut noter que je ne suis ni electronicien ni informaticien, juste jardinier, qui recherche un outil, de ce fait les solutions ne seront peut etre pas toujours orthodoxe.

Comment :

A partir d'un PC personnel avec le systeme d'exploitation  Linux, (avec windows c'est presque pareil mais je ne sais pas faire), en utilisant le port parrallele et un montage électronique relativement simple.
Certain constructeur propose des montages en kit ou montés :
 http://www.velleman-kit.com
 http://www.comelec.fr/Kit_Interface_Informatique.htm
 http://www.costronic.com.tw/../realtime/Erta1010.htm

 Haut

Théorie :

Un port parrallele (25 broches) permet directement et simplement de controler 8 appareils électrique par l'intermediaire des broches 2 a 9, les broches 18 et 25 donnent la masse (les broches 10 11 12 13 servent a lire, on y reviendra).
On envoie un message par l'intermediaire d'un programme en C au port (l'adresse du premier port parrallele un generalement 0x378 ou 0x3bc ou 0x278).
On fait un programme pour chaque commande.

A chaque broche correspond un bit : a la broche 2 corresponds le bit 1, à 3 correspond 2, a 4 corresponds 4, à 5 correspond 8, à 6 correspond 16, à 7 correspond 32, à 8 correspond 64 et à 9 correspond 128. pour allumer on envoie le message 8, pour allumer 5 et 2 on envoie le message 9 (8+1), pour allumer 9, 6 et 3 on envoie le message 146 (128+16+2)

Voir la doc linux : "howto IO port
http://www.freenix.fr/unix/linux/HOWTO/mini/IO-Port.html
 

Avec la commande crontab on programme les differents processus dans le temps (minute; heure; jour; mois).
 

Note pour les élécromecanicien programmeur : On peut naturelement faire fonctionner n'importe quel appareil electrique. Pour un moteur à pas on utilise plusieur broche et un programme spécial ou une carte spéciale (voir toujours chez www.velleman-kit.com ).
La durée d'une action peut etre commandée en c par sleep ou usleep, mais le temp sera relatif par rapport a la charge du processeur,  une machine robot ne devrait etre que pour ca, ou gerer les prioritées d'execution (rechercher la documentation sur linux embarque "embeded").
 

Les broches de 2 à 9 (+5v) se branchent vers la masse via une resistance de 4.7 Kohm.

Haut

Montage Electronique :

Le montage est a repéter jusqu'à huit fois, sur une carte


1 : broche du port parrallele; 2 : diode anti retour pour débutant; 3 résistance de 4.7KOhm; 4 transistor 2n2222a;  6 : relais : 12V, 110V ou 220V; 7 : masse;  10 : alimentation en 12V; 11 : fusible; 12 alimentation en courant 110V ou 220V ; 13 : sortie 110V ou 220V.
 

Montage ameliorer :

Maintenant que vous avez compris on fait mieux et plus simple :

  • Utilisation du ULN2803A qui est un circuit intégré et remplace le montage de base , il comporte 8 entrées compatible TTL  et qui permet de commander 8 relais par ses sorties de puissances.  On peut commander des relais de 5 à 30V continu.   Voir la doc :  http://www.onsemi.com/pub/Collateral/ULN2803-D.PDF
    Ce composant permet de faire la meme chose et en mieux que le montage avec transistors.  Le montage devient tres facile un connecteur // male un uln 2803 et 8 relais.

    - L'utilisation d'optocoupleur  apporte de la sécurité.

Exemple de montage :

-1 port parralele

-2 transformateur electrique avec deux sorties 5v et 12v

-3 uln2803

-4 2 regulateurs de courant 5v et 12v

-5 relais 12v, il n'y en a que 4, car 3 sorties sont pour l'arrosage, et une pour autre chose...

Haut

Augmenter le nombre de sorties :

Il y a plusieurs solutions :
- la premiere que j'ai utiliser est un jeu de relais, le defaut est que l'on agit que sur une sortie a la fois.
- Autre solutions un demutiplexeur il y en a plusieur sortes, par exemple le "74HC138 1 of 8 decoder demultiplexer"; 3 broches commandent 8 sorties, c'est simple mais ca a le meme defaut que precedement, c'est a dire que l'on agit que sur une sortie a la fois. j'ai resolu le probleme en mettant une bascule "D 4013"  a chaque sorties. En fait il y a deux bascule par '4013'; les connexions : 'SD', 'CD', 'moins', au moins, la sortie 'non O' a 'D', la sortie 'O'  au relais et  a l'entre 'CP'  l'impultion que l'on envoie. Ansi on envoit deux impultions successives pour actionner le relais, et deux impultion pour le fermer.

Documentation :

Bascule D :  www.philipslogic.com/products/hef/pdf/hef4013b.pdf
Demutiplexeur :  www.ir.hiof.no/~aaj/Datateknikk/Datablad/74hc138.pdf -

Explication de la  logique du demutiplexer :
 

3 broches a + 5v controle 8 sorties.

entre 1

entre 2

entre 3

sorties

0

0

0

1

1

0

0

2

0

1

0

3

0

1

1

4

0

0

1

5

1

0

1

6

0

1

1

7

1

1

1

8


 

exemple : 2.c

/* dans cet exemple on active ou desactive le relais  n°2 il passe par un demultiplexeur il sera actionner par la valeur "1", pour activer la bascule on va faire outb(1,BASEPORT) puis outb(4,BASEPORT) la valeur 4 peut etre n'importe laquel de preference une sortie que l'on utilise pas. */

#include <stdio.h>
#include <asm/io.h>
#include <unistd.h>

#define BASEPORT 0x378 // adresse du port
void main()
{
 if(ioperm(BASEPORT,3,1)){perror("ioperm");exit(1);}
   {
     outb(1,BASEPORT);
     outb(4,BASEPORT);
     }
}
 

Encore mieux :

Ce montage electronique a base de demultiplexeur et de bascule est un peu fastidieux (mais permet le control d'un grand nombre de sortie 64, 256 etc ...), c'est pourquoi il y a le "82C55A" qui est un cicuit integre a 40 broche qui gere 24 entre ou sortie (je n'ai pas encore tester). Doc. : 

Et encore beaucoup mieux utiliser un microcontrolleur.  http://www.jmb-electronique.com/Microcontroleur.htm

Haut

Montage :

Pour commencer une  alimentation d'ordinateur est un bon debut car de  bonne qualité en 12v, 5V.
par la suite nous verons a faire une alimentation dans une armoire electrique.

Port parrallele : se procurer 1 prises femelles et 2 prises males , soudez au minimum  les broches 2 a 9 plus une masse broche 25. On soude la broche 2 male faire la broche 2 femelle et ainsi de suite sans en inverser, le mieux est de souder toutes les broches, ca servira, ainsi que le blindage si il y en a , à la prise.
 

Haut

Programations :

La programation ce fait à deux niveaux : en premier on  fait les programmes des commandes en C, la deuxième on programme dans le temp avec cron.
Pour chaque action on fait un programme.

     
    Programmation en C :
    Le tableau ci-dessous explique la structure d'un programme, le programme en lui même est en vert.
    Remarque : Il y a d'autre manière de le faire.

    Commentaire

    Programme

    Parametre

    Entête qui contient les bibliotheque.

    #include <stdio.h>
    #include <asm/io.h>
    #include <unistd.h>

    asm/io.h,  obligatoire pour l'ouverture et la fermeture du port

    Definition de l'adresse du port parralelle.

    #define BASEPORT 0x378

    generalement 0x378, mais aussi 0x3bc et 0x278  et pour une carte pci avec des ports supplementaires 0xb401  et 0xd001

    Debut du programme avec la demande d'autoristion a la machine pour l'acces au port.

    int main (void)

    {

    if (ioperm(BASEPORT,3,1)){perror(« ioperm »); exit;}

     

     avec 0xb401 et 0xd001 on remplace ioperm par iopl :
    (iopl(3)){perror(« ioperm »); exit;}

    On solicite une broche avec outb x est une variable que l'on remplace par ca valeur


    outb(x,BASEPORT);

    Valeur que peut prendre  x

    broche

    relais

    bit = x

    2

    1

    1

    3

    2

    2

    4

    3

    4

    5

    4

    8

    6

    5

    16

    7

    6

    32

    8

    7

    64

    9

    8

    128

    ex :2 et 6

    1 et 5

    9 (1+8)

    Durée de l'action, (facultatif)

    sleep (4);

    sleep (n) n est en seconde
    usleep (n) n est en cent millieme de seconde

    Fermer toutes les broches (facultatif)

    outb(0,BASEPORT);//arret general

    les "//" indique le commentaire

    Fin du programme

    }

    Haut

    Exemple de programme avec l'editeur Emacs (Emacs a un mode C et bien d'autres).

    #include <stdio.h>
    #include <asm/io.h>
    #include <unistd.h>
    #define BASEPORT 0x378
    int main (void)
    {
    if (ioperm(BASEPORT,3,1)){perror(« ioperm »); exit;}
    outb(128,BASEPORT); // relais n°8, soit la broche 9 au bit 128.
    sleep(45);//temps 45 secondes
    outb(0,BASEPORT); // on ferme tout
    }

    on enregistre, puis on compile sur une ligne de commande  :
    #:gcc Monprogramme.c -oMonprogramme -O (la lettre o).

Haut

*******

Programmer cron







Cron permet de programmer des tâches.
 voir les sites http://www.mosx.net/trucs/cron.shtml  , il est dédié a mac mais c'est pareil, http://www.chez.com/bsdlibre/man5/crontab.5.html  de BSD , la page de man et man  5 crontab et cron.

Dans une console lancer crontab -e
Quand c'est lancer vous êtes dans vi (l'éditeur)
Tapez  "Echap" puis ":" puis "i"
nous sommes en mode INSERT

Ecrire :

#(dans cet exemple les fichiers sont enregistrés dans /home)
#lumiere à 6h05 tout les jours
5 6 * * * /home/Lumiere
#arrosage à 9h05 tous les jours
5 9 * * */home/Arrosage
#ventilation toutes les 15minute de 10h à 20h
*/15 10-20 * * * /home/Ventilation
puis 'Echap'
puis ':wq'
 

La programation est écrite dans cron, pour verifier tapez crontab -l pour effacer crontab -r.

Arrosage :

Pour faire de l'arrosage automatique on utilise des electrovannes il en existe plusieurs sortes :

- Electrovanne de machine à laver pas cher quand on les recuperes.

- Electrovanne d'arrosage en 12v ou 24v à impultion ou en alimentation continu.
- 24 VAC continu (nelson) marque Irritrol par exemple 60hz, 0.4A au demarage puis 0.2A.
- 24 VAC impulsion
- 12 VDC impulsion ; marque par exemple aquanet netafim  à inversion du courant une impultion de 250 mA pendant un minimum de 50ms pour ouvrir , 50ms pour fermer pour fermer.

Generalement il faut que les electrovannes soit sous pression pour fonctionner.

exemple de programme avec une durée determinée :

/* ce programme active une electrovanne, on l'appel avec un parametre qui est la duré de l'arrosage en seconde #arrosage 30   ; arrose 30 secondes. noter qu''il y a encore une bascule 'D'*/

#include <stdio.h>
#include <asm/io.h>
#include <unistd.h>
#define BASEPORT 0x278

int main(int argc, char *argv[])
{
int dure;
 if(ioperm(BASEPORT,3,1)){perror("ioperm");exit(1);}
{
    outb(140,BASEPORT);
    outb (129,BASEPORT);
    dure=atoi(argv[1]);
    sleep(dure);
    outb(140,BASEPORT);
    outb (129,BASEPORT);
}
}

Haut

Acquisition de données :

Plusieur systeme possible.
Nous allons d'abord voir la broche 11 qui permet de lire un bit à la fois (le paper out des imprimantes à aiguille).
On conecte un contact a la broche 11, ce contact quand il est effectif conecte la broche 11 a la masse (broche 20 a 25).
 

Exemple de programme :

/* ce programme lit l'etat du port // si on a la valeur 255 la broche 11 est connecte si on lit 127 elle n'y est pas */

#include <stdio.h>
#include <asm/io.h>
#include <unistd.h>
#define BASEPORT 0x278
void main()
{
int lu;
 if(ioperm(BASEPORT,3,1)){perror("ioperm");exit(1);}
lu=inb(BASEPORT+1);
printf(" valeur lu : %d ",lu);
}

C'est simple, ainsi on peut faaire un detecteur de niveau d'eau pour la pluie., si d'autre broches sont connecter les valeur lu seront differentes.

    Haut

    Thermometre :

    Thermometre electronique sans carte carte d'acquision analogique/numerique.

    Généralement un thermometre pour pc a besoin d'une carte d'acquisition numérique, mais étant donné le prix élevé (300$ ca), j'ai mis au point un système qui n'en a pas besoin., mais ce n'est pas aussi efficace.  voir cette page :  ancien thermometre mais bon c'est depasser.
    J'utilise actuelement la sonde numerique sht71 de Sensirion on vera plus tard.

    Autre  types de sonde  :
    - La thermistance est un composant qui a une resistance qui varie avec la temperature.
    - Le LM35 de National est un composant qui ressemble a un transistor, l'intensité de
    sortie varie de 10mv par degre, c'est simple.
     
     

    Hygrometre :

    C'est un gros probleme que de mesurer l'humidité, les composants ne sont pas facile a obtenir et sont onèreux, et pas forcement tres juste, de plus il ont besoin d'un convertisseur analogique/numerique du type "aoc0800"

    La encore j'utilise la sonde sht71


    Le montage simpliste d'une sonde sht directement sur le port parralele, et meme pas de pull up ! fonctionne a grande vitesse ou tous doucement. on pourrait communiquer avec en appuyant sur un bouton comme en morse. L'important c'est la clock : + ou -, clock, + ou -, clock ....

  • Haut

    Autre mesures :

    Bien d'autre mesure peuvent etre réalisées voici je que je pense qu'il faut faire (je ne suis pas surs !!):
    Humidité du sol : mesure de la resistance et un convertisseur A/N.
    Niveau d'eau : sonde specifique avec un convertisseur A/N.
    Gaz carbonique : sonde specifique avec un convertisseur A/N.

    Haut
    La sonde SHT71

    La grande innovation, j'arrete de jouer c'est serieux :
    C'est une sonde numerique à 4 broches et 4mm de cote. Elle donne la mesure de l'humidite, la mesure de la temperature en 8 a 14 bits et avec precision. Elle est etalonée et possède un registre.
    On accede au information par le biais d' une broche entre/sortie, on envoie un message ponctu par une horloge, et la sonde repond super !.

    Le prix : 20$ us, j'en ai acheter 2  aux USA avec les taxes frais de transport, frais de preparation de douanes, taxe sur les frais etc etc 120$ canadiens, sans commentaire !!

  • J'ai quand meme reussi a en avoir pour moins cher, sans passer par ups.
     

    Montage :

    Tres simple : on utilise les broches 14, 15, 16 du port //; 14 'data out' relier par un diode a 15 'data in', 16 clock, de plus une resistance 4.7kohm de data au plus, c'est ce que l'on appelle un pull-up resistor pour vider rapidement le fil quand il passe a zero, et un condensateur entre le + et le -. l'alimentation maximum 5v.
    differentes documentations sur le sujet :
    http://www.sensirion.com/en/download/humiditysensor/SHT1x_SHT7x.htm

    Haut

    Quelques explications :

    La sonde a quatre broches : plus, moins, data (in et out), clock.

    Les broches 14, 15 et 16 sont des broches de control du port parrallele, je vous invite a vous instruire sur ce sujet. Si l'adresse du port // est 0x278 c'est l'adresse des 8  bits d'action, 0x279 sera la lecture, 0x27a l'adresse du control.

    Afin d'avoir un data bidirectionnel (in et out) on utilise 2 broches 14 pour le 'out' et 15 qui 'snif' 14 pour le 'in', 16 fera la clock.

    Data : on envoie des bits (0 (0volt) ou 1 (5volt) ) ou on les lit, les messages qui sont des serie 8 bits.
    exemple : 00000011 lire la temperature, 00000101 lire l'humidité.

    Clock : chaque bit est valide par un coup d'horloge, on envoie un zero, on envoie un coup d'horloge (+5v) on attend (10ms par exemple) et suivant.

    Ack = acknoledgement = accusé de reception : quand on envoie un message au bout de 8 bit la sonde doit faire chuter a zero le data en signe de comprehension, quand la sonde envoie un message on doit mettre a zero le data apres 8 bit en signe de bonne reception.

    Haut

    Exemple de programme :

    /* lit l'humidite 25 jan 03 */
    #include <stdio.h>
    #include <asm/io.h>
    #include <unistd.h>

    #define BASEPORT 0x278
    #define CONTROL 0x27a
    #define CLOCK outb(4,0x27a);LIRE
    #define DATA outb(2,0x27a)
    #define CLOCKDATA outb(6,0x27a);
    #define REPOS outb(0,0x27a);
    #define LIRE lu=inb(BASEPORT+1)
    #define WAIT usleep(1000)

    int main(void)
    {
    float h;
    unsigned int i=1;    /*broche*/
    unsigned int r=0;    /*reponse ?*/
    unsigned int j=0;    /*boucle*/
    unsigned int c=0;
    unsigned int lu=127;      /*lecture de broche*/

    /* outb(2,CONTROL);   data  est bas */
    /* outb(4,CONTROL);   clock  est haut */
    /* lu=inb(BASEPORT+1);  lire data */
    /* par defaut data est haut, clock est bas */

     if(ioperm(BASEPORT,3,1)){perror("ioperm");exit(1);}
     {
     WAIT;REPOS; while (j<=8)
    {   /*reset*/
           CLOCK; WAIT;  REPOS;  WAIT;   j++;
         }
     }
     {   /*start*/
       REPOS; WAIT; CLOCK; WAIT; CLOCKDATA;
       WAIT;  DATA;  WAIT;  CLOCKDATA;
       WAIT;  CLOCK;  WAIT;  REPOS; WAIT;
     }
     {//message
       DATA;   WAIT;   CLOCKDATA; /* a2 */  WAIT;  DATA;
       WAIT;  CLOCKDATA; /* a1 */
       WAIT;  DATA;  WAIT; CLOCKDATA; /* a0 */  WAIT;
       DATA;  WAIT;   CLOCKDATA; /*c4*/  WAIT;
       DATA;  WAIT;  CLOCKDATA; /*c3*/  WAIT;
       DATA;  REPOS;  WAIT;  CLOCK; /* c2*/  WAIT;
       REPOS;  DATA;  WAIT;  CLOCKDATA; /* c1*/  WAIT;
       DATA;  REPOS;  WAIT;  CLOCK; /* c0*/  WAIT;
       REPOS;  WAIT;  LIRE;  CLOCK;   WAIT;  REPOS;  WAIT;  LIRE;
     }
     {  /* attente de reponse*/
       while (lu==111) {  lu=inb(BASEPORT+1);  }
     }/* lecture*/
    j=0; c=1;
            CLOCK; /*0*/    WAIT;    REPOS;    WAIT;   CLOCK; /*0*/
           WAIT;   REPOS;   WAIT;  CLOCK; if(lu==111)j=8196;
           WAIT;  REPOS;   WAIT;  CLOCK; if(lu==111)j=j+4096;
           WAIT;  REPOS;  WAIT;  CLOCK; if(lu==111)j=j+2048;
           WAIT; REPOS;  WAIT;   CLOCK; if(lu==111)j=j+1024;
           WAIT;  REPOS;  WAIT;  CLOCK;  if(lu==111)j=j+512;
           WAIT;  REPOS;  WAIT;CLOCK;  if(lu=111)j=j+256;
    WAIT;DATA;WAIT;CLOCKDATA; WAIT;REPOS;WAIT;c=1; CLOCK; if(lu==111)j=j+128;  WAIT;
           REPOS;    WAIT;  CLOCK;  if(lu==111)j=j+64;  WAIT; REPOS; WAIT;
           CLOCK;  if(lu==111)j=j+32; WAIT;  REPOS;  WAIT;  CLOCK;  if(lu==111)j=j+16;
           WAIT;  REPOS;   WAIT;  CLOCK;  if(lu==111)j=j+8;  WAIT;
           REPOS;   WAIT; CLOCK;  if(lu==111)j=j+4; WAIT;  REPOS; WAIT;
           CLOCK;  if(lu==111)j=j+2;  WAIT;   REPOS;   WAIT;CLOCK;  if(lu==111) j=j+1;
    h=-4.0 + 0.0405*j - 2.8*j*j/1000000; printf(" %.2f \n",h); WAIT;REPOS;
    }

    Haut
     

    Afficher une courbe :
    avec le logiciel traceur de courbe gnuplot

    exemple de script  avec données enregistrer dans donne.data, la courbe est mise a jour toute les minutes:

    set title "Courbe de l'humidite et de la temperature"
    set grid
    set size 0.95,0.95
    set ylabel "T(°C)";plot [a:a+450] [5:30] 'donne.data' using 1 title "temperature" with lines
    set y2label "H(%)"; set y2tics;set y2range [30:80];replot
    'donne.data' using 2 axes x1y2 title "humidite" with lines
    a=a+1
    pause 59
    reread


     

    Haut

    Alimentation electrique :

    Il nous faut 3 niveau d'electricite :

    5v : c'est la partie logique ou electronique. Il faut du courant stable filtre regule.

    12v ou 24v : c'est la partie puissance, c'est le courant qui agit sur les relais et les elctrovannes. 12v permet des relais jusque 5A, 24v alimente les ectrovannes et des relais jusque 30A.

    110v ou 220v : alimentation des appareils electriques, attention a la consommation
    des lampes et du chauffage l'amperage peut etre dangeureusement elever il faut respecter absolument les normes.
     


    Un boitier pour les courants fort.

    Celui ci peut avoir deux relais 12A 240V,

    ce qui permet d'utiliser 2000W facilement.

    Pour arriver a respecter les normes j'ai separé les courant forts du systeme des courants faibles, puis chaque application a son relais qui se place entre la prise et l'appareil.

  • Haut

    ******  Note sur les relais :  *********

    Il en existe de nombreuse sortes, quelques parametres il faut sur-evaluer l'ampérage en cas d'usage intensif :

    Le voltage de la bobine 5v, 12v, 24v.
    L'amperage supporté par les contacts 1A, 3A, 5A, 10A, 30A.
    Le nombre de contacts 1 à 3 sorties.
    A bascule  (le courant passe par defaut par un coté et par l'autre quand la bobine est
    solicitée)ou interupteur (le courant passe que quand la bobine est solicitée).
    La resistance de la bobine c'est tres important. En théorie une bobine a une resistance nul, mais il faut lui en donnée une car dans ce cas c'est un court circuit. Certain relais l'on inclus d'autres non, il faut le verifier.
     

    Communication avec l'exterieur :
    Grace au fait que l'on utilise un ordinateur, on peut communiquer avec celui ci a distance, et ainsi etre au courant des événements et agir s'il le faut. On peut recevoir des mails, se connecter via l'internet, par telephone ou par sms.
     


  • Conclusion :
    Naturelement, c'est beaucoup de travail, il serait interressant de developper encore plus, notament les acquisition diverses de données et porté sur d'autre plateforme.