68tjs:
Ne jamais alimenter un relai à partir du 5 V de la carte microcontrôleur.
Si la diode de roue libre est absente : clairement OUI :
Si la diode de roue libre est présente : à l'oscilloscope on observe généralement une légère chute de tension lorsque le relais colle mais plus de surtension :
EDIT ### : ces mesures ont été faites avec une carte ARDUINO NANO et un module relais alimentés par 5V USB uniquement.
Juste pour rire exécute ce code sur un ARDUINO avec une carte relais sur la broche 4.
Tu n'as jamais entendu un relais jouer la marseillaise ?
C'est le moment d'essayer.
#define RELAY_OUT 4
// diviseur = 1 pour un HP, 15 pour un relais
#define DIVISEUR 15
#define TEMPO ALLEGRO
// Liste des notes
#define SIL 0
#define DON 65
#define DOD 69
#define REN 74
#define RED 78
#define MIN 83
#define FAN 87
#define FAD 93
#define SON 98
#define SOD 104
#define LAN 110
#define LAD 117
#define SIB 117
#define SIN 123
#define FIN 255
// liste des rythmes
#define QUINTUPLECROCHE 1
#define QUADRUPLECROCHE 2
#define TRIPLECROCHE 4
#define DOUBLECROCHE 8
#define CROCHE 16
#define CROCHEPOINTEE 24
#define NOIRE 32
#define NOIREPOINTEE 48
#define BLANCHE 64
#define BLANCHEPOINTEE 96
#define RONDE 128
// liste des rythmiques de silences
#define TRENTEDEUXIEMEDESOUPIR 1
#define SEIZIEMEDESOUPIR 2
#define HUITIEMEDESOUPIR 4
#define QUARDESOUPIR 8
#define DEMISOUPIR 16
#define SOUPIR 32
#define DEMIPAUSE 64
#define PAUSE 128
// Tempo
#define LENTO 60
#define ANDANTE 80
#define MODERATO 100
#define ALLEGRO 120
#define PRESTO 150
#define PRESTISSIMO 200
void setup() {
pinMode(RELAY_OUT, OUTPUT);
Serial.begin(115200);
}
void buzz(int freq, int length)
{
unsigned long t = millis();
while (millis() < t + length) {
digitalWrite(RELAY_OUT, HIGH);
delay(1000/freq/2);
digitalWrite(RELAY_OUT, LOW);
delay(1000/freq/2);
}
}
struct note
{
uint8_t base;
uint8_t tempo;
uint8_t octave;
};
const struct note marseillaise[] = {
{REN, DOUBLECROCHE, 3}, {REN, CROCHEPOINTEE, 3}, {REN, DOUBLECROCHE, 3}, {SON, NOIRE, 3}, {SON, NOIRE, 3},
{LAN, NOIRE, 3}, {LAN, NOIRE, 3}, {REN, NOIREPOINTEE, 4}, {SIN, CROCHE, 3}, {SON, CROCHEPOINTEE, 3},
{SON, DOUBLECROCHE, 3}, {SIN, CROCHEPOINTEE, 3}, {SON, DOUBLECROCHE, 3},
{MIN, NOIRE, 3}, {DON, BLANCHE, 4}, {LAN, CROCHEPOINTEE, 3}, {FAD, DOUBLECROCHE, 3}, {SON, BLANCHE, 3}, {SIL, SOUPIR, 3},
{SON, CROCHEPOINTEE, 3}, {LAN, DOUBLECROCHE, 3}, {SIN, NOIRE, 3}, {SIN, NOIRE, 3}, {SIN, NOIRE, 3},
{DON, CROCHEPOINTEE, 4}, {SIN, DOUBLECROCHE, 3},
{SIN, NOIRE, 3}, {LAN, NOIRE, 3}, {SIL, SOUPIR, 3}, {LAN, CROCHEPOINTEE, 3}, {SIN, DOUBLECROCHE, 3}, {DON, NOIRE, 4},
{DON, NOIRE, 4}, {DON, NOIRE, 4}, {REN, CROCHEPOINTEE, 4}, {DON, DOUBLECROCHE, 4}, {SIN, BLANCHE, 3}, {SIL, SOUPIR, 3},
{REN, CROCHEPOINTEE, 4}, {REN, DOUBLECROCHE, 4},
{REN, NOIRE, 4}, {SIN, CROCHEPOINTEE, 3}, {SON, DOUBLECROCHE, 3}, {REN, NOIRE, 4}, {SIN, CROCHEPOINTEE, 3},
{SON, DOUBLECROCHE, 3}, {REN, BLANCHE, 3}, {SIL, DEMISOUPIR, 3}, {REN, DOUBLECROCHE, 3},
{REN, CROCHEPOINTEE, 3}, {FAD, DOUBLECROCHE, 3}, {LAN, BLANCHE, 3}, {DON, NOIRE, 4}, {LAN, CROCHEPOINTEE, 3},
{FAD, DOUBLECROCHE, 3},
{LAN, NOIRE, 3}, {SON, NOIRE, 3}, {FAN, BLANCHE, 3}, {MIN, NOIRE, 3}, {SON, CROCHEPOINTEE, 3}, {SON, DOUBLECROCHE, 3},
{SON, NOIRE, 3}, {FAD, CROCHEPOINTEE, 3}, {SON, DOUBLECROCHE, 3}, {LAN, BLANCHEPOINTEE, 3}, {SIL, DEMISOUPIR, 3}, {LAN, CROCHE, 3},
{SIB, NOIREPOINTEE, 3}, {SIB, CROCHE, 3}, {SIB, CROCHE, 3}, {SIB, CROCHE, 3}, {DON, CROCHE, 4}, {REN, CROCHE, 4},
{LAN, BLANCHEPOINTEE, 3}, {SIB, CROCHE, 3}, {LAN, CROCHE, 3}, {SON, NOIREPOINTEE, 3}, {SON, CROCHE, 3}, {SON, CROCHE, 3},
{SIB, CROCHE, 3}, {LAN, CROCHE, 3}, {SON, CROCHE, 3}, {SON, NOIRE, 3}, {FAD, CROCHE, 3}, {SIL, DEMIPAUSE, 3},
{REN, DOUBLECROCHE, 4},
{REN, BLANCHE+CROCHEPOINTEE, 4}, {REN, DOUBLECROCHE, 4}, {SIN, CROCHEPOINTEE, 3},
{SON, DOUBLECROCHE, 3}, {LAN, BLANCHEPOINTEE, 3}, {SIL, DEMISOUPIR, 4}, {REN, DOUBLECROCHE, 4},
{REN, BLANCHE+CROCHEPOINTEE, 4}, {REN, DOUBLECROCHE, 4}, {SIN, CROCHEPOINTEE, 3}, {SON, DOUBLECROCHE, 3}, {LAN, BLANCHEPOINTEE, 3},
{REN, NOIRE, 3}, {SON, BLANCHEPOINTEE, 3}, {LAN, NOIRE, 3},
{SIN, RONDE, 3}, {DON, BLANCHE, 4}, {REN, NOIRE, 4}, {MIN, NOIRE, 4}, {LAN, BLANCHEPOINTEE, 3}, {MIN, NOIRE, 4}, {REN, BLANCHE, 4},
{REN, CROCHEPOINTEE, 4}, {SIN, DOUBLECROCHE, 3}, {DON, CROCHEPOINTEE, 4}, {LAN, DOUBLECROCHE, 3}, {SON, RONDE, 3},
FIN
};
int getFrequency(int frequency, int octave) {
return frequency * pow(2, octave);
}
void loop()
{
float ftempo = 0;
ftempo = (1000.0 * 60.0) / float(TEMPO);
for (int n = 0; marseillaise[n].base != FIN; n++) { // boucle de lecture du tableau
char note = marseillaise[n].base; // on récupère la fréquence de base dans le tableau
char octave = marseillaise[n].octave; // on récupère l'octave
int frequence;
if (note != SIL) {
frequence = getFrequency(note, octave) / DIVISEUR; //on calcule la bonne fréquence
}
// Serial.println(frequence);
float duree = ftempo * marseillaise[n].tempo / 32; // on multiplie la duree de base par la valeur de duree du tableau
// Serial.println(duree);
if (note != SIL) {
tone (RELAY_OUT, frequence); //on joue la note
}
delay(duree);
if (note != SIL) {
noTone(RELAY_OUT);//on arrete la note
}
delay(10);// petite attente pour avoir l'impression d'attaquer la note
}
delay(2000);
}