Boîte aux lettres Yoctopuce: Le retour de la revanche

Boîte aux lettres Yoctopuce: Le retour de la revanche

Vous vous rappelez de la boîte aux lettres laser? elle marche plutôt pas mal, mais on a remarqué qu'elle présente un défaut assez pénible: étant fabriquée en tôles métalliques, elle a tendance à se déformer légèrement en fonction des changements de température. Cette déformation modifie la trajectoire du rayon laser à l'intérieur de la boîte, parfois au point de le détourner du capteur de lumière. Par conséquent, on est obligé d'aller régler notre boîte aux lettres assez régulièrement. A la longue, on a fini par en avoir un peu marre et on a eu une autre idée pour résoudre le problème. Mais cette fois, on a décidé de faire les choses en grand: on va en plus rendre notre boîte aux lettres autonome grâce à un panneau solaire et une connexion WiFi..


Capteur de distance + wifi

L'idée est d'utiliser un petit capteur de distance optique à la place du laser, du coup plus besoin de miroir: si il n'y a rien dans la boîte, le capteur va mesurer la hauteur de la boîte, dans le cas contraire il va mesurer une distance bien inférieure. En fait notre boîte aux lettres ayant deux étages, on pourrait même déterminer si il y a un paquet ou une lettre à l'intérieur. On a choisi un capteur à Led avec une sortie 4-20mA, avec sa précision de l'ordre du 10ème de millimètre, c'est très clairement un overkill, mais au moins c'est du matériel sérieux.

Notre capteur de distance 4-20 mA, objectivement un overkill, mais il marche tellement bien
Notre capteur de distance 4-20 mA, objectivement un overkill, mais il marche tellement bien


L'idée est de placer le capteur de distance sous la boîte
L'idée est de placer le capteur de distance sous la boîte


Le capteur est bien entendu raccordé à un Yocto-4-20mA-Rx. Et tant qu'à faire autant résoudre le problème des fils électriques interminables avec un YoctoHub-Wireless. Par contre il faut alimenter ce Hub.

La partie électronique du projet : un YoctoHub-Wireless et un Yocto-4-20mA-RX
La partie électronique du projet : un YoctoHub-Wireless et un Yocto-4-20mA-RX



Panneau solaire et batterie USB

On peut facilement alimenter notre YoctoHub-Wireless avec une simple batterie USB rechargée par un panneau solaire pour peu qu'on utilise la même astuce que pour la station météo. Le YoctoHub-Wireless est en effet capable de s'endormir sur demande et de se réveiller à intervalle régulier. Pendant qu'il est en sommeil il ne consomme quasiment rien, on obtient alors une consommation moyenne tout à fait compatible avec une application sur batterie.

Deux batteries USB
Deux batteries USB



A propos des batteries USB

Ces batteries USB sont essentiellement conçues pour recharger des appareil portables, comme des téléphones ou des tablettes. Certaines de ces batteries ont une fonctionnalité très pratique quand il s'agit de recharger un téléphone portable: quand elles détectent qu'il n'y a plus de consommation significative, elles en concluent que l'appareil est chargé et s'éteignent totalement. Elles ne se rallumeront pas avant qu'on ne connecte physiquement un nouvel appareil, cela évite que la batterie ne se décharge toute seule dans son coin. Cependant, ce genre de batteries est à éviter pour notre application: Elles s'éteignent définitivement dès que le hub part en sommeil. Soyez donc très attentif à ce problème quand vous achetez une batterie USB pour autre chose que charger votre téléphone.

Réactivité

On a configuré le hub pour se réveiller toutes les 5 minutes aux alentours de l'heure du passage du facteur, et une fois toutes les heures en dehors. Par contre, il serait dommage d'avoir à attendre une heure pour que le système se rende compte que la boîte a été vidée. Il se trouve que le YoctoHub-Wireless dispose d'une entrée qui permet de le réveiller artificiellement. Cette entrée se présente sous la forme de deux contacts qu'il suffit de court-circuiter pour réveiller le hub. Il suffit donc de relier ces contacts à un switch qui fermera le circuit dès qu'on ouvrira la porte de la boîte aux lettres. En fait, tant que ce contact est fermé le hub ne peut pas se rendormir, ce qui nous laisse le temps de vider la boîte aux lettres tranquillement.

On va utiliser un switch pour détecter l'ouverture de la porte de la boîte aux lettres
On va utiliser un switch pour détecter l'ouverture de la porte de la boîte aux lettres


Le schéma de l'installation
Le schéma de l'installation



Réalisation

La réalisation n'a rien de bien sorcier: on a placé toute l'électronique dans une boîte métallique étanche que l'on a fixée à l'arrière de la boîte aux lettres. L'installation ne fonctionnant au pire que quelques secondes toutes les 5 minutes, il y a peu de chance qu'on rencontre des problèmes de surchauffe.

On a tout tassé dans une boîte métallique étanche
On a tout tassé dans une boîte métallique étanche


Les différents éléments de l'installation
Les différents éléments de l'installation


Le capteur de distance est placé dans un boîtier imprimé fixé sous la boîte aux lettres et le panneau solaire est fixé sur le dessus de la boîte.

C'est presque prêt
C'est presque prêt



Pour signaler la présence de courrier dans la boîte, on continue d'utiliser notre cadre lumineux dont on est très content. C'est un cadre photo un peu bricolé qui contient un Yocto-Color.

Le cadre lumineux utilisé pour signaler la présence de courrier
Le cadre lumineux utilisé pour signaler la présence de courrier



Programmation

La partie programmation est très simple pour autant qu'on l'aborde par le bon côté. On a choisi de la réaliser en Python, mais n'importe quel autre langage aurait pu faire l'affaire. On fait simplement tourner notre programme sur un ordinateur qui a accès au même réseau que la boîte aux lettres et auquel le tableau lumineux est raccordé par USB. L'idée est de pré-enregistrer le hub de la boîte aux lettres, et de mettre en place un callback qui sera automatiquement appelé dès qu'un module apparaît. Ainsi, à chaque fois que le hub va se réveiller, notre callback va être automatiquement appelé une fois pour le hub, et une fois pour le Yocto-4-20mA-Rx qui lui est raccordé. La partie principale du programme consiste donc à mettre en place un callback et à attendre.

# Setup the API to use local USB devices
if YAPI.RegisterHub("usb", errmsg)!= YAPI.SUCCESS:
    sys.exit("init error"+errmsg.value)

# configure the API to use the mailbox hub if available
if YAPI.PreregisterHub("172.17.17.76", errmsg)!= YAPI.SUCCESS:
    sys.exit("init error"+errmsg.value)

# Each time a device comes online, deviceArrival is called
YAPI.RegisterDeviceArrivalCallback(deviceArrival)

while True:
    YAPI.UpdateDeviceList(errmsg) # traps plug/unplug events
    YAPI.Sleep(500, errmsg)   # traps others events



A chaque fois que notre callback est appelé, on vérifie que son origine est bien le Yocto-4-20mA-Rx de la boîte aux lettres. Si c'est le cas, on récupère la distance mesurée par le capteur optique qui lui est raccordé, et on met à jour les Leds du tableau lumineux en conséquence, puis on demande au hub de s'endormir dans 5 secondes.

def sendHubtoSleep():
  hub = YWakeUpMonitor.FindWakeUpMonitor("MailBox_Monitor")
  if hub.isOnline() : hub.sleep(5)

def deviceArrival(m):
    print('Device arrival : ' +  m.get_serialNumber())
    name = m.get_logicalName()
    if (name=='Mail_Sensor'):
         sensor = YGenericSensor.FindGenericSensor("Mail_Sensor.genericSensor1")
         value = sensor.get_currentValue()
         SetMailIndicator(sensor,"%f" % value)
         sendHubtoSleep()
         sensor.registerValueCallback(SetMailIndicator)



On a ajouté une petite subtilité pour gérer le cas où quelqu'un est un train de vider la boîte aux lettres: on a mis en place un second callback sur les changements de valeurs mesurées par le Yocto-4-20mA-Rx. A chaque fois que cette valeur change, ce callback est appelé, les Leds du tableau lumineux sont mises à jour. Si un changement de couleur a eu lieu, la mise en sommeil du hub est décalée de 5 secondes. Par conséquent, tant que la porte de la boîte reste ouverte, le hub reste éveillé et le tableau lumineux est mis à jour en temps réel. Pratique.

def SetMailIndicator(mailSensor,value):
  global laststate
  led1 = YColorLed.FindColorLed("Mail_Indicator.colorLed1")
  led2 = YColorLed.FindColorLed("Mail_Indicator.colorLed2")

  if (float(value)<200):
    led1.set_rgbColor(0xFF0000)
    led2.set_rgbColor(0xFF0000)
    state = 1
  else:
    led1.set_rgbColor(0x00FF00)
    led2.set_rgbColor(0x00FF00)
    state = 0
  if (state!=laststate): sendHubtoSleep()
  laststate = state



Voilà, on a plus ou moins fait le tour de la question, vous trouverez le programme complet ici.

Une boîte aux lettres avec une antenne, quoi de plus normal? :-)
Une boîte aux lettres avec une antenne, quoi de plus normal? :-)



Conclusion

Nous avons décidé de mettre le paquet en rendant notre boîte aux lettres à la fois WiFi et solaire, mais vous n'êtes absolument pas obligés de d'aller aussi loin. Vous pouvez par exemple vous passer du panneau solaire, il vous faudra simplement recharger la batterie une fois de temps en temps. Vous pouvez aussi décider de vous passer de la batterie USB en tirant du 5 volts jusqu'à votre boîte aux lettres... à vous de voir...

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.