Description
Dans le cadre du projet développement, nous avons réaliser un dispositif à installer sur un escalier, dispositif qui émet des notes de musique lorsqu’une personne emprunte l’escalier.
L’objectif est de favoriser l’utilisation de l’escalier traditionnel au détriment de l’escalier mécanique, afin de promouvoir l’activité physique dans notre société. L’aspect fatiguant des escaliers traditionnels est remplacé par un aspect ludique grâce à la musique, ce qui favorise son utilisation.
Matériel utilisé
- 1 Raspberry Pi B
- 3 cartes Arduino UNO
- 2 émetteurs radio FS1000A (433 MHz)
- 1 récepteur radio XY-MK-5V
- 4 modules de détection US-HC-SR04
- 1 lecteur de tag RFID RC522
Fonctionnement
L’élément prépondérant de l’escalier musical est la détection de l’usager. Pour se faire, nous utilisons les modules de détection ultrason US-HC-SR04 qui, grâce au principe d’émission-réflexion des ondes ultrasonores fournissent en continu la distance entre le capteur et un obstacle. Lorsque personne ne passe, cet obstacle est le mur opposé, et lorsqu’un obstacle se situe à une distance inférieure à un seuil, il s’agit de la jambe d’un passant et il faut donc émettre un son.
Cette tâche incombe à un Raspberry Pi modèle B qui, grâce au programme Python présenté en Annexe, émet un son lorsqu’il reçoit l’information correspondant à une marche.
Cette information transite entre le capteur ultrason et le Raspberry Pi par ondes radio grâce aux émetteurs FS1000A et au récepteur XY-MK-5V. Nous utilisons pour cela la librairie VirtualWire.
Les émetteurs sont chacun branchés à une carte Arduino UNO, où sont également branchés deux modules de détection. Ainsi, chaque émetteur transmet les informations correspondant à deux capteurs. Celles-ci sont récupérées par le récepteur XY-MK-5V, branché à une carte Arduino UNO, elle-même reliée au Raspberry Pi. Le code des cartes Arduino UNO émettrice et réceptrice est présentée en Annexe.
De plus, un lecteur de tag RFID est relié à la carte Arduino UNO réceptrice, afin de permettre aux membres de Télécom Bretagne de changer l’instrument joué grâce à leur badge. Les librairies SPI et MFRC522 sont utilisées pour cette tâche.
Le schéma suivant illustre le principe de fonctionnement de l’escalier:
Annexe
Code Python implémenté à exécuter par le Raspberry Pi:
#serial est une bibliothèque qui permet la lecture des données provenant du port série
#pygame est une bibliothèqye dont le module mixer permet de jouer des fichiers .mp3
import serial, pygame.mixer
#initialisation du mixer
pygame.mixer.init()
#initialisation de la connexion série
ser=serial.Serial(‘/dev/ttyACM1’,9600)
#la boucle sera exécutée à l’infini
while 1:
#on récuppère la valeur provenant du port série
newIncome = ser.readline()
# si c’est un instrument, on défini la variable instrument comme l’instrument correspondant
if newIncome==‘piano\r\n’:
instrument = ‘piano’
if newIncome==‘trompette\r\n’:
instrument = ‘trompette’
if newIncome==‘coeur\r\n’:
instrument = ‘coeur’
if newIncome==‘batterie\r\n’:
instrument = ‘batterie’
if newIncome==‘piano2\r\n’:
instrument = ‘piano2’
#si c’est une note de musique, on la joue grâce au module pygame.mixer
#les notes sont contenues dans un dossier dont le nom correspond à l’instrument dont elles sont issues
if newIncome== ‘A\r\n’ :
pygame.mixer.music.load(‘/home/pi/Music/%s/la.mp3’+instrument)
pygame.mixer.music.play(loops=0, start =0.1)
elif newIncome == ‘B\r\n’:
pygame.mixer.music.load(‘/home/pi/Music/%s/si.mp3’+instrument)
pygame.mixer.music.play(loops=0, start =0.1)
elif newIncome == ‘C\r\n’ :
pygame.mixer.music.load(‘/home/pi/Music/%s/do.mp3’+instrument)
pygame.mixer.music.play(loops=0, start =0.1)
elif newIncome ==‘D\r\n’:
pygame.mixer.music.load(‘/home/pi/Music/%s/re.mp3’+instrument)
pygame.mixer.music.play(loops=0, start =0.1)
elif newIncome == ‘E\r\n’ :
pygame.mixer.music.load(‘/home/pi/Music/%s/mi.mp3’+instrument)
pygame.mixer.music.play(loops=0, start =0.1)
elif newIncome == ‘F\r\n’ :
pygame.mixer.music.load(‘/home/pi/Music/%s/fa.mp3’+instrument)
pygame.mixer.music.play(loops=0,start = 0.1)
elif newIncome == ‘G\r\n’:
pygame.mixer.music.load(‘/home/pi/Music/%s/sol.mp3’+instrument)
pygame.mixer.music.play(loops=0,start = 0.1)
elif newIncome == ‘c\r\n’:
pygame.mixer.music.play(‘/home/pi/Music/%s/DO.mp3’+instrument)
pygame.mixer.music.play(loops=0,start = 0.1)
Code de la carte Arduino UNO émettrice:
include <VirtualWire.h>
/* virtualWire est une librairie libre de droit permettant l’utilisation
des modules de transmission-réception radio*/
// initialisation des pins
int trig1 = 12;
int echo1 = 11;
int trig3=8;
int echo3=7;
// instanciation des variables utiles
long lecture_echo1;
long cm1;
long lecture_echo3;
long cm3;
//messages qui seront envoyés, à changer d’une carte à l’autre (msgStringD et msgStringE par exemple pour envoyer D et E)
String msgStringG;
String msgStringF;
void setup(){
// paramétrage des capteurs
pinMode(trig1, OUTPUT);
digitalWrite(trig1, LOW);
pinMode(echo1, INPUT);
pinMode(trig3, OUTPUT);
digitalWrite(trig3, LOW);
pinMode(echo3, INPUT);
//initialisation de la communication via le port série (USB)
Serial.begin(9600);
Serial.println(« setup transmitter 1 « );
//initialisation de la communication par radio
vw_setup(2000);
vw_set_tx_pin(2);
}
//code qui sera répété indéfiniment
void loop(){
// récupération de la distance cm1 du capteur 1 à l’obstacle
digitalWrite(trig1, HIGH);
delayMicroseconds(10);
digitalWrite(trig1, LOW);
lecture_echo1 = pulseIn(echo1, HIGH);
cm1 = lecture_echo1 / 58;
// récupération de la distance du capteur 3 à l’obstacle
digitalWrite(trig3,HIGH);
delayMicroseconds(10);
digitalWrite(trig3,LOW);
lecture_echo3=pulseIn(echo3,HIGH);
cm3 = lecture_echo3 / 58;
/* si la distance de l’obstacle au capteur est inférieure à 115cm et que c’est la première fois que l’obstacle
est detecté, on envoie l’information correspondant au capteur */
if( cm1 < 115 && msgStringF != « F » && cm1 != 0 ){
//traitement des données
msgStringF = « F »; /*ces valeurs seront à changer en cas de changement de carte*/
const char* msg = msgStringF.c_str();
// envoi des données par radio
vw_send((uint8_t *)msg,strlen(msg));
Serial.println(« envoyé »);
}
// sinon, on réinitialise les valeurs
elseif( cm1 >= 115){
msgStringF = « 0 »;
}
// le principe est identique pour le second capteur
if(cm3 < 115 && msgStringG != « G » && cm3!= 0){
msgStringG = « G »;
const char* msg = msgStringG.c_str();
vw_send((uint8_t *)msg,strlen(msg));
Serial.println(« envoyé »);
}
elseif( cm3 >= 115 ){
msgStringG = « 0 »;
}
delay(200);
}
Code de la carte Arduino UNO réceptrice:
#include <VirtualWire.h>
/*
* SPI et MFRC522 sont deux bibliothèques qui permettent la gestion
* du lecteur RFID
*/
#include <SPI.h>
#include <MFRC522.h>
//configuration des pins du lecteur RFID
#define RST_PIN 9
#define SS_PIN 10
//on créer une instance MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
// instanciation et déclaration des variables utiles par la suite
String instruments[]={« piano », « trompette », « batterie »,« coeur »,« piano2 »};
int i = 0;
char ASCII[128];
void setup(){
// on créer un tableau de 128 char correspondant à 128 caractères du code ASCII
for(int i = 0; i<33 ; i++){
ASCII[i]= ‘ ‘;
}
ASCII[47]= ‘/’;
ASCII[58]= ‘:’;
ASCII[59]= ‘;’;
ASCII[60]= ‘<‘;
ASCII[61]= ‘=’;
ASCII[62]= ‘>’;
ASCII[63]= ‘?’;
ASCII[64]= ‘@’;
ASCII[65]= ‘A’;
ASCII[66]= ‘B’;
ASCII[67]= ‘C’;
ASCII[68]= ‘D’;
ASCII[69]= ‘E’;
ASCII[70]= ‘F’;
ASCII[71]= ‘G’;
ASCII[72]= ‘H’;
ASCII[91]= ‘[‘;
ASCII[92]= ‘ ‘;
ASCII[93]= ‘]’;
ASCII[94]= ‘^’;
ASCII[95]= ‘_’;
ASCII[96]= ‘ ‘;
ASCII[97]= ‘a’;
ASCII[98]= ‘b’;
ASCII[99]= ‘c’;
ASCII[100]= ‘d’;
ASCII[101]= ‘e’;
ASCII[102]= ‘f’;
ASCII[103]= ‘g’;
ASCII[104]= ‘h’;
ASCII[123]= ‘{‘;
ASCII[124]= ‘|’;
ASCII[125]= ‘}’;
ASCII[126]= ‘~’;
ASCII[127]= ‘ ‘;
// initialisation de la communication en série (USB)
Serial.begin(9600);
Serial.println(« setup reciever »);
// initialisation du récepteur radio
vw_setup(2000);
vw_set_rx_pin(2);
vw_rx_start();
//initialisation du lecteur RFID
SPI.begin();
mfrc522.PCD_Init();
}
void loop(){
//définition de la variable dans laquelle sera stocké le message reçu
uint8_t buf[VW_MAX_MESSAGE_LEN];
// longueur du message maximal pouvant être reçu
uint8_t buflen = VW_MAX_MESSAGE_LEN;
// si une carte est présente, on pioche dans la liste des instruments et on transmet cette information via le port série
if( mfrc522.PICC_IsNewCardPresent()){
Serial.println(instruments[i%5]);
i++;
}
// si réception du message, on le lit et on le transmet via le port série
if(vw_get_message(buf,&buflen))
{
int i;
// Message with a good checksum received, dump HEX
for(i = 0; i < buflen; i++)
{
Serial.println(ASCII[buf[i]]);
}
}
}