Projekt Theremin: Porovnání verzí
m |
|||
(Není zobrazeno 12 mezilehlých verzí od 2 dalších uživatelů.) | |||
Řádek 1: | Řádek 1: | ||
− | + | Generátor a modulátor tónů pomocí infračervených čidel, vizualizace vzdálenosti od čidel le diodami – VRNI, LS 2015/2016 | |
+ | == Členové projektu == | ||
− | |||
* Daniel Sýkora, Studia nových médií, [mailto:sykora.dan@gmail.com sykora.dan@gmail.com] | * Daniel Sýkora, Studia nových médií, [mailto:sykora.dan@gmail.com sykora.dan@gmail.com] | ||
* Vladimír Anděl, Studia nových médií, [mailto:va@vladimirandel.cz va@vladimirandel.cz] | * Vladimír Anděl, Studia nových médií, [mailto:va@vladimirandel.cz va@vladimirandel.cz] | ||
+ | |||
== Motivace vzniku projektu a jeho význam == | == 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 | + | |
+ | 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 oscilátorů, jejichž sobě podobné tóny spolu interferují (viz [https://cs.wikipedia.org/wiki/Z%C3%A1zn%C4%9Bj 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. | 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 == | + | |
+ | == Použitý materiál == | ||
+ | |||
* 1x Arduino UNO (+ propojovací USB A-B kabel) | * 1x Arduino UNO (+ propojovací USB A-B kabel) | ||
* 2x Infračervené čidlo SHARP 2Y0A21 | * 2x Infračervené čidlo SHARP 2Y0A21 | ||
Řádek 19: | Řádek 23: | ||
* 1x Box z tvrdého kartonu | * 1x Box z tvrdého kartonu | ||
* 1x Powerbanka | * 1x Powerbanka | ||
+ | |||
=== Použitý software === | === Použitý software === | ||
* Arduino IDE 1.6.9 | * Arduino IDE 1.6.9 | ||
* Atom či jiný textový editor | * Atom či jiný textový editor | ||
+ | |||
+ | == Zapojení == | ||
+ | |||
+ | [[Soubor:theremin bb.png]] | ||
+ | |||
+ | == Schéma zapojení == | ||
+ | |||
+ | [[Soubor:theremin_schema_schem.png]] | ||
+ | |||
== Odkazy na knihovnu arduina a vlastní zdrojový kód == | == Odkazy na knihovnu arduina a vlastní zdrojový kód == | ||
+ | |||
* Zdrojový kód ve formátu [https://drive.google.com/file/d/0BzvYyaUSf22QQkdFTE9CeFVfUE0/view ino] a [https://drive.google.com/file/d/0BzvYyaUSf22QUkxPSzd1OEdjOGM/view rtf] | * Zdrojový kód ve formátu [https://drive.google.com/file/d/0BzvYyaUSf22QQkdFTE9CeFVfUE0/view ino] a [https://drive.google.com/file/d/0BzvYyaUSf22QUkxPSzd1OEdjOGM/view rtf] | ||
* [https://github.com/guillaume-rico/SharpIR Knihovna Sharp IR pro senzory] | * [https://github.com/guillaume-rico/SharpIR Knihovna Sharp IR pro senzory] | ||
+ | |||
== Vlastní zdrojový kód == | == Vlastní zdrojový kód == | ||
− | |||
− | |||
− | # | + | <code>#include <SharpIR.h> // knihovna pro optické senzory</code> |
− | |||
− | #define | + | <code>#define ir_1 A0 // port pro senzor1</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>// rozlišení dvou čidel</code> | |
− | |||
− | |||
− | |||
− | void setup() { | + | <code>SharpIR *IR1;</code> |
+ | |||
+ | <code>SharpIR *IR2;</code> | ||
+ | |||
+ | <code>//určení délky tonu (4 pro čtvrťovou dobu, 8 pro osminovou atp.)</code> | ||
+ | |||
+ | <code>int noteDurations[] = { </code> | ||
+ | |||
+ | <code> 8,</code> | ||
+ | |||
+ | <code>};</code> | ||
+ | |||
+ | <code>void setup() {</code> | ||
− | + | <code> Serial.begin(9600);</code> | |
− | |||
− | |||
− | + | <code> IR1 = new SharpIR(ir_1, model);</code> | |
− | + | ||
+ | <code> IR2 = new SharpIR(ir_2, model);</code> | ||
+ | |||
+ | <code> // pin pro zvukový výstup</code> | ||
+ | |||
+ | <code> pinMode(9, OUTPUT);</code> | ||
− | + | <code> // pin pro led diody</code> | |
− | + | ||
− | + | <code> pinMode(4, OUTPUT);</code> | |
− | + | ||
− | } | + | <code> pinMode(7, OUTPUT);</code> |
+ | |||
+ | <code> pinMode(13, OUTPUT);</code> | ||
+ | |||
+ | <code>}</code> | ||
+ | |||
+ | <code>void loop() {</code> | ||
+ | |||
+ | <code> unsigned long pepe1 = millis(); // takes the time before the loop on the library begins</code> | ||
− | + | <code> int dis = 0;</code> | |
− | + | <code> // this returns the distance to the object you're measuring</code> | |
− | + | <code> int dis2 = 0;</code> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | <code> for (int i = 0; i < 1; i++) {</code> | |
− | |||
− | |||
− | |||
+ | <code> Serial.println(i);</code> | ||
− | + | <code> dis += IR1->distance();</code> | |
− | + | ||
− | + | <code> dis2 += IR2->distance();</code> | |
+ | |||
+ | <code> }</code> | ||
+ | |||
+ | <code> dis = dis / 1;</code> | ||
+ | |||
+ | <code> dis2 = dis2 / 1;</code> | ||
+ | |||
+ | <code> Serial.print("Mean distance: "); // log do konzole - naměřená vzdálenost senzoru 1</code> | ||
+ | |||
+ | <code> Serial.println(dis);</code> | ||
+ | |||
+ | <code> Serial.print("Mean distance2: "); // log do konzole - naměřená vzdálenost senzoru 2</code> | ||
+ | |||
+ | <code> Serial.println(dis2);</code> | ||
+ | |||
+ | <code> unsigned long pepe2 = millis() - pepe1; // the following gives you the time taken to get the measurement</code> | ||
+ | |||
+ | <code> Serial.print("Time taken (ms): ");</code> | ||
+ | |||
+ | <code> Serial.println(pepe2);</code> | ||
− | + | <code> // mapování analogového vstupu (v tomto případě, 20 - 150 z optických čidel)</code> | |
− | |||
− | |||
+ | <code> // hraniční frekvence zvukového výstupu (500 - 4000Hz)</code> | ||
− | + | <code> int thisPitch = map(dis, 20, 150, 500, 4000); </code> | |
+ | |||
+ | <code> // žlutá led dioda</code> | ||
− | + | <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> | ||
− | + | <code> // červená led dioda</code> | |
− | + | ||
− | + | <code> if ((dis > 80) && (dis < 150)) {</code> | |
+ | |||
+ | <code> digitalWrite(4, HIGH);</code> | ||
+ | |||
+ | <code> delay(dis/32);</code> | ||
+ | |||
+ | <code> digitalWrite(4, LOW);</code> | ||
+ | |||
+ | <code> delay(dis/32);</code> | ||
+ | |||
+ | <code> }</code> | ||
+ | |||
+ | <code> // zelená led dioda</code> | ||
+ | |||
+ | <code> if (dis < 150) {</code> | ||
+ | |||
+ | <code> digitalWrite(13, HIGH);</code> | ||
+ | |||
+ | <code> delay(dis2);</code> | ||
+ | |||
+ | <code> digitalWrite(13, LOW);</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 == | ||
+ | |||
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í. | 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í == | == 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. | 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 [http://www.arduino.org/ arduino.org] a DIY platformě [http://www.instructables.com/ instructables.com]) lze vytvořit mnoho kvalitních projektů, které mají reálné využití. | 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 [http://www.arduino.org/ arduino.org] a DIY platformě [http://www.instructables.com/ instructables.com]) lze vytvořit mnoho kvalitních projektů, které mají reálné využití. | ||
+ | |||
+ | == Fotodokumentace == | ||
+ | |||
+ | <gallery widths="200" mode=nolines> | ||
+ | Soubor:Theremin1.jpg|Přípravná fáze - zapojení reproduktoru a senzorů do Arduina skrz breadboard | ||
+ | Soubor:Theremin2.jpg|Zkompletovaný box I. | ||
+ | Soubor:Theremin3.jpg|Zkompletovaný box II. | ||
+ | Soubor:Theremin4.jpg|Pohled na vnitřní komponenty boxu s powerbankou | ||
+ | Soubor:Theremin5.jpg|Pohled na vnitřní komponenty boxu s vyjmutou powerbankou | ||
+ | </gallery> | ||
+ | |||
+ | == Videodokumentace == | ||
+ | |||
+ | [https://goo.gl/photos/MUr7Y8DodVwjzXWo8 Představení thereminu v praxi] |
Aktuální verze z 15. 10. 2016, 23:42
Generátor a modulátor tónů pomocí infračervených čidel, vizualizace vzdálenosti od čidel le diodami – VRNI, LS 2015/2016
Obsah
Členové projektu
- Daniel Sýkora, Studia nových médií, sykora.dan@gmail.com
- Vladimír Anděl, Studia nových médií, va@vladimirandel.cz
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 oscilá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
Zapojení
Schéma zapojení
Odkazy na knihovnu arduina a vlastní zdrojový kód
- Zdrojový kód ve formátu ino a rtf
- Knihovna Sharp IR pro senzory
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í.