mardi 12 juin 2012

-12- Le systeme YaZo-L'aspect logiciel-Versions 1 a 4

Licence Creative Commons
Le Système YaZo de PapyDeYannis est mis à disposition selon les termes de la licence Creative Commons Paternité - Partage à l'Identique 3.0 non transposé.
Les autorisations au-delà du champ de cette licence peuvent être obtenues à PapyDeYannis@gmail.com.




Début : -1- 941 jours
Article précédent :-11- Le système YaZo : Remarques importantes
 Article suivant :-13- L'aspect logiciel-Versions 5 a 8, 9 et 10
Statistiques

 

L'aspect Logiciel du système YaZo

Avertissement

Il faut garder à l'esprit le fait que je ne suis pas programmeur. De ce fait certaines tournures dans les différents listings présentés ici risquent de choquer les gens du métier. Mon but n'est que de préciser ma démarche.
Toutes les versions présentées s'articulent sur la base de la version 01 et pour la plupart, ne sont que des évolutions de cette version, ceci afin d'en préciser plus aisément le fonctionnement. Il est évident qu'un programmeur expérimenté aurait probablement fait certains choix plutôt que ceux que j'ai faits moi-même.

Fonctionnement général

Au départ,  le(s) siège(s) est(sont) inoccupé(s).
Si l'on installe un enfant dans son siège, le capteur va être passant et via l'électronique de mise en forme, provoquer le collage d'un relais qui va à son tour permettre l'alimentation du microcontrolleur via un régulateur 5V. Le microcontrolleur va alors commander , via un transistor, l'auto alimentation du système.
L'ensemble du logiciel est écrit en langage Arduino, trés proche (en fait dérivé) du langage C.
Comme tout programme Arduino (aussi appelé sketch) il est constitué de 3 blocs : 
  • Un bloc de definitions des variables 
  • Une boucle setup() exécutée lors du démarrage du programme
  • Une boucle loop() qui constitue l'essentiel du programme
D'autres blocs peuvent être ajoutés , en général pour définir des routines appelées par le programme principal.

Chaque version est composée, dans sa boucle loop() de 3 blocs principaux:
  • Un bloc while ((digitalRead(pinContact) == HIGH) && (digitalRead(pinSiege) == HIGH))
             Dans ce bloc, on traite le cas où la voiture vient d'être arrétée , le siège enfant étant inoccupé. Ce bloc sert uniquement, aprés un certain délai à mettre hors tension le système si le siège est toujours inoccupé.
  • Un bloc while((digitalRead(pinContact) == HIGH) && (digitalRead(pinSiege) == LOW))
             Dans ce bloc (le plus important), on traite le cas où la voiture est arrétée, le siège enfant étant occupé. Ce bloc est essentiellement constitué d'une boucle, de tests et de temporisations. Les différents dispositifs d'alerte intérieure (Led, buzzer) et extèrieure (klaxon) sont commandés en fonction des tests pour prévenir le conducteur et éventuellement le voisinage de la présence d'un enfant seul dans la voiture.
  • Un bloc  while (digitalRead(pinContact) == LOW)
             Dans ce cas on traite de tous les cas envisagés dans la version étudiée lorsque la voiture est en marche.



Le logiciel existe en 10 versions, toutes fonctionnelles, chacune étant une évolution de la (ou des ) précédente.

La version 01 

Le listing est visible ici.

Les déclarations

On définit ici les affectations de différentes entrées sorties du microcontrolleur:

#define pinSiege 2                              /* detection presence dans le siege                     */
#define pinPower 7                              /* maintien alim                                        */
#define pinContact 4                            /* contact mis                                          */
#define pinBuzzer 9                             /* Sortie buzzer interne                                */
#define pinKlaxon 8                             /* Sortie commande Klaxon                               */

#define pinLed 13                                /* Led allumée si le sieg est occupe ou                */
                                                 /* si le siege est occupe  et en situation de risque   */    

ainsi que la variable booléene Voiture qui indique que l'enfant vient d'être installé dans son siège ou que le véhicule vient d'être arrété.

Le bloc setup()

Dans ce bloc , on définit  le type d'entrée/sortie utilisée. On s'en sert aussi pour activer la résistance de pull-up interne lorsque la pin est utilisée en entrée. Ceci explique pourquoi les optocoupleurs vus dans le schéma de principe ne possèdent pas de résistance de charge sur le collecteur de leur transistor interne.

On commande aussi l'auto-maintien de l'alimentation dans ce bloc :

digitalWrite(pinPower,HIGH) ;                        /* Le siege est occupé - On alimente l'alarme  */

et on positionne la Variable Voiture à la valeur true .

Le bloc loop()

 Le premier cas traité est le plus simple, à savoir , c est le cas où le siège est vide et le véhicule en stationnement.
Une simple temporisation de 3 minutes (pour être sur que le siège est bien inoccupé) fait tout le travail.À la fin de cette temporisation, on coupe l'auto-maintien de l'alimentation, et le système est arrété.

Le dernier cas traité est celui où la voiture est en marche. Ce cas est trés simple lui aussi. si le siège est occupé, on alimente la Led rouge, et si ce n'est pas le cas elle est éteinte, puis on positionne la variable Voiture à la valeur true.

Le deuxième cas est le coeur du système. On traite du cas où le véhicule est en stationnement ET le siège est occupé.

À l'entré dans cette boucle on allume la Led rouge car le siège est occupé. D'autre part la variable Voiture est positionnée à la valeur true, on envoie alors un bip de 2 secondes sur le buzzer interne à l'attention du conducteur, puis on démarre une temporisation de 3 minutes afin de permettre à l'adulte de prendre un éventuel ticket de stationnement ou de récupérer un caddie au supermarché. À la fin de cette temporisation on met la variable Voiture à la valeur false et si le siège est toujours occupé on actionne l'alarme exterieure pendant 2 secondes, et on redémarre une temporisation de 1 minute.
À la fin de cette temporisation on entre dans une boucle qui ne peut prendre fin que si l'on enlève l'enfant de son siège ou si l'on redémarre la voiture.
Cette boucle commence par une temporisation de 1 minute à l'issue de laquelle on commande l'alarme exterieure au rythme du signal SOS en morse (c'est la raison d'être des 3 fonctions dot() , dash() et morse() ).

La version 02

Le listing est visible ici 

 Cette version est identique à la version 01 sauf en ce qui concerne le cas où le véhicule est en marche.
On commence par définir la pin utilisée pour la boucle dans la section des déclarations. Puis dans le bloc setup() on définit cette pin en entrée et on active la résistance de pull-up interne.
On commence par verifier si le siège est occupé. Si c'est le cas, on allume la Led rouge et on teste l'état de la boucle si celle-ci le permet. Si la boucle est ouverte, on envoie une série de 3 bips d'une durée de 200mS espacés de 200mS et on recommence toutes les 800mS tant que la boucle est déverrouillée.
Si la boucle est verrouillée on se contente d'allumer la Led rouge pour signaler la présence de l'enfant. 
Si le siège est inoccupé , la Led rouge reste éteinte. Enfin , on positionne la variable Voiture à true

La version 03 

Le listing est visible ici 
 

Comme la version 02 cette version est identique à la version 01 sauf dans le cas où le véhicule est en marche et si le siège enfant est occupé. Dans ce cas on a ajouté la possibilité de surveiller la température dans le véhicule et de déclencher une alarme si cette température dépasse un seuil arbitraire fixé ici à 32°C . Il faut savoir qu'une petite fille de 2 ans a gravement souffert lors d'un départ en vacances dans le midi de la France alors que la voiture où elle était installée a été bloquée dans un important ralentissement. Heureusement ses parents ont constaté son état qui était une hyperthermie avancée et l'intervention d'un medecin , pris lui aussi dans ce ralentissement a permis d'appeler le SAMU et elle a pu être évacuée par hélicoptère vers l'hopital le plus proche.

Apres definitions dans les blocs de déclarations et dans le bloc setup() , on trouve une fonction qui sera appelée pour la mesure de température : la fonction MesureTemp(). Dans cette fonction constituée d'une boucle for (), on mesure 10 fois de suites à intervalles de 200 mS la température dans la voiture, puis on calcule la moyenne de ces 10 mesures. Cette valeur est alors retournée au programme appelant.
Ce programme se trouve dans le bloc où le véhicule est en marche. On effectue la mesure toutes les 3 minutes. Si la température est supérieure à la température maximum fixée à 32°C, on envoie sur le buzzer un bip égal à 10 fois la température mesurée , soit au moins égal en durée à 320mS. on allume aussi la Led rouge pendant 1200mS puis on l'éteint pendant 800mS et ce , tant que le problème n'est pas résolu (ventilation, climatisation du véhicule, etc....)

Si la température est inferieure à la valeur maximum, la LED rouge est allumée fixement si le siège est occupé et eteinte si le siège est inoccupé.
La variable Voiture , comme dans les versions précédentes est positionnée à la valeur true.

La version 04

Le listing est visible ici

Cette version regroupe les fonctionalités des 3 versions précédentes. Le bloc correspondant au cas où le véhicule est en marche a été remanié pour imbriquer les fonctionalités des versions 02 et 03.
La variable de boucle j est utilisée pour permettre la mesure de température toutes les 3 minutes (j=90) . 
Si j<90 on surveille la bonne fermeture de la boucle du siège. 
Si une situation de danger est présente (temperature trop élevée ou boucle déverrouillée) , outre les alarmes correspondantes sur le buzzer, la Led rouge clignote au rythme de 1200 mS ON /  800 mS OFF .
Si le siège est occupé et qu'aucune situation de risque immédiat n'est présente, la Led rouge est allumée , et elle est éteinte si le siège est inoccuppé.
On repositionne comme précédemment la variable Voiture à la valeur true



Le prochain article traitera des versions 5 à 8 ainsi que des versions 9 et 10

Début : -1- 941 jours
Article précédent :-11- Le système YaZo : Remarques importantes
Article suivant :-13- L'aspect logiciel-Versions 5 a 8, 9 et 10
Statistiques

 Mode de diffusion et licence

Tous les documents (y compris cet article) sont diffusés sous licence libre Creative Commons sous les termes spécifiés au début de cet article
Cette licence donne le droit à tous de copier, diffuser, traduire, etc... ces documents sous réserve d'en diffuser les éventuelles modifications selon les dispositions de cette licence.
Toute autre utilisation de ces documents doit faire au préalable l'objet d'une demande d'autorisation.

Hors des termes de cette licence, je souhaite que toute utilisation commerciale de ces documents ou du dispositif créé à partir de ces documents soit assortie du versement d'une partie des bénéfices générés à une (des) association(s) d'aide à l'enfance en danger ou(et) de lutte contre la violence routière.

   


Aucun commentaire: