Table des matières:
- Étape 1: Exigences 1/3 - Matériel
- Étape 2: Exigences 2/3 - Composants pour votre circuit
- Étape 3: Exigences 3/3 - Logiciel
- Étape 4: Circuit d'entrée
- Étape 5: Circuit de sortie
- Étape 6: [FACULTATIF] Création de circuits imprimés et de composants à souder
- Étape 7: configuration du SoC
- Étape 8: Programmation C HPS
- Étape 9: Acquisition numérique de l'ADC à partir de la carte
- Étape 10: Calcul de la FFT
- Étape 11: Affichage de la FFT
- Étape 12: Assemblage
- Étape 13: Effets sonores
- Étape 14: [FACULTATIF] Fabrication du casque
2025 Auteur: John Day | [email protected]. Dernière modifié: 2025-01-13 06:57
Salut! Nous sommes une équipe de 4 étudiants de l'école polytechnique de Sorbonne Université:
- Louis Buchert
- Bilal Melehi
- Bao Tinh Piot
- Marco Longépé
Ce projet est réalisé dans le cadre de nos études, et vise à prendre en main un certain nombre d'outils, ainsi qu'à démontrer nos acquis théoriques.
Le célèbre objet prend l'apparence d'un casque ressemblant à celui du héros d'un certain jeu vidéo dont le nom sera perdu. Pour le côté design également, nous avons un écran qui affiche la transformée de Fourier du signal audio sortant du haut-parleur. Le but de ce casque est de changer la voix du porteur en temps réel à l'aide d'un certain nombre d'effets sélectionnables.
Objectifs pédagogiques:
- Capturez le son d'un microphone
- Amplifier, filtrer, numériser le signal
- Réaliser la FFT d'un signal
- Afficher cette FFT sur un écran
- Synthèse de signaux
- Extraire un son d'un haut-parleur
- Réaliser des effets sur le son audio (réverbération, écho, etc…)
Maintenant que nous avons posé le décor et présenté le projet, il est temps de mettre la main dessus !
Étape 1: Exigences 1/3 - Matériel
Afin de construire avec succès votre casque, nous aurons besoin de matériel pour faire fonctionner l'appareil.
- Carte de développement DE0-Nano-SoC par Terasic + écran LCD TFT Adafruit (Arduino)
- Accès à une imprimante 3D pour fabriquer le casque (Si vous êtes un étudiant universitaire vous rapprochez de votre université, certains ont des labos accessibles aux étudiants)
- Un ordinateur avec une connexion internet et un minimum de connectivité (USB, Ethernet). Votre ordinateur doit également avoir un processeur puissant car la compilation de programmes sur Qsys prend beaucoup de temps.
- (Non requis) Une imprimante qui fabrique des cartes de circuits imprimés (PCB) à partir de fichiers Gerber afin de réduire la taille du circuit + un fer à souder pour mettre les composants sur le PCB.
- (Fortement recommandé): Un bon café pour profiter de votre travail avec notre Instructable:)
Étape 2: Exigences 2/3 - Composants pour votre circuit
Voici les composants nécessaires à votre circuit:
- Amplificateur audio Texas Instrument LM386 de classe AB
- Planche à Pain
- Jeu de câbles Mâle-Mâle, Mâle-Femelle
- Convertisseur numérique-analogique LM358P (DAC)
- Conférencier
- Petit microphone utilisé dans le circuit analogique
- Un jeu de résistances de 1kOhm à 220kOhm
- Condensateur 1.5nF
- Condensateur 50nF
- Condensateur 100nF
- Condensateur 100uF
- Condensateur 220uF
- x4 Condensateurs 10uF
Étape 3: Exigences 3/3 - Logiciel
Last but not least, vous aurez besoin d'un logiciel:
- Quartus 15.1: version allégée
- Un compilateur C (gcc par exemple)
- Altium pour la conception de circuits imprimés
-
Suite embarquée SoC d'Altera pour communiquer avec la carte SoC
- Mastic
Étape 4: Circuit d'entrée
Construisons le circuit. Utilisez l'image ci-dessus du circuit afin de l'assembler sur votre maquette. Vous verrez également l'image de la BreadBoard et du circuit à l'intérieur pour voir comment les broches sont connectées. L'ensemble du circuit est alimenté par un courant continu (CC) 5V. Pour cela, vous pouvez utiliser une batterie 5V avec un convertisseur USB-B ou un générateur de fonctions.
Quelques rappels:
- L'alimentation 5V et la terre sont connectées sur des lignes horizontales séparées de la maquette
- Si vous souhaitez connecter 2 composants en parallèle, placez-les dans une ligne commune de la maquette
- Si vous souhaitez connecter 2 composants série, les composants ne doivent qu'une seule broche dans une ligne commune de la maquette.
N'hésitez pas à regarder un tutoriel dédié sur la façon d'utiliser une maquette et de construire un circuit dessus. N'oubliez pas non plus de lire attentivement la position des broches de l'amplificateur audio LM358P (voir photo ci-dessus)
Étape 5: Circuit de sortie
Exactement les mêmes instructions qu'à l'étape 4. Les quatre entrées: SDI, pas CS, SCK, pas LDAC proviennent de votre carte DE0-Nano-Soc. Nous verrons plus tard comment les générer.
N'oubliez pas de lire attentivement les positions des broches de l'amplificateur audio LM386 (voir photo ci-dessus)
Étape 6: [FACULTATIF] Création de circuits imprimés et de composants à souder
Si vous avez la chance de posséder une imprimante à circuits imprimés ou de pouvoir en utiliser une, nous allons créer notre propre circuit imprimé (PCB). Notez que cette étape est facultative. Cette étape consiste uniquement à déplacer votre circuit d'une breadboard vers un PCB.
Vous aurez besoin de ces 2 fichiers GERBER.
Ces fichiers ont été réalisés sur Altium. Utilisez-les sur votre logiciel d'impression PCB afin d'imprimer votre PCB. Une fois que vous obtenez votre PCB, assurez-vous que votre PCB est propre et que les pistes sont correctement imprimées.
Maintenant, voici la vraie affaire: la soudure. Les 2 photos ci-dessus sont la carte du circuit sur le PCB. Chaque composant a des noms (R6, C4, MK1 etc.). Les images des étapes 4 et 5 montrent les paramètres des composants (résistance, conductance..). Placez chaque composant de votre maquette sur le PCB en fonction de leurs noms.
Une fois que vous avez tout soudé avec votre fer à souder, testez chaque composant avec un voltmètre pour vérifier s'il y a un court-circuit.
Étape 7: configuration du SoC
Concernant la configuration du SoC, vous devrez exécuter certaines commandes et scripts inclus dans la suite embarquée SoC dans un terminal. Pour ce faire, vous devrez ajouter du $PATH. PATH sont utilisés dans un terminal pour dire rechercher un fichier dans les répertoires donnés par path lorsque vous exécutez une commande. Pour cela, tapez la ligne de commande suivante:
export PATH=/cygdrive/c/altera_lite/15.1/quartus/sopc_builder/bin:$PATH
Tapez ensuite la ligne de commande pour générer des en-têtes à partir d'un fichier sof. Vous obtenez le fichier sof en compilant votre projet sur Quartus. Pour ce faire, tapez:./generate_header.
Étape 8: Programmation C HPS
Nous devons réaliser 2 choses dans cette partie, à savoir lire lire la valeur de l'ADC et l'écrire dans le SPI.
1. Lire la valeur de l'ADC
L'adresse de la mémoire dans laquelle est contenu l'ADC n'est pas directement accessible, en effet le système linux présent sur la carte met en place une abstraction de la mémoire. Pour vraiment accéder à l'adresse ADC, nous utiliserons la fonction mmap.
"h2p_lw_spi_addr=virtual_base + ((non signé long)(ALT_LWFPGASLVS_OFST + SPI_0_BASE) & (non signé long)(HW_REGS_MASK));"
Cette instruction permet d'ajouter un offset au début de l'adresse de base pour atteindre l'adresse de la mémoire allouée pour l'ADC, et d'effectuer sur l'adresse résultante un ET logique pour prendre en compte le masquage.
Après cela, il suffira de déréférencer le pointeur dans le programme pour obtenir sa valeur.
2. Écrivez la valeur de l'ADC dans le SPI
La manipulation est identique, cette fois on donne au mmap l'offset pour atterrir sur l'adresse allouée par le SPI. Lors de l'écriture dans le SPI, la documentation technique précise que vous devez écrire à l'adresse + 1 la valeur de l'adc.
"*(h2p_lw_spi_addr+1) = ((0x1 << 12) | *h2p_lw_adc_addr);"
Cette instruction vous permet d'écrire dans le SPI. En effet le bit 4, donc 1 << 12, est le bit qui permet d'activer le SPI. Avec un OU logique, on donne donc à la fois le bit d'activation et la valeur de l'ADC au SPI.
Étape 9: Acquisition numérique de l'ADC à partir de la carte
Tout d'abord, vous devrez définir l'adresse IP Ethernet de votre ordinateur via Panneau de configuration -> Réseau -> Carte Parmesals. Sélectionnez l'interface ethernet de la carte, la propriété, l'adresse ipv4 et entrez une IP fixe, un masque etc…
Ensuite, connectez la carte du côté de la prise d'alimentation avec le câble micro USB. Ouvrez le programmeur Quartus et lancez l'export. Cette manipulation sera refaite après chaque mise hors tension de la carte.
Changez le câble de la prise micro USB, pour vous connecter cette fois à côté de la prise Ethernet. Désormais, avec Putty il faudra se connecter à la carte par liaison série. La configuration est visible sur les photos, l'idée étant de remplacer COM5 par COM suivi du numéro que vous pourrez retrouver dans votre gestionnaire de périphériques (clic droit sur le logo windows pour l'ouvrir).
Appuyez sur Entrée, vous êtes connecté.
Info pour redémarrer le projet: - Fix ethernet ip correspondant à la carte - Allumez la carte, à chaque mise sous tension, il faut mettre avec "program" sous quartus le projet compilé dans la carte. Cela se fait via le port micro-USB - Pour pouvoir afficher le résultat du programme on utilise plus du micro USB mais de l'UART - Avec putty configuré pour la série COM5 (ou 6 watch gestinnaire periph) Connectez-vous à la carte. - Définir un mot de passe (passwd) - Définir l'adresse IP ifconfig ethxx IPchoice (IP pas loin de celle pour l'eth du PC) - Générer l'en-tête selon Qsys avec le terminal embarqué (export PATH) - make - scp l exec dans le map - exécuter sous putty le prog
Étape 10: Calcul de la FFT
Afin d'obtenir la transformée de Fourier rapide dans notre programme C, nous utiliserons une bibliothèque écrite par Mark Borgerding: Kiss FFT. Vous pouvez télécharger la bibliothèque ici: https://kissfft.sourceforge.net/. L'application d'une FFT sur un signal est nécessaire pour modifier et appliquer des effets de signal. Il peut également servir à afficher le spectre d'un signal.
La première étape de votre programme C consiste à allouer de la mémoire afin de stocker le résultat de la FFT. La taille de la mémoire dépend du nombre de point utilisé pour calculer la FFT. Plus vous avez de points, plus la FFT sera précise. Cependant, le programme fonctionnera plus lentement et utilisera plus de mémoire. Notez que vous obtiendrez deux tableaux de la fonction kiss_fft: l'entrée et la sortie de la fonction (cx_in et cx_out)
Une fois que notre tableau est rempli de nouvelles valeurs FFT, c'est-à-dire lorsque r = Win - 1, nous traitons la FFT. Concernant l'affichage, nous n'affichons que la partie positive du spectre, car il y a une symétrie entre la partie négative et la partie positive.
Concernant l'axe horizontal, nous réduisons les valeurs des pics de 100*hauteur/(hauteur²) afin de distinguer les pics des fréquences principales.
Nous utilisons l'appel système usleep pour définir une fréquence de lecture des valeurs ADC. Cette fréquence est actuellement fixée à 1,5 Hz.
Étape 11: Affichage de la FFT
Sur la base d'un exemple donné sur l'écran LCD TFT Adafruit disponible ici: https://www.terasic.com/downloads/cd-rom/de0-nano-s… nous avons programmé le NIOS de notre carte pour qu'il puisse lire la valeur ADC.
Ainsi, le registre ADC est partagé entre le NIOS et le HPS car les valeurs ADC seront utilisées pour afficher la FFT sur l'écran NIOS, et ces mêmes valeurs seront écrites sur le SPI afin d'être sorties de la carte et enfin converties par le DAC pour obtenir un signal analogique.
Étape 12: Assemblage
Nous avons presque fini ! Vous devrez assembler toutes les parties du projet (circuit d'entrée, circuit de sortie et la carte). Assurez-vous de connecter les pièces aux broches correctes selon le projet Quartus.
- Le circuit d'entrée enverra le signal audio capté par le microphone, amplifié, filtré et décalé.
- Le programme C présent sur la carte va lire les valeurs de l'ADC comme nous l'avons vu précédemment, et va l'écrire sur le SPI afin que l'on puisse récupérer la valeur sur le GPIO de la carte.
- Ensuite la sortie GPIO du SPI transmettra les informations qui seront décodées par notre DAC et amplifiées en courant pour atteindre le haut-parleur.
Étape 13: Effets sonores
La seule étape restante sont les effets sonores.
Les effets disponibles sont:
- Filtre haute fréquence
- Filtre basse fréquence
- …
Vous pouvez basculer entre les effets grâce à un bouton. Ce bouton changera une variable dans notre programme C, afin qu'il puisse appliquer le bon effet.
Étape 14: [FACULTATIF] Fabrication du casque
Nous voici dans l'étape la plus manuelle du projet:
- Nous avons d'abord collé les différentes parties imprimées en 3D du casque.
- Pour combler les espaces entre les pièces collées, nous avons ajouté une finition à l'aide d'un stylo 3D.
- Nous avons poli les interstices remplis à la plume et au casque plus généralement pour que la peinture tienne bien par la suite.
- Nous avons peint le casque avec 2 couches: La première en noir anthracite, de près, et une seconde en vert primaire de plus loin pour donner des nuances de vert plus foncé.
- Enfin nous avons imprimé le logo de notre école sur le côté du casque