STIC:STIC IV (2019)/Pomodor'Up

De EduTech Wiki
Aller à la navigation Aller à la recherche

Cet article est en construction: un auteur est en train de le modifier.

En principe, le ou les auteurs en question devraient bientôt présenter une meilleure version.


Pomodor'Up est un dispositif tangible servant à mettre en œuvre facilement et rapidement la méthode pomodoro.

Introduction

Le projet Teach'Out consiste à créer un dispositif composé d'une carte Adafruit Circuit Playground Express (ou CPX) pour les enseignants et/ou accompagnateurs en sortie avec un groupe d’enfants. Le dispositif est basé sur les capteurs/émetteurs d’infrarouge déjà installés sur le circuit.

Problème

Durant les sorties scolaires, un grand nombre d'enfants sont accompagnés d'un petit nombre d'enseignants/accompagnateurs. Ce groupe se déplace dans la ville à pied ou en transports publics. À présent, les accompagnateurs n'ont aucun moyen rapide de vérifier que tous les enfants sont présents à tout moment. Ils doivent également assurer la sécurité des enfants lorsqu'ils doivent traverser la route.

Apports théoriques : à compléter.

Cahier des charges

Contexte

Ce dispositif est conçu pour être utilisé principalement en contexte scolaire. Cependant, il est facilement adaptable à un contexte de sortie familiale.

Public

Le public cible du dispositif Teach'Out sont les enseignants/accompagnateurs en sortie scolaire avec un groupe d'enfants et les enfants faisant partie de ce groupe.

Objectifs

L'objectif principal du dispositif Teach'Out est d'aider les enseignants/accompagnateurs à s’assurer que tous les enfants sont bien présents à tout moment. Teach'Out aide également à éviter des accidents de la route lorsqu’on veut traverser avec le groupe d’enfants, ainsi qu'à sensibiliser les enfants envers la sécurité routière.

Besoins et contraintes

  • les besoins et contraintes de votre projet (matérielles, humaines, techniques ...)

Présentation du projet

Le dispositif est basé sur les capteurs/émetteurs d’infrarouge déjà installés sur le circuit, utilisés pour compter les élèves. La puissance de ces émetteurs étant limitée à des facteurs de distance/direction, les élèves doivent passer devant l'enseignant afin d'être correctement comptés. Les LEDs de la guirlande s'allument une par une, à chaque passage. Une couleur est associée à chaque dizaine d'unités afin d'améliorer la lecture de la part des accompagnateurs.

Il s'agit d'une mini-maquette de notre projet Teach'Out.
Il s'agit d'une mini-maquette de notre projet Teach'Out.

Informations additionnelles

  • Tout autre item pertinent selon notre projet.

Solution

Dispositif et son fonctionnement

Composantes matérielles du dispositif :

  • Une carte CPX programmée avec le logiciel MakeCode
  • Une bande Adafruit Neopixels composée de 30 LED

Fonctionnalités de Teach'Out :

  • possibilité de compter les élèves et voir s’ils sont tous présents ;
  • messages/sons et lumières déclenchés par l’enseignant lorsqu’on doit traverser la route: si la lumière affichée sur la guirlande est verte cela signifie que l’on peut traverser ; si elle est rouge alors il ne faut surtout pas bouger.

Documentation

Prototypes

Difficultés

Test(s) de la solution

Wearable réalisé

Cognitive walkthrough

Persona

Persona des utilisateurs·trice de Pomodor'Up

Objectifs

  • forcer une alternance entre des phases de travail et des phases de pause
  • forcer une mise en mouvement au début et à la fin des phases de pause
  • indiquer facilement la progression de l'utilisateur·trice dans sa réalisation des tâches (dans une même séquence "pomodoro")

Scénario d'utilisation

  1. (en amont) Réfléchir à un fractionnement des tâches compatibles avec un pomodoro
  2. Allumage du dispositif
  3. (facultatif: activation/désactivation des fonctionnalités sonores)
  4. Lancement du dispositif
  5. Réalisation d'une séquence "pomodoro" (i.e. réalisation de tâches lors de 4 phases de travail de 25 minutes alternées avec des phases de pause de 5 minutes (avec une pause finale de 20 minutes)
  6. Lancement et réalisation d'une autre séquence "pomodoro" (4 à 5 dans la journée)
  7. Mise hors tension du dispositif

Test utilisateurs

Questionnaire

Discussion

Cette partie inclus deux sous parties :

  • Discussion du design (et si c'était à refaire)
  • Discussion des résultats de vos tests utilisateurs

Licence, fichiers et documentation

By-nc.png Cette œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale 4.0 International.

  • Fichiers :

Insérer ici vos fichiers ou les liens vers vos fichiers

  • Documentation :

Insérer ici une petite documentation pour l'utilisation de l'objet si nécessaire

Programme

Voici le programme (en bloc et en JavaScript) de Pomodor'Up. Il est aussi disponible sur MakeCode à cette adresse.

Programme en "bloc" du Pomodor'Up
//////////////////////// DEFINITION DES VARIABLES ////////////////////////

let strip: light.NeoPixelStrip = null // definition des leds utilisees dans le strip
let volume = 0
let check = 0 // nombre de pomodoro effectues

// Variables liees au temps //
let minutes = 0
let tempsTravail = 0
let tempsPauseCourte = 0
let tempsPauseLongue = 0

// Variables liees au signalement de la pause
let pause2 = 0
let finPause = 0

// Definition des temps de travail et de pause (en minutes)
forever(function () {
    minutes = 60000
    tempsTravail = minutes * 25
    tempsPauseCourte = minutes * 5
    tempsPauseLongue = minutes * 15
})


//////////////////////// FONCTIONS DU POMODOR'UP (volume, mouvement, sons, lumieres, temps de travail et de pause) ////////////////////////

// gestion du volume (on/off)
input.buttonA.onEvent(ButtonEvent.Click, function () {

    // desactiver le volume 
    if (volume != 0) {
        music.jumpDown.playUntilDone() // feedback audio off
        volume = 0
        music.setVolume(volume)
    } 
        // activer le volume 
    else {
        volume = 500
        music.setVolume(volume) // feedback audio on
        music.jumpUp.play()
    }
})

// Gestion du mouvement (si le pomodoro est secoue => mettre ces variables a 1)
input.onGesture(Gesture.Shake, function () {
    pause2 = 1
    finPause = 1
})

// periode de travail
function travail () {
    // gestion de la lumiere sur le strip et le CPX
    light.setBrightness(20)
    strip.setBrightness(20)
    light.setAll(0xff8000)
    strip.setAll(0xff8000)
    // gestion du volume
    music.setVolume(volume)
    // timer 
    pause(tempsTravail)
}

// signal de pause
function alarmePause () {
    // gestion de la lumiere 
    light.setBrightness(255)
    strip.setBrightness(255)

    // alternance de lumieres jusqu'a ce que l'accelerometre soit declenche
    while (pause2 == 0) {
        // alternance lumiere
        light.setAll(0x00ffff)
        strip.setAll(0x00ffff)
        pause(200)
        light.setAll(0xffff00)
        strip.setAll(0xffff00)

        // declenchement de l'alarme
        music.setVolume(volume)
        music.baDing.play()
        pause(100)
        light.clear()
    }

    // mettre la variable fin de pause a 0 pour que la fonction se declenche a la prochaine pause 
    finPause = 0
}

// signal de fin de pause
function alarmeFinPause () {

    // gestion de la puissance de la lumiere 
    light.setBrightness(255)
    strip.setBrightness(255)

    // si l'accelerometre n'est pas declenche => alternance de lumiere et signal sonore
    if (finPause == 0) {
        while (finPause == 0) {
            light.setAll(0x00ffff)
            strip.setAll(0x00ffff)
            music.playTone(659, music.beat(BeatFraction.Half))
            pause(50)
            light.setAll(0x00ff00)
            strip.setAll(0x00ff00)
            music.setVolume(volume)
            music.playTone(523, music.beat(BeatFraction.Half))
            pause(50)
            light.clear()
        }
    }
    // si l'accelerometre est declenche => mettre pause2 a 0 
    if (finPause == 1) {
        pause2 = 0
    }
}

// definition de la pause 
function pauseCourte () {
    music.setVolume(volume)
    pause2 = 0
    // si la pause est a 0 => declencher l'alarme 
    if (pause2 == 0) {
        alarmePause()
    }

    //si le pomodorup a ete secoue => lancer la pause 
    if (pause2 == 1) {
        light.setBrightness(255)
        strip.setBrightness(255)
        light.setAll(0x00ff00)
        strip.setAll(0x00ff00)
        pause(tempsPauseCourte) // attendre le temps defini en amont avant de declencher l'alarme de fin de pause 
        alarmeFinPause() // appelle l'alarme de fin de pause
    }
}


// meme fonction que "pauseCourte" avec un temps de pause plus long 
function pauseLongue () {
    music.setVolume(volume)
    pause2 = 0
    if (pause2 == 0) {
        alarmePause()
    }
    if (pause2 == 1) {
        light.setBrightness(255)
        strip.setBrightness(255)
        light.setAll(0x00ff00)
        strip.setAll(0x00ff00)
        pause(tempsPauseLongue)
    }
}

//////////////////////// SEQUENCE POMODORO ////////////////////////

// declenchement avec le bouton B
input.buttonB.onEvent(ButtonEvent.Click, function () {

    // definition des parametres de base
    light.setBrightness(255)
    check = 0
    strip = light.createStrip(pins.A1, check)
    music.setVolume(volume)

    // feedback d'initialisation
    music.powerUp.play()
    light.setAll(0x00ff00)
    pause(750)

    // alternance travail - pause (3 fois)
    for (let i = 0; i < 3; i++) {
        // phase "travail"
        travail()
        // gestion des checks signalant les pomodoro
        if (check >= 1) {
            check = check + 2 // allumer 2 LEDs par pomodoro
        } else {
            check = 1 // allumer une seule LED au premier pomodoro
        }
        //activer les LEDs
        strip = light.createStrip(pins.A1, check)
        strip.setAll(0x00ff00)
        //declenchement de la pause
        pauseCourte()
    }

    // DERNIER POMODORO : travail + pause longue
    travail() // phase travail

    // ajout de la derniere coche 
    check = check + 2
    strip = light.createStrip(pins.A1, check)
    strip.setAll(0x00ff00)
    
    //pause longue 
    pauseLongue()
    pause(100)
    
    // signal de fin
    light.setBrightness(255)
    strip.setBrightness(255)
    light.setAll(0xffffff)
    strip.setAll(0xffffff)

    // musique de fin 
    music.playMelody("G C5 B A A G G - ", 300)
    music.playMelody("G A G A G A G A ", 300)
    music.playMelody("G A G A G A A A ", 300)
    pause(2000)

    // remise a 0 des elements
    strip.setBrightness(0)
    light.clear()
    strip.clear()
})

Bibliographie