Création d'une carte d'interface 21 sorties / 16 entrées

photo
Le but est d'obtenir une carte créant une communication entre l'ordinateur et le monde réel (du virtuel au physique).
Exemple quand vous tapez sur votre clavier, vous transformez des données physiques caractérisées par l'action de vos doigts sur les touches en des données virtuelles traitées par l'ordinateur. Un carte de domotique doit permettre de recevoir des informations en provenance de n'importe quels types de capteurs (sonore, proximité, humidité, luminosité,...) afin que l'ordinateur puisse analyser ce qui se passe dans le monde extérieur et éventuellement envoyer une réponse qui peut soit être une action de l'ordinateur (exécuter un programme, un son...) soit d'un système électronique à part (contrôle de moteur, fermeture d'un circuit électrique...).

Des cartes pareilles existent sur le marché, mais leur coût est bien souvent trop important pour le portefeuille du bricoleur... Le but est donc d'en construire une nous même... La carte qui va être proposée a été développée par mes soins et testée 100% fonctionnelle. Son coût varie entre 7€ et 10€ suivant le magasin où vous achetez vos composants (plaque à graver comprise)

La première partie dans le développement est de choisir le port de l'ordinateur par lequel il est possible de communiquer. 3 choix s'offrent alors à nous. Le port série, l'usb et le port parallèle. Le port série comme son nom l'indique envoie et reçoit des données envoyées en série, l'usb nécessite une puce pour traiter les données mais bénéficie d'une vitesse très importante. Le port parallèle permet d'envoyer des données en parallèle, ce qui signifie que vous pouvez envoyer un octet (8 bit) à la fois sur les 8 broches data du port parallèle. Comme le port // est aussi facile à programmer et qu'il est présent sur tous les ordinateurs (à l'époque de l'article), le choix s'imposa.

La suite du développement consista à trouver un composant pouvant conserver une valeur qui lui est envoyée. Pour cela, j'ai trouvé le 74hc574 (voir datasheet). Ce composant permet de basculer 8 bit sur 8 broches "mémoires". Ainsi, il devient possible de dupliquer les 8 sorties data via plusieurs 74hc574... J'ai disposé 3 circuits qui donnent un total de 24 sorties. Chaque circuit met en mémoire les données data lorsqu'il reçoit une impulsion sur ça broche "clock". Donc chaque composant est connecté aux broches Data et à une autre broche qui lui est personnel et qui active la mise en mémoire.
Le schéma ci-dessous qui est le schéma interne du 74hc574 répété à chaque entrée de celui-ci, révèle une bascule D commandée par l'entrée CLK avec le niveau choisi sur la broche D.
74hc574
La dernière étape, consiste à trouver un composant pouvant envoyer 16 entrées en série... Explication: le port parallèle ne possède que peu d'entrée, du moins, un nombre inférieur à 16, donc il faut envoyer chaque entrée une à une. Au début j'ai pensé à utiliser un 16f84, mais ça augmenterait considérablement le prix de construction et la complication du système. J'ai donc trouvé le 74hc151 qui permet d'afficher l'entrée désirée en lui envoyant le code de celle-ci... (voir datasheet). Pour envoyer le code, je me suis donc servi de 3 broches sorties (donc 24-3 = 21 sorties restantes). Le schéma ci-dessous montre la table de fonction du composant, suivant les entrées CBA, la valeur présente sur Y est D0, D1, ... D7
74hc151table

Schéma de la carte d'interface

Voici la version du schéma pour le mode simulation, les entrées des composants ont été remplacées par des simulateurs d'état logique (soit 1, soit 0). Par ce schéma on peut comprendre facilement le rôle chaque composant. La version source du schéma permettant la simulation sous proteus est proposée dans les téléchargements du projet.
schemalog
Le schéma est très simple, 3 74hc574 reçoivent un octet en provenance des sorties « data » du port parallèle, la broche « clock » de chaque circuit est reliée à une sortie différente du port parallèle, suivant quelle broche « clock » sera activée, un circuit basculera les données data dans sa mémoire (q0->q7) et les conservera jusqu’au prochain coup sur l’horloge. Nous pouvons ainsi contrôler 21 sorties.

Les entrées sont traitées par 2 74hc151. Suivant les données envoyées aux broches ABC de ces composants via 3 sorties du troisième circuits 74hc574 (d’où qu’il n’y a que 21 sorties au lieu de 24), la valeur d’une des entrées passera sur la broche Y et son inverse sur /Y. Les 2 Transistors BC547 permettent de faire passer les entrées du port parallèle à l’état 1 ou 0. Le circuit U4 est connecté sur la sortie inversée car il est connecté à une entrée inversée sur port parallèle. L’alimentation n’est pas dessinée dans le circuit mais bien comprise dans le circuit imprimé via un 7805.
schema
La carte peut-être alimentée par une pile 9V, ou par une alimentation externe, attention, dans le data-sheet du 7805 on remarque que la tension maximale imposable au borne du composant est de 36Volt... Il est donc pas question de lui imposé plus ou de le relier directement au 220Volt (Ce qui est tout à fait normale... surtout que celui-ci est en alternatif, mais je préfère prévenir...)
alim

Programmation de la carte

La dernière étape du projet est la création du programme informatique permettant de contrôler la carte. Pour simplifier la programmation, j'ai développé une librairie qui permet de contrôler indépendamment chaque port via une fonction d'ouverture et de fermeture mais aussi de lire les entrées (heureusement!). Pour que les programmes soient opérationnels sous tous les Windows, j'ai utilisé une librairie de contrôle du port parallèle. Cette librairie est gratuite, il suffit de la copier avec la librairie de contrôle de la carte et l'exécutable de votre programme (donc pour que votre programme soit opérationnel, il faut la librairie de la carte, celle du port // et l'exécutable de votre programme).

L'exemple que je vais montrer à été programmé en Delphi, mais il est clair que la traduction des commandes n'est pas une chose difficile. La première étape est d'implémenter la dll dans le programme, de cette manière: Dans la zone implémentation mettez:

implementationfunction setup(port, temps:integer):integer;Stdcall;external 'Driver.dll' name 'setup';
function open(porte:integer):integer;Stdcall;external 'Driver.dll' name 'open';
function closed(porte:integer):integer;Stdcall;external 'Driver.dll' name 'close';
function readin(porte:integer):boolean;Stdcall;external 'Driver.dll' name 'readin';
function setdown():integer;Stdcall;external 'Driver.dll' name 'setdown';


La fonction 'setup' est nécessaire pour configurer, elle doit être appelée avec les bons paramètres à chaque exécution du programme. Le premier paramètre 'port' est l'adresse du port parallèle, par défaut celui-ci est 888 mais peut varier suivant si vous avez plusieurs port... Le paramètre 'temps' permet de configurer le temps que la librairie doit attendre avant d'envoyer une seconde information sur le port parallèle ainsi que le temps de l'impulsion à envoyé. Setup renvoie "1" si tout à bien été initialisé mais "0", s'il y a un problème. En effet, si vous avez un lecteur zip ou autres périphériques, le système lit continuellement le port et écrit dessus, pour empêcher la carte de malfonctionner à cause de ça, la fonction setup vérifie que l'OS n'écrit pas sur le port. Pour cette raison, l'initialisation prend un peu plus d'une seconde.

La fonction 'open' permet d'ouvrir une porte (la passer à l'état haut). Le paramètre porte est le numéro de la porte à ouvrir 1 à 21. Si vous essayez d'ouvrir deux fois la même porte, rien ne se passe... J'ai optimisé la librairie ;)

La fonction 'closed' est tout simplement l'inverse de la fonction open. La fonction s'appelle 'closed' uniquement parce qu'une fonction 'close' existe déjà en delphi.

La fonction 'readin' permet de lire une porte, elle renvoie 'true' si la porte est à l'état haut et 'false' si la porte est à l'état bas. Encore une fois, si vous lisez 2 fois la même porte d'affiliée, la deuxième fois sera beaucoup plus rapide que la première fois, la carte étant déjà configurée sur la bonne porte, il ne suffit plus que de lire.

La fonction 'setdown' est l'inverse de 'setup', elle permet uniquement de fermer toutes les sorties de la cartes, elle peut-être utilisée en cours de fonction tout comme à la fin de l'utilisation de la carte. L'utilité est surtout d'être sur que tout est coupé à la fermeture du programme. Si vous utilisez cette fonction en cours de programme, vous n'êtes pas obligé de refaire le setup après, elle n'efface pas les données initialisées.

Je distribue un programme démo, ça ne signifie pas qu'il y a une version complète payante, démo signifie démonstration de programmation. Pour montrer le fonctionnement des fonctions. Voir téléchargement.

Pour ceux qui désirent programmer en C# le driver s'utilise en créant la classe suivante:

using System.Runtime.InteropServices;
class domocarte {
[DllImport("Driver.dll", EntryPoint = "setup")]
public static extern int setup(int port, int temps);
[DllImport("Driver.dll", EntryPoint = "open")]
public static extern int open(int porte);
[DllImport("Driver.dll", EntryPoint = "close")]
public static extern int closed(int porte);
[DllImport("Driver.dll", EntryPoint = "readin")]
public static extern bool readin(int porte);
[DllImport("Driver.dll", EntryPoint = "setdown")]
public static extern int setdown();
}


Aucun commentaire:

Enregistrer un commentaire