Parcours 1 : des objets qui réagissent

Crédits

Licence Creative Commons
Ce document, basé sur du contenu de France-IOI, est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International.

Auteur du document original : Eric Madec de l'académie de Rennes. Le document a été légèrement modifié.

Thèmes du programme

programme

Consignes

Rendez-vous à l'adresse : https://amazon.quick-pi.org/ pour apprendre à programmer vos objets connectés en Python en réalisant les activités du Parcours 1.

Copier ci-dessous le code d'accès personnel fourni par l'enseignant :

.........

Lisez la présentation pour programmer en python , écrire, tester puis valider votre programme avec interface France IOI.

Au fur et à mesure que vous expérimentez et validez vos programmes par simulation pour chaque étape, recopiez votre script dans les cellules de code vides ci-dessous...

Un tutoriel video de présentation de QuickPi https://tube.ac-lyon.fr/videos/watch/playlist/33c4984a-b64e-46cb-b0eb-3118f9728953

Mélodie

Lisez la présentation du buzzer et de gestion du temps .

Exercice à faire à la maison

Écrire un programme qui active le buzzer pour jouer un son.
In [2]:
# Recopier le code ici

Exercice à faire à la maison

Écrire un programme qui joue la note "la", à la fréquence 440Hz, pendant une seconde.
In [ ]:
# Recopier le code ici

Exercice à faire à la maison

Écrire un programme qui joue la mélodie “do ré mi ré do”, en jouant chaque note pendant 500ms, l'une après l'autre, puis éteint le buzzer. Les fréquences des notes sont : Do : 523Hz, Ré : 587Hz, et Mi : 659Hz.
In [ ]:
# Recopier le code ici

Exercice à faire en classe

Écrire un programme qui fait clignoter la LED cinq fois : c'est à dire l'allume pendant 1s, puis l'éteint pendant 1s, puis recommence quatre autres fois.
In [ ]:
# Recopier le code ici

Exercice à faire en classe

Écrire un programme qui allume en alternance les LED rouge et bleue pendant 500ms chacune : la rouge pendant 500ms, la bleue pendant 500ms, etc. Chacune des LEDs doit être allumée 5 fois au total. Tout doit être éteint à la fin.
In [ ]:
# Recopier le code ici

Exercice à faire à la maison

Écrire un programme qui allume en alternance les LED rouge et bleue 5 fois au total, chaque fois pendant 500ms mais allumant la suivante 100ms avant d'éteindre la précédente : on allume la rouge au tout début, puis allume la bleue au temps 400ms, puis éteint la rouge au temps 500ms, puis allume la rouge au temps 800ms, etc.
In [ ]:
# Recopier le code ici

Show lumineux 1

3-light-show-1/icon.png

Lisez la présentation de boucle for, des leds et de gestion du temps.

Exercice à faire en classe

Écrire un programme qui dans l'ordre : - Allume la LED rouge pendant 1s - Fait clignoter la LED bleue 5 fois : 500ms allumée puis 500ms éteinte. - Allume la LED verte et la laisse allumée.
In [ ]:
# Recopier le code ici

Exercice à faire en classe

Écrire un programme qui dans l'ordre : - Allume la LED rouge pendant 1s - Fait clignoter la LED verte 5 fois : 500ms allumée puis 500ms éteinte. - Fait clignoter la LED bleue 3 fois : 500ms allumée puis 500ms éteinte. - Rallume la LED verte et la laisse allumée.
In [ ]:
 # Recopier le code ici

Exercice à faire en classe

Écrire un programme qui joue la séquence suivante, où chaque tiret représente un état allumé de 500ms, et chaque point un état éteint de 500ms. Notez que les deux lignes se jouent en même temps :
- LED rouge : -.-.-.--.-.-.
- LED verte : .......------
Les LEDs doivent être éteintes à la fin du programme.
In [ ]:
# Recopier le code ici

Quelle direction ?

4-afficher-la-direction/icon.png

Exercice à faire en classe

Écrire un programme qui laisse l'écran vide au début, puis affiche le texte "Bonjour" dès que l'on appuie sur le bouton, et le laisse affiché. Votre programme devra boucler indéfiniment, et tester en permanence si le bouton est enfoncé. Notez qu'un texte affiché à l'écran y reste jusqu'à ce que l'on affiche autre chose.
In [ ]:
 # Recopier le code ici

Exercice à faire en classe

Écrire un programme qui :
  • affiche le texte "Appuyez"
  • affiche le texte "Merci" dès que l'on appuie sur le bouton, et le laisse affiché
In [ ]:
 # Recopier le code ici

Exercice à faire en classe

Écrire un programme qui :
  • affiche le texte "Direction ?" dès le début
  • puis lorsque l'on appuie sur une direction, affiche le texte "Haut", "Droite", "Bas" ou "Gauche" selon la direction appuyée
In [ ]:
 # Recopier le code ici

Instrument

5-instrument-de-musique/icon.png

Lisez la présentation de boucle while, de l'instruction if, du capteur de distance et du buzzer.

Exercice à faire en classe

Écrire un programme qui allume le buzzer quand le capteur détecte un objet à moins de 100cm, et arrête le buzzer dès qu'il n'en détecte plus.
In [ ]:
 # Recopier le code ici

Exercice à faire en classe

Écrire un programme qui allume le buzzer quand le capteur détecte un objet à moins de 500cm. Le buzzer doit jouer un son à une fréquence égale à la distance de l'objet en centimètres. Il doit être éteint s'il n'y a pas d'objet à moins de 500cm.
In [ ]:
 # Recopier le code ici

Exercice à faire en classe

Modifier le programme de la version précédente, avec la différence suivante : lorsque le bouton est enfoncé, la fréquence du buzzer doit être doublée.
In [ ]:
 # Recopier le code ici

Show Lumineux 2 :

6-light-show-2/icon.png

Exercice à faire en classe

Écrire un programme qui fait 3 fois ces deux étapes :
  • Faire clignoter la LED rouge 3 fois (200ms allumée puis 200ms éteinte)
  • Attendre 1 seconde.
In [2]:
 # Recopier le code ici

Exercice à faire en classe

Écrire un programme qui fait 3 fois ces deux étapes :
  • Clignoter la LED rouge 3 fois (200ms allumée puis 200ms éteinte)
  • Clignoter la LED verte 3 fois (200ms allumée puis 200ms éteinte)
  • Clignoter la LED bleue 3 fois (200ms allumée puis 200ms éteinte)
  • Attendre 1 seconde.
In [ ]:
 # Recopier le code ici

Exercice à faire en classe

Écrire un programme qui fait en même temps, et pendant 4 secondes au total :
  • Clignoter la LED rouge : 1s allumée puis 1s éteinte
  • Clignoter la LED verte : 500ms allumée puis 500ms éteinte
  • Clignoter la LED bleue : 250ms allumée puis 250ms éteinte
In [ ]:
 # Recopier le code ici

Avertisseur :

7-avertisseur-de-recul/icon.png

Exercice à faire en classe

Écrire un programme qui, dès qu'un objet passe à moins de 30cm du capteur, fait dans l'ordre :
  1. Jouer 3 bips de 100ms espacés de 100ms
  2. Attendre 500ms
In [ ]:
 # Recopier le code ici

Exercice à faire en classe

Modifiez le programme de la version précédente, pour qu'il arrête de jouer des bips dès qu'il n'y a plus d'objet. S'il y a un bip en cours, il se termine, mais on ne joue pas le suivant.
In [ ]:
 # Recopier le code ici

Exercice à faire à la maison

Modifiez le programme de la version précédente, pour que lorsqu'un objet passe à moins de 10cm du capteur alors qu'une série de bips n'est pas en cours, alors il joue un bip en continu. Au dessus de cette distance, il doit faire comme dans la version précédente.
In [ ]:
 # Recopier le code ici

Servo chronométré

8-servo-chronometre/icon.png

Lisez la présentation du servomoteur, de boucle while, de l'instruction if, de la boucle for, de [la manette](#manette), du buzzer, des leds, et de gestion du temps.

Exercice à faire en classe

Écrire un programme qui met l'angle du servomoteur à 0°, puis lorsque l'on appuie sur le bouton : - Augmente l'angle 18 fois de 10°, toutes les 50ms - Joue un bip pendant 500ms - Remet l'angle à 0°
In [ ]:
 # Recopier le code ici

Exercice à faire en classe

Écrire un programme qui met le servomoteur à 10°, puis lorsque que le stick est appuyé : - À gauche : diminue de 2° puis attend 50ms - À droite : augmente de 2° puis attend 50ms Le programme doit ignorer les actions qui ne gardent pas l'angle entre 10° et 170°.
In [ ]:
  # Recopier le code ici

Exercice à faire à la maison

Modifier le programme de la version précédente, pour qu'il arrête au bout de 5s, puis selon l'angle du servo : - S'il vaut 90°, allume la LED verte - S'il est inférieur à 90°, allume la LED rouge - S'il est supérieur à 90°, allume la LED bleue Le programme doit ensuite attendre 2s, puis éteindre les LEDs et tout recommencer.
In [ ]:
 # Recopier le code ici

Les instructions utiles en Python :

Programmation :

Python permet de créer des programmes à partir d'instructions. Par exemple, l'instruction `droite()` peut faire déplacer un robot d'une case vers la droite. Un programme formé d'instructions les unes en dessous des autres, exécute ces instructions l'une après l'autre.
from robot import *

droite()
haut()
droite()
Le programme ci-dessus fait déplacer le robot vers la droite, puis vers le haut, puis de nouveau vers la droite.

Structure de test

L'instruction if :

Avec l'instruction if, on peut exécuter une instruction uniquement dans certaines conditions.
if caseMarquee():
    peindre()
Par exemple, le programme ci-dessus teste le contenu de la case du robot, et ne la peint que si elle est marquée. On peut aussi placer plusieurs instructions dans une instruction if, comme illustré ci-dessous :
if caseMarquee():
    peindre()
    droite()
### L'instruction if/else On peut utiliser une instruction if/else, pour effectuer des opérations différentes selon la situation. Par exemple :
if caseMarquee():
    peindre()
else:
    haut()
Dans le programme ci-dessus, si la case du robot est marquée, le robot la peint, sinon il ne la peint pas mais se déplace vers le haut.

Les structures de boucles

Boucle inconditionnelle avec l'instruction for

Une boucle inconditionnelle permet de répétefor k in range(...) Par exemple, plutôt que de mettre 5 fois la même instruction :
droite()
droite()
droite()
droite()
droite()
On peut écrire la boucle suivante :
for k in range(5):
    droite()
On peut aussi mettre plusieurs instructions dans une boucle :
for k in range(5):
    droite()
    haut()
La situation la plus courante est :
    
    Pour k allant de 1 à 10 répéter 
        Bloc d'instructions
    FinPour
Sa traduction en `Python` est :
# flux parent
for k in range(1, 11):
    # bloc d'instructions
# retour au flux parent
On remarque l'utilisation `range(1, 11)` alors qu'on attendrait `range(1, 10)`. En fait range(1, 11) retourne un _itérateur_, qui va parcourir avec un incrément de 1 tous les entiers $n$ tels que $1 \leqslant n < 11$. Il faut bien se souvenir que la borne supérieure de range(n, m) est exclue mais il est facile de retenir que le nombre de tours de boucles est m - n. Par exemple, pour calculer la somme des tous les entiers consécutifs de 100 à 200, on peut écrire :
somme = 0
for k in range(100, 201):
    somme = somme + k
print("La somme est ", somme)
S'il s'agit juste de répéter `n` fois un bloc d'instructions on utilise le raccourci range(n) au lieu de range(0, n) ou de range(1, n + 1). Par exemple pour dire 100 fois "Merci", on peut écrire :
for k in range(100):
    print("Merci !")
print("Ouf!")

La boucle conditionnelle avec l'instruction while

Généralement, on souhaite répéter un bloc d'instructions tant qu'une condition est réalisée mais on ne sait pas à l'avance combien de répétitions seront nécéssaires. La situation la plus courante est :
    Tant Que Condition répéter
        Bloc d'instructions
    Fin Tant Que
Elle se traduit en `Python` par :
# flux parent
while condition:
    # bloc d'instructions indenté
# retour au flux parent
Par exemple, pour demander la saisie d'un login jusqu'à une saisie correcte, on peut écrire :
login = 'moi'
while input('Login ?') != login:        # test d'entrée de boucle
    print("Essaie encore !")
print('Bienvenue ', login)    # sortie de boucle
Évidemment, on peut aboutir à une _boucle infinie_ si la condition d'entrée de boucle n'est jamais vérifiée. Parfois une boucle infinie est le comportement souhaité, par exemple pour un programme qui doit surveiller des événéments par l'intermédiaire d'écouteurs logiciels (Javascript dans le navigateur) ou de capteurs physiques (de lumière, de température ...). On peut utiliser l'instruction `while True :` pour répéter sans fin une séquence d'instructions, comme dans l'exemple ci-dessous, qui allume et éteint une LED toutes les 500 millisecondes :
while True :
    allumerLED()
    attendre(1000)
    eteindreLED()
    attendre(1000)
L'instruction while True : exécute en boucle les instructions placées en dessous, indentées vers la droite, sans s'arrêter, jusqu'à ce que l'on interrompe l'exécution du programme. Ce type de boucle est utile pour les programmes qui ne doivent jamais s'arrêter, par exemple le programme d'un système d'alarme, qui doit être actif en permanence.

Boucles imbriquées :

Il est possible d'utiliser des boucles imbriquées, c'est-à-dire que l'on peut mettre des boucles for, à l'intérieur d'autres boucles for. Par exemple :
for i in range(5):
    droite()
    for j in range(3):
        haut()
    droite()
Ce programme répétera 5 fois un déplacement d'1 case vers la droite, 3 cases vers le haut et 1 case vers la droite.

L'interface FranceIOI :

L'interface comporte deux onglets EXPÉRIMENTER et VALIDER, qui correspondent à deux modes d'utilisation différents.

experimenter_p.png

Ecrire un programme :

C'est à droite dans l'éditeur que vous allez écrire vos programmes en langage python.

Votre programme doit toujours commencer par la ligne from quickpi import *.

Cette ligne de code permet de pouvoir utiliser les fonctions spécialement définies pour le module QuickPi.

Les fonctions et mots clés disponibles sont répertoriés dans des listes déroulantes.

Ensuite, vous écrivez les instructions de votre programme les unes

Tester un programme :

L'onglet EXPÉRIMENTER est en quelque sotre un "bac à sable". Il vous permet de mener des expérimentations avec les composants et les fonctions disponibles dans l'interface.

Un ou des composants sont mis à votre disposition sur l'interface.

onglet_experimenter.png

Vous pouvez tester ces composants en cliquant dessus pour changer leur état.

Exemple : cliquer sur une LED pour l'allumer.

Pour exécuter votre programme, cliquez sur le bouton en bas à gauche de l'écran.

interface_p.png

N'importe quel programme que vous concevez est exécuté entièrement, avec une simulation visuelle ou auditive du fonctionnement des composants.

Valider un programme :

Votre mission consiste à concevoir un programme qui permet d'effectuer la tâche demandée dans l'énoncé.

L'onglet VALIDER permet une validation automatique des programmes soumis : grâce à un test, le programme présent dans l'éditeur est automatiquement évalué.

Voici comment fonctionne ce test :

valider_p.png

Une ligne du temps (en secondes) est présente pour chaque composant disponible.

Cette ligne du temps apparaît en gris lorsque le composant est activé pendant la période, sinon elle n'apparaît pas.

Au fur et à mesure de l'exécution du programme, un curseur se déplace horizontalement et vérifie que l'état des composants est conforme à ce qui est attendu.

Dans l'exemple, la LED doit être initialement éteinte (état OFF), puis allumée (état ON, ligne grise) entre les instants 0 et 3, puis à nouveau éteinte à l'instant 3.

Les fonctions utiles des composants :

Gestion du temps :

temps

  • sleep(milliseconds)

    Cette fonction permet de stopper l'exécution du programme pendant une durée entrée en paramètre.

    Cette durée est exprimée en millisecondes.

    Exemple :

    sleep(1000)
    

    Pour stopper l'exécution du programme pendant une durée de 1 seconde.

Buzzer :

Un buzzer est un composant qui produit un son lorsqu'il est soumis à un tension électrique.

Un buzzer possède deux états :

  • ON : le buzzer est soumis à une tension électrique, il sonne. buzzer-ringing.png
  • OFF : sans tension électrique, le buzzer reste silencieux. buzzer.png

Le son peut être toujours le même ou être paramétrable.

Fonctions disponibles :

  • turnBuzzerOn()

    Cette fonction permet d'allumer le buzzer.

  • turnBuzzerOff()

    Cette fonction permet d'éteindre le buzzer.

  • setBuzzerNote(buzzer, frequency)

    Pour le buzzer entré en paramètre, cette fonction permet de produire un son à une fréquence donnée.

    La fréquence est exprimée en Hertz.

    Exemple :

    setBuzzerNote("buzzer1", 264)
    

    permet de jouer la note DO.

LEDs ou diodes électroluminescentes :

Une LED est un composant qui émet de la lumière quand il est parcouru par un courant électrique.

Une LED possède deux états :

  • ON : le courant traverse la LED, elle est allumée : ledon-red.png

  • OFF : il n'y a pas de courant, la LED est éteinte : ledoff.png

Une LED ne laisse passer le courant électrique que dans un seul sens.

On trouve des LEDs qui émettent de la lumière rouge ou de la lumière verte, ou d'autres couleurs encore.

Fonctions disponibles :

  • Les fonctions turnLedOn() et turnLedOff() permettent respectivement d'allumer et d'éteindre une LED.

    Elles ne peuvent servir que lorsqu'il n'y a qu'une seule LED utilisée.

  • setLedState(led,state) :

    Cette fonction permet d'allumer ou éteindre une LED.

    Elle prend en paramètre le nom de la LED et l'état à considérer, True pour l'allumer, False pour l'éteindre.

    Exemple :

    setLedState("led1",True)
    
  • toggleLedState(led) :

    Cette fonction permet d'inverser l'état de la LED entrée en paramètre sous forme de chaine de caractères.

    Exemple :

    toggleLedState("led1")
    

Bouton poussoir

Un bouton poussoir est un élément qui possède deux états, relevé et enfoncé.

  • ON : le bouton est enfoncé : buttonon.png
  • OFF : le bouton est relevé :
    buttonoff.png

Fonctions disponibles :

  • isButtonPressed()

    Cette fonction renvoie True si le bouton est enfoncé, et False s'il est relevé.

    Cette fonction est utilisée seulement lorsqu'il n'y a qu'un seul bouton pressoir sur le montage.


  • isButtonPressed(button)

    Pour le bouton entré en paramètre sous forme de chaine de caractères, cette fonction renvoie True si le bouton est enfoncé, et False s'il est relevé.

    Exemple :

    isButtonPressed("button1")
    

Écran :

screen.png

L'écran de ce module est un petit écran qui permet d'afficher deux lignes de 16 caractères.

Fonctions disponibles

  • displayText(screen, line1, line2) Cette fonction permet d'afficher deux lignes de texte sur un écran.

    Elle prend en paramètre l'écran à considérer, ainsi qu'une ou deux lignes à afficher, sous forme de chaines de caractères.

    Exemple : avec le code

    displayText("screen1", "Hello", "World !")
    

    on affiche Hello sur la première ligne, et World ! sur la deuxième ligne de l'écran screen1.

Manette :

stick.png

Une manette (stick en anglais) est un ensemble de 5 boutons, chacun correspondant à une direction : haut, droite, bas, gauche ou bien centre.

Il s'agit d'un seul composant, mais qui se programme comme 5 boutons différents :

  • "stick1.up" pour la direction haut de la manette "stick1"
  • "stick1.right" pour la direction droite
  • "stick1.down" pour la direction bas
  • "stick1.left" pour la direction gauche
  • "stick1.center" pour la direction centre

Par exemple pour tester si la direction haut est enfoncée, on utilise :

buttonState("stick1.up")

Capteur de distance :

range.png

Ce capteur permet de mesurer la distance sans contact grâce à un capteur à ultrasons ou à laser. Il a une portée de 3 centimètres à 5 mètres.

Fonctions disponibles :

  • readDistance(range)

    Cette fonction renvoie la distance captée par le capteur de distance entré en paramètre. Cette distance est exprimée en centimètres.

    Exemple :

    readDistance("range1")
    

Servomoteur :

servo-full.png

Le Servomoteur est un petit moteur qui peut tourner précisément jusqu'à un angle donné, entre 0 et 180 degrés. On peut l'utiliser pour contrôler la direction des roues d'un petit véhicule, ou pour ouvrir ou fermer une barrière, etc.

Fonctions disponibles :

  • setServoAngle(servo, angle)

    Cette fonction permet de modifier l'angle du servomoteur choisi. L'angle est exprimés en degrés, entre 0 et 180 degrés.

    Exemple :

    setServoAngle("servo1", 90)`
    
  • getServoAngle(servo)

    Ce bloc permet de relire l'angle auquel on a réglé le servomoteur choisi. Ce n'est pas un capteur, mais simplement une mémorisation de la dernière valeur modifiée par une instruction.

    On peut par exemple l'utiliser pour augmenter l'angle de 1 degré.

    Exemple :

    setServoAngle("servo1", getServoAngle("servo1") + 1)
    

Crédits

Licence Creative Commons
Ce document, basé sur du contenu de France-IOI, est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International.

Auteur du document original : Eric Madec de l'académie de Rennes.