|
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.
|
|