Détecteur de Métaux à Induction d'Impulsion Arduino Nano – Kit DIY et Guide
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino Nano R3 | 1 |
| Module Bluetooth HC-05 | 1 |
| Transistor PNP usage général | 1 |
| Transistor NPN usage général | 1 |
| MOSFET canal N puissance | 1 |
| Amplificateur opérationnel (Op Amp + Comparateur + Référence) | 1 |
| Diode 1N4148 (commutation rapide) | 2 |
| Condensateur 10 µF | 1 |
| Condensateur 1 µF | 1 |
| Potentiomètre mono-tour 100 kΩ | 1 |
| Potentiomètre mono-tour 47 kΩ | 1 |
| 12 résistances valeurs diverses | 1 set |
Outils nécessaires
- Fer à souder (générique)
À propos de ce projet
Les systèmes à Induction d'Impulsion (PI - Pulse Induction) utilisent une seule bobine comme émetteur et récepteur. Cette technologie envoie de puissantes courtes rafales (impulsions) de courant dans une bobine. Chaque impulsion génère un champ magnétique bref. Quand l'impulsion se termine, le champ magnétique inverse sa polarité et s'effondre brutalement, créant un pic électrique net. Ce pic dure quelques microsecondes et provoque un autre courant dans la bobine : le "pulsation réfléchie", très courte (~30 µs). Le processus se répète.
Si un métal entre dans les lignes de champ magnétique, la bobine de réception détecte un changement d'amplitude et de phase du signal reçu. L'amplitude et la variation de phase indiquent la taille et la distance du métal, et permettent de discriminer métaux ferreux/non-ferreux.
J'ai trouvé un bon exemple de détecteur PI sur le site N.E.C.O. projects. Ce détecteur est une symbiose Arduino + Android. Sur le Play Store, téléchargez l'application gratuite "Spirit PI" (version pro payante avec options supplémentaires). Communication smartphone-Arduino via module Bluetooth HC-05 (tout adaptateur Bluetooth avec baud rate 115200 convient). Schéma original : neco-desarrollo.es
Mes modifications au schéma original :
- Résistance 150 Ω → Potentiomètre 47 kΩ : règle le courant dans la bobine. Augmenter = plus de courant = plus de sensibilité.
- Résistance 62 kΩ → Potentiomètre 100 kΩ : règle la tension ~4.5V sur entrée A0 de l'Arduino. Nécessaire car la valeur optimale varie selon l'ampli-op et la tension d'alimentation.
Alimentation : 4 batteries Li-ion en série (>15V). Arduino max 12V → régulateur 5V (7805) sur petit radiateur, connecté directement sur broche +5V.
Bobine : Fil de cuivre émaillé Ø0.4 mm, 25 spires, cercle Ø19 cm. Important : aucun objet métallique près de la bobine (collage à la colle, pas de vis).
Résultats : Pièce métallique détectée à 10-15 cm, objet plus grand à 30-40+ cm. Excellents résultats pour une fabrication et un réglage relativement simples.
Code
code.ino
#include <EEPROM.h>
// #include <SoftwareSerial.h>
// int bluetoothTx = 5;
// int bluetoothRx = 6;
// SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
#define pulsePin 2
int timer = 200;
const int button1 = 12;
int buttonState1 = 0;
char data;
// Variables EEPROM
int addr_duty = 0;
int addr_freq = 1;
int stored_value;
int duty_cycle;
int duty_cycle_temp;
int freq;
int freq_temp;
int duty_def_value = 10;
int freq_def_value = 60;
// Variables d'équilibrage
int value_count = 0;
int value_count_def = 100;
int balance_value = 0;
int balance_value_temp = 0;
// Timing
unsigned long startMillis;
unsigned long currentMillis;
long period = 100000; // microsecondes
// Mesure tension batterie
float resistencia1 = 101000; // 100k
float resistencia2 = 10000; // 10k
float const arefVolt = 4.8f; // AJUSTER VALEUR EXACTE ICI
float voutv, vinv;
unsigned long startMillisVolts;
unsigned long currentMillisVolts;
long periodVolts = 2000; // microsecondes
int sensorValue;
void setup() {
// analogReference(INTERNAL);
Serial.begin(115200);
readFromStorage(addr_duty); duty_cycle = stored_value;
readFromStorage(addr_freq); freq = stored_value;
if (duty_cycle == 0 || duty_cycle == 255) {
writeToStorage(duty_def_value, addr_duty);
readFromStorage(addr_duty); duty_cycle = stored_value;
}
if (freq == 0 || freq == 255) {
writeToStorage(freq_def_value, addr_freq);
readFromStorage(addr_freq); freq = stored_value;
}
pinMode(pulsePin, OUTPUT);
}
void loop() {
currentMillis = micros();
currentMillisVolts = millis();
if (Serial.available() > 0) {
data = Serial.read();
setDutyAndFreq(data);
}
if (currentMillis - startMillis >= period) {
period = 1000000 / freq;
digitalWrite(pulsePin, HIGH);
duty_cycle_temp = duty_cycle * 10;
delayMicroseconds(duty_cycle_temp);
digitalWrite(pulsePin, LOW);
for (int i = 0; i < 3; i++) sensorValue = analogRead(A0);
delayMicroseconds(10);
sensorValue = analogRead(A0);
sensorValue = sensorValue / 5;
sendData();
startMillis = currentMillis;
}
// Lecture tension batterie
if (currentMillisVolts - startMillisVolts >= periodVolts) {
lecturaVoltios();
startMillisVolts = currentMillisVolts;
}
}
void writeToStorage(int valor, int addr) {
EEPROM.write(addr, valor);
}
int readFromStorage(int addr) {
stored_value = EEPROM.read(addr);
return stored_value;
}
void setDutyAndFreq(char valor) {
// 'n' = augmenter duty cycle
// 'm' = diminuer duty cycle
// 'j' = augmenter fréquence
// 'k' = diminuer fréquence
// '+' = augmenter balance
// '-' = diminuer balance
// 'p' = reset valeurs par défaut
if (valor == 'n') {
readFromStorage(addr_duty);
duty_cycle = stored_value + 1;
writeToStorage(duty_cycle, addr_duty);
} else if (valor == 'm') {
readFromStorage(addr_duty);
duty_cycle = stored_value - 1;
writeToStorage(duty_cycle, addr_duty);
} else if (valor == 'j') {
readFromStorage(addr_freq);
freq = stored_value + 10;
writeToStorage(freq, addr_freq);
} else if (valor == 'k') {
readFromStorage(addr_freq);
freq = stored_value - 10;
writeToStorage(freq, addr_freq);
} else if (valor == 'p') {
writeToStorage(0, addr_freq);
writeToStorage(0, addr_duty);
}
}
void lecturaVoltios() {
vinv = 0.0f; voutv = 0.0f;
for (int i = 0; i < 100; i++) {
voutv = (analogRead(A7) * arefVolt) / 1023;
vinv += voutv / (resistencia2 / (resistencia1 + resistencia2));
if (vinv < 0.9) vinv = 0.0f;
}
vinv = vinv / 100;
}
void sendData() {
String data = "<";
data += sensorValue;
data += "/";
data += freq;
data += "/";
data += duty_cycle;
data += "/";
data += vinv;
data += ">";
Serial.println(data);
/* Version Bluetooth (commentée)
bluetooth.print("<");
bluetooth.print(sensorValue);
bluetooth.print("/");
bluetooth.print(freq);
bluetooth.print("/");
bluetooth.print(duty_cycle);
bluetooth.print("/");
bluetooth.print(vinv);
bluetooth.print(">");
*/
}
Schémas

Processus de fabrication
- Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
- Pixie : Montre-bracelet NeoPixel à base d'Arduino – Élégante, DIY, montre LED
- Détecteur de fréquence audio Arduino — Mesurer le pic sonore avec module haute sensibilité
- Construisez un skateboard VR DIY avec Arduino, Google Cardboard et Bluetooth
- Automates Cellulaires Temps Réel sur Arduino avec Écran OLED 128x64
- Dispositif de Traitement Radionique EMR DIY avec Arduino Nano
- Simulateur de Course 2 Axes DIY : Arduino Nano & Servos SG90
- Construire un détecteur de distance à ultrasons avec Arduino UNO et capteur SR04
- Système de sécurité Arduino : Détection de mouvement intelligente et alerte