Luchtdrum
Door: Nanko Schrijver Daniël Sonck Jeroen Venema
s1199870
[email protected] s1176366
[email protected] s1173375
[email protected]
13-2-2012 Universiteit Twente EWI MidP
Inhoud Inleiding..............................................................................................................................................3 Wat is een luchtdrum? ....................................................................................................................3 Analyse ...............................................................................................................................................4 Drumstokken ..................................................................................................................................4 Linker pantoffel Hi-hat (Lichtsensor) ...............................................................................................4 Rechter pantoffel Bass (Geluidsensor).............................................................................................5 Clapboard (Xylofoon) ......................................................................................................................6 Uitwerking ..........................................................................................................................................6 Conclusie ............................................................................................................................................7 Foutenanalyse.................................................................................................................................7 Discussie .........................................................................................................................................8 Gebruiksaanwijzing .............................................................................................................................9 Gebruiksaanwijzing Luchtdrum .......................................................................................................9 Gebruiksaanwijzing clapboard....................................................................................................... 10 Bijlage............................................................................................................................................... 11 Planning ........................................................................................................................................ 11 Taakverdeling ............................................................................................................................... 11 Source code .................................................................................................................................. 11
2
Inleiding Wij hebben de opdracht om een luchtdrum te bouwen met de kennis die wij tot nu toe hebben opgedaan. Wij gaan dus een elektronische luchtdrum bouwen. Naast de luchtdrum is er ook een clapboard gebouwd, dit is eigenlijk een elektronische xylofoon. Dit idee hebben wij gevonden op: http://homepage.mac.com/coldham/klang/clapboard.html
Wat is een luchtdrum? Een drumstel dat de trommels en bekkens niet bevat maar gebruik maakt van elektronica en sensoren om de geluiden van een drumstel via een computer te laten horen. Door middel van drumstokjes en pantoffels worden de Hi-hat en Bass bediend. Deze implementatie komt van Maayan Migdal. Het project kan opgedeeld worden in verschillende subsystemen die samen de luchtdrum vormen.
Figuur 1 Blokschema
Specificaties: -
Bedienbaar door 1 persoon 4 inputs, 3 instrumenten Hi-hat, Snare, Bass Inputs door middel van accelerometers in Drumstokjes Geluidsensor in één slipper Hi-hat open/dicht gestuurd door led en LDR in de andere slipper De computer kan geluiden aan elke actie koppelen Het clapboard kan verschillende tonen realiseren
3
Analyse Het project is opgedeeld in verschillende subsystemen zoals in de inleiding is weergeven.
Drumstokken De drumstokken maken gebruik van accelerometers. Na de neergaande beweging van de stok is er een plotselinge stop, hierbij ontstaan er grote G-krachten, dit moment staat gelijk met het neerkomen van een drumstok op het vel van het drumstel en kan dus worden gebruikt als een trigger voor het aansturen van een bepaald geluid. De accelerometer die wij gekozen hebben is de MMA8452QT. Dit is een digitale accelerometer en kan dus direct uitgelezen worden door de Arduino. Toch heeft de accelerometer een kleine schakeling nodig voor het juist functioneren.
Figuur 2 Schema accelerometer Bron: datasheet
Linker pantoffel Hi-hat (Lichtsensor) De Hi-hat wordt bediend door een lichtsensor. Deze geeft een hoog signaal af als de Hi-hat open moet zijn. En dus een laag signaal als de Hi-hat dicht moet zijn. Met deze simpele eigenschap kan de Arduino gemakkelijk overweg; het is een soort digitaal signaal. De lichtsensor bestaat uit een LDR en LED de LED is er om de LDR van licht te voorzien als de Hi-hat open is en dus de voet iets van de grond is. Zonder de LED is er te weinig licht voor de LDR om een verschil tussen open en dicht te meten. Voor het meten en aansturen van de LDR en LED hebben wij de volgende schakeling ontworpen:
4
Figuur 3 Schema LDR Slof
Rechter pantoffel Bass (Geluidsensor) De bass werkt met een geluidsensor. Er wordt gebruik gemaakt van een piëzo die door de klap met de grond een spanning afgeeft. Deze spanning wordt vergeleken met een referentiespanning waardoor de geluidssterkte voor de trigger ingesteld kan worden. Uiteindelijk geeft de schakeling net zoals de Lichtsensor een hoog of laag signaal af. Voor het meten en aansturen van de geluidsensor hebben wij de volgende schakeling ontworpen die een laag of hoog signaal uitgeeft:
Figuur 4 Schema Geluid Sensor
De comparator heeft een signaal nodig dat voor een lange tijd hoog is. De piëzo levert maar een kleine piek en dus de opamp ook. Daarom komt er naar de opamp nog een omhullende detector die het signaal voor 0,01s vasthoudt. Daarom is er voor R6 een waarde van 100kΩ gekozen en voor C7 100nF.
5
Clapboard (Xylofoon) Naast de luchtdrum is er ook een soort xylofoon gebouwd. Dit zogenaamde clapboard maakt gebruik van twee piëzo’s die op de plank zijn gemonteerd. Door op de plank te tikken worden de piëzo’s getriggerd; de ene net iets later dan de andere. Hiermee kan de Arduino een timer zetten en de tijd tussen de triggers berekenen die vervolgens een bepaalde toon uitgeeft aan een luidspreker. Het clapboard maakt gebruik van dezelfde schakeling als de geluidsensor en geeft dus twee hoog/laag signalen af aan de Arduino.
Uitwerking Gebruikte componenten: MMA8452QT A9013 WU-8-750SNC LM741 LM339 EPZ-20MS64W SL74HCT32
2x 1x 1x 5x 2x 3x 1x
Accelerometer LDR LED Opamp Comparator Piëzo Or Gate
1 10 100 1 150 20 30 4,7
kΩ 3x kΩ max 4x kΩ 7x mΩ 8x Ω 1x kΩ 2x kΩ 2x kΩ 4x
9 kΩ 100 nF 100 μF 0,1 μF 4,7 μF Schakelaar Arduino Mega
3x 5x 2x 4x 2x 3x
De schakeling voor de lichtsensor en geluidsensor zijn eerst op een experimenteerbord gebouwd. Hier werd na een tijdje ondervonden dat de LDR een versterking nodig heeft anders is het bijna niet mogelijk om deze sensor in te stellen. De versterker versterkt het LDR signaal met een factor 2. Voor een versterking met een factor twee geldt bij een niet-inverterend opamp 6+ 7 = 2 6 6= 7=2 Bij de geluidsensor bleek ook een versterking nodig te zijn. Uit eerdere testen bleek dat de piëzo een spanning van 10 V levert als deze getriggerd wordt. Hierdoor wilden wij dit signaal een versterking van 1/3 geven zodat de opamp geen hoge spanningen te verwerken kreeg. Maar nadat de piëzo in de pantoffel was gebouwd was de uitgang van de piëzo nog maar 0,2 V doordat de pantoffel aardig veel dempt. Daarom is de versterking een factor 9 geworden zodat de opamp goed kan reageren op de piëzo. Voor een versterking van een factor 1/3 bij een inverterende opamp geldt: 3/ 2 = 1/3 3 = 1
2 = 3
Voor een versterking van 9 geldt: 3/ 2 = 9 3 = 9
2=1
De schakelingen uit de analyse zijn gebouwd en de benodigde schakeling voor de accelerometers zijn in de stokjes gebouwd en worden met de hardware verbonden via een UTP-kabel. De hardware voor de lichtsensor en de piëzo zijn op de Arduino zelf gebouwd, omdat er geen ruimte is in de pantoffels voor de hardware, ook deze zijn verbonden met UTP-kabels. Op het clapboard zijn twee piëzo’s
6
geplaatst die met een telefoonkabel verbonden zijn met de hardware op de Arduino. Er is voor het clapboard wel een aparte schakeling gemaakt die op de andere schakeling gezet kan worden. Het clapboard werkt niet dit komt doordat de tijd die het geluid nodig heeft om zich door het hout te verplaatsen te klein is vergeleken met de tijd die de Arduino nodig heeft om de signalen van het clapboard te verwerken. De maximale tijd tussen de piëzo’s is 2 ∗ 10 , dit is een te kleine tijd voor de Arduino in combinatie met onze code om te verwerken. Gezien het feit dat de Arduino te weinig interruptaansluitingen heeft is er aan de totale schakeling nog een of-poort met omhullende detectoren toegevoegd. Deze gebruikt twee analoge poorten van de Arduino zodat het mogelijk is te kijken welke interrupt getriggerd is.
Figuur 5 Schema signaalverwerking
Conclusie Foutenanalyse De pantoffel voor de Hi-hat moet soms opnieuw worden afgesteld. Dit is afhankelijk van de lichtweerkaatsing. Dit komt doordat de LED niet fel genoeg is. Als deze vervangen wordt door een fellere LED dan is het verschil in weerstand van de LDR tussen open en dicht groter en dan hoeft de schakeling maar één keer goed afgesteld te worden. De interrupts van de accelerometers werken niet. De reden is niet bekend maar het kan een soldeerfout zijn of de aansturing van de accelerometers is niet goed geprogrammeerd. Dit probleem is opgelost door de accelerometers steeds uit te lezen. Helaas kost dit veel rekenkracht waardoor andere delen van het systeem minder goed gaan werken. Ook is deze manier te gevoelig waardoor een kleine beweging al voor een reactie kan zorgen.
7
Het clapboard functioneert niet goed. Dit komt doordat de plank die gebruikt wordt te kort is en gebogen waardoor de trillingen slecht door het hout bewegen.
Discussie Van de luchtdrum werken uiteindelijk de pantoffels goed met heel af en toe geen responsie. De stokken werken niet goed waardoor dit project niet 100% werkend is. Het is nu enkel mogelijk om de bass en de Hi-hat goed te bedienen. De stokken reageren vaak wel maar ook nog te vaak op de verkeerde momenten. Toch is het uiteindelijke product dicht in de buurt gekomen van een luchtdrum. Het clapboard heeft nog meer onderzoek nodig om deze goed te laten werken aangezien hij nu wel verschillende tonen maakt als er op verschillende plaatsen wordt geslagen, maar het clapboard reageert lang niet op elke slag en heeft ook nog moeite met het bepalen van de plaats waar de slag plaats vindt. De onderlinge samenwerking verliep goed en iedereen wist goed wat hij moest doen om aan het einde van de week tot een product te komen dat presenteerbaar is.
8
Gebruiksaanwijzing Gebruiksaanwijzing Luchtdrum Geachte gebruiker, U heeft zojuist een prototype van de Luchtdrum ontvangen. Deze luchtdrum is nog in ontwikkeling en zal daarom niet altijd op de juiste manier reageren. Op de volgende dingen moet u letten voordat u gebruik maakt van dit product:
Gebruik het instrument niet op een vloer waar vloerbedekking ligt of een vergelijkbare niet weerkaatsende/dempende vloerbekleding. De instrumenten zijn niet bestand tegen water, vocht of andere vloeistoffen. Daarnaast zijn de schakelingen nog niet schokbestendig en dient er uiterst voorzichtig mee omgegaan te worden om eventuele kabel-/soldeerbreuken en kortsluiting te voorkomen. Wij zijn niet aansprakelijk voor eventuele beschadigingen of gebreken aan het instrument, het betreft een prototype en wordt daarom beschouwd als een product dat vele fouten en gebreken kan bevatten.
De luchtdrum wordt van te voren afgesteld maar het kan zijn dat deze bij u niet goed meer werkt. Het is daarom mogelijk om de bediening voor de Hi-hat en de Bass in te stellen met behulp van de blauwe potmeters op de schakeling. U heeft hiervoor een schroevendraaier nodig die op de potmeters past. De Bass is zeer simpel af te stellen: u beweegt de potmeter net zolang terwijl u met uw voet op de grond tikt totdat de bass op de gewenste manier reageert. Voor de Hi-hat moet eerst de bass goed ingesteld zijn. Daarna draait u aan de potmeter terwijl u met uw rechtervoet tikt en de linkervoet op de grond heeft, totdat het geluid laag wordt als dit eerst een hoge toon was, bij een lage toon doet u uw linkervoet juist omhoog. Wij wensen u veel plezier met uw luchtdrum en hopen dat u in de toekomst nog andere producten van ons gaat gebruiken.
9
Gebruiksaanwijzing clapboard Geachte gebruiker, U heeft zojuist een prototype van het clapboard, ook wel elektronische Xylofoon genaamd, ontvangen. Het clapboard is een uitbreiding van de luchtdrum, zonder de luchtdrum is het niet mogelijk om het clapboard te gebruiken.
Gebruik het instrument alleen op een stevige tafel en niet op andere objecten. Gebruik de juiste stokken voor het bedienen van het clapboard, wij raden drumstokken aan of een soortgelijk product maar geen gereedschap of andere voorwerpen die het clapboard kunnen beschadigen. De instrumenten zijn niet bestand tegen water, vocht of andere vloeistoffen. Daarnaast zijn de schakelingen nog niet schokbestendig en dient er uiterst voorzichtig mee omgegaan te worden om eventuele kabel-/soldeerbreuken en kortsluiting te voorkomen. Wij zijn niet aansprakelijk voor eventuele beschadigingen of gebreken aan het instrument, het betreft een prototype en wordt daarom beschouwd als een product dat vele fouten en gebreken kan bevatten.
Het clapboard wordt van te voren afgesteld, maar het kan zijn dat uw clapboard niet goed is afgesteld of u wilt een andere afstelling. Dit is mogelijk door met behulp van een schroevendraaier aan de potmeter te draaien totdat u het gewenste geluid bereikt. Dit maakt het mogelijk om met een zachte tik al tonen uit uw clapboard te halen, maar let wel op: dit vereist een gevoelige afstelling en daardoor kan het clapboard op ongewenste acties reageren. Wij wensen u veel plezier met uw clapboard en hopen dat u in de toekomst nog andere producten van ons gaat gebruiken.
10
Bijlage Planning Datum (Eind tijd) 6-2-2012 12:30 6-2-2012 17:30 7-2-2012 17:30 7-2-2012 8-2-2012 17:30 9-2-2012 17:30 9-2-2012 10-2-2012 13:30 10-2-2012 na 13:30 13-2-2012 12:00
Omschrijving Probleemanalyse, specificaties Plan van aanpak Functioneel ontwerp en planning Drumstokken en slippers af Clapboard op breadbord en begin software Hardware af Software af Koppelingen van deelschakelingen, testen van de werking van het product Afronding testen/ Uitloop Presentatie Inleveren verslag
Taakverdeling -
Slippers Drumstokken Arduino (Software) Clapboard Arduino (Hardware)
Nanko Nanko Daniël Daniël Jeroen
Source code #include
#include <math.h> volatile bool on; bool stick_1_triggered,stick_2_triggered; int time; int freq = 200; // Base drum frequency. int hihat = 800; // Hi-hat time. int snare = 200; // Snare time bool hihat_open = 0; // Hi-hat mode. bool hihat_triggered; int x_1,y_1; float d_1,d_1o; int x_2,y_2; float d_2,d_2o; int tone_current; int tone_target; int clockright, clockleft, state=0; /* The "state" variable is important to the structure of this program. There are 5 states: 0 == waiting for a new "hit" 1 == left got a hit, we're waiting for right 2 == right got a hit, we're waiting for left
11
3 == both hit, right was first 4 == both hit, left was first */ #define HP_FILTER_CUTOFF 0x0F // Pulse filter #define ACCELEROMETER1 0x1C // Right stick #define ACCELEROMETER2 0x1D // Left stick #define FF_MT_CFG 0x15 // Motion detection interrupt #define FF_MT_THS 0x17 // Motion detection threshold #define #define #define #define #define #define
PULSE_CFG 0x21 PULSE_SRC 0x22 PULSE_THSX 0x23 PULSE_THSY 0x24 PULSE_THSZ 0x25 PULSE_TMLT 0x26
// // // //
Pulse Pulse Pulse Pulse
x threshold y threshold z threshold timewindow
#define CTRL_REG1 0x2A // Control register 1 #define CTRL_REG2 0x2B // Control register 2 #define CTRL_REG4 0x2D // Interrupt enables #define HIHAT_MIN_OPEN 4000 #define HIHAT_MAX_OPEN 5000 #define HIHAT_MIN_CLOSED 2500 #define HIHAT_MAX_CLOSED 3000 void i2cWriteEnsure(uint8_t dev, uint8_t reg, uint8_t value) { I2c.setSpeed(1); I2c.write(dev,reg,value); I2c.read(dev,reg,(uint8_t)1); Serial.print("0x"); Serial.print(dev,HEX); Serial.print(" - 0x"); Serial.print(reg,HEX); Serial.print(" : 0x"); Serial.print(value,HEX); Serial.print(" -> 0x"); Serial.println(I2c.receive(),HEX); } void setup() { // put your setup code here, to run once: Serial.begin(115200); attachInterrupt(4, left, RISING); attachInterrupt(5, right, RISING); TCCR1B=0x05; //set the timer to increment once every 1024 clock cycles attachInterrupt(0,basedrum,RISING); on = 0; time = millis(); stick_1_triggered = stick_2_triggered = 0; //I2c.scan(); I2c.timeOut(1000);
12
I2c.begin();
/*
// Communicate to the I2C Accelerometers // Reset the device i2cWriteEnsure(ACCELEROMETER1,CTRL_REG2,0x40); i2cWriteEnsure(ACCELEROMETER2,CTRL_REG2,0x40); i2cWriteEnsure(ACCELEROMETER1,CTRL_REG1,0x00); i2cWriteEnsure(ACCELEROMETER2,CTRL_REG1,0x00); // Enable the interrupt i2cWriteEnsure(ACCELEROMETER1,CTRL_REG4,0x14); i2cWriteEnsure(ACCELEROMETER2,CTRL_REG4,0x14); // Set to motion detection i2cWriteEnsure(ACCELEROMETER1,FF_MT_CFG,0xC0); i2cWriteEnsure(ACCELEROMETER2,FF_MT_CFG,0xC0); // Set to motion detection i2cWriteEnsure(ACCELEROMETER1,PULSE_CFG,0x40); i2cWriteEnsure(ACCELEROMETER2,PULSE_CFG,0x40); i2cWriteEnsure(ACCELEROMETER1,PULSE_THSX,0x1); i2cWriteEnsure(ACCELEROMETER2,PULSE_THSX,0x1); i2cWriteEnsure(ACCELEROMETER1,PULSE_THSY,0x1); i2cWriteEnsure(ACCELEROMETER2,PULSE_THSY,0x1); i2cWriteEnsure(ACCELEROMETER1,PULSE_THSZ,0x1); i2cWriteEnsure(ACCELEROMETER2,PULSE_THSZ,0x1); i2cWriteEnsure(ACCELEROMETER1,HP_FILTER_CUTOFF,0x20); i2cWriteEnsure(ACCELEROMETER2,HP_FILTER_CUTOFF,0x20); i2cWriteEnsure(ACCELEROMETER1,PULSE_TMLT,0x7F); i2cWriteEnsure(ACCELEROMETER2,PULSE_TMLT,0x7F);
// Set the threshold to 2g i2cWriteEnsure(ACCELEROMETER1,FF_MT_THS,0x10); i2cWriteEnsure(ACCELEROMETER2,FF_MT_THS,0x10); // Set // Set the accelerometer to active*/ i2cWriteEnsure(ACCELEROMETER1,CTRL_REG1,0x01); i2cWriteEnsure(ACCELEROMETER2,CTRL_REG1,0x01); } void loop() { // put your main code here, to run repeatedly: if(on) { freq = 100; on = false; } hihat_open = digitalRead(7); if(freq > 0) { //tone(13,freq); tone(13,1500+500*hihat_open); freq --; delay(1); } else if(tone_current != tone_target) { tone_current = tone_target; for(int I = 0;I < 5;I++)
13
{ tone(13,tone_current+(-15+random()%30)); delay(200); } } else if(snare > 0) { tone(13,3500); snare --; } else if(hihat > 0) { if(hihat_open) { tone(13,4000); } else { if(hihat > 200) { hihat = 200; } tone(13,4500); } hihat --; } else { noTone(13); if(stick_1_triggered && !hihat_triggered) { hihat = 700; hihat_triggered = true; } else if(!stick_1_triggered) { hihat_triggered = false; } } if(stick_2_triggered) { snare = 200; } stick_2_triggered = stick_1_triggered = 0;
if(digitalRead(6)) { I2c.read(ACCELEROMETER1,0x01,4); //read 4 bytes (x,y) from the device x_1 = I2c.receive() << 8; x_1 |= I2c.receive(); x_1 >> 4; y_1 = I2c.receive() << 8; y_1 |= I2c.receive(); y_1 >> 4; d_1 = atan2(x_1,y_1); if(abs(d_1o - d_1) > PI/2 && 0
14
stick_2_triggered = true; d_1o = d_1; } } if(digitalRead(5)) { I2c.read(ACCELEROMETER2,0x01,4); //read 4 bytes (x,y) from the device x_2 = I2c.receive() << 8; x_2 |= I2c.receive(); x_2 >> 4; y_2 = I2c.receive() << 8; y_2 |= I2c.receive(); y_2 >> 4; d_2 = atan2(x_2,y_2); if(abs(d_2o - d_2) > PI/2 && 0
} void basedrum() { on = true; } void left() { if(state==0){ state=1; TCNT1=0; } if(state==2){ clockleft = TCNT1; state = 4; } }
void right() { if(state==0){ state=2; TCNT1=0; }
15
if (state==1) { clockright = TCNT1; state = 3; } }
16