Arduino - Spielen Sie das Piezo

Arduino - Spielen Sie das Piezo

Spielen Sie das Piezo!
Das Ziel dieses Projekts ist es, Musik durch Bewegung mithilfe von Beschleunigungsmessern zu erzeugen.

- 1 3-Achsen-Beschleunigungsmesser
- 1 Arduino-Karte
- 1 Sprecher
- 1 Song, der den Mist des Lautsprechers herausfordern kann

Der Code ist einfach: Der Song-Rhythmus wird implementiert, und der Handschuh erkennt vor jedem Zeitschritt die Richtung der Schwerkraft und wählt eine der drei Noten des Songs aus.

Der Code ist unten.

Sie können das Video auf Youtube sehen.

Erhalten Sie Neuigkeiten und Updates auf meiner Seite. Momentan sammle ich Geld gegen Krebs, bitte spenden Sie!

/*
28. Dezember 2012 - Sebastien RUBRECHT
Versuchen Sie, eine coole Musik mit einem Mistlautsprecher abzuspielen, in der Hoffnung, dass "cool" den "Mist" kompensiert.
Die Musik ist "Where Is My Mind" von The Pixies, was wirklich einfach zu spielen ist.
*/

#define AUTO 0 // Automatikmodus: Wenn 1, wird die Musik automatisch abgespielt.

// Stifte
const int analogInPinX = 0; // Analogeingangspin, an den der erste Pin des Beschleunigungsmessers angeschlossen ist
const int analogInPinY = 1; // Analogeingangspin, an den der zweite Pin des Beschleunigungsmessers angeschlossen ist
const int analogInPinZ = 2; // Analogeingangspin, an den der dritte Pin des Beschleunigungsmessers angeschlossen ist
const int tone1Pin = 9; // Tonausgangssignal

const int highPin1 = 11; // 5 V alimentation
const int highPin2 = 12; // 5 V alimentation
const int lowPin1 = 5; // Masse für einen der 2 Beschleunigungsmesser gnd.
const int lowPin2 = 6; // Masse für einen der 2 Beschleunigungsmesser gnd.

const int ledOKPinGnd = 8; // Masse für OK Pin
const int ledOKPinH = 10; // 5 V alimentation for OK Pin
const int ledNOKPinGnd = 2; // Masse für NOK Pin
const int ledNOKPinH = 4; // 5 V Versorgung für NOK Pin

// konstante Werte
const float freq_rediese0 = 38.9; // Frequenz eines scharfen Re in Hz für Oktave 0
const float freq_mi0 = 41.2; // Frequenz eines Mi in Hz für Oktave 0
const float freq_soldiese0 = 51.9; // Frequenz eines scharfen Sols in Hz für Oktave 0

// Konstante benutzerdefinierte Parameter
const int octave = 4; // Oktavenzahl. Seien Sie vorsichtig, unter 2 (niedrig) und über 6 (akut) wird es sehr hässlich
const int temps = 380; // Anzahl der Millisekunden für 1 Musiknote. 380 ist der wahre Rhythmus, aber mit 600 zu beginnen ist einfacher zu lernen

//Variablen
float freq_rediese = freq_rediese0 * pow (2, Oktave); // Frequenz eines scharfen Re in Hz für die verbleibende Oktave
float freq_mi = freq_mi0 * pow (2, Oktave); // Frequenz eines Mi in Hz für die verbleibende Oktave
float freq_soldiese = freq_soldiese0 * pow (2, Oktave) // Frequenz eines scharfen Sols in Hz für die verbleibende Oktave

int noire; // Zeit einer Gabelung
int croche; // Temps einer Achtelnote
Schwebefrequenz; // gespielte Frequenz

int sensorValue1; // Wert, der vom ersten Pin des Beschleunigungsmessers gelesen wird
int sensorValue2; // Wert, der vom zweiten Pin des Beschleunigungsmessers gelesen wird
int sensorValue3; // Wert, der vom zweiten Pin des Beschleunigungsmessers gelesen wird

void setup () {
pinMode (tone1Pin, OUTPUT);

pinMode (highPin1, OUTPUT);
pinMode (highPin2, OUTPUT);
pinMode (lowPin1, OUTPUT);
pinMode (lowPin2, OUTPUT);

pinMode (ledOKPinGnd, OUTPUT);
pinMode (ledOKPinH, OUTPUT);
pinMode (ledNOKPinGnd, OUTPUT);
pinMode (ledNOKPinH, OUTPUT);

digitalWrite (lowPin1, LOW);
digitalWrite (lowPin2, LOW);
digitalWrite (highPin1, HIGH);
digitalWrite (highPin2, HIGH);

digitalWrite (ledOKPinGnd, LOW);
digitalWrite (ledNOKPinGnd, LOW);
}

void loop () {
noire = temps;
Croche = Temps / 2;

// "wo ist mein Verstand" ist 4 * (1mi + 1sol #); 2 * (1re # + 1sol #); 2 * (1mi + 1 / 2mi + 1 / 2re #).
für (int j = 0; j <4; j ++) // 4 * (1mi + 1sol #)
{
Frequenz = acqNote (freq_mi); // erhält die Richtung der höheren Beschleunigung vom Sensor und gibt die Assofrequenz zurück. Der theoretisch gute ist ein Mi.Nr.
note (frequenz, noire); // spielt die Frequenz ab, die in der vorherigen Zeile während einer "noire" -Zeit zurückgegeben wurde.
Frequenz = acqNote (freq_soldiese);
beachten Sie (Frequenz, noire);
}
für (int j = 0; j <2; j ++) // 2 * (1re # + 1sol #);
{
Frequenz = acqNote (freq_rediese);
beachten Sie (Frequenz, noire);
Frequenz = acqNote (freq_soldiese);
beachten Sie (Frequenz, noire);
}
für (int j = 0; j <2; j ++) // 2 * (1mi + 1 / 2mi + 1 / 2re #)
{
Frequenz = acqNote (freq_mi);
beachten Sie (Frequenz, noire);
Frequenz = acqNote (freq_mi);
Note (Frequenz, Croche);
Frequenz = acqNote (freq_rediese);
Note (Frequenz, Croche);
}
}

ungültige Note (Float-Frequenz, int-Dauer)
{
// Die Funktion "note" spielt eine Note mit der Frequenz "freq" (Hz) während "duration" (ms)

// Umrechnung der Frequenz in eine Halbperiode
double semiperiod_micros = 1 / (double (freq)) * 1000000 * 0.5;

long duree = long (dauer);
ohne Vorzeichen long a = millis ();
while (millis () <(a + duree))
{
digitalWrite (tone1Pin, HIGH);
delayMicroseconds (int (semiperiod_micros));
digitalWrite (tone1Pin, LOW);
delayMicroseconds (int (semiperiod_micros));
}
// Um ​​die Noten zu trennen (es klingt besser), kleine Verzögerungen.
if (dauer> 300)
{delay (15);}
sonst
{delay (7);}
}

float acqNote (float freq_ref) {

// "acqNote" erhält die Beschleunigung in drei Richtungen vom Sensor, wählt die höchste aus und gibt die zugehörige Frequenz zurück.
// Wenn es mit der theoretisch guten Frequenz "freq_ref" übereinstimmt, schaltet es die grüne LED ein, ansonsten die rote LED.

float freq;

// liest die beiden analogen Eingangswerte:
sensorValue1 = analogRead (analogInPinX);
sensorValue2 = analogRead (analogInPinY);
sensorValue3 = analogRead (analogInPinZ);

// gibt den Index des Maximums von 3 Werten zurück
if ((max (max (sensorValue1, sensorValue2), sensorValue3)) == sensorValue1) {
freq = freq_rediese;
}
sonst wenn ((max (max (sensorValue1, sensorValue2), sensorValue3)) == sensorValue2) {
freq = freq_mi;
}
sonst {
freq = freq_soldiese;
}

// schaltet die grüne LED ein, wenn die gefundene Frequenz die theoretisch gute ist, ansonsten die rote.
if (freq == freq_ref) {
digitalWrite (ledOKPinH, HIGH);
digitalWrite (ledNOKPinH, LOW);
}
sonst{
digitalWrite (ledOKPinH, LOW);
digitalWrite (ledNOKPinH, HIGH);
}
if (AUTO) {
return freq_ref;
}
sonst {
return freq;
}

};

Zubehör: