Différences entre les versions de « Le capteur de distance Sharp GP2Y0A »
(43 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
{{sommaire|niveau=3|flottant=left}} | |||
{{Infobox IPX800 | |||
| titre = Sharp GP2Y0A | |||
| image = SharpGP2Y0A_Pres.png | |||
| famille = IPX800 V4 | |||
| date-create = 06/11/2017 | |||
| date-update = 16/11/2017 | |||
| auteur= fgtoul | |||
}} | |||
==Capteur de distance infra-rouges sur IPX800V4== | ==Capteur de distance infra-rouges sur IPX800V4== | ||
Ligne 4 : | Ligne 33 : | ||
Il existe également des modèles alimentés en 3.3V, d'autres en 5V, sans pour autant que la tension de sortie dépasse les limites de l'IPX800. | Il existe également des modèles alimentés en 3.3V, d'autres en 5V, sans pour autant que la tension de sortie dépasse les limites de l'IPX800. | ||
Voici les formules du capteur, déterminées sur un tableur [http://gce | Voici les formules du capteur, déterminées sur un tableur [http://gce.ovh/wiki/index.php?title=D%C3%A9terminer_l%27%C3%A9quation_d%27un_Capteur_analogique (méthode décrite ici)] | ||
[[Fichier:Excel_tendance2.png]] | [[Fichier:Excel_tendance2.png]] | ||
Ligne 25 : | Ligne 54 : | ||
[[Fichier:Sharp GP2Y0A controle.JPG|center]] | [[Fichier:Sharp GP2Y0A controle.JPG|center]] | ||
La sortie analogique ne délivre pas de tension supérieure à 3.3 V, nous n'aurons donc pas | La sortie analogique ne délivre pas de tension supérieure à 3.3 V, nous n'aurons donc pas besoin de mettre un pont diviseur en place pour protéger l'entrée analogique de l'IPX. | ||
Ligne 32 : | Ligne 61 : | ||
[[Fichier:Sharp_GP2Y0A_branchement.JPG|center]] | [[Fichier:Sharp_GP2Y0A_branchement.JPG|center]] | ||
[[Fichier: | [[Fichier:GP2YOA_branchement3b.jpg|center|500px]] | ||
==Paramétrage de l'entrée analogique== | ==Paramétrage de l'entrée analogique== | ||
Ligne 45 : | Ligne 74 : | ||
[[Fichier:Sharp_GP2Y0A_widget1b.JPG|center]] | [[Fichier:Sharp_GP2Y0A_widget1b.JPG|center]] | ||
==Utilisation en détecteur de passage== | |||
Dans un passage étroit, des escaliers par exemple, le schéma précédent suffit à créer un détecteur de passage. | |||
Reliez le capteur à une entrée analogique. Dans l'IPX800, menu Administrateur/Périphériques, configurez l'entrée analogique avec le type "Volt". | |||
Lorsqu'aucun obstacle ne se trouve devant le capteur, sa sortie analogique présente une tension très basse. | |||
En créant une scène, vous pouvez activer un relais chaque fois que quelqu'un passe devant le capteur. | |||
Utilisons un seuil Haut à 0.7 volts, ce qui correspond approximativement à 100 cm. Le seuil bas pourra être réglé à 0.5 Volts | |||
[[Fichier:GP2Y0A_courbe.png|border|center]] | |||
Cette valeur sera à régler en fonction de la largeur du passage. | |||
Pour un passage de 120 cm, les valeurs auraient été de 0.3V pour le seuil bas et 0.5V pour le seuil haut | |||
Pour un passage de 80 cm, les valeurs auraient été de 0.7V pour le seuil bas et 0.8V pour le seuil haut | |||
Evènement : Analogique (seuil bas :0.6 ; seuil haut : 0.8) | |||
Action ON | |||
Résultat : Relais | |||
La sortie relais sera configurée avec Tb=xxx secondes afin de permettre une extinction automatique. | |||
Les valeurs en sortie sont données par le constructeur pour des surfaces réflectives. | |||
Il faudra peut-être ajuster les seuils à l'issu de tests de passage avec des vêtements sombres, puis des vêtements clairs. | |||
'''Préconisation :''' aucun obstacle ne doit se trouver à une distance inférieure à la plage maximale de détection. | |||
Si le modèle de capteur a une amplitude de mesure jusqu'à 150 cm, aucun obstacle ne doit se trouver en deça de cette distance, idem pour un capteur avec une portée de 80 cm. | |||
[[Fichier:GP2YOA_passage2.PNG|border|center]] | |||
==Conversion de la tension en distance== | ==Conversion de la tension en distance== | ||
Ligne 61 : | Ligne 128 : | ||
Créons maintenant notre widget HTML et insérons un peu de code | Créons maintenant notre widget HTML et insérons un peu de code | ||
< | <source> | ||
function bruteToDistance(brute) { | function bruteToDistance(brute) { | ||
d = Math.floor(63.37 * Math.pow(brute * 0.000050354,-1.143)); | d = Math.floor(63.37 * Math.pow(brute * 0.000050354,-1.143)); | ||
Ligne 130 : | Ligne 197 : | ||
</center> | </center> | ||
`; | `; | ||
</ | </source> | ||
Au début du code, vous pouvez remarquer la fonction bruteToDistance(). | Au début du code, vous pouvez remarquer la fonction bruteToDistance(). | ||
Ligne 218 : | Ligne 285 : | ||
< | <source> | ||
function bruteToDistance(brute) { | function bruteToDistance(brute) { | ||
d = Math.floor(63.37 * Math.pow(brute * 0.000050354,-1.143)); | d = Math.floor(63.37 * Math.pow(brute * 0.000050354,-1.143)); | ||
Ligne 293 : | Ligne 360 : | ||
</center> | </center> | ||
`; | `; | ||
</ | </source> | ||
Voici le Widget Complet : | Voici le Widget Complet : | ||
Ligne 327 : | Ligne 394 : | ||
[[Fichier:SharpGP2Y0A_advanced2.gif|center]] | [[Fichier:SharpGP2Y0A_advanced2.gif|center]] | ||
==Amélioration utilisable pour un détecteur de présence== | ==Amélioration utilisable également pour un détecteur de présence== | ||
Sur une idée originale qui m'a été proposée par un membre de la communauté : | Sur une idée originale qui m'a été proposée par un membre de la communauté : | ||
Ligne 333 : | Ligne 400 : | ||
Nous pourrions définir des seuils sur notre entrée analogique. | Nous pourrions définir des seuils sur notre entrée analogique. | ||
Imaginons que la sortie virtuelle 5 passe ON chaque fois que le seuil haut est atteint | Imaginons que la sortie virtuelle 5 passe ON chaque fois que le seuil haut est atteint . | ||
Le phénomène, si transitoire, doit être artificiellement prolongé en réglant un Tb suffisament long sur | Le phénomène, si transitoire, doit être artificiellement prolongé. C'est faisable en réglant un Tb suffisament long sur notre sortie virtuelle N°5, soit 1 minute. | ||
Dans ce cas, nous pourrions jouer sur la couleur de l'animation du Widget, par exemple : rouge pendant 1 minute si le seuil haut a été dépassé. | Dans ce cas, nous pourrions jouer sur la couleur de l'animation du Widget, par exemple : rouge pendant 1 minute si le seuil haut a été dépassé. | ||
Il faudra donc ajouter une scène à l'IPX : | |||
Évènement : [Entrée Analogique : 1] | |||
Action : [ON] | |||
Résultat : [Sortie Virtuelle : 5] | |||
voici le code amélioré : | voici le code amélioré : | ||
< | <source> | ||
function bruteToDistance(brute) { | function bruteToDistance(brute) { | ||
d = Math.floor(63.37 * Math.pow(brute * 0.000050354,-1.143)); | d = Math.floor(63.37 * Math.pow(brute * 0.000050354,-1.143)); | ||
Ligne 354 : | Ligne 426 : | ||
var distance = bruteToDistance(datasources["STATUS"]["response"]["analog0"]); | var distance = bruteToDistance(datasources["STATUS"]["response"]["analog0"]); | ||
var passage = datasources["STATUS"]["response"][" | var passage = datasources["STATUS"]["response"]["vout4"]; | ||
// l'activité du capteur est récupérée avec l'état de | |||
// l'activité du capteur est récupérée avec l'état de la sortie 1 | |||
//en fonction de l'état, l'animation sera rendue non visible (active mais couleur du fond), sinon verte | //en fonction de l'état, l'animation sera rendue non visible (active mais couleur du fond), sinon verte | ||
var SharpCouleur = (datasources["STATUS"]["response"]["led0"]==0) ? "#333" : (passage==1) ? "#f00" : "#3C14"; | var SharpCouleur = (datasources["STATUS"]["response"]["led0"]==0) ? "#333" : (passage==1) ? "#f00" : "#3C14"; | ||
Ligne 416 : | Ligne 489 : | ||
</center> | </center> | ||
`; | `; | ||
</ | </source> |
Version actuelle datée du 28 mai 2019 à 13:44
| |||
---|---|---|---|
![]() | |||
Nom | Sharp GP2Y0A | ||
Famille | IPX800 V4 | ||
Wiki créé le | 06/11/2017 | ||
Wiki mis à jour le | 16/11/2017 | ||
Auteur | fgtoul |
Capteur de distance infra-rouges sur IPX800V4
Le capteur Sharp existe sous différentes références, permettant de mesurer des distances différentes. Il existe également des modèles alimentés en 3.3V, d'autres en 5V, sans pour autant que la tension de sortie dépasse les limites de l'IPX800.
Voici les formules du capteur, déterminées sur un tableur (méthode décrite ici)
Ces 2 formules serviront à renseigner l’entrée analogique de l’IPX
- Analog -> Digital ou Digital->Analog
Dans certains cas, il faudra paramétrer l’entrée analogique avec le type "Volt" la tension sera alors “lue” par IPX, la formule sera ensuite appliquée uniquement dans un widget HTML associé à un petit script Javascript (lecture dans une source de données)
Connexion du Capteur à l'IPX
Maintenant que nous avons déterminé les caractéristiques de notre capteur, nous allons le connecter à l'IPX800 V4.
Ce capteur doit être alimenté en 5 volts. Nous utiliserons une alimentation externe. Pour le montage, j'ai utilisé une alimentation USB.
Avant de brancher le capteur à l'IPX, il faut vérifier que la tension de sortie de dépasse pas les limites admises par l'entrée analogique de notre automate.
La sortie analogique ne délivre pas de tension supérieure à 3.3 V, nous n'aurons donc pas besoin de mettre un pont diviseur en place pour protéger l'entrée analogique de l'IPX.
Voici le schéma de connexion :
Paramétrage de l'entrée analogique
Le capteur émettant une tension sur sa sortie, il suffit de paramétrer l'entrée analogique comme un voltmètre.
Il suffira alors de placer un widget de type "Entrée analogique" sur le Dashboard pour visualiser la tension de sortie.
Utilisation en détecteur de passage
Dans un passage étroit, des escaliers par exemple, le schéma précédent suffit à créer un détecteur de passage.
Reliez le capteur à une entrée analogique. Dans l'IPX800, menu Administrateur/Périphériques, configurez l'entrée analogique avec le type "Volt".
Lorsqu'aucun obstacle ne se trouve devant le capteur, sa sortie analogique présente une tension très basse.
En créant une scène, vous pouvez activer un relais chaque fois que quelqu'un passe devant le capteur.
Utilisons un seuil Haut à 0.7 volts, ce qui correspond approximativement à 100 cm. Le seuil bas pourra être réglé à 0.5 Volts
Cette valeur sera à régler en fonction de la largeur du passage.
Pour un passage de 120 cm, les valeurs auraient été de 0.3V pour le seuil bas et 0.5V pour le seuil haut
Pour un passage de 80 cm, les valeurs auraient été de 0.7V pour le seuil bas et 0.8V pour le seuil haut
Evènement : Analogique (seuil bas :0.6 ; seuil haut : 0.8) Action ON Résultat : Relais
La sortie relais sera configurée avec Tb=xxx secondes afin de permettre une extinction automatique.
Les valeurs en sortie sont données par le constructeur pour des surfaces réflectives.
Il faudra peut-être ajuster les seuils à l'issu de tests de passage avec des vêtements sombres, puis des vêtements clairs.
Préconisation : aucun obstacle ne doit se trouver à une distance inférieure à la plage maximale de détection. Si le modèle de capteur a une amplitude de mesure jusqu'à 150 cm, aucun obstacle ne doit se trouver en deça de cette distance, idem pour un capteur avec une portée de 80 cm.
Conversion de la tension en distance
Il va de soit que ce n'est pas réellement la tension en sortie de notre capteur qui nous intéresse, mais la distance mesurée.
Nous allons faire la conversion grâce à un widget HTML, celui-ci contiendra un peu de JavaScript.
Mais pour cela, nous devons d'abord créer une source de données.
Sur le Dashboard, créons la source nommée STATUS. Elle pointera sur le fichier status.xml de l'IPX800 et sera donc du type XML.
Attention au nom de la source : le JavaScript faira appel à elle par son nom, en respectant la casse (majuscules/minuscules).
Créons maintenant notre widget HTML et insérons un peu de code
function bruteToDistance(brute) {
d = Math.floor(63.37 * Math.pow(brute * 0.000050354,-1.143));
if (d < 20 || d > 150) {
return "";
}else{
return d + " cm";
}
}
var distance = bruteToDistance(datasources["STATUS"]["response"]["analog0"]);
return `
<style>
.content {
position: absolute;
bottom: 0;
left: 0;
height: 100%;
width: 100%;
background-color: #333;
overflow: hidden;
}
.circle {
width: 5px;
height: 5px;
background-color: transparent;
position: absolute;
left: 50%;
margin-left: -2px;
top: 50%;
margin-top: -2.0px;
border-radius: 50%;
border: 2px solid #3C14;
animation: radar 5s infinite;
-webkit-animation: radar 5s infinite;
-webkit-transition: all ease-in-out;
transition: all ease-in;
}
@keyframes radar {
1% {
width: 5px;
height: 5px;
margin-left: 0;
margin-top: 0px;
border: 2px solid #3AA65E;
opcity:0.9
}
100% {
width: 300px;
height: 300px;
margin-left: -150px;
margin-top: -150px;
border: 12px solid #055E23;
opacity:0.0;
}
}
</style>
<center>
<div class="content" height=100%> <div valign=middle style="color:#fff;font-size: 20px;"> ${distance}</div> <div class="circle">
</div>
</div>
</center>
`;
Au début du code, vous pouvez remarquer la fonction bruteToDistance(). La source de données (status.xml) renvoie la valeur brute du capteur après traitement par le Convertisseur Analogique/Numérique de l'IPX.
Il convient donc, dans un premier temps de traduire cette valeur en Volts. La valeur brute est alors multipliée par 0.000050354. Pour de plus amples explications, je vous invite à consulter cette page.
La valeur convertie en volts sera finalement transformée par la formule de notre capteur, déterminée plus haut avec notre tableur.
Distance=63.37 * (tension)-1.143
La distance retournée par notre fonction ne devra pas excéder 150, ceci étant la limite de la plage de mesure du capteur.
De même, elle ne pourra être inférieure à 20 cm.
Voici notre widget :
Le léger décalage entre la distance affichée et la tension correspondante est dû au fait que les 2 widgets n'ont pas la même vitesse de rafraîchissement.
Utilisation avancée
Le câblage
Pour prolonger la durée de vie du capteur, on pourrait faire passer son fil d’alimentation par une sortie de l’IPX. Ainsi, le capteur ne serait alimenté que sur demande, pour faire une mesure. Il est également possible d’ajouter un petit poussoir, pour une commande locale, et une EV, pour une commande distante (dashboard).
- Nous allons utiliser une Sortie virtuelle SV1 comme commande distante.
Cette sortie virtuelle servira à mettre notre capteur en marche forcée à partir du Dashboard, du poussoir, ou de tout autre système domotique (Alarme, ...)
- La sortie virtuelle SV2 sera utilisée pour lancer une lecture sur notre capteur, avec une durée limitée (30 s pour notre exemple). Ensuite, l'alimentation du capteur sera coupée.
- Un bouton poussoir sera connecté à l'entrée digitale N°8. Ce sera la marche manuelle. Il pilotera la sortie Virtuelle N°1. Il y aura retour d'état sur le Dashboard.
- Toutes les commandes piloteront le relais n°1 (alimentation du capteur).
En résumé,
ED8 : Commande manuelle. Pilotage de SV1 par scenario.
SV1 : Variable pour Marche forcée du capteur. Commandée par le poussoir ou le Widget "Activation" ou une box.
SV2 : Variable avec tempo pour Lecture 30 secondes. Commandé par le Widget "Lecture".
Remarque :
l'entrée analogique sur laquelle sera connectée le capteur, devra être configurée avec le type Volt
Voici le schéma de câblage :
Le dashboard
- Nous allons créer un widget de pilotage "Sortie virtuelle" auquel nous lierons la sortie SV1.
- Créons maintenant le widget servant à la mise en lecture temporaire du capteur
- La sortie virtuelle SV2 doit avoir été réglée avec Tb=30 (secondes) [menu Périphériques]
- Créons le Widget HTML qui contiendra le script JavaScript pour afficher la distance.
function bruteToDistance(brute) {
d = Math.floor(63.37 * Math.pow(brute * 0.000050354,-1.143));
if (d < 20 || d > 150) {
return "";
}else{
return d + " cm";
}
}
// Récupération de la valeur analogique brute (de l'entrée 1) et conversion en distance par appel de la fonction bruteToDistance()
var distance = bruteToDistance(datasources["STATUS"]["response"]["analog0"]);
// l'activité du capteur est récupérée avec l'état du relais 1
//en fonction de l'état, l'animation sera rendue non visible (active mais avec la même couleur que le fond), sinon verte
var SharpCouleur = (datasources["STATUS"]["response"]["led0"]==1) ? "#3C14" : "#333";
return `
<style>
.content {
position: absolute;
bottom: 0;
left: 0;
height: 100%;
width: 100%;
background-color: #333;
overflow: hidden;
}
.circle {
width: 5px;
height: 5px;
background-color: transparent;
position: absolute;
left: 50%;
margin-left: -2px;
top: 50%;
margin-top: -2.0px;
border-radius: 50%;
border: 2px solid ${SharpCouleur};
animation: radar 1s infinite;
-webkit-animation: radar 1s infinite;
-webkit-transition: all ease-in-out;
transition: all ease-in;
}
@keyframes radar {
1% {
width: 5px;
height: 5px;
margin-left: 0;
margin-top: 0px;
border: 2px solid ${SharpCouleur};
opcity:0.9
}
100% {
width: 300px;
height: 300px;
margin-left: -150px;
margin-top: -150px;
border: 12px solid ${SharpCouleur};
opacity:0.0;
}
}
</style>
<center>
<div class="content" height=100%> <div valign=middle style="color:#fff;font-size: 20px;"> ${distance}</div> <div class="circle">
</div>
</div>
</center>
`;
Voici le Widget Complet :
Les Scènes
2 scènes sont nécessaires pour contrôler le capteur
1.la scène qui pilote SV1 si le poussoir est pressé
Si au lieu d'un poussoir, vous utilisez un interrupteur, il faudra remplacer l'action [SWITCH] par l'action [ON/OFF]
Évènement : [Entrée Digitale : 8] Action : [SWITCH] Résultat : [Sortie Virtuelle : 1]
2.La scène qui active le relais si une mesure est demandée
Évènement : [Sortie Virtuelle : 1] [OU] [Sortie Virtuelle : 2] Action : [ON/OFF] Résultat : [Relais : 1]
Le résultat en fonctionnement
Amélioration utilisable également pour un détecteur de présence
Sur une idée originale qui m'a été proposée par un membre de la communauté :
Nous pourrions définir des seuils sur notre entrée analogique.
Imaginons que la sortie virtuelle 5 passe ON chaque fois que le seuil haut est atteint .
Le phénomène, si transitoire, doit être artificiellement prolongé. C'est faisable en réglant un Tb suffisament long sur notre sortie virtuelle N°5, soit 1 minute.
Dans ce cas, nous pourrions jouer sur la couleur de l'animation du Widget, par exemple : rouge pendant 1 minute si le seuil haut a été dépassé.
Il faudra donc ajouter une scène à l'IPX :
Évènement : [Entrée Analogique : 1] Action : [ON] Résultat : [Sortie Virtuelle : 5]
voici le code amélioré :
function bruteToDistance(brute) {
d = Math.floor(63.37 * Math.pow(brute * 0.000050354,-1.143));
if (d < 20 || d > 150) {
return "";
}else{
return d + " cm";
}
}
var distance = bruteToDistance(datasources["STATUS"]["response"]["analog0"]);
var passage = datasources["STATUS"]["response"]["vout4"];
// l'activité du capteur est récupérée avec l'état de la sortie 1
//en fonction de l'état, l'animation sera rendue non visible (active mais couleur du fond), sinon verte
var SharpCouleur = (datasources["STATUS"]["response"]["led0"]==0) ? "#333" : (passage==1) ? "#f00" : "#3C14";
return `
<style>
.content {
position: absolute;
bottom: 0;
left: 0;
height: 100%;
width: 100%;
background-color: #333;
overflow: hidden;
}
.circle {
width: 5px;
height: 5px;
background-color: transparent;
position: absolute;
left: 50%;
margin-left: -2px;
top: 50%;
margin-top: -2.0px;
border-radius: 50%;
border: 2px solid ${SharpCouleur};
animation: radar 0.6s infinite;
-webkit-animation: radar 0.6s infinite;
-webkit-transition: all ease-in-out;
transition: all ease-in;
}
@keyframes radar {
1% {
width: 5px;
height: 5px;
margin-left: 0;
margin-top: 0px;
border: 2px solid ${SharpCouleur};
opcity:0.9
}
100% {
width: 300px;
height: 300px;
margin-left: -150px;
margin-top: -150px;
border: 12px solid ${SharpCouleur};
opacity:0.0;
}
}
</style>
<center>
<div class="content" height=100%> <div valign=middle style="color:#fff;font-size: 20px;"> ${distance}</div> <div class="circle">
</div>
</div>
</center>
`;