Arduino Mega2560 : domotique et alarme

Bonsoir, J'étudie la mise en oeuvre d'un système alarme/domotique sur base Arduino.

Au départ, je pensais piloter l'ensemble de la maison via 1 Arduino Mega2560 et un bus I2C (capteurs DS1820, electrovannes, etc...). Du fait des risques d'instabilité (longueur du bus I2C) je pars maintenant sur : - une carte Mega2560 par pièce (gestion capteurs et relais de la pièce). - l'ensemble des Mega2560 connectées entre elles. - une des cartes Mega2560 connectée à mon PC. - paramétrage et monitoring via le PC, plus tard peut-être un clavier + LCD dans chaque pièce

Choix du réseau. 1) [u]Ethernet[/u] http://www.watterott.com/en/Arduino-Ethernet-Shield 33 ? pour cet Arduino Ethernet-Shield Carte compatible Mega2560 Utilisation de la librairie standard Ethernet

2)[u]RS485[/u] http://www.dfrobot.com/index.php?route=product/product&path=35_39&product_id=264 15? environ ou http://www.futurlec.com/Mini_RS422.shtml 4? pour cette mini board Utilisation de la librairie standard serial

=> Est-il vrai que le bus RS485 se pilote via la librairie serial ? => Si oui, peut-on adresser chaque carte facilement ? => Quel est l'avantage de l'Ethernet vs RS485 en utilisation locale ?

Interface avec le PC => Via qu'elle interface puis-je connecter Arduino à mon PC ? => Quel langage utiliser pour créer un écran de visu / paramétrage sympa ?

Interruptions Pour la partie alarme, j'ai tendance à vouloir traiter l'intrusion par interruption. => Est-ce possible avec le langage Arduino ?

D'avance merci pour vos retours.

PS : Bien sûr, toutes vos remarques et retours d'expériences sont les bienvenues !

Up !...

=> Est-il vrai que le bus RS485 se pilote via la librairie serial ?

à priori oui. Un exemple: http://gdallaire.net/blog/?p=39

=> Si oui, peut-on adresser chaque carte facilement ?

j’imagine que oui ?

=> Quel est l’avantage de l’Ethernet vs RS485 en utilisation locale ?

mon avis:

RS485: c’est pas cher, les données à échanger ne doivent pas être importante, il y a qu’1 maitre et des esclaves (pour que 2 esclaves communique entre eux, c’est le maitre qui joue les intermédiaires), le bus oblige à faire passer un réseau en “série”.

Ethernet: c’est plus cher, c’est plus flexible, plus ouvert, plus évolutif (cf. xPL/xAP pour la domotique), ça nécessite un routeur au delà de 2 devices sur le réseau (qui du coup sera en étoile), chaque arduino peut embarquer son propre webserver pour la config par exemple.

Pour ma part, j’ai fait le choix du réseau Ethernet. Pour 15?, tu peux trouver des shields ethernet à base de ENC28J60.

=> Via qu’elle interface puis-je connecter Arduino à mon PC ?

USB pour le programmer.

=> Quel langage utiliser pour créer un écran de visu / paramétrage sympa ?

ça dépend ce que tu veux faire en fait. Tu peux utiliser des pages web via un serveur php ou directement embarqué dans l’arduino, ou bien un logiciel plus orienté domotique (domogik par ex)…

Pour la partie alarme, j’ai tendance à vouloir traiter l’intrusion par interruption.
=> Est-ce possible avec le langage Arduino ?

oui, tout est possible avec arduino. Mais quel est l’intérêt ? tu n’as que quelques interruptions matériels disponibles.

Gromain

RS485 avec lib serial
OK. Il reste que je ne vois pas bien comment on définit l’ID de chaque carte, et comment on n’adresse que la carte correspondant à l’ID… Je vais continuer à chercher.

Ethernet vs RS485
Effectivement, au-delà de 2 cartes, il faut un hub ou un switch (pas un routeur). Aïe, je crains que mes gaines encastrées correspondent à une topologie série, donc RS485 obligatoire… Je revérifie, d’autant que j’ai déjà du câble torsadé 3 paires de passé … Le coût serait plus élevé en Ethernet ici cause shield V2 obligatoire (seul Arduino Mega2560 compatible) mais je suis prêt à investir, y compris dans xPL.

Dialogue Arduino <> PC
Je parle hors programmation, pour le dialogue continu PC <> carte. Ne vaut-il pas mieux une une liaison RS232 (ou RS485) pour être bien “séparé” de la partie programmation via USB ? (Pas bien clair pour moi en fait).

Langage pour programmer l’interface.
Je veux pouvoir disposer de plusieurs formaulaires pour afficher :

  • Statuts capteurs et électrovannes
  • Températures et courbes (24h, 1 semaine…)
  • Les plages de consigne
    etc…
    Je pourrais le faire en VB, mais je suppose qu’il y a … mieux (nb : je suis débutant/intermédiaire en prog).

Gestion par interruption
Je me suis mal exprimé. Je voulais parler de l’interruption RTI qui permet de lancer une routine à intervalle régulier. C’est de cette manière que ma carte à 68HB912 scrutait le statut des entrées (domotique et alarme).

PS : super sympa ce forum :wink:

Vérification faite, je suis forcé d'oublier le mode Ethernet à cause d'un câblage série.

Si tu dis qu'en RS485 il faut 1 maitre et n esclaves, je ne vois pas comment implémenter ma fonction "alarme". En effet, en cas d'intrusion sur l'entrée d'une carte esclave, comment cette dernière pourra-t-elle remonter l'info vers la carte maitre ? Et si je demande à la carte maitre d'interroger régulièrement toutes les cartes esclave, je vais saturer le réseau.

Comment faire :o

Avec l'Ethernet tu peux imposer le n[ch730]IP de chaque carte, il me semble que ça se trouve dans le setup.

RS485 avec lib serial
OK. Il reste que je ne vois pas bien comment on définit l’ID de chaque carte, et comment on n’adresse que la carte correspondant à l’ID… Je vais continuer à chercher.

pour moi, le maitre envoi d’abord une commande avec l’adresse de l’esclave qu’il veut joindre. Chaque esclave reçoit cette commande en même temps et se tait si l’adresse contenu dans la commande n’est pas la sienne. L’esclave concerné envoi un message de réponse.

Dialogue Arduino <> PC
Je parle hors programmation, pour le dialogue continu PC <> carte. Ne vaut-il pas mieux une une liaison RS232 (ou RS485) pour être bien “séparé” de la partie programmation via USB ? (Pas bien clair pour moi en fait).

c’est à toi de voir. Mais je ne pense pas que ce soit utile. Par l’USB il te faudra neutraliser le reset automatique. Par un liaison série, il faudra utiliser un adaptateur de niveau (MAX232)

Langage pour programmer l’interface.
Je veux pouvoir disposer de plusieurs formaulaires pour afficher :

  • Statuts capteurs et électrovannes
  • Températures et courbes (24h, 1 semaine…)
  • Les plages de consigne
    etc…
    Je pourrais le faire en VB, mais je suppose qu’il y a … mieux (nb : je suis débutant/intermédiaire en prog).

Hormis si tu veux tout faire toi-même (hardware/software) pour avoir un système domotique “kafifi”, je te conseille vivement de t’intéresser au peu de standard de la domotique. Au début je pensais faire tout à ma sauce, puis je me suis vite rendu compte que je faisais un système complétement fermé, que j’aurai été seul à pouvoir maintenir, et encore…
Je m’oriente désormais vers une solution bcp plus ouverte. Je développe le hardware et software de l’arduino, que je fais communiquer avec un PC en xPL. Dans ce PC, j’y met des outils dédié domotique pour faire de l’archivage, créer des courbes, créer des pages d’interface… :wink:

Et si je demande à la carte maitre d’interroger régulièrement toutes les cartes esclave, je vais saturer le réseau.

Je ne pense pas que tu vas saturer le bus si le maitre envoie juste une commande sur un ou deux octets pour savoir si l’esclave a quelque chose à dire.

Comment faire

y aller à l’économie en déterminant un protocole de communication économe en octet. Pour la première version de mon projet domotique, j’utilise des messages d’une dizaine d’octet, chaque octet ayant sa signification, un peu comme sur le modéle du projet Domocan à base de PIC et de CAN. C’est très efficace.
Le bus idéal pour ça est le bus CAN, car plus de maitre ni d’esclave, chaque message est reçu par tous et c’est à chacun de faire le tri. Mais au niveau arduino, il n’y a rien eu vraiment de fait avec du CAN.

Gestion par interruption
Je me suis mal exprimé. Je voulais parler de l’interruption RTI qui permet de lancer une routine à intervalle régulier…

ok, c’est tout à fait possible.

ma carte à 68HB912 scrutait le statut des entrées (domotique et alarme).

tu as quoi actuellement comme installation ?

Gromain

Avec l'Ethernet tu peux imposer le n[ch730]IP de chaque carteil me semble que ça se trouve dans le setup.

oui, c'est dans le setup. Mais rien n'empêche de redéfinir l'IP à la volée, ou d'utiliser la lib DHCP.

A priori, il est tout a fait possible d'avoir plusieurs maitres sur un reseau RS485. le bus EIB en est un exemple. MAIS, tu devra implementer toi-meme toute la gestion de collision de paquet, le réenvoi en cas de non reception... etc

@moustic,
Je me sens incapable d’implémenter un protocole. Trop lourd…

@Jean-François,
Merci mais impossible d’utiliser la solution Ethernet,à cause du câblage série…

@Gromain,
En ligne avec le principe que seule la “bonne carte” répondra. Je cherche ou fixer cette adresse “ID”…

Je pensais faire discuter PC <> Arduino via un convertisseur RS232 <> RS485 isolé, mais j’ai un problème : comment faire pour interroger ma carte maitre RS485 via le PC puisque ce dernier doit être esclave ? Un esclave ne peut pas initier de conversation… Or à partir de mon PC, je souhaite prendre la main pour paramétrer les cartes (températures de consigne etc…)

Hormis si tu veux tout faire toi-même (hardware/software) pour avoir un système domotique “kafifi”, je te conseille vivement de
Bien sûr ! Je ne fais que si je ne trouve pas à mon gout. Exemple : je n’aime pas le look de Domogik, on dirait un jouet …

Je m’oriente désormais vers une solution bcp plus ouverte. Je développe le hardware et software de l’arduino, que je fais communiquer avec un PC en xPL. Dans ce PC, j’y met des outils dédié domotique pour faire de l’archivage, créer des courbes, créer des pages d’interface… Wink
+1 c’est exactement ce que je cherche. As-tu d’autres softs à communiquer ?

Dommage pour le CAN…

tu as quoi actuellement comme installation ?
L’ancêtre de l’Arduino :wink: Une carte à base de 68HC912 Motorola développée avec un copain il y a 15 ans …
Le pcb embarque tout ce dont nous avions besoin : RS485, connecteurs avec E/S, connecteur pour clavier, LCD… Quelques libs : LCD, RS485, KEYPAD,…
Mon soft intègre alarme + domotique mais je n’ai pas utilisé le RS485. Projet en stand-by par manque de temps en fait. Et à 2 users, impossible d’avoir la force de frappe d’une communauté entière !
Je cherche aujourd’hui une carte “vivante” avec un bon support hard et soft, des échanges, etc… Arduino est parfait !

PS : quelqu’un peut me dire ou le “quote” sur ce forum ? Je ne trouve que le “reply”…

Je cherche ou fixer cette adresse “ID”…

cet ID doit être unique, donc tu peu le stocker une fois pour toute dans l’eprom de chaque arduino et ton soft ira lire cet ID au démarrage. Ou bien tu peux faire un codage “hard” avec des switchs d’adressage sur 2 ou 3 entrées.

Je pensais faire discuter PC <> Arduino via un convertisseur RS232 <> RS485 isolé, mais j’ai un problème : comment faire pour interroger ma carte maitre RS485 via le PC puisque ce dernier doit être esclave ? Un esclave ne peut pas initier de conversation… Or à partir de mon PC, je souhaite prendre la main pour paramétrer les cartes (températures de consigne etc…)

Ta carte maitre sera dédié à ça. Elle fera passerelle entre ton PC et toutes les autres cartes. Donc si tu veux modifier un paramètre, ton PC demande au maitre, qui transmettra le message au bon esclave. Ton maitre peux même être interfacé en Ethernet avec ton PC. Et il peut y avoir plusieurs maitres en réseau avec leurs propres esclaves raccordés.

Exemple : je n’aime pas le look de Domogik, on dirait un jouet …

j’imagine que son look sera paramétrable à terme. Ceci dit, l’aspect “jouet” peux rassurer certain final user (madame par ex.)

Je cherche aujourd’hui une carte “vivante” avec un bon support hard et soft, des échanges, etc… Arduino est parfait !

oui, je le pense aussi.

As-tu pensé au OneWire comme bus dans ta maison ? je sais qu’il y en a qui n’utilises que ça.

le quote est à droite de l’icone # lorsque tu réponds à un message.

Gromain

Merci pour le quote :wink:

…, donc tu peu le stocker une fois pour toute dans l’eprom de chaque arduino et ton soft ira lire cet ID au démarrage. Ou bien tu peux faire un codage “hard” avec des switchs d’adressage sur 2 ou 3 entrées.

Bonne idée le codage hard ou eeprom, cela simplifie les upgrades des différentes cartes du réseau (soft unique). Reste à trouver COMMENT le code va chercher ce fameux ID unique. Je continue à chercher…

Je pensais faire discuter PC <> Arduino via un convertisseur RS232 <> RS485 isolé, mais j’ai un problème : comment faire pour interroger ma carte maitre RS485 via le PC puisque ce dernier doit être esclave ? Un esclave ne peut pas initier de conversation… Or à partir de mon PC, je souhaite prendre la main pour paramétrer les cartes (températures de consigne etc…)

Ta carte maitre sera dédié à ça. Elle fera passerelle entre ton PC et toutes les autres cartes. Donc si tu veux modifier un paramètre, ton PC demande au maitre, qui transmettra le message au bon esclave. Ton maitre peux même être interfacé en Ethernet avec ton PC. Et il peut y avoir plusieurs maitres en réseau avec leurs propres esclaves raccordés.

Bonne idée que d’interfacer maitre et PC via Ethernet => je prends. En revanche, l’idée d’avoir plusieurs maitres avec leur propre esclaves, trop lourd… Je commence à avoir les idées un peu plus claires sur comment gérer le RS485…

Exemple : je n’aime pas le look de Domogik, on dirait un jouet …

j’imagine que son look sera paramétrable à terme. Ceci dit, l’aspect “jouet” peux rassurer certain final user (madame par ex.)

Eh bien je vais attendre alors :wink:

PS : as-tu un site web sur lequel on peut prendre connaissance de ton installation ?

Reste à trouver COMMENT le code va chercher ce fameux ID unique. Je continue à chercher...

Ici :

http://www.arduino.cc/en/Reference/EEPROM

Merci Jean-François, Je cherche en fait le code de la partie RS485.

PS : concernant le bus OneWire, j'y ai pensé, mais vu le nombre de périphériques et la taille de la maison, je crains des soucis de stabilité. Donc je préfère une dizaine d'Arduino reliés en RS485, avec pour chacune la gestion locale des périphériques de la pièce : DS1820, électrovanne chauffage, etc...

Hello

Ton projet semble interessant.
Perso, je travaille aussi à un projet domotique, et je bute aussi sur le problème du réseau.
J’ai aussi hésité avec le RS485, mais l’implentation du protocole m’ennuie … Je pense m’orienter vers l’I²C. Et pour palier au problème de longueur de cable, il y a le P82B715, un petit bus extender ultra simple ( 2 entrées, 2 sorties et une alim), qui permet d’étendre le bus à plus de 100m.

C’est le genre de composants qui peuvent bien simplifier la vie…
Donc, si cela t’intéresse (ou a d’autres), voici qlq extraits de docs glanés sur le net :

DESCRIPTION
Le P82B715 est un circuit dédié aux applications à systèmes bus I2C. Il permet d’étendre la distance de séparation entre les composants communicants du bus I2C par amplification des lignes de données (SDA) et d’horloge (SCL). La capacité limite d’une ligne de bus I2C est de 400pF et réduit la distance de communication de plusieurs mètres. L’utilisation du P82B715 à chaque extrémité de la ligne réduit la capacité du câble du bus I2C et permet d’atteindre une capacité totale du système (circuits, connecteurs, …) proche de 3000pF.

CALCUL DES RESISTANCES DE TIRAGE
Des résistances de tirage de type pull-up sont nécessaires pour assurer des niveaux logiques hauts convenables sur les lignes de bus une fois amplifiés. En pratique, les résistances de tirage pull-up sont calculées pour un fonctionnement d’un temps de montée minimal du signal de transfert. Cette limite a été établie pour un échange de données sur la ligne fonctionnant à la fréquence de 100kHz et avec une constante de temps totale du système fixée à 1[ch956]s au plus. Pour chaque section du bus, la résistance de pull-up est calculée selon la formule suivante :
R= 1[ch956]s / ( Ccircuit + Cconducteurs )
Où :

  • Ccircuit = somme de l’ensemble des capacités internes aux circuits connectés au bus
  • Cconducteurs = capacité totale des conducteurs du bus.

A noter qu’il semblerait que le couple IES5501 + P82B715 donnent les meilleurs résultats pour l’extension de lignes I²C :
http://www.bus-buffer.com/_data/docs/IES5501-P82B715-AN102.pdf

Bonne idée le codage hard ou eeprom, cela simplifie les upgrades des différentes cartes du réseau (soft unique). Reste à trouver COMMENT le code va chercher ce fameux ID unique. Je continue à chercher...

Si tu pars du principe que c'est comme du RS232 mais avec plusieurs transmetteur/recepteur sur la ligne, ça semble pas trop compliqué. Le maitre envoie une commande contenant l'ID du destinataire. Tous les récepteurs reçoivent le message, et décode l'ID. En le comparant à l'ID stocké en eeprom, ils savent si le message et pour eux. Dans l'exemple (http://gdallaire.net/blog/?p=39), tu as du code pour la réception d'un message. Reste à ajouter une fonction décodage. Que cherches-tu exactement ?

Au niveau OneWire, si tu écartes le mode parasite, on obtient des temps de réponse assez court. Mais on reste dans un schéma maitre/esclave.

L'I2C: http://automatepc.fr/ pour un exemple d'application en domotique.

Sinon il y a le sans-fil (zigbee...)

l'ID. En le comparant à l'ID stocké en eeprom, ils savent si le message et pour eux. Dans l'exemple (http://gdallaire.net/blog/?p=39), tu as du code pour la réception d'un message. Reste à ajouter une fonction décodage. Que cherches-tu exactement ?

Je comprends le processus du maitre qui s'adresse à l'esclave de son choix, mais je cherche un exemple de code. Dans l'exemple de guillaume, l'ID n'apparait pas :

void rs485TxMsg(char *msg)
{
  Serial.flush();
  digitalWrite(txPin, HIGH);
  delay(10);
  Serial.println(msg);
  delay(10);
  digitalWrite(txPin, LOW);
}

PS : je suis contre le sens fil, mais je regarderai côté I2C.

... Perso, je travaille aussi à un projet domotique, et je bute aussi sur le problème du réseau. J'ai aussi hésité avec le RS485, mais l'implentation du protocole m'ennuie ... Je pense m'orienter vers l'I²C. Et pour palier au problème de longueur de cable, il y a le P82B715, un petit bus extender ultra simple ( 2 entrées, 2 sorties et une alim), qui permet d'étendre le bus à plus de 100m.

Merci pour les infos. Pourquoi dis-tu que le protocole RS485 t'ennuie ? Qu'il s'agisse du RS485 ou de l'I2C des librairies existent, donc la complexité est équivalente, non ?

Je comprends le processus du maitre qui s'adresse à l'esclave de son choix, mais je cherche un exemple de code. Dans l'exemple de guillaume, l'ID n'apparait pas :

c'est un exemple d'envoi de message. L'ID est contenu [u]dans[/u] le message. Par ex, tu envoies "0x0F/0x3/0x01", qui pourrait être ID/PIN/ETAT (ID=15, pin 3, etat Haut). L'arduino recoit la trame et lit le 1er octet qui est l'ID. A toi de définir un format de trame unique.