Mini lévitation acoustique avec Arduino UNO et capteur ultrason HC-SR04
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Capteur ultrason HC-SR04 (générique) | 1 |
Applications et services en ligne
- Arduino IDE
À propos de ce projet
Consultez ce projet sur mon site web pour voir une simulation de circuit et plus de détails !
La lévitation acoustique est possible car le son se comporte comme une onde. Lorsque deux ondes sonores se croisent, elles interfèrent soit de manière constructive, soit destructive. (C'est le principe des écouteurs à réduction de bruit active.)
Ce projet utilise un capteur de distance ultrasonique pour créer un effet de lévitation. Cela fonctionne en créant des « poches » où deux ondes sonores opposées interfèrent. Quand un objet est placé dans la poche, il y reste, semblant flotter sur place.
Matériel nécessaire (liens Amazon affiliés)
- Carte Arduino : amzn.to/2DLjxR2
- Pont en H (H-bridge) : amzn.to/2DXFw7y
- Capteur de distance : amzn.to/2PSbJU2
- Plaque d'essai : amzn.to/2RYqiSK
- Fils de connexion : amzn.to/2Q7kiKc
- Diode : amzn.to/2KlYMf8
- Condensateurs (éventuellement) : amzn.to/2DYnCla
En tant qu'associé Amazon, je gagne une commission sur les achats éligibles.
Étape 1 : Récupérer les émetteurs ultrasoniques
Il faut sacrifier un capteur de distance (peu coûteux) :
- Désoudez et retirez les deux émetteurs du circuit imprimé
- Récupérez et conservez l'écran grille (mesh) de l'un d'eux
- Soudez des fils sur les deux émetteurs
Étape 2 : Créer le circuit
Réalisez le circuit ci-dessus en notant :
- Les deux condensateurs 100 nF ne sont pas forcément nécessaires (uniquement si votre carte ne gère pas le circuit et s'éteint constamment).
- La pile 9V représente toute alimentation DC – le mien a fonctionné avec une LiPo 7,5V.
Étape 3 : Code
Téléversez ce code sur votre Arduino :
// Code original : https://makezine.com/projects/micro-ultrasonic-levitator/
byte TP = 0b10101010; // Chaque autre port reçoit le signal inversé
void setup() {
DDRC = 0b11111111; // Toutes les broches analogiques en sorties
// Initialisation Timer1
noInterrupts(); // Désactiver interruptions
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 200; // Registre comparaison (16MHz / 200 = 80kHz onde carrée → 40kHz onde complète)
TCCR1B |= (1 << WGM12); // Mode CTC
TCCR1B |= (1 << CS10); // Prescaler = 1 (pas de prescaling)
TIMSK1 |= (1 << OCIE1A); // Activer interruption comparaison timer
interrupts(); // Réactiver interruptions
}
ISR(TIMER1_COMPA_vect) {
PORTC = TP; // Envoyer valeur TP sur les sorties
TP = ~TP; // Inverser TP pour le prochain cycle
}
void loop() {
// Rien à faire ici :)
}
Étape 4 : Monter les émetteurs et calibrer
On peut utiliser n'importe quel support, moi j'ai utilisé des pinces « helping hands » (achetables ici) :
- Positionnez les émetteurs à environ 3/4" (≈19 mm) l'un de l'autre
- Prenez un minuscule morceau de mousse polystyrène (≈ moitié d'un petit pois, pas besoin d'être rond)
- Placez la mousse sur l'écran grille récupéré à l'étape 1
- Avec une pince à épiler, positionnez-la entre les deux émetteurs (elle devrait commencer à vibrer quand vous approchez)
- Déplacez les émetteurs (plus près / plus loin) jusqu'à ce que la mousse reste immobile
Dépannage
La première fois, j'ai mis environ 15 minutes à faire fonctionner. Ensuite, c'était plus facile. Si ça ne marche pas :
- Vérifiez le câblage
- Augmentez la tension du pont en H (autre batterie)
- Utilisez un morceau de mousse plus petit
- Essayez une autre position pour les émetteurs
- Ajoutez les condensateurs (si pas déjà fait)
- Si toujours rien : peut-être un composant défectueux – essayez d'autres émetteurs ou une nouvelle batterie
Code
Extrait de code #1 (Arduino) :
//original code from: https://makezine.com/projects/micro-ultrasonic-levitator/
byte TP = 0b10101010; // Every other port receives the inverted signal
void setup() {
DDRC = 0b11111111; // Set all analog ports to be outputs
// Initialize Timer1
noInterrupts(); // Disable interrupts
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 200; // Set compare register (16MHz / 200 = 80kHz square wave -> 40kHz full wave)
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS10); // Set prescaler to 1 => no prescaling
TIMSK1 |= (1 << OCIE1A); // Enable compare timer interrupt
interrupts(); // Enable interrupts
}
ISR(TIMER1_COMPA_vect) {
PORTC = TP; // Send the value of TP to the outputs
TP = ~TP; // Invert TP for the next run
}
void loop() {
// Nothing left to do here :)
}
Schémas
Processus de fabrication
- Bâtonnets antitranspirants/déodorants : science, histoire et aperçus de fabrication
- Clientron lance terminaux PT2500 et PST750 POS, comblant entrée de gamme à premium retail
- Astera Labs dévoile des solutions CXL 2.0 et PCIe 5.0 pour réduire la latence et alimenter le calcul hétérogène
- Ouvre-porte de garage Raspberry Pi avec streaming vidéo en direct – Guide étape par étape
- EMAR Mini : Robot d'assistance d'urgence compact et open-source
- Construire un business case solide pour le GMAO : Améliorer l'efficacité maintenance et le ROI
- Mini VMC expliquée : fraisage CNC compact pour projets à petite échelle
- Comprendre les mini tours CNC : fonction, caractéristiques et avantages
- Comprendre les mini tours CNC : fonctionnalités et applications