~~NOTOC~~ =======Maquette de porte automatisée (Programmation PICAXE)======== Nous allons utiliser la maquette de porte automatisée afin de tester différents fonctionnements possibles. **Compétence(s)** * CT 4.2 Appliquer les principes élémentaires de l’algorithmique et du codage à la résolution d’un problème simple. * CT 5.5 Modifier ou paramétrer le fonctionnement d’un objet communicant. **J’ai acquis la(les) compétence(s) si :** * Je suis capable de modifier un algorithme de fonctionnement initial afin de répondre à un nouveau besoin * J'ai acquis les notions de variables, sous-programmes, temporisations/délais Nous avons découvert la programmation des objets au travers d'activités simples les années précédentes. Nous allons aujourd'hui programmer un objet plus complexe avec plus de possibilité. {{ :cours:maqpicporte.jpg?300|}} [[cours:picaxe|Logiciels pour la programmation PICAXE]] (Utilisables à la maison) * **PICAXE BLOCKLY** : programmation des microcontrôleurs PICAXE * **Simulateur de maquette PICAXE** : test des programmes ======Programmation====== =====Informations préalables===== **Maquette** : Nom = Porte ; Dossier maquette virtuelle = Maquette/Activité2 \\ **Microcontrôleur** : PICAXE28X1 \\ **Moteur ** : Les commandes avancer, reculer et arrêter seront produites par les broches B.4 et B.5 suivant la table de vérité suivante du "Pont en H". \\ {{:cours:ponth.jpg?250 |}} ^ B.5 ^ B.4 ^ Commande ^ Description ^ | 0 | 0 | Arrêt | Libre (Aucun effort appliqué sur le moteur| | 0 | 1 | Ouvrir | SAM (rotation sens des aiguilles d'une montre) | | 1 | 0 | Fermer | SIAM (rotation sens inverse des aiguilles d'une montre) | | 1 | 1 | Arrêt | Bloqué (Un effort empêche la rotation du moteur) | ^ Nom ^ Broche(s) ^ Fonction ^ |P28X1 |-- |Définir mes ordres en fonction des informations disponibles et du programme utilisé | |Bouton fermer |C.0 |Demander la fermeture de la porte | |Bouton ouvrir |C.1 |Demander l'ouverture de la porte | |Bouton |C.4 |Demander une autres chose | |Fin de course Fermé |C.2 |Indiquer que la porte est totalement fermée | |Fin de course Ouvert |C.3 |Indiquer que la porte est totalement ouverte | |Barrière infra rouge |C.5 |Indique une personne à proximité de la porte | |Capteur de lumière |A.0 |Indique la luminosité ambiante (de 0 à 1023) | |Voyant Vert |B.0 |Signale : Marche, Ouvert, Absence de danger ... | |Voyant Rouge |B.1 |Signale : Arrêt, Fermé, danger ... | |Buzzer |B.2 |Générer un signal audible | |Contacteur ouverture |B.4 * |Commander le moteur dans le sens d'ouverture | |Contacteur fermeture |B.5 * |Commander le moteur dans le sens de fermeture | =====Acti 1 : Ouvrir/Fermer la porte avec les boutons===== Une 1ère version du programme fonctionne de la manière suivante : * Le moteur doit être arrêté si la porte est entièrement ouverte ou entièrement fermée. L'information ("ouverte" ou "fermée" est fourni par les capteurs de fins de course. * La porte s'ouvre ou se ferme si j'appuie sur le bouton correspondant et qu'elle n'est pas déjà ouverte ou fermée. Les informations sont fournies par les boutons (et les capteurs de fin de course). Soit l'algorithme ou l'organigramme suivant : \\ //Des commentaires qui ne sont pas à traduire peuvent figurer entre crochet.// [INITIALISATION] [Condition de sécurité au démarrage] 01 Mettre le moteur a l'arrêt [BOUCLE PRINCIPALE] 02 Répéter indéfiniment 03 Si Fin de course porte fermée activé 04 Mettre le moteur à l'arrêt 05 Sinon 06 Si bouton fermer appuyé 07 Démarrer la fermeture 08 Si Fin de course porte ouverte activé 09 Mettre le moteur à l'arrêt 10 Sinon 11 Si bouton ouvrir appuyé 12 Démarrer ouverture . {{ :cours:orga_porte_1.jpg?400 |}} {{ :cours:blocsportes1.jpg?200|}} - Bien comprendre les 2 représentations (algorithme et organigramme). - Noter la description du fonctionnement et l'algorithme sur votre copie, - Traduire l'algorithme en programme sur l'ordinateur avec BLOCKLY en utilisant les 4 blocs ci contre, - Le tester et montrer le résultat (fonctionnement correct) au professeur à l'aide du simulateur de maquette. - Coller l'image du programme à coté de l'algorithme dans votre classeur. \\ \\ =====Acti 2 : Amélioration du programme===== Pour chaque problème, noter sur votre copie, le fonctionnement attendu, l'algorithme et coller l'image du programme. ====Acti 2-1 : Utiliser des sous programme/fonction==== Pour rendre le programme modulaire (faciliter les modifications ultérieures) nous allons utiliser 3 sous-programmes/procédures "OUVRIR", "FERMER" et "ARRÊTER". Nous allons aussi utiliser les voyants pour informer l'utilisateur (rouge ne pas passer et vert/jaune passer) ainsi qu'une temporisation de 3s entre l'allumage du voyant rouge et la fermeture de la porte. ATTENTION : 1 seul voyant est allumé à un instant donné. \\ Il faut donc déterminer à quel moment les allumer. {{:cours:cp.png?20 |}}++++Coups de pousse 1 | Ci contre, blocs à utiliser en plus des précédents {{ :cours:blocsportes2.jpg?200|}} * Je crée les 3 sous-programmes/procédures demandés (Faire glisser le bloc Procédures/Sous-fonction et lui donner un nom) * Compléter les 3 sous-programmes/procédures (Placer dedans les blocs utiles) * Supprimer les blocs devenus inutiles du programme principal et les remplacer par les blocs Procédures/Appeler correspondants ++++ {{:cours:cp.png?20 |}}++++Coups de pousse 2 | * Si une LED est allumée, l'autre est éteinte * A l'initialisation, le moteur est arrêté et la LED rouge allumée * La LED n'est verte que si la porte est complètement ouverte (fin de course ouvert) * Si on veut fermer la porte (Bouton fermer), il faut attendre 3s après avoir allumer LED rouge ++++ {{:cours:soluce.jpg?20 |}}++++Algorithme type | -- [PROG PRINCIPAL] 01 Allumer LED rouge (Éteindre verte) 02 PROC-ARRÊTER 03 Répéter indéfiniment 04 Si fin de course porte fermée activé 05 PROC-ARRÊTER 06 Sinon 07 Si bouton fermer appuyé 08 PROC-FERMER 09 Si fin de course porte ouverte activé 10 PROC-ARRÊTER 11 Allumer LED verte (Éteindre rouge) 12 Sinon 13 Si bouton ouvrir appuyé 14 PROC-OUVRIR -- [PROC : ARRÊTER] 01 Arrêter le moteur -- [PROC : OUVRIR] 01 Moteur sens ouverture -- [PROC : FERMER] 01 Allumer LED rouge (Éteindre verte) 02 Attendre 3s 03 Moteur sens fermeture ++++ ====Acti 2-2 : Utiliser une variable==== Nous voulons que la barrière infra rouge provoque la réouverture de la porte si elle __détecte une personne lors de la fermeture__. (//Il faut donc se rappeler que la porte est en train de se fermer et utiliser une variable pour cela. en effet, aucun capteur n'indique le sens du mouvement, seule la fin de celui-ci est détecté par les fins de course.//) \\ **ATTENTION : Le capteur infrarouge est __désactivé__ si une personne est présente.** {{:cours:cp.png?20 |}}++++Coups de pousse | Blocs supplémentaires à utiliser ci-contre. {{ :cours:blocsportes3.jpg?200|}} * Je crée une variable ETAT qui prendra les valeurs : 0 Arrêté ; 1 S'ouvre ; 2 Se ferme. * Modifier le programme et les sous programmes pour tenir compte des différents états. * Ajouter dans le programme principal l'utilisation de la barrière infra rouge qui remplace alors le bouton ouvrir si besoin. ++++ {{:cours:soluce.jpg?20 |}}++++Algorithme type | -- [PROG PRINCIPAL] 01 Allumer LED rouge (Éteindre verte) 02 PROC-ARRÊTER 03 Répéter indéfiniment 04 Si fin de course porte fermée activé 05 PROC-ARRÊTER 06 Sinon 07 Si bouton fermer appuyé 08 PROC-FERMER 09 Si fin de course porte ouverte activé 10 PROC-ARRÊTER 11 Allumer LED verte (Éteindre rouge) 12 Sinon 13 Si bouton ouvrir appuyé 14 PROC-OUVRIR 14 Si porte se ferme (voir variable ETAT) 16 Si barrière I/R désactivé 17 PROC-OUVRIR -- [PROC : ARRÊTER] 01 Arrêter le moteur 02 Variable ETAT = 0 -- [PROC : OUVRIR] 01 Moteur sens ouverture 02 Variable ETAT = 1 -- [PROC : FERMER] 01 Allumer LED rouge (Éteindre verte) 02 Attendre 3s 03 Moteur sens fermeture 04 Variable ETAT = 2 ++++ ====Acti 2-3 : Créer une temporisation==== Nous voulons que sans appui sur le bouton de fermeture la porte se referme seule au bout d'un temps défini (5s). **Attention, il ne faut pas bloquer le programme pendant la temporisation** et pouvoir utiliser le bouton "Fermer" à tout moment. On utilise donc un compteur avec un petit temps d'attente (< 0.5 s) pour ne pas bloquer le programme. ===Coup de pousse :=== {{:cours:cp.png?20 |}}++++Coups de pousse | Bloc supplémentaire à utiliser ci-contre. {{ :cours:blocsportes4.jpg?200|}} * Je crée une variable TEMPO que j'initialise à 5000 ms (5s) lorsque je demande à ouvrir la porte * Si la porte est en position "Ouverte" et TEMPO <= 0, je referme la porte comme si j'avais appuyé sur le bouton * Sinon j'attends 100 ms et je diminue TEMPO d'autant ++++ {{:cours:soluce.jpg?20 |}}++++Algorithme type | -- [PROG PRINCIPAL] 01 Allumer LED rouge (Éteindre verte) 02 PROC-ARRÊTER 03 Répéter indéfiniment 04 Si fin de course porte fermée activé 05 PROC-ARRÊTER 06 Sinon 07 Si bouton fermer appuyé 08 PROC-FERMER 09 Si fin de course porte ouverte activé 10 PROC-ARRÊTER 11 Allumer LED verte (Éteindre rouge) 12 Si variable TEMPO <=0 13 PROC-FERMER 14 Sinon 15 Attendre 100ms 16 Variable TEMPO = TEMPO - 100 17 Sinon 18 Si bouton ouvrir appuyé 19 PROC-OUVRIR 20 Si porte se ferme (voir variable ETAT) 21 Si barrière I/R désactivée 22 PROC-OUVRIR -- [PROC : ARRÊTER] 01 Arrêter le moteur 02 Variable ETAT = 0 -- [PROC : OUVRIR] 01 Moteur sens ouverture 02 Variable ETAT = 1 03 Variable TEMPO = 5000 -- [PROC : FERMER] 01 Allumer LED rouge (Éteindre verte) 02 Attendre 3s 03 Moteur sens fermeture 04 Variable ETAT = 2 ++++