Projekt Theremin: Porovnání verzí

Řádek 32: Řádek 32:
 
<code>#define ir_2 A1 // port pro senzor2</code>
 
<code>#define ir_2 A1 // port pro senzor2</code>
 
<code>#define model 20150 // typ optického senzoru - 1080 pro GP2Y0A21Y, 20150 pro GP2Y0A02Y</code>
 
<code>#define model 20150 // typ optického senzoru - 1080 pro GP2Y0A21Y, 20150 pro GP2Y0A02Y</code>
<code>// rozlišení dvou čidel
+
<code>// rozlišení dvou čidel</code>
SharpIR *IR1;  
+
<code>SharpIR *IR1;</code>
SharpIR *IR2;
+
<code>SharpIR *IR2;</code>
  
//určení délky tonu (4 pro čtvrťovou dobu, 8 pro osminovou atp.)
+
<code>//určení délky tonu (4 pro čtvrťovou dobu, 8 pro osminovou atp.)</code>
int noteDurations[] = {  
+
<code>int noteDurations[] = { </code>
  8,
+
<code>  8,</code>
};
+
<code>};</code>
  
void setup() {
+
<code>void setup() {</code>
 
    
 
    
  Serial.begin(9600);
+
<code>  Serial.begin(9600);</code>
  IR1 = new SharpIR(ir_1, model);
+
<code>  IR1 = new SharpIR(ir_1, model);</code>
  IR2 = new SharpIR(ir_2, model);
+
<code>  IR2 = new SharpIR(ir_2, model);</code>
  
  // pin pro zvukový výstup
+
<code>  // pin pro zvukový výstup</code>
  pinMode(9, OUTPUT);
+
<code>  pinMode(9, OUTPUT);</code>
 
    
 
    
  // pin pro led diody
+
<code>  // pin pro led diody</code>
  pinMode(4, OUTPUT);
+
<code>  pinMode(4, OUTPUT);</code>
  pinMode(7, OUTPUT);   
+
<code>  pinMode(7, OUTPUT);</code>
  pinMode(13, OUTPUT);
+
<code> pinMode(13, OUTPUT);</code>
}
+
<code>}</code>
  
void loop() {
+
<code>void loop() {</code>
  
  unsigned long pepe1 = millis(); // takes the time before the loop on the library begins
+
<code>  unsigned long pepe1 = millis(); // takes the time before the loop on the library begins</code>
  
  int dis = 0;
+
<code>  int dis = 0;</code>
  // this returns the distance to the object you're measuring
+
<code>  // this returns the distance to the object you're measuring</code>
  int dis2 = 0;
+
<code>  int dis2 = 0;</code>
  for (int i = 0; i < 1; i++) {
+
<code>  for (int i = 0; i < 1; i++) {</code>
    Serial.println(i);
+
<code>    Serial.println(i);</code>
    dis += IR1->distance();
+
<code>    dis += IR1->distance();</code>
    dis2 += IR2->distance();
+
<code>    dis2 += IR2->distance();</code>
  }
+
<code>  }</code>
  dis = dis / 1;
+
<code>  dis = dis / 1;</code>
  dis2 = dis2 / 1;
+
<code>  dis2 = dis2 / 1;</code>
  
  Serial.print("Mean distance: ");  // log do konzole - naměřená vzdálenost senzoru 1
+
<code>  Serial.print("Mean distance: ");  // log do konzole - naměřená vzdálenost senzoru 1</code>
  Serial.println(dis);
+
<code>  Serial.println(dis);</code>
  Serial.print("Mean distance2: "); // log do konzole - naměřená vzdálenost senzoru 2
+
<code>  Serial.print("Mean distance2: "); // log do konzole - naměřená vzdálenost senzoru 2</code>
  Serial.println(dis2);
+
<code>  Serial.println(dis2);</code>
  
 
+
<code>  unsigned long pepe2 = millis() - pepe1; // the following gives you the time taken to get the measurement</code>
  unsigned long pepe2 = millis() - pepe1; // the following gives you the time taken to get the measurement
+
<code>  Serial.print("Time taken (ms): ");</code>
  Serial.print("Time taken (ms): ");
+
<code>  Serial.println(pepe2);</code>
  Serial.println(pepe2);
 
 
   
 
   
  // mapování analogového vstupu (v tomto případě, 20 - 150 z optických čidel)
+
<code>  // mapování analogového vstupu (v tomto případě, 20 - 150 z optických čidel)</code>
  // hraniční frekvence zvukového výstupu (500 - 4000Hz)
+
<code>  // hraniční frekvence zvukového výstupu (500 - 4000Hz)</code>
  int thisPitch = map(dis, 20, 150, 500, 4000);  
+
<code>  int thisPitch = map(dis, 20, 150, 500, 4000); </code>
  
 
+
<code>    // žlutá led dioda</code>
    // žlutá led dioda
 
   
 
    if((dis > 40) && (dis < 150)) // bliká v rozsahu hodnot 40 až 150
 
   
 
  {
 
    digitalWrite(7, HIGH);  // zapne diodu napětím (HIGH)
 
    delay(dis/8);
 
    digitalWrite(7, LOW);    // vypne diodu napětím (LOW)
 
    delay(dis/8);
 
 
      
 
      
    }
+
<code>    if((dis > 40) && (dis < 150)) // bliká v rozsahu hodnot 40 až 150 {</code>
 +
<code>    digitalWrite(7, HIGH);  // zapne diodu napětím (HIGH)</code>
 +
<code>    delay(dis/8);</code>
 +
<code>    digitalWrite(7, LOW);    // vypne diodu napětím (LOW)</code>
 +
<code>    delay(dis/8);</code>   
 +
<code>    }</code>
 
    
 
    
  // červená led dioda
+
<code>  // červená led dioda</code> 
 
+
<code>  if ((dis > 80) && (dis < 150)) {</code>
  if ((dis > 80) && (dis < 150))
+
<code>    digitalWrite(4, HIGH);</code>
 
+
<code>    delay(dis/32);</code>
  {
+
<code>    digitalWrite(4, LOW);</code>    
    digitalWrite(4, HIGH);  
+
<code>    delay(dis/32);</code>   
    delay(dis/32);
+
<code>    }</code>
    digitalWrite(4, LOW);   
 
    delay(dis/32);
 
   
 
    }
 
 
 
  // zelená led dioda
 
 
 
  if (dis < 150)
 
 
 
  {
 
    digitalWrite(13, HIGH); 
 
    delay(dis2);
 
    digitalWrite(13, LOW);
 
    delay(dis2);
 
 
 
    tone(10, thisPitch, dis2);
 
    }
 
  
  else
+
<code>  // zelená led dioda</code> 
  {
+
<code>  if (dis < 150) {</code>
    noTone(10);
+
<code>    digitalWrite(13, HIGH);</code> 
  }
+
<code>    delay(dis2);</code>
}
+
<code>    digitalWrite(13, LOW);</code>
</code>
+
<code>    delay(dis2);</code>
 +
<code>    tone(10, thisPitch, dis2);</code>
 +
<code>    }</code>
 +
<code>  else {</code>
 +
<code>    noTone(10);</code>
 +
<code>  }</code>
 +
<code>}</code>
  
 
== Popis vývoje a konečná verze vlastního produktu ==
 
== Popis vývoje a konečná verze vlastního produktu ==

Verze z 25. 5. 2016, 20:07

generátor a modulátor tónů pomocí infračervených čidel, vizualizace vzdálenosti od čidel led diodami – VRNI, LS 2015/2016


Členové projektu

Motivace vzniku projektu a jeho význam

Theremin je elektronický hudební nástroj, na který se hraje bez doteku. Namísto, abychom sestrojili technologicky podobný nástroj vytvářející elektrické kmity dvou nesynchronizovaných oscylátorů, jejichž sobě podobné tóny spolu interferují (viz zázněj), jsme se chopili využítí obdobného principu ovládání bezdotykově, ve zjednodušené formě.

Projekt jsme si zvolili pro jeho jednoduchou interpretaci fyzického pohybu v prostředí. Kolem nás se vyskytuje mnoho elektronických senzorů a čidel, které jsou nám mnohdy neviditelné, jejich funkčnost obdobně (využití infračerveného světla, které lidské oko není schopno vnímat). Zábavnou formou transformujeme pohyb lidského těla na zvukovou a vizuální složku. Uživatel našeho výstupu je schopný pomocí končetin zasahovat do zorného pole infračervených čidel a tím ovlivňovat funkčnost v reálném čase - ihned dochází ke zpětné vazbě na jeho pohyb.

Použitý materiál

  • 1x Arduino UNO (+ propojovací USB A-B kabel)
  • 2x Infračervené čidlo SHARP 2Y0A21
  • 1x Breadboard (nepájivé pole)
  • 1x Reproduktor
  • 3x LED
  • 1x Potenciometr
  • Cca 25x propojovací kabel
  • 1x Box z tvrdého kartonu
  • 1x Powerbanka

Použitý software

  • Arduino IDE 1.6.9
  • Atom či jiný textový editor

Odkazy na knihovnu arduina a vlastní zdrojový kód

Vlastní zdrojový kód

#include <SharpIR.h> // knihovna pro optické senzory

#define ir_1 A0 // port pro senzor1 #define ir_2 A1 // port pro senzor2 #define model 20150 // typ optického senzoru - 1080 pro GP2Y0A21Y, 20150 pro GP2Y0A02Y // rozlišení dvou čidel SharpIR *IR1; SharpIR *IR2;

//určení délky tonu (4 pro čtvrťovou dobu, 8 pro osminovou atp.) int noteDurations[] = { 8, };

void setup() {

Serial.begin(9600); IR1 = new SharpIR(ir_1, model); IR2 = new SharpIR(ir_2, model);

// pin pro zvukový výstup pinMode(9, OUTPUT);

// pin pro led diody pinMode(4, OUTPUT); pinMode(7, OUTPUT); pinMode(13, OUTPUT); }

void loop() {

unsigned long pepe1 = millis(); // takes the time before the loop on the library begins

int dis = 0; // this returns the distance to the object you're measuring int dis2 = 0; for (int i = 0; i < 1; i++) { Serial.println(i); dis += IR1->distance(); dis2 += IR2->distance(); } dis = dis / 1; dis2 = dis2 / 1;

Serial.print("Mean distance: "); // log do konzole - naměřená vzdálenost senzoru 1 Serial.println(dis); Serial.print("Mean distance2: "); // log do konzole - naměřená vzdálenost senzoru 2 Serial.println(dis2);

unsigned long pepe2 = millis() - pepe1; // the following gives you the time taken to get the measurement Serial.print("Time taken (ms): "); Serial.println(pepe2);

// mapování analogového vstupu (v tomto případě, 20 - 150 z optických čidel) // hraniční frekvence zvukového výstupu (500 - 4000Hz) int thisPitch = map(dis, 20, 150, 500, 4000);

// žlutá led dioda

if((dis > 40) && (dis < 150)) // bliká v rozsahu hodnot 40 až 150 { digitalWrite(7, HIGH); // zapne diodu napětím (HIGH) delay(dis/8); digitalWrite(7, LOW); // vypne diodu napětím (LOW) delay(dis/8); }

// červená led dioda if ((dis > 80) && (dis < 150)) { digitalWrite(4, HIGH); delay(dis/32); digitalWrite(4, LOW); delay(dis/32); }

// zelená led dioda if (dis < 150) { digitalWrite(13, HIGH); delay(dis2); digitalWrite(13, LOW); delay(dis2); tone(10, thisPitch, dis2); } else { noTone(10); } }

Popis vývoje a konečná verze vlastního produktu

Pro vstupy, které následně generují zvuk, jsme využili dva optické senzory Sharp IR, které jsou schopny detekovat vzdálenost přibližně jednoho metru od samotného senzoru. Každý senzor má přitom jinou funkci. Senzor na levé straně s přibývající vzdáleností ruky od senzoru plynule zvyšuje frekvenci zvuku, tedy jeho výšku, zatímco senzor na straně pravé reguluje rychlost opakování daného tónu. Zvukový výstup zajišťuje jednoduchý reproduktor, do kterého je vpouštěn mono signál. Intenzita zvuku je regulovatelná potenciometrem. Pro vizuální znázornění zvukového výstupu jsou vyvedeny tři led diody, které reflektují oba možné vstupy, tedy jak výšku tónu, kdy zelená dioda je tón nejnižší a s přibývajícími frekvencemi se přes diodu žlutou rozsvítí konečně i dioda červená, tak frekvenci opakování tónu, což je znázorněno blikáním diod. Tyto komponenty jsou skrz breadboard vedeny do Arduina UNO, které je naprogramováno výše zmíněným kódem. Veškeré prvky jsou umístěny v tmavém boxu z tvrdého kartonu. Napájení je zajištěno power bankou, takže zařízení je soběstačné a mobiní.

Zhodnocení

Při použití tohoto typu infračerveného čidla jsme nedbali na jeho zorné pole. Umístění do boxu ukázalo, že je problematické umístění zařízení - čidla snímají všechny objekty ve svém zorném poli, a to i plochu, na které zařízení stojí. Je tedy potřeba pozorně vybírat prostor umístění. Škála interpretovaných tónu je příliš široká a je velmi obtížné úmyslně zahrát konkrétní melodii. Další revize vyžaduje namapovat všechny vzdálenosti objektu od čidla a vytvořit přesně definovaná pole, konkrétní zvukové tóny, obsahující limitní vzdálenosti.

Bylo velmi přínosné pracovat v týmu na projektu, který zahrnuje open hardware. Mikrokontroléry jsou svou variabilitou a použitelností vhodným entry levelem pro práci s hardwarem. Zejména pak arduino, které integruje serial port pro komunikaci, GPIO sběrnici pro analogovou a digitální komunikaci s periferiemi a speciální IDE software s velmi jednoduchým a přehledným rozhraním. Open hardware je vázán i na početnou komunitu lidí, která je velmi vzručná v DIY a v programování. S těmito dispozicemi je pak jednoduché vstoupit do tohoto světa: S využitím již hotových knihoven a příkladů použití různých funkcí, zpracovaných problematik a kvalitní dokumentace (zejména na webu arduino.org a DIY platformě instructables.com) lze vytvořit mnoho kvalitních projektů, které mají reálné využití.