Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
wiki:flossmanuals:bouton-jukebox-aleatoire:accueil [2021/05/01 17:47] damien.muti |
wiki:flossmanuals:bouton-jukebox-aleatoire:accueil [2021/05/20 15:59] (Version actuelle) damien.muti [Programme Processing] |
||
---|---|---|---|
Ligne 24: | Ligne 24: | ||
{{ : | {{ : | ||
- | |||
===== Plans et schémas de fonctionnement ===== | ===== Plans et schémas de fonctionnement ===== | ||
+ | ===== Programme et montage Arduino ===== | ||
+ | |||
+ | Le montage permettant de capter le signal provenant du bouton poussoir est le suivant : | ||
+ | {{ : | ||
+ | |||
+ | Lorsqu' | ||
+ | |||
+ | Le montage Arduino est le suivant : | ||
+ | {{ : | ||
+ | |||
+ | Le programme permettant d' | ||
+ | |||
+ | < | ||
+ | /* | ||
+ | Branchement sur ARduino NANO BLE | ||
+ | sur bread board - Branchement USB en bas | ||
+ | + : 2 à droite | ||
+ | GND (-) : 14 à droite | ||
+ | ENtrée Bouton : 11 à gauche | ||
+ | |||
+ | */ | ||
+ | |||
+ | // constants won't change. They' | ||
+ | const int buttonPin = 2; // the number of the pushbutton pin | ||
+ | const int ledPin = 13; // the number of the LED pin | ||
+ | |||
+ | // variables will change: | ||
+ | int buttonState = 0; // variable for reading the pushbutton status | ||
+ | int inByte = 0; // incoming serial byte | ||
+ | |||
+ | void setup() { | ||
+ | // initialize the LED pin as an output: | ||
+ | pinMode(ledPin, | ||
+ | // initialize the pushbutton pin as an input: | ||
+ | pinMode(buttonPin, | ||
+ | // port Série | ||
+ | // start serial port at 9600 bps: | ||
+ | Serial.begin(9600); | ||
+ | while (!Serial) { | ||
+ | ; // wait for serial port to connect. Needed for native USB port only | ||
+ | } | ||
+ | // établir le contact avec Processing | ||
+ | establishContact(); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | if (Serial.available() > 0) { // si un octet arrive sur le port série | ||
+ | //de la carte venant de Processing | ||
+ | // get incoming byte: | ||
+ | inByte = Serial.read(); | ||
+ | | ||
+ | // read the state of the pushbutton value: | ||
+ | buttonState = digitalRead(buttonPin); | ||
+ | |||
+ | // check if the pushbutton is pressed. If it is, the buttonState is HIGH. | ||
+ | // //et envoi de la valeur | ||
+ | if (buttonState == HIGH) { // bouton appuyé => 5V en D2 => envoi de 255 et allumer LED 13 | ||
+ | // | ||
+ | Serial.write(255); | ||
+ | // turn LED on: | ||
+ | digitalWrite(ledPin, | ||
+ | } else { // bouton relâché => 0V en D2 => envoi de 0 et éteindre LED 13 | ||
+ | // | ||
+ | byte zero = 0; | ||
+ | Serial.write(zero); | ||
+ | // turn LED off: | ||
+ | digitalWrite(ledPin, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void establishContact() { | ||
+ | while (Serial.available() <= 0) { | ||
+ | Serial.print(' | ||
+ | delay(300); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | Ce programme est inspiré de l' | ||
+ | |||
+ | Lorsque le bouton est relâché, la led est éteinte et la carte envoie 0 via le port série. Lorsque le bouton on allume | ||
+ | |||
+ | |||
+ | ===== Programme Processing ===== | ||
+ | Les sons joués par Processing peuvent être mis dans le dossier " | ||
+ | * **mp3** | ||
+ | * **aiff** | ||
+ | * **wave** | ||
+ | |||
+ | Dans sa boucle de fonctionnement, | ||
+ | l' | ||
+ | |||
+ | * jouer le son si le bouton est appuyé | ||
+ | * tester le compteur de sonnerie. Si le compteur est égal à zéro, tirer un son aléatoire dans la liste des sons | ||
+ | * lancer le son et incrémenter le compteur de sonnerie. | ||
+ | * sinon (i.e. si si le bouton est relâché ET que le son joue) : | ||
+ | * arrêter le son | ||
+ | * tester si le compteur d' | ||
+ | |||
+ | Le programme Processing est le suivant : {{ : | ||
+ | |||
+ | sonnerie_8_recherche_fichier : | ||
+ | < | ||
+ | /** Affiche tactile interactive - | ||
+ | | ||
+ | */ | ||
+ | /// librairies | ||
+ | import processing.sound.*; | ||
+ | import processing.video.*; | ||
+ | import processing.serial.*; | ||
+ | |||
+ | |||
+ | // variables globales | ||
+ | SoundFile son; // un son - un seul lecteur CD audio | ||
+ | ArrayList < | ||
+ | java.util.List< | ||
+ | |||
+ | // bouton son actif ? | ||
+ | boolean son_actif = false; | ||
+ | float tempsDebutSon = 0; // temps du début de la musique a été joué | ||
+ | |||
+ | |||
+ | /// dialogue avec la carte Arduino | ||
+ | Serial myPort; | ||
+ | boolean firstContact = false; | ||
+ | int donneePortSerie; | ||
+ | |||
+ | // compteur sonnerie | ||
+ | int interationSonnerie = 2; | ||
+ | int compteurSonnerie = 0; | ||
+ | int indiceSon = 0; | ||
+ | |||
+ | // debug | ||
+ | boolean debug = false; | ||
+ | |||
+ | |||
+ | void setup() { // initialisation des paramètres d' | ||
+ | size(500, 500); | ||
+ | noStroke(); | ||
+ | background(0); | ||
+ | |||
+ | // chargement des nom des sons | ||
+ | String[] extensionsArray = {" | ||
+ | extensions = java.util.Arrays.asList(extensionsArray); | ||
+ | |||
+ | nomDesSons = rechercheTousLesSons(); | ||
+ | |||
+ | son = new SoundFile(this, | ||
+ | |||
+ | /// Port série | ||
+ | // Print a list of the serial ports, for debugging purposes: | ||
+ | printArray(Serial.list()); | ||
+ | |||
+ | String portName = Serial.list()[0]; | ||
+ | myPort = new Serial(this, | ||
+ | } | ||
+ | |||
+ | void draw() { | ||
+ | fill(0); | ||
+ | rect(0, 0, width, height); | ||
+ | fill(255); | ||
+ | text(donneePortSerie, | ||
+ | } | ||
+ | |||
+ | void serialEvent(Serial myPort) { | ||
+ | // lire la donnée sur la port série | ||
+ | int inByte = myPort.read(); | ||
+ | |||
+ | if (firstContact == false) { | ||
+ | if (inByte == ' | ||
+ | myPort.clear(); | ||
+ | firstContact = true; // you've had first contact from the microcontroller | ||
+ | myPort.write(' | ||
+ | println(" | ||
+ | } | ||
+ | } else { | ||
+ | donneePortSerie = inByte; // lire la donnée et la stoquer dans inBuffer (chaine de caractères - String) | ||
+ | //debug | ||
+ | if (debug) { | ||
+ | println(" | ||
+ | } | ||
+ | |||
+ | // tester la valeur du bouton et gérer le son | ||
+ | gestionSon(); | ||
+ | |||
+ | // envoyer ' | ||
+ | myPort.write(' | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | La partie " | ||
+ | < | ||
+ | //////////////////////////////////////////////// | ||
+ | void gestionSon(String nomDuSon) { | ||
+ | //if (donneePortSerie < seuil && donneePortSerie> | ||
+ | // jouer le son SSI si le buton est appuyé | ||
+ | if (donneePortSerie == 255 && !son.isPlaying()) { // son | ||
+ | // lancement du son | ||
+ | lancerSon(nomDuSon); | ||
+ | } else if (donneePortSerie == 0 && son.isPlaying()) { //si le bouton est relâché ET que le son joue : arrêter le son | ||
+ | son.stop(); | ||
+ | } | ||
+ | } | ||
+ | void gestionSon() { /// tirage aléatoire parmi la liste de son joué 2 fois | ||
+ | // jouer le son SSI si le bouton est appuyé | ||
+ | if (donneePortSerie == 255 && !son.isPlaying()) { // son | ||
+ | // test du compteur de sonnerie | ||
+ | if (compteurSonnerie == 0){ | ||
+ | //tirer un son aléatoire dans la liste des sons | ||
+ | indiceSon = floor(random(0, | ||
+ | } | ||
+ | // lancement du son | ||
+ | lancerSon(nomDesSons.get(indiceSon)); | ||
+ | println(nomDesSons.get(indiceSon)); | ||
+ | } else if (donneePortSerie == 0 && son.isPlaying()) { //si le bouton est relâché ET que le son joue : arrêter le son | ||
+ | son.stop(); | ||
+ | // tester si le compteur d' | ||
+ | compteurSonnerie = compteurSonnerie % interationSonnerie; | ||
+ | } | ||
+ | } | ||
+ | void lancerSon(String nomDuSon) { | ||
+ | if (!son.isPlaying()) { // le son ne joue pas | ||
+ | // chargement du son 1 | ||
+ | son = new SoundFile(this, | ||
+ | // jouer le son | ||
+ | son.loop(); | ||
+ | // | ||
+ | compteurSonnerie++; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | Enfin, la lecture automatique des fichiers son est gérée par le code suivant : | ||
+ | |||
+ | < | ||
+ | ArrayList< | ||
+ | ArrayList< | ||
+ | |||
+ | // Using just the path of this sketch to demonstrate, | ||
+ | // but you can list any directory you like. | ||
+ | String path = sketchPath(); | ||
+ | |||
+ | // recherche de tous les dossiers et fichiers dans le dossier du sketch parent | ||
+ | ArrayList< | ||
+ | |||
+ | // recherche de tous les fichiers " | ||
+ | if (allFiles != null) { | ||
+ | |||
+ | // recherche de tous les fichiers son : .mp3, .aif, .wav | ||
+ | for (File f : allFiles) { | ||
+ | String fname = f.getName(); | ||
+ | String fileExt = fname.toLowerCase().substring(fname.lastIndexOf(' | ||
+ | if (extensions.contains(fileExt)) { | ||
+ | // fname.toLowerCase().endsWith(" | ||
+ | nomDesSons.add(f.getAbsolutePath()); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // | ||
+ | // | ||
+ | // | ||
+ | |||
+ | return nomDesSons; | ||
+ | } | ||
+ | |||
+ | // Function to get a list of all files in a directory and all subdirectories | ||
+ | ArrayList< | ||
+ | ArrayList< | ||
+ | recurseDir(fileList, | ||
+ | return fileList; | ||
+ | } | ||
+ | |||
+ | // Recursive function to traverse subdirectories | ||
+ | void recurseDir(ArrayList< | ||
+ | File file = new File(dir); | ||
+ | if (file.isDirectory()) { | ||
+ | // If you want to include directories in the list | ||
+ | a.add(file); | ||
+ | File[] subfiles = file.listFiles(); | ||
+ | for (int i = 0; i < subfiles.length; | ||
+ | // Call this function on all files in this directory | ||
+ | recurseDir(a, | ||
+ | } | ||
+ | } else { | ||
+ | a.add(file); | ||
+ | } | ||
+ | } | ||
- | ===== Programmes ===== | + | </code> |
- | ==== Références : Contrôle d’accès par badge RFID avec Arduino ==== | + | |
- | Le programme permettant de détecter l' | + | |
- | ===== Réalisation de la maquette ===== | ||
- | vidéos, photos du making of... | ||