Musikperformance durch Handbewegungen
(EN google-translate)
(PL google-translate)
Teillösungen zu der vorangegangenen Übung:


Programm läßt alle vier Digits immer von 0..9 zählen.

Bild 0-1: Hardware zur Ansteuerung der 4fach 7-Segmentanzeige mit einem Arduino-Micro.
Aufgabe 1
|
Testen Sie einen Infrarot-Entfernungssensor von Sharp.
|
Schauen Sie sich zur Orientierung noch einmal Kapitel 10 an und ein Beispiel mit dem Sensor:

Anschlüsse des Sensors von vorn betrachtet:
|
Der Anschluß des Entfernungssensors sollte sehr sorgfältig geschehen, um dabei eine Beschädigung durch falsch verbundene Leitungen zu vermeiden.


Erläuterungen und Material für die nachfolgenden Aufgaben
Zum Schutz des MPU6050 sollte besser erst das Programm geflasht werden und er danach erst angeschlossen werden. Dies muß sehr sorgfältig geschehen, um auch dabei eine Beschädigung durch falsch verbundene Leitungen zu vermeiden.
Grundidee: Über einen MPU6050 wird die Orientierung der Schwerkraft relativ zur Arduino-Platine gemessen. Diese Information wird verwendet, um mit dem Arduino Töne zu erzeugen.
Vorgabe: Testschaltung für den MPU6050
Nachfolgende Testschaltung wird am Handrücken mit dem USB-Kabel zum Arm hin orientiert befestigt.
Hängt der Arm leuchtet keine der LEDs.
Wird der Arm oder das Handgelenk angehoben, beginnt die rote LED an zu leuchten.
Wird dazu noch das Handgelenk nach links oder rechts gedreht, leuchtet die grüne, bzw. die gelbe LED.

Bild 0-2: Testschaltung auf dem Handrücken befestigt.

Bild 0-3: Testschaltung.

Bild 0-4: Das Programm liefert die drei orthogonalen Beschleunigungskomponenten auf dem seriellen Monitor.

#include<math.h> #include<Wire.h> //A0 = D18 //A1 = D19 //A2 = D20 //A3 = D21 //A4 = D22 //A5 = D23 //A6 = D24 //A7 = D25 //A8 = D26 //A9 = D27 //A10 = D28 //A11 = D29 const int MPU=0x68; // I2C address of the MPU-6050 int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; double ax,ay,az; double arx,ary,arz; void setup() { //Pins deaktivieren, wo MPU6050 anliegt: pinMode(18,INPUT); pinMode(19,INPUT); pinMode(20,INPUT); pinMode(21,INPUT); pinMode(22,INPUT); pinMode(23,INPUT); //LEDs pinMode(11,OUTPUT); pinMode(12,OUTPUT); digitalWrite(11,LOW); digitalWrite(12,LOW); pinMode(8,OUTPUT); pinMode(9,OUTPUT); digitalWrite(8,LOW); digitalWrite(9,LOW); pinMode(4,OUTPUT); pinMode(5,OUTPUT); digitalWrite(4,LOW); digitalWrite(5,LOW); //eigentliche Konfiguration Wire.begin(); Wire.beginTransmission(MPU); Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0); // set to zero (wakes up the MPU-6050) Wire.endTransmission(true); Serial.begin(9600); } void loop() { Wire.beginTransmission(MPU); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU,6,true); // request a total of 14 registers AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L) ax = (double)AcX; ay = (double)AcY; az = (double)AcZ; arx = ax / sqrt(ay*ay + az*az); ary = ay / sqrt(ax*ax + az*az); arz = az / sqrt(ax*ax + ay*ay); if(ary<-1.5) { //Ruhestellung, Arm hängt analogWrite(5,0); analogWrite(9,0); analogWrite(11,0); } else { if(ary<1.05) { analogWrite(11,(int)((ary+1.5)*10.0)); if(arx>0.5 && arx<3.05) { analogWrite(9,(int)((arx-0.5)*10.0)); } else if(arx>3.05) { analogWrite(9,255); } else { analogWrite(9,0); } if(arx<-0.5 && arx>-3.05) { analogWrite(5,(int)((-arx-0.5)*10.0)); } else if(arx<-3.05) { analogWrite(5,255); } else { analogWrite(5,0); } } else { analogWrite(11,255); } } Serial.print(arx); Serial.print(" "); Serial.print(ary); Serial.print(" "); Serial.print(arz); Serial.println(" "); delay(200); }
Code 0-1: Quelltext zum Beispielprojekt.
Aufgabe 2
Nehmen sie die Testschaltung und das vorangehende Kapitel zu Tonerzeugung als Grundlage dazu, ein Tonerzeugungsgerät zu entwickeln, dass am Handgelenk befestigt wird und gemäß der Handgelenkbewegung Klänge nach selbst erfundenen Regeln erzeugt.
Die Lautsprecher mit den 50Ohm Impedanz lassen sich ohne Vorwiderstand an die digitalen Ausgänge des Arduino anschließen, sollten aber aus Rücksicht auf die Nerven Ihrer Kommilitonen mit einem Vorwiderstand versehen werden, z.B. 2200Ohm.
Bringen Sie das Gesamtprogramm in objektorientierte Form.
Aufgabe 3
Verwenden Sie als Sensor einen Sharp-Infrarot-Entfernungssensor statt des MPU6050.
Versuchen Sie hier die ADW-Wandlung über Register hinzubekommen.