kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Musikperformance durch Handbewegungen

(EN google-translate)

(PL google-translate)

Teillösungen zu der vorangegangenen Übung:

SegAnsteuern.zip - Beispiellösung zu letzer Übung: 4fach 7-Segmentanzeige ansteuern.
SegAnsteuernOOP.zip - OOP Beispiellösung. (Hinweis für die, die da waren: An einer Stelle stand inx%5; statt inx%=5;)

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

Hardware zur Ansteuerung der 4fach 7-Segmentanzeige mit einem Arduino-Micro.

Bild 0-1: Hardware zur Ansteuerung der 4fach 7-Segmentanzeige mit einem Arduino-Micro.

Aufgabe 1

  • Vorübung

Testen Sie einen Infrarot-Entfernungssensor von Sharp.

  • Verwenden Sie zunächst die Arduino-Library analogRead(..)
  • Versuchen Sie anschließend einen Kanal für die auto-getriggerte 10-Bit-Wandlung mittels Registerkonfiguration zu realisieren.
  • Machen Sie transparent, ob obige Konfigurationen funktionieren, indem Sie die Daten im Serial-Terminal anzeigen lassen.

Schauen Sie sich zur Orientierung noch einmal Kapitel 10 an und ein Beispiel mit dem Sensor:

http://www.kramann.info/40_Mikrocontroller/02_Oszillator/03_Quarz/index.php

Anschlüsse des Sensors von vorn betrachtet:

  • GELB oder WEISS: Analogausgang
  • ROT: +5Volt
  • SCHWARZ: Masse/Ground

Der Anschluß des Entfernungssensors sollte sehr sorgfältig geschehen, um dabei eine Beschädigung durch falsch verbundene Leitungen zu vermeiden.


01_Infrarot_Sensor.zip - Studentische Lösung mit analogRead(..)
Test_02_register.zip - Musterlösung unter Verwendung von Registern.
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.

Testschaltung auf dem Handrücken befestigt.

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

Testschaltung.

Bild 0-3: Testschaltung.

Das Programm liefert die drei orthogonalen Beschleunigungskomponenten auf dem seriellen Monitor.

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

test_mpu6050_2.zip - Beispielprojekt.
#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.