Depuis peu de temps, je m'intéresse au logiciel JEEDOM (domotique).
J'utilise, pour contrôler un relais avec un NRF24L01, la bibliothèque MySensors.
J'ai branché mon NRF24L01 sur un Arduino nano comme indiqué sur le site MySenors.com.
et j'arrive à contrôler une LED depuis Internet.
Pas de problème a priori donc, sauf que la pin D7, sur laquelle est branchée ma LED ne délivre que 1,69v en HIGH, au lieu d'environ 5v comme prévu, ce qui est insuffisant pour contrôler mon relais.
Voici le sketch utilisé pour mon noeud Mysensors, si quelqu'un a une explication...
En tout cas, merci pour votre attention.
// sketch pour piloter un ou plusieurs relais
// avec un mode normal, implusionnel et bistable
//
#include <MySensor.h>
#include <SPI.h>
// pour activer ou désactiver un mode il suffit de mettre ou d'enlever les "//"
#define Mode_Normal
//#define Mode_Impulsion
//#define Mode_Bistable
#ifdef Mode_Normal
// paramettre pour le mode normal
#define RELAY_1 7 // N° de la première pin Arduino du relai mode normal
#define NUMBER_OF_RELAYS 1 // Total du nombre de relai
#endif
#ifdef Mode_Impulsion
// paramettre pour le mode Implusionel
#define RELAYImpuls_1 6 //N° de la première pin Arduino du relai mode impulsionnel (Attention au mode normal)
#define NUMBER_OF_RELAYSImpuls 1 // Total number of attached relays
#define TpsPulse 1000 // temps de impulsion
#endif
#ifdef Mode_Bistable
//parametre pour mode Bistable
#define RELAYBistable_1 6 //N° de la première pin Arduino du relai mode impulsionnel (Attention auautre mode)
#define NUMBER_OF_RELAYSBistable 1 // Total number of attached relays
#define Pulse 1000 // temps pour changer état
#endif
//
#define RELAY_ON 1
#define RELAY_OFF 0
MySensor gw;
void setup()
{
// Initialize library and add callback for incoming messages
gw.begin(incomingMessage, 1);
// Send the sketch version information to the gateway and Controller
gw.sendSketchInfo("Relay", "1.0");
int NbRelay = 0;
#ifdef Mode_normal
// Init relais
for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
// Register all sensors to gw (they will be created as child devices)
gw.present(sensor, S_LIGHT);
// Then set relay pins in output mode
pinMode(pin, OUTPUT);
// Set relay to last known state (using eeprom storage)
digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
}
NbRelay = NUMBER_OF_RELAYS;
#endif
#ifdef Mode_Impulsion
// Init relais
for (int sensor=1 + NbRelay, pin=RELAYImpuls_1; sensor<=NUMBER_OF_RELAYSImpuls + NbRelay;sensor++, pin++) {
// Register all sensors to gw (they will be created as child devices)
gw.present(sensor, S_LIGHT);
// Then set relay pins in output mode
pinMode(pin, OUTPUT);
// Set relay to last known state (using eeprom storage)
digitalWrite(pin, LOW);
}
NbRelay = NbRelay + NUMBER_OF_RELAYSImpuls;
#endif
#ifdef Mode_Bistable
// Init relais
for (int sensor=1 + NbRelay, pin=RELAYBistable_1; sensor<=NUMBER_OF_RELAYSBistable + NbRelay;sensor++, pin++) {
// Register all sensors to gw (they will be created as child devices)
gw.present(sensor, V_VAR1);
// Then set relay pins in output mode
pinMode(pin, OUTPUT);
// Set relay to last known state (using eeprom storage)
digitalWrite(pin, LOW);
}
#endif
}
void loop()
{
// Alway process incoming messages whenever possible
gw.process();
}
void incomingMessage(const MyMessage &message) {
#ifdef Mode_Normal
// Si recetion d'un ordre pour un relai Mode normal
if (message.type==V_LIGHT) {
// Change relay state
digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
// Store state in eeprom
gw.saveState(message.sensor, message.getBool());
}
#endif
#ifdef Mode_Impulsion
// Si recetion d'un ordre pour un relai Mode Impulsionnel
if (message.type==V_VAR1) {
// Change relay state
digitalWrite(message.sensor-1+RELAYImpuls_1, HIGH);
delay(TpsPulse);
digitalWrite(message.sensor-1+RELAYImpuls_1, LOW);
// Store state in eeprom
gw.saveState(message.sensor, LOW);
}
#endif
#ifdef Mode_Bistable
// Si recetion d'un ordre pour un relai Mode Bistable
if (message.type==V_VAR2) {
Serial.println(message.type);
Serial.print("sensor : ");Serial.println(message.sensor);
Serial.print("Pin : ");Serial.println(message.sensor-1+RELAYBistable_1);
Serial.print("data : ");Serial.println(message.data);
Serial.print("Memoire : ");Serial.println(gw.loadState(message.sensor));
// Change relay state
if (message.getBool()!=gw.loadState(message.sensor)){
Serial.println("changement d'etat");
digitalWrite(message.sensor-1+RELAYBistable_1, HIGH);
delay(Pulse);
digitalWrite(message.sensor-1+RELAYBistable_1, LOW);
// Store state in eeprom
Serial.print("GetBool : ");Serial.println(message.getBool());
gw.saveState(message.sensor, message.getBool());
}
}
#endif
}
Donne des liens dirrectement consultables et qui vont droit au but.
Personne ne va explorer un site pour essayer de trouver où se trouve ce dont tu parles.
Donne le schéma électrique du montage (pas celui de câblage : l'électrique avec des symboles normalisés).
Pin D7
Qu'elle valeur de résistance a tu mis en série avec la diode ?
Si tu répond : j'ai pas mis de résistance tu aura la réponse à ta question.
Pour ce qui est du schéma électrique, l'arduino est alimenté par l'USB, mais même en passant par une alim 12V 1A, rien ne change (GND / VIN bien sûr).
Pour la résistance, j'ai mis une 150 ohms, mais même si je l'enlève, de toute façon, je n'ai que 1,69V à la sortie, ce qui est bien insuffisant pour un module relais qui ne s'active pas car l'entrée DATA ne reçoit pas les 5V nécessaires.
Ce qui veut dire que brut de fonderie à la première mise en service tu as fait pénétrer dans la base un courant égal à :
U=RI
R = 150
U = 5 - 0,8V --> 0,8V est la tension développée dans la diode base/émetteur du BD139
Donc I = 4,2V/150 = 28 mA.
N'est-ce pas trop 28 mA pour une base de transistor ? Je pense que oui et pour la sortie du micro aussi.
Cela ne figure pas sur les schémas que tu donnes mais tu parles d'une led qui est également branché sur la même pin D7 --> quel courant passe dans la del (led)
Cela fait beaucoup de courant pour cette pauvre sortie.
Coté micro les transistors des sorties du micro ont une résistance Rdson évaluée à 25 ohms (+/- 30% c'est à dire entre 32,5 et 19 ohms) --> d'après la datasheet du micro : courbes données entre 0 et 20 mA et déjà à 20 mA on voit que ce n'est plus une droite la courbe plonge, donc à 28 ou 40 mA c'est largement pire.
Peut-être bien que ce qui passe est normal et que tu es en train de torturer le micro et le transistor.
Que faire ?
En URGENCE vérifier la pin 7 pour voir si elle n'a pas souffert de cet excès de courant
Tout décâbler.
Tester les niveaux haut et bas sans charge.
Placer la del(led) avec un courant de 10 mA --> c'est suffisant, à la limite il existe des diodes bas courant : elles éclairent avec seulement 5 mA.
Calculer la résistance de base selon le mode opératoire du tuto --> on part du courant Ic pour calculer le courant Ib
Éviter de chercher des bâtons pour se faire battre en ne plaçant pas sur la même pin la del(led) et la commande du relais
Je me suis mal expliqué : j'ai d'abord branché le relais seul sur D7, et comme il ne s'activait pas, je l'ai échangé avec une LED et une résistance de 150 ohms (pour voir si elle s'allumait, et depuis, je suis resté comme ça en attendant de résoudre mon souci de tension de sortie).
Je vais essayer de téléverser un autre sketch sur le nano pour voir ce que donne la tension en D7 avec un simple blink sur cette sortie (elle est effectivement peut-être grillée).
j'ai testé, ma D7 est bonne (comme toutes les autres sorties d'ailleurs) : j'ai fait un blink qui me donne 4,07V, ce qui suffit à actionner mon relais.
Est-ce que quelque chose vous parait suspect dans le sketch cité plus haut ?
Je m'explique : pour ceux qui ferait le comparatif entre le sketch présent sur le site MySensors et celui que j'ai présenté : il y a 3 options pour le relais (fonctionnement normal, en impulsion ou en bistable).
C'est pas une version adaptée en réalité, mais une version optimisée à disposition sur la page suivante:
j'ai testé, ma D7 est bonne (comme toutes les autres sorties d'ailleurs) : j'ai fait un blink qui me donne 4,07V.
Si le micro est alimenté par 5V ne trouver que 4,07 V est anormal, c'est un mauvais signe.
Selon la courbe que je t'ai fourni tu ne devrais pas perdre plus de 0,5V avec un courant de 20 mA or là tu perds presque 1 V.
Dans quelle condition tu fais la mesure ?
Qu'est-ce qu'il y a de raccordé sur la pin D7 ?
ce qui suffit à actionner mon relais.
Tu as modifié le schéma de commande du relais ?
Pour commencer quelle est la valeur de la résistance de la bobine du relais ?
J'espère que tu ne commande pas directement le relais par une pin du micro mais que tu passe toujours par un transistor.
Quelle valeur utilise tu pour la résistance de base ?
Quand je fais ma mesure (entre D7 et GND), je connecte le relais.
Par contre, je suis maintenant sûr que le sketch qui en début de post est en cause : en prenant la version du sketch provenant du site MySensors (ci-dessous), le relais fonctionne parfaitement.
Je vais essayer d'adapter ce dernier sketch pour utiliser le mode impulsion qui m'intéresse particulièrement pour mon projet (contrôle d'un télérupteur en parallèle du contacteur mural).
/**
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2015 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
*******************************
*
* REVISION HISTORY
* Version 1.0 - Henrik Ekblad
*
* DESCRIPTION
* Example sketch showing how to control physical relays.
* This example will remember relay state after power failure.
* http://www.mysensors.org/build/relay
*/
// Enable debug prints to serial monitor
#define MY_DEBUG
// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
// Enable repeater functionality for this node
#define MY_REPEATER_FEATURE
#include <MySensors.h>
#define RELAY_1 7 // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 1 // Total number of attached relays
#define RELAY_ON 1 // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay
void before()
{
for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
// Then set relay pins in output mode
pinMode(pin, OUTPUT);
// Set relay to last known state (using eeprom storage)
digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
}
}
void setup()
{
}
void presentation()
{
// Send the sketch version information to the gateway and Controller
sendSketchInfo("Relay", "1.0");
for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
// Register all sensors to gw (they will be created as child devices)
present(sensor, S_BINARY);
}
}
void loop()
{
}
void receive(const MyMessage &message)
{
// We only expect one type of message from controller. But we better check anyway.
if (message.type==V_STATUS) {
// Change relay state
digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
// Store state in eeprom
saveState(message.sensor, message.getBool());
// Write some debug info
Serial.print("Incoming change for sensor:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println(message.getBool());
}
}
Je reste sur le coté matériel, le programme pour l'instant ne m'intéresse pas : si le matériel est foireux le meilleur programme du monde ne l'améliorera pas et le résultat final restera foireux.
Un peu de méthode pour trouver les renseignements :
J'ai lancé ton lien --> je trouve une image d'un relais sur lequel je peux lire des indications.
J'ouvre un moteur de recherche et je rempli le champ de recherche avec ce que j'ai lu sur la photo du relais : "SONGLE SRD 05VDC 3J C"
Le premier lien me dirige sur un fichier pdf :
Sur lequel je cherche les informations sur la bobine et je lis:
U nominal = 5V
R nominal = 70 ohms.
Soit un courant de 5/70 = 72 mA
Le BD139 dont tu nous a parlé est un transistor de puissance (1,5A) qui est démesuré pour fournir 72 mA.
Si tu as lu mon tuto tu devrais avoir retenu que les transistors bipolaires de puissance ont un gain en courant déplorable.
Sur les photos du module relais on peut voir un transistor faible puissance en boîtier CMS SOT23 (donc avec un gain bien supérieur à 100) .
Ce transistor devrait (en principe) être déjà équipé d'une résistance de base.
Le BD139 comme tous les transistors de puissance est en gros boîtier (TO220 ou équivalent).
Ce n'est lui qui est sur la photo du module, d'où sort-il ?
Il faudrait être plus clair dans tes explications.
Sinon avec un transistor de gain mini = 100 il faut un courant de base = 71,2/100 = 0,7 mA.
Si on veut être certain de le saturer on prend un coefficient de marge entre 7 et 10 ce qui donne un courant de base entre 5 et 7 mA (c'est aussi le courant de sortie du micro).
Ce qui donne une résistance de base Rb = (5-0,8)/7 = 600 ohm ou (5-08)/ 5 = 840 ohms, on prend une valeur normalisée entre 840 et 600 ohms.
desole 68tjs mais sur ce genre de petit module il y a un transistor amplificateur de courant. Ce module est parfaitement adapte pour une commande directe avec une pin Arduino.
Jacques
N.B. : je n'arrive pas a inserer une photo, desole. Le lien de la photo se trouve ici :
desole 68tjs mais sur ce genre de petit module il y a un transistor amplificateur de courant.
Oui c'est le transistor en boîtier cms dont je parle.
Soit je me fourre le doigt dans l'oeil jusqu'au coude et je mélange avec un autre sujet, soit il a bien été question d'un BD139 avec la base branchée directement sur une sortie du micro.
Edit : c'est confirmé : je me fourre bien le doigt dans l'oeil jusqu'au coude ce n'est pas ici le BD139, désolé.