Faire de la musique avec un lecteur floppy et un Arduino

Bonjour à tous, aujourd'hui est un grand jour puis-ce que c'est notre premier tuto sur l'Arduino !

Comme d'habitude, une petite démo :

Eh oui, nous allons faire de la musique avec un lecteur de disquette (floppy en anglais) !

1. Introduction

Pour ceux qui auraient vécu dans une grotte ces dernières années, ce hack à fait un gros buz il y a maintenant quelques années. J'ai longtemps été frustré de ne pas pouvoir essayer mais ce temps est révolu car j'ai en ma possession : un Arduino Uno !

Eh c'est quoi un Arduino ?

C'est une plateforme open-source d'électronique programmée qui est basée sur une simple carte à microcontrôleur (de la famille AVR) et un logiciel pour écrire/compiler/transférer les programmes vers la carte à microcontrôleur.
Uno est une des nombreuses déclinaisons de Arduino, il en existe beaucoup d'autres, comme Leonardo, Due, Esplora, Mini et j'en passe.

Arduino Uno
Arduino Uno

Derrière ce nom se cache toute une communauté active, donc vous n'aurez aucun mal à trouver de la documentation ou même de l'aide sur le net ;)

En somme, Arduino = 1 carte à microcontrôleur + 1 outil de développement + 1 communauté active. Le logiciel et le matériel sont open-source.

Ouais ok, mais tu vas pas nous faire croire que c'est le lecteur floppy qui fait du son quand même ?

Eh bien si ! c'est le lecteur disquette et rien d'autre qui fait de la "musique".

Comme toujours, le principe est relativement simple à comprendre.
Ce qui produit le son typique des lecteurs disquette est le moteur servant à déplacer la tête de lecture. Lorsque la tête se déplace d'avant en arrière (et inversement) de manière très rapide, le moteur entre en résonance et créé une fréquence audible.
Le but ici est de contrôler cette fréquence. Pour cela, il suffit de contrôler la durée pendant laquelle la tête de lecture avance et recule. C'est aussi simple que ça.
Après, c'est par l'expérience que l'on détermine les "notes" jouées par le lecteur disquettes.

Pour ce tutoriel, vous allez avoir besoin de :

  • 1 Arduino et son câble USB
  • Au moins 1 lecteur disquettes (si vous en avez plusieurs c'est tant mieux)
  • Du fils à strap
  • Si possible, la nappe de votre FDD, sinon les fils suffiront
  • 1 alimentation de PC (ou de quoi alimenter votre FDD, par exemple une alimentation de labo)

Allez, place à la pratique !

2. Partie hardware

Tout d'abord, nous allons commencer par comprendre à quoi correspondent les broches au dos du FDD.

Floppy pinout Table des corresponsdances

Voici les signaux qui vont nous intéresser :

  • /DRVS(A/B) : sert à sélectionner le lecteur A ou B
  • /DIR : défini le sens dans lequel le moteur va tourner
  • /STEP : fait avancer (ou reculer selon /DIR) le moteur d'un "pas" (il s'agit en effet d'un moteur pas à pas)

Le / devant le nom des signaux signifie qu'ils sont actifs au niveau logique bas (0), pour les activer il faudra donc les relier à la masse.

Comme on peut le voir sur le schéma, les pin supérieurs sont les pins PAIRES et les pins inférieurs sont les pins IMPAIRES. Ces dernières ne sont autres que les masses.

De manière générale, les ordinateur ont un à deux lecteurs floppy, A et B. Pour sélectionner le FDD A, il faut relier les broches 13 et 14 (/DRVSA), pour sélectionner le FDD B, il faut relier les broches 11 et 12 (/DRVSB). Pour ma part j'ai choisi le B.

Sélection du lecteur disquettes

Pour relier les broches, je vous conseil d'utiliser un jumper, c'est plus propre et moins galère que de souder ;)

A ce stade, lorsque vous alimentez votre lecteur disquette, la LED en façade devrait s'allumer, signe que votre FDD est activé.

Alimentation du lecteur floppy LED allumée en façace du lecteur floppy

Petit rappel sur les alimentations de PC : pour les démarrer, il faut relier le fil VERT du connecteur 24 broches à un fil NOIR (une masse).

Maintenant que votre FDD est activé, vous pouvez vérifier les commandes moteur. Pour cela rien de plus simple :
faites se toucher les broches 19 et 20 (signal /STEP) pour faire bouger votre moteur dans un sens. Recommencez cette fois-ci en ayant également relié les broches 17 et 18 (signal /DIR) et votre moteur se déplace dans l'autre sens.
Si rien ne se passe, vous pouvez changer de FDD, il est mort :P

FDD pinout

Maintenant que vous êtes sûr que votre lecteur disquettes fonctionne, il ne reste plus qu'à le relier aux entrées/sorties de l'Arduino comme ceci :

Cablage du FDD à l'Arduino

Si vous souhaitez brancher un second lecteur floppy, il vous suffira de relier la broche 18 (/DIR) à la borne 5 de l'Arduino et la broche 20 (/STEP) à la borne 4 de l'Arduino. Pour un troisième, 18 vers 7 et 20 vers 6 ... etc

Photo du câblage floppy vers Arduino

3. Partie software

3.1 Téléchargement des sources et installation des librairies

Nous arrivons maintenant à la partie que je qualifierais de chiante.

Pour la suite de ce tuto, je suppose que vous utiliser la version 8 de Java.

Tout d'abord il va falloir télécharger quelques trucs :

Commencez par installer l'Arduino software.

Notez dans un petit coin de votre tête que pour ajouter des futures librairies, il suffit de placer les fichiers dans le dossier Arduino/librairies créé (généralement) dans Mes Documents. Nous en aurons besoin pour la suite.

3.1.1 Librairies Java

Installez JDK 8u111 with NetBeans 8.2. Rien de spécial à ce sujet, choisissez juste la version correspondant à votre OS.

Décrompessez l'archive Moppy-master.zip et rendez vous dans le dossier créé, puis dans Java/SerialDrivers/rxtx-2.1-7-bins-r2/. Copiez le fichier RXTXcomm.jar et collez-le dans le dossier C:\Program Files (x86)\Java\jre7\lib\ext.
Ensuite, retournez dans Moppy/Java/SerialDrivers/rxtx-2.1-7-bins-r2, puis dans le dossier Windows. Là, ouvrez le dossier correspondant à votre configuration (32bits ou 64bits) et copiez les .dll.
Enfin, collez-les dans C:\Program Files (x86)\Java\jre7\bin.
Voilà, vous venez d'ajouter des librairies à Java pour gérer les connexions séries.

Comme je sais que vous aimez les schémas, voici le résumé en images ;)

Illustration des copies de fichiers

Cette manip' décrit l'ajout de librairies Java sous Windows mais c'est sensiblement la même chose pour les autres OS.

3.1.2 Librairies Arduino

Décompessez l'archive TimerOne-v9.zip, puis rendez vous dans le dossier créé et copiez son contenu. Rendez vous ensuite dans le dossier Arduino/librairies dont je vous ai parlé précédement, créez un dossier nommé TimerOne et collez-y le tout.

Copie des fichiers librairies Arduino

Voilà, les librairies Arduino sont installées.

3.2 Première connexion entre l'Arduino et votre ordinateur

Ici, je pars du principe que vous connectez votre Arduino à votre PC pour la première fois et donc que les drivers de ce dernier ne sont pas installés. Si tel n'est pas le cas, vous pouvez passer directement à la section suivante.

La procédure d'installation décrite ici n'est valable que pour Windows. A vous de l'adapter à votre OS.

Commencez par brancher votre Arduino à votre PC à l'aide du câble USB. Là Windows devrait vous dire qu'il n'a pas réussi à identifier le périphérique USB. Rendez vous dans le gestionnaire de périphriques. Là vous voyez que l'Arduino est effectivement en périphérique inconnu.

Périphérique inconnu

Double cliquez dessus et faites Mettre à jour le pilote puis Rechercher un pilote sur mon Ordinateur. Là, sélectionnez le dossier où vous avez installé (ou extrait) Arduino Software et laissez-le chercher. Normalement, Windows doit trouver le driver.

Une fois les drivers installés, notez sur quel port votre Arduino est connecté.

Arduino connecté COM3

Maintenant, nous allons établir une connexion entre le PC et l'Arduino, pour celà, lancez l'Arduino software.
Ensuite, vérifiez que le bon port est sélectioné : Outils → Port série → COMx

Connection Arduino port série

Maintenant, nous allons charger un programme sur notre Arduino : Fichier → Exemples → 01.Basics → Blink.
Ensuite cliquez sur le petit check vert et enfin sur la flèche verte "téléverser" .

Si tout se passe bien, vous devriez voir la LED notée L de l'Arduino clignoter à 1Hz, signe que nous avons bien réussi à charger un programme depuis l'ordinateur vers l'Arduino.

3.3 Compilation et exécution du code

Nous sommes maintenant fin prêts à charger le code dans notre Arduino !
Voici le code en question : Code source

Chargez-le dans votre Arduino à l'aide de l'Arduino software comme nous venons de le faire avec le fichier d'exemple. Ensuite, ouvrez NetBeans et chargez le projet MoppyDesk. Cliquez sur la flèche verte en haut pour exécuter le projet.

Dans la fenêtre qui s'ouvre, sélectionnez le port sur lequel votre Arduino est connecté (dans mon cas COM3) et cliquez sur le bouton Connect.
Maintenant, cliquez sur Load sequence pour charger une musique au format MIDI. De base, il y en a quelques unes dans le dossier samplesongs mais vous pouvez en télécharger d'autres ou mieux, en composer vous-même !
Il ne reste plus qu'à cliquer sur Start et la magie opère !

Fenêtre NetBeans

Si vous avez suivi les étapes sans rien zapper, ça devrait fonctionner tout seul.

Certain lecteurs ont besoin d'avoir une disquette d'insérée pour fonctionner, à vous de voir si le vôtre en a besoin ou pas. Certaines musiques passent mieux que d'autres. Il m'est arrivé de n'avoir aucun son avec certaines musiques, il suffit d'en changer.

Si comme moi vous n'avez qu'un seul lecteur disquette, vous pouvez essayer de le brancher sur différentes voies de l'Arduino, pour certains morceaux vous obtiendrez un meilleur rendu.

Sources : [1] [2] [3]

Vos réactions (29) :

Penicilline28

Super tuto !
Encore merci pour ce partage.

08/08/2013 à 16:57

lobodol

@Penicilline28 : Merci, content que ça te plaise !

11/10/2013 à 13:03

kiki37250

Inpossible de complier , il me dit "
Moppy.ino: In function 'void setup()':
Moppy:70: error: 'Timer1' was not declared in this scope" :(

28/10/2013 à 15:05

seb976

merci pour ce super tuto !!
j'aimerait juste savoir comment changer les pins pour avoir un autre instrument ..

merci d'avance

23/11/2013 à 22:26

lobodol

@seb976 : Comment ça "changer les pins" ?
Pour ajouter un deuxième floppy, relis la fin de la partir 2, j'explique comment faire.

13/12/2013 à 14:00

Tutur00012

MERCI BEAUCOUP!!! Ca fait très longtemps que je voulais le faire et ça marche super bien!!!
Cependant, ya pas moyen de lui rajouter quelques notes vers les aigus?
Merci!

26/01/2014 à 22:26

romu

Merci beaucoup pour ce tuto, j'ai pas encore branché de lecteur mais la partie soft est terminée. D'ailleurs avec la dernière version de MoppyDesk on peut envoyer les infos midi directement avec un controlleur midi (clavier ou autre, reconnu part Windows sans rien faire dasn l'onglet "Keyboard")

Pour moi la partie délicate était une lib de NetBeans qui ne s'était pas installée (sans doute à cause d'un proxy au taf)

J'ai hate de passer à l'étape suivante, masi j'ai toutes les peines à trouver un lecteur de disquettes :p

PS: pour répondre à Tutur00012, je pense qu'on ne peux pas étendre le registre dans les aigus puisqu'il s'agit d'une limite physique : le moteur du lecteur ne peux sans doute pas aller plus vite.

31/01/2014 à 14:00

galaxy_doctor

Bonjour,

Ma question est que si l'on veut brancher plus de lecteur (par exemple 15 ou 16) y-a t il d'autre modèle de carte ou devons nous en acheter plusieurs et jouer avec le logiciel ?

Merci !!

20/02/2014 à 12:08

lobodol

@galaxy_doctor : Salut, pour un nombre aussi élevé de lecteurs, l'arduino n'a pas assez de sorties. Tu peux peut-être tenter quelque chose avec un multiplexeur, ça doit être jouable.

22/02/2014 à 14:18

Nachon

même problème que @kiki37250

il affiche :

sketch_mar05a.ino: In function 'void setup()':
sketch_mar05a:70: error: 'Timer1' was not declared in this scope

05/03/2014 à 15:38

lobodol

@Nachon : T'es sûr que tu as bien copié toutes les sources ? On dirait qu'il ne trouve pas les librairies relatives à TimerOne...

05/03/2014 à 16:40

alan009

bonjour a tous
voila j'ai fait tout comme il faut l'arduino reagi avec netbean mais rien ne se passe sur dix lecteur tester j'ai mis 6 de coté qui fonctionne a la perfection mais brancher au arduino rien avec ou sans disquette rien de rien avec divers musique rien le lecteur ne bouge pas pourtant il est alim le voyant est alumé tout le branchement est respecter dou vient le prob a votre avis.?

29/04/2014 à 12:56

alexxela7676

Bonjour, juste pour informer que les sortit 17 & 19 ne sont pas utile, il n'est pas necesaire de les brancher avec l'arduino.
Autre choses le 12V n'est pas nn plus utile pr le mouvement du moteur, on peut parfaitement relier le 5V & le GND de l'arduino au SDD.
voila bonne journée.

02/05/2014 à 19:08

alexxela7676

A oui, et si vous n'avez pas de disquette vous pouver aussi enclencher le mécanisme a la main, il faut juste pousser un petit bout de plastique blanc qui se trouve régulièrement du meme coter que le moteur.

02/05/2014 à 19:13

Anthony59

Bonjour,

Je trouve votre tutoriel très instructif, mais il reste un point que je n'arrive pas à éclaircir.
Pourquoi faut-il passer par un Arduino pour contrôler un lecteur de disquette? (pour vendre des Arduino?)
Un ordinateur relier à un lecteur disquette via une Nap ne permet pas de le contrôler? Il le fait bouger lui le moteur pas à pas.

j'ai peut-être rater quelque chose (fort probable), si vous pouvez m'éclairer dans ce cas ça serait sympas.

22/05/2014 à 09:32

lobodol

@Anthony59 : Je ne suis pas sûr que l'on puisse contrôler les signaux des moteurs directement depuis un PC. Ces signaux sont gérés par la carte mère (très bas niveau donc). Avec un arduino, on est capable de générer une PWM que l'on peut directement utiliser sur le lecteur floppy et ainsi contrôler les moteurs.
Je vais creuser la question pour trouver une réponse un peu plus précise.

22/05/2014 à 11:19

Giants

Ton schéma est faux.
Tu écrie sur ton image Pin12 alors que su ton image c'est la pin9 (2eme image du connecteur floppy).
La 1er image par contre est bonne.

10/02/2015 à 11:46

lobodol

@Giants : effectivement il y a une erreur sur le schéma de câblage, c'est bien vu :)
Merci pour ta remarque je vais corriger ca ce soir

10/02/2015 à 12:31

Giants

J'ai eu aussi un soucis avec le code source 'timer1.txt' qui me générait des erreur de compilation.
J'ai du le prendre directement sur le net à sa source.

Sinon c'est marrant, ça marche bien.
Mais il faut au moins deux voies (donc deux lecteurs), perso j'en ai mis trois.

Par contre, dur dur de trouver des MID qui fonctionnent bien, j'arrive pas à trouver Super Mario par exemple.

En tout cas, sympa l'article.

10/02/2015 à 15:19

lobodol

@Giants : D'accord, je vais mettre à jour le fichier dans ce cas.
Oui, à partir de deux voies ça commence à devenir marrant, mais comme tu l'as dit, ça n'est pas facile de trouver des MIDI qui donnent un bon rendu.
N'hésite pas à partager une vidéo ou des photos sur le forum de ce que tu as réalisé ;)

10/02/2015 à 15:50

EElite

Je suppose que ça fonctionne aussi avec une carte arduino NANO ?

19/02/2015 à 01:15

vincent

Bonjour,
Le "moppy" n'est pas accessible !!!
(not fond)

Merci d'avance pour vos réponses

13/03/2016 à 12:06

lobodol

@EElite : a priori oui ça fonctionne avec un Arduino Nano

@vincent : merci de créer un nouveau post sur le forum pour qu'on en discute

14/03/2016 à 20:19

Dorian

Bonjour,
j'ai un problème avec netbeans,
je lance moppydesk et il y a un msg d'erreur. Je comprend rien !!!

31/10/2016 à 11:54

lobodol

@Dorian : Salut, sans plus d'information ça va être dur de t'aider. De plus, les demandes d'aide → FORUM

14/11/2016 à 17:28

vivi

le"Moppy Software" est mort

08/01/2017 à 20:33

lobodol

@vivi: Merci pour le signalement, je vais tâcher de régler ça.

08/01/2017 à 20:35

saucisson

il n'y a pas les bon fichier dans Java/SerialDrivers

15/01/2017 à 18:42

lobodol

@saucisson: j'y travail ;)

15/01/2017 à 22:47

Vous avez besoin d'aide ? Utilisez le Forum plutôt que les commentaires.