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í.

Fotodokumentace