Vous êtes sur la page 1sur 25

(/) hagamos Explorar(/tag/typeid/) Concursos(/contest/) T (/you/)

Clases(/classes/) Publicar(/about/create.jsp)
(http://www.autodesk.com/)
Destacado: BOSEBuildDesignChallenge(/contest/bosebuild/?utm_source=featurebar/)

Proyectosdelpatiotrasero(/tag/typeid/categoryoutside/channelbackyard/?utm_source=featurebar/)

Clasecarne(/class/MeatClass/?utm_source=featurebar/)
Arduino,sensores,yMIDI por
amandaghassaei(/member/amandaghassaei/)enArduino(/tag/typeid/categorytechnology/channelarduino/)

Descargar h(/id/ArduinoSensorsandMIDI/) 16Pasos .

Coleccin Lohice! Favorito Compartir

AcercadeesteInstructable

Licencia:
8 114,523 vistas
491 favoritos

amandaghassaei
(/member/amandaghassaei/)
uhhombreduhGussojopunto
com
(http://www.amandaghassaei.com)
(/member/amandaghassaei/)
Siga 3418

Bio:Soyunestudiantegraduadoenel
CentrodeBitsytomosdelMITMedia
Lab.Antesdeesotrabajen
Instructables,laescrituradecdigode...
Ms(/member/amandaghassaei/)

(/file/FZTJQNIHRI8UWFE/) Msenamandaghassaei:

AhoraqueestaldaenelusodelasentradasysalidasdeArduino
(/id/OTCA
(https://www.instructables.com/id/BeginnerArduino/),esteinstructivoledar
todolonecesarioparaempezarausarsensoresparaactivarlasnotasMIDIde
Arduino.Estemensajeeslaltimaentregadeunaseriedetalleresquelleva
laMisindeaudiodelaMujer(http://www.womensaudiomission.org/).Lasdos MetapixelConwaysGameofLife/)

primerasclasessonIntroduccinaArduino
(https://www.instructables.com/id/BeginnerArduino/)ytrabajarconArduino
entradasysalidas(https://www.instructables.com/id/IntermediateArduino (/id/9Degreesof
InputsandOutputs/).
Listadepartes:

(1x)ArduinoUnoAmazon(http://amzn.to/1JGTEPT)opuederecogerunaenun
localdeRadioShack(http://www.radioshack.com/product/index.jsp?
FreedomIMU/)
productId=12268262)
(1x)cableUSBAmazon(http://amzn.to/1TRcNz2)

(1x)breadboard(stevieneconcablesdepuente)Amazon (/id/TwitterControlledPetFeeder/)

(http://amzn.to/1JGTTup)

(1x)cablesdepuenteAmazon(http://amzn.to/1JGTUOV)
Relacionado
(1x)220OhmresistenciasDigikeyCF14JT220RCTND
Convertircasicualquiercosa
(http://www.digikey.com/productdetail/en/CF14JT220R/CF14JT220RCT
enuninstrumento(/id/Turn
ND/1830334) NearlyAnythingIntoan
Instrument/)
(1x)llevaronDigikeyC503BRCNCW0Z0AA1ND medianteConstruido
(/id/Turn
(http://www.digikey.com/productdetail/en/C503BRCNCW0Z0AA1/C503B ArduinoMidiClase
hardware,cdigosyaccesos
RCNCW0Z0AA1ND/1922930?
directosexploradas
itemSeq=142099537&uq=635254198237088166) (/id/ArduinoMidiClass
(1x)10kOhmresistorDigikeyCF14JT10K0CTND ControladorMIDIArduino
Techshopusandoboarduino
(http://www.digikey.com/productdetail/en/CF14JT10K0/CF14JT10K0CT Scarff(/id/ArduinoMIDI
ND/1830374) controllertechshopusing
(/id/Arduino scarffbo/)
(1x)botndetactoDigikey4501650ND(http://www.digikey.com/product Elferrocarrildelalectura
detail/en/FSM4JH/4501650ND/1632536) (/id/TheReadingRailroad/)
porjkarl11(/member/jkarl11/)
(1x)interruptordeinclinacinAdafruit173
(http://www.adafruit.com/products/173) (/id/The
ArduinoUnoxilfono
(/id/ArduinoUnoXylophone/)
(1x)10kOhmpotencimetroDigikeyPDB181K420K103BND
porlaurencallahan
(http://www.digikey.com/productdetail/en/PDB181K420K103B/PDB181 (/member/laurencallahan/)
K420K103BND/2564744?itemSeq=142100255&uq=635254194493713454) (/id/Arduino

(1x)resistorsensiblealaluzDigikeyPDVP8103ND
(http://www.digikey.com/productsearch/en?x=0&y=0&KeyWords=pdvp8103)

(1x)33kOhmresistorDigikey33KQBKND(http://www.digikey.com/product
detail/en/CFR25JB5233K/33KQBKND/1686)

(1x)1MOhmresistorDigikey1.0MQBKND(http://www.digikey.com/product
detail/en/CFR25JB521M/1.0MQBKND/99)
(1x)sensorpiezoSparkfunSEN10293
(https://www.sparkfun.com/products/10293)

Paso1:EnserieaMIDIConverter

(/file/FEEFRPPHRGP5VGK/)

EnestaclasevamosautilizarlaconexinUSBdelArdiunoparaenviarserie
(http://arduino.cc/en/reference/serial)demensajesasuordenador,a
continuacin,vamosacorrerunaaplicacincomosinpeloMIDI
(http://projectgus.github.io/hairlessmidiserial/)paraconvertirestaseriealos
mensajesMIDIyelcaminoaotrasaplicacionesdelordenador(Ableton,
Garageband,etc).Elegestasolucindesoftware,yaqueesmsfcilyms
baratadeconfiguracinparatodaunaclase,tambinsepuedeutilizarun
enchufeMIDIde5pinesyuncableMIDI
(https://www.instructables.com/id/SendandReceiveMIDIwithArduino/step3)
paraconectardirectamenteaotrosinstrumentosMIDI.Hayalgunascosasque
ustednecesitaparatenerencuentaconestesistema:

AsegresedequelavelocidaddetransmisinseespecificaenSerial.begin()
ensubocetoArduinoeselmismonmeroseleccionadoenMIDIsinpelo>>
Preferencias>>Velocidaddetransmisin(heusado9600porloqueutilizael
comandoSerial.begin(9600)entodabocetosejemploArduino,verlasprimeras
dosimgenesdearriba).SioptaporcablehastaunenchufeMIDIde5pines
(https://www.instructables.com/id/SendandReceiveMIDIwithArduino/step3)
tienequeconfigurarlavelocidaddetransmisinde31250,perosiseconectaa
travsdeUSBaunaaplicacindeserieaMIDI,puedeutilizarcualquieraque
sealavelocidaddetransmisinquetegusta.
ParautilizarsinpeloMIDIquetendrqueseleccionarsutablero(algoascomo
usbmodemfd121)enelmendepuertoserieyseleccioneelcanalMIDIque
deseaenviarorecibirMIDIa/desde.Asegratedequetieneselmismocanal
MIDIseleccionadoenlaspreferenciasdecualquierotrasaplicacionesMIDIque
seejecutanenelequipo.EnvimiMIDIparaIACconductordelautobs1,y
luegoconfiguracindebandadegarajeoAbletonpararecibirMIDIeneste
mismocanal.SiannohayopcionesdesalidaMIDIenMIDIsinpelo,
desplcesehaciaabajoparaelFAQ(http://projectgus.github.io/hairless
midiserial/)ysolucionarproblemasdesuconfiguracin.
NosepuedeprogramarelArduinomientrasestconectadoaMIDIsinpelo,
debidoaquelasdosaplicacionesestncompitiendoporelmismopuerto(verel
errorenlasegundaimagen).Unaformarpidadepasarporaltoestasin
necesidaddedejardefumarsinpeloMIDIcadavezquequieracambiarsu
cdigoesseleccionarunpuertoseriediferentedelainterfazsinpeloMIDI,
cargandosunuevocdigodeArduino,yluegoconfigurarelpuertoserieensin
peloMIDIdenuevoalacorrecta.

Paso2:ProtocoloMIDI
LosmensajesMIDIsecomponendedoscomponentes:loscomandosydatos
bytes.ElbytedecomandoleindicaalinstrumentoMIDItipodemensajequese
estenviandoyenqucanalMIDI,yelbytededatossubsiguiente(s)
almacenarlosdatosreales.Porejemplo:unbytedecomandopodradecirlea
uninstrumentoMIDIquetieneinformacinsobreunanotaylasiguientebytes
dedatosdescribirqunotaylofuerte.Unbytedecomandotambinpodra
decirleauninstrumentoMIDIquesevaaenviarinformacinsobrepitchbend,a
continuacin,lossiguientesbytesdedatosdescribiranlacantidadpitchbend.
Unbytedecomandoylosbytesdedatossiguientesqueconformanun
"mensajeMIDI".
Unbyte(http://arduino.cc/en/Reference/Byte)esuntipodedatos(otrostiposde
datosquehemosvistohastaahorasonint(http://arduino.cc/en/Reference/int),
boolean(http://arduino.cc/en/Reference/BooleanVariables),ylarga
(http://arduino.cc/en/Reference/long)).Almacenarbytesenterospositivosentre
0y255.LosmensajesMIDIsecomponendeunaseriedebytes,ypuedenser
decodificadosconbaseensuvaloraentenderloquesignifican.
Aquestunalistadebytesdecomandocomnensusdecimal(basediez)
Forma:
NoteOff=128
NotaEn=144
Pitchbend=224
bytesdecomandosonsiempremayoresque127bytesdedatosysonsiempre
entre0y127,dehecho,queescomouninstrumentoMIDIpuededecirla
diferenciaentreunbytedecomandoyunbytededatos.Asescomoqueremos
enviarunmensajeMIDIparaactivarelMedioCconaltovolumen:
144,60,127
Elprimernmero,144,eselbytedecomando,escucharelinstrumentoMIDI
queestemensajeMIDIesunmensajedenotaactivada.Elsegundonmero,
60,esunbytededatos.Elprimerbytededatosenunmensajedenota
activadaMIDIes"nota"NotaEnestecomandoseactivalanotaMIDI60
(MedioC,sepuedeencontrarunalistadenotasMIDI/conversionesaqu
(http://itp.nyu.edu/physcomp/uploads/midi/midi_screen5.png)).Elltimonmero
estambinunbytededatos,elsegundobytededatosenunmensajedenota
activadaMIDIes"velocidad",queseutilizaparacontrolarelvolumendeuna
nota.Desdebytesdedatosestnentre0y127,127eselvolumenmximo
paraunanota.
CadanotaMIDIiniciaconunmensajedenotaactivadayterminaconun
mensajedeNoteOff.Algunosinstrumentosdepercusinsonarncomosi
hubieranapagadosilosmantienedurantemuchotiempo,perolarealidadnova
aserapagadohastaqueseenvaunmensajedenotadesactivada.Es
importanterecordarasuvezunanotafueraantesdeintentarvolvera
encenderlaparaevitarresultadosinconsistentes.Haydosformasdeconvertir
unanotaMIDIlugar,esteprimeroeselusodeuncomandodedesactivacinde
nota:
128,60,0
Estecomandoseconvertirnota60fuera,quecomienzaconelbytede
comandodedesactivacindenota,establecenota=60,ylavelocidad=0
(velocidadporlogeneralnoesmuynotableparaladesactivacindenota,
cualquiernmeroquedeseaelegirestmuybien).Tambinpuedeactivaruna
notafueramedianteelenvodeunmensajedenotaactivadaconvelocidad=0:
144,60,0
EsteesunenfoquemscomnenMIDI(desdemiexperiencia)asquees
comovamosaestartratandocondesactivacindenotaenestaclase.
SiustedestinteresadoenaprendermssobreelprotocoloMIDI,binario,ylos
bits,echaunvistazoaesteartculo(https://www.instructables.com/id/Sendand
ReceiveMIDIwithArduino/)yestatabla
(http://www.midi.org/techspecs/midimessages.php).

Paso3:GeneracindeMIDIConArduino
SubeelsiguientecdigoenelArduino,resultanotaMIDI60(Docentral)en
adelante,esperaa300ms,yluegoloapagayesperaduranteotros200ms.

NoteOnbytes=144;//notaalaorden

voidsetup(){
Serial.begin(9600);
}

voidloop(){
MIDImessage(NoteOn,60,100);//enciendeencuentaen
retardo(300);//notaasimientopor300ms
MIDImessage(NoteOn,60,0);//enciendeencuentaoff(notasobreconlaveloc
idad0)
retardo(200);//espera200mshastadesencadenarsiguientenota
}

//enviarmensajeMIDI
MIDImessagevaco(comandobyte,elbytedatos1,datos2bytes){
Serial.write(comando);
Serial.write(datos1);
Serial.write(data2);
}
EnestebosquejoquecreunafuncinauxiliarllamadaMIDImessageque
aceptauncomandodelosdosbytesdedatosylosenvaacabolaconexin
USBdelArduinousandoSerial.write()(http://arduino.cc/en/Serial/write).
Serial.writeescomoSerial.print,sinoqueconvierteloquehaydentroabinario
antesdeenviarlo.
Intentevolveraescribirelbocetoparajugarunaseriedenotas,ciclismoa
travsdelasnotasMIDI5079,convirtiendocadanotayluegoseapaga:

NoteOnbytes=144;//notaalaorden

voidsetup(){
Serial.begin(9600);
}

voidloop(){
para(bytenota=50;nota<80;cuenta++){//denota50(D3)quetomenota79
(G5)
MIDImessage(NoteOn,nota,100);//enciendeencuentaen
retardo(300);//notaasimientopor300ms
MIDImessage(NoteOn,nota,0);//enciendedesactivacindenota(notasobre
conlavelocidad0)
retardo(200);//espera200mshastadesencadenarsiguientenota
}
}

//enviarmensajeMIDI
MIDImessagevaco(comandobyte,elbytedatos1,datos2bytes){
Serial.write(comando);
Serial.write(datos1);
Serial.write(data2);
}

Paso4:EntradasanalgicasArduinoyMIDI

(/file/F1VWLDMHR0AQ1I8/)

Vamosacablehastaunpotencimetroalpinanalgico0yutilizarlosdatosde
ellaparacontrolareltonodeunanotaMIDI:
NoteOnbytes=144;//notaalaorden
intpotPin=A0;

voidsetup(){
Serial.begin(9600);
}

voidloop(){

intpotVal=analogRead(potPin);//leerdatosdepotencimetro

//tenemosqueescalarlosdatosdepotencimetroparaajustarentre0y127
(esteeselrangodenotasMIDI)
bytenota=map(potVal,0,1023,0,127);

MIDImessage(NoteOn,nota,100);//enciendeencuentaen
retardo(300);//notaasimientopor300ms
MIDImessage(NoteOn,nota,0);//enciendedesactivacindenota(notasobre
conlavelocidad0)
retardo(200);//espera200mshastadesencadenarsiguientenota
}

//enviarmensajeMIDI
MIDImessagevaco(comandobyte,elbytedatos1,datos2bytes){
Serial.write(comando);
Serial.write(datos1);
Ahoratratedeusarelpotencimetroparacontrolarlavelocidaddeunanota
MIDI:

NoteOnbytes=144;//notaalaorden
intpotPin=A0;

voidsetup(){
Serial.begin(9600);
}

voidloop(){

intpotVal=analogRead(potPin);//leerdatosdepotencimetro

//tenemosqueescalarlosdatosdepotencimetroparaajustarentre0y127
(esteeselrangodenotasMIDI)
velocidadbyte=map(potVal,0,1023,0,127);
bytenota=60;

MIDImessage(NoteOn,nota,velocidad);//suveznotaen
retardo(300);//notaasimientopor300ms
MIDImessage(NoteOn,nota,0);//enciendedesactivacindenota(notasobre
conlavelocidad0)
retardo(200);//espera200mshastadesencadenarsiguientenota
}

//enviarmensajeMIDI
MIDImessagevaco(comandobyte,elbytedatos1,datos2bytes){
Serial.write(comando);
Estosonardiferentedependiendodequtipodeinstrumentoquetengasu
MIDIconectadoa,peroporlogeneraldebesonarmsfuerte.Elsonidotambin
puedesermsagudo,comosiestuvieragolpearunatecladura,osoplandoen
uninstrumentodevientoconmuchafuerza.

Paso5:desencadenarunanotaMIDIconunbotn
(/file/FLTHQ64HQHHW67L/)

Usandoelcdigosimplebotndesupresinderebotes
(https://www.instructables.com/id/BeginnerArduino/step15)desdelaprimera
clase(tambinsepuedeutilizarestecdigodesupresinderebotes
(https://www.instructables.com/id/IntermediateArduinoInputsand
Outputs/step2)queutilizaMillis()paramantenereltiempo),cablehastaun
botndepindigital7yloutilizanparadesencadenarunanotaMIDI:

NoteOnbytes=144;//notaalaorden

intbuttonPin=7;
currentStatebooleano=BAJO;//stroageparaelestadodebotnactual
booleanoLastState=BAJO;//almacenamientoparaelltimoestadodelbotn

voidsetup(){
pinMode(buttonPin,INPUT);//Estavezvamosaestablecerelpincomoentrad
a
Serial.begin(9600);//inicializarConexinenserie
}

voidloop(){
currentState=digitalRead(buttonPin);
si(==currentStateALTA&&LastState==LOW){//sielbotnacabadeserac
cionada
MIDImessage(NoteOn,60,127);//enciendenota60con127velocidad
retardo(2);//formacrudadebotndeeliminacinderebotes
}Elseif(currentState==LOW&&LastState==HIGH){
MIDImessage(NoteOn,60,0);//enciendenota60off
retardo(2);//formacrudadebotndeeliminacinderebotes
}
LastState=currentState;
}

//enviarmensajeMIDI
Enesteesquema,cadavezquesepulsaelbotnqueenvaunmensajede
notaactivada,ycadavezquesesueltaelbotn,nosotrosenviarunmensajede
NoteOff.Ahoratratedeaadirenelpotencimetro(conectadoaA0)para
controlareltonodelanota:
NoteOnbytes=144;//notaalaorden
notadebytes;//almacenamientoparajugarActualmentenota

intbuttonPin=7;
intpotPin=A0;
currentStatebooleano=BAJO;//stroageparaelestadodebotnactual
booleanoLastState=BAJO;//almacenamientoparaelltimoestadodelbotn

voidsetup(){
pinMode(buttonPin,INPUT);//Estavezvamosaestablecerelpincomoentrad
a
Serial.begin(9600);//inicializarConexinenserie
}

voidloop(){
currentState=digitalRead(buttonPin);

si(==currentStateALTA&&LastState==LOW){//sielbotnacabadeserac
cionada

intcurrentPotVal=analogRead(potPin);
Nota=mapa(currentPotVal,0,1023,0,127);

MIDImessage(NoteOn,nota,127);//enciendenotasobrecon127velocidad
retardo(2);//formacrudadebotndeeliminacinderebotes
}Elseif(currentState==LOW&&LastState==HIGH){
Ahorapodemosaadirunascuantasmsnotasenlamezcla,estebosquejo
juegaunafrasedetresnotasencadapulsacindebotn.Puedecambiarla
notadefondoconelpotencimetro:

NoteOnbytes=144;//notaalaorden
notadebytes;//almacenamientoparajugarActualmentenota

intbuttonPin=7;
intpotPin=A0;
currentStatebooleano=BAJO;//stroageparaelestadodebotnactual
booleanoLastState=BAJO;//almacenamientoparaelltimoestadodelbotn

voidsetup(){
pinMode(buttonPin,INPUT);//Estavezvamosaestablecerelpincomoentrad
a
Serial.begin(9600);//inicializarConexinenserie
}

voidloop(){
currentState=digitalRead(buttonPin);

si(==currentStateALTA&&LastState==LOW){//sielbotnacabadeserac
cionada

intcurrentPotVal=analogRead(potPin);
Nota=mapa(currentPotVal,0,1023,0,127);
intnoteLength=200;
bytenoteVelocity=127;

MIDImessage(NoteOn,nota,noteVelocity);//notadefondo
Porltimo,podemosutilizaruntiempo(http://arduino.cc/en/Reference/While)de
bucleparacontinuarelarpegiocontaldequepulseelbotn.Mientrasquelos
buclessonbsicamenteloopablesilasdeclaraciones.Sielargumentoentre
parntesisdelbuclewhileevalaacierto,entoncesseejecutanloscomandos
dentrodelbuclewhile.Alfinaldelbuclewhile,elArduinocompruebasiel
argumentoentreparntesisdeloscicloswhileesciertodenuevo.Sitodavaes
verdadera,elbuclewhileejecutatodosloscomandosenelculysepreparade
nuevo,estasiguesiemprehastaqueelargumentoentreparntesisdelbucle
whileseevalacomofalsa.Enelsiguienteejemplo,yousoelbuclewhilepara
seguirjugandolafrasedetresnotasduranteeltiempoquedigitalRead
(buttonPin)==ALTO.
NoteOnbytes=144;//notaalaorden
notadebytes;//almacenamientoparajugarActualmentenota

intbuttonPin=7;
intpotPin=A0;
currentStatebooleano=BAJO;//stroageparaelestadodebotnactual
booleanoLastState=BAJO;//almacenamientoparaelltimoestadodelbotn

voidsetup(){
pinMode(buttonPin,INPUT);//Estavezvamosaestablecerelpincomoentrad
a
Serial.begin(9600);//inicializarConexinenserie
}

voidloop(){
currentState=digitalRead(buttonPin);

si(==currentStateALTA&&LastState==LOW){//sielbotnacabadeserac
cionada

intcurrentPotVal=analogRead(potPin);
Nota=mapa(currentPotVal,0,1023,0,127);
intnoteLength=200;
bytenoteVelocity=127;

mientrasque(digitalRead(buttonPin)==HIGH){//eltiempoquesepulsae

Paso6:ArduinoydeinclinacinInterruptor
Uninterruptordeinclinacin(http://www.adafruit.com/products/173)esun
interruptormecnicoqueestabiertocuandosemantieneenunadireccinyse
cierracuandoseledalavueltapatasarriba.Cuentaconunapequeabolade
metalenelinteriordelosmismosquepuedanrodar,cuandosemantieneen
unaciertaorientacin,lapelotacreaunaconexinelctricaentredosladosdel
interruptor.
Elinterruptordeinclinacintienedoscablesquesalendel,sepuedetirardel
botnpulsadorfueradesucircuitoyreemplazarloconuninterruptorde
inclinacin,orientacindelinterruptorenelcircuito(tiempodeejecucincorto
vs)noimporta.

Paso7:Arduinoyligerasresistenciassensibles

(/file/FN8QI4KHRGP5VQ5/)

Unresistorsensiblealaluz(http://www.digikey.com/productsearch/en?
x=0&y=0&KeyWords=pdvp8103)(LSR)esuntipoderesistorvariableque
respondealaluz.LosenrutadoresLSRquetengoparaestaclasetienenun
alcancede1633kOhmsderesistencia,porloqueentotaloscuridadtienenuna
resistenciade33kOhmsyalaluzquetieneunaresistenciade16kOhms.El
circuitoquemidelaLSRrequiereotraresistenciaregular,laresistenciaacta
comounpuntodereferenciaparadeterminarcmoelLSRestcambiando.
Cadavezqueustedestmidiendolaresistenciavariabledeuncomponente
(flexindelsensor,sensoresdepresin,ymuchosotros)quedeseavincularse
conunaresistenciaregularquetieneunaresistenciaqueesaproximadamente
igualalaresistenciamximadelacomponentederesistenciavariable.Desde
queestoyusandoun1633kOhmLSR,voyautilizarunaresistencia33kOhmen
micircuito.
Elcircuitoeselsiguiente:
5V>resistencia33kOhm>resistenciasensiblealaluz>Suelo(ver
imagensuperior)
yelpasadoranalgicaArduino(estoyusandoA0)seconectaalauninentreel
LSRylaresistencia.ElLSRnotienepolaridad,porloquelaorientacindel
componenteenelcircuitonoimporta.
EjecutarelcdigosiguienteparatenerunaideadelagamadelaLSR:

intanalogPin=A0;//uninentreLSRylaresistenciaconectadaalapatillaA0

voidsetup(){
Serial.begin(9600);
}

voidloop(){
intLSR=analogRead(analogPin);
Serial.println(LSR);
}

Heencontradoquemislecturasderesistenciavariarondeaproximadamente0
aplenaluzacercade900enlaoscuridad.Ahoraasignaresteobservar,notar
cuandometirenelrango0900

NoteOnbytes=144;//notaalaorden
intanalogPin=A0;

voidsetup(){
Serial.begin(9600);
}

voidloop(){

intanalogVal=analogRead(analogPin);//leerdatos

//tenemosqueescalarlosdatosLSRparaajustarseentre0y127(esteesel
rangodenotasMIDI)
bytenota=map(analogVal,0,900,0,127);//utilizarelrango0900Med

MIDImessage(NoteOn,nota,100);//enciendeencuentaen
retardo(300);//notaasimientopor300ms
MIDImessage(NoteOn,nota,0);//enciendedesactivacindenota(notasobre
conlavelocidad0)
retardo(200);//espera200mshastadesencadenarsiguientenota
}

//enviarmensajeMIDI
MIDImessagevaco(comandobyte,elbytedatos1,datos2bytes){
Serial.write(comando);
Serial.write(datos1);
Estaconfiguracincreanotascontonomsaltoenlaoscuridadybajadetono
alaluz.Siquerarevertirlanavedelarelacinentrelaluzyeltonomeacaba
derevertirmirangoenlafuncindemapa:
bytenota=map(analogVal,900,0,0,127)
Observecmoheinvertmirangode0900a9000,estohacemsluzacrear
msaltasnotasadosaguasyconpocaluzcrearnotasconpendiente.
Estebosquejoesqueabarcaunagrancantidaddenotasenestemomento,si
queralimitarelalcancedelasnotasquepuedojugarconelcircuito,quese
puedeutilizarlasiguientelnea:

bytenota=map(analogVal,900,0,40,90)
Ahoratodalagamadesensibilidadalaluzresistordevolverunagamade
notasdeentre40y90.

Paso8:Arduinoysensordepresin
Hiceunossensoresdepresindeespumaconductora,cintadecobre,cable
trenzado,ycintaelctrica(https://www.instructables.com/id/DIYForceSensitive
ResistorFSR/).Amedidaquesecomprimelaespumaconductorasevuelve
menosresistente,loqueesunsensiblealapresinresistorvariable.

Cualquierresistenciavariablesepuedecableardeacuerdoconelesquemade
laetapaanterior.Heutilizadounmultmetroparamedirlaresistenciamaxde
missensoresdepresinaaproximadamente1MOhm
(http://www.digikey.com/productdetail/en/CFR25JB521M/1.0MQBKND/99),
porloTelegrafihastaunaresistencia1MOhmenserieconelsensorde
presin(utilicexactamenteelmismoesquemticacomolaresistenciasensible
alaluz,ensustitucindelaresistenciasensiblealaluzconelsensorde
presin,ylaresistencia33kOhmconlaresistencia1MOhm).Luegoutilizael
cdigodelaltimaetapaparamedirelintervalodelecturasformanlos
sensoresdepresinaaproximadamente50500.Desdeallsepuedeejecutar
elmismocdigoparacambiareltonodeunanotaconelsensordepresin,
perocambiarlalneaquetrazalamedicindelsensortenerencuentapara
tenerencuentaelrangode50500:

bytenota=map(analogVal,50,500,0,127)

Paso9:Arduinoylaflexindelsensor

(/file/FZTJQNIHRI8UWFE/)

SensoresFlexsonotrotipoderesistenciavariable,quesepuedenconectar
hastaexactamentedelamismamaneraquelaluzderesistenciassensibles
sensiblesydepresin.Lossensoresdeflexinqueutilicenclase
(http://www.adafruit.com/products/182)tienenunaresistenciaentre10kOhm
20kOhm,porloquedebenseremparejadosconunaresistenciaen
aproximadamenteelmismovalor.Elcdigodelaetapaderesistenciasensible
alaluzfuncionaconunsensordeflexin,perorecuerdequedebeajustarel0,
900enlalnea:
bytenota=map(analogVal,0,900,0,127)

acualquierrangosemideporsusensordeflexin.

Paso10:Arduinoysensorpiezoelctrico

(/file/FPJHGOHHRGP64QW/)

Sensorespiezoelctricos(http://en.wikipedia.org/wiki/Piezoelectric_sensor)
conviertenpresinovibracionesencargaelctricaquesepuedemedirusando
unodelasentradasanalgicasdelArduino.Elcircuitorequiereunaresistencia
1MOhmconectadoenparaleloalsensorpiezo,conunladoconectadoTOG
redonda,yelotroconectadoelunpinanalgicoArduino(imagen#1anterior).
Monitorearelsensorusandoelsiguientecdigo:

intpiezo=A0;

voidsetup(){
Serial.begin(9600);
}

voidloop(){
intpiezoVal=analogRead(piezo);
Serial.println(piezoVal);
}

Viquetenaelsensorpiezoelctricosemantuvoestablealrededorde01sobre
normalmente,entoncescuandomegolpe,salthastaaproximadamente150
(imagen#2arriba).Podemosusarelpiezoelctricocomouninterruptor
mediantelabsquedadeestospicos,enelcdigosiguientesecreaunanota
MIDIcadavezqueelpasadorpiezoelctricomideunasealmsdel50.
intNoteOn=144;
intpiezo=A0;
intumbral=50;//nadamsdecincuentasignificaquehemosdadoelpiezo

voidsetup(){
Serial.begin(9600);
}

voidloop(){
intpiezoVal=analogRead(piezo);
si(piezoVal>umbral){
MIDImessage(NoteOn,60,127);
retardo(300);
MIDImessage(NoteOn,60,0);
}
}

//enviarmensajeMIDI
MIDImessagevaco(comandobyte,elbytedatos1,datos2bytes){
Serial.write(comando);
Serial.write(datos1);
Serial.write(data2);
}

Tambinpodemosusarlafuerzadelgolpealavelocidaddecontrol:

intNoteOn=144;
intpiezo=A0;
intumbral=50;//nadamsdecincuentasignificaquehemosdadoelpiezo

voidsetup(){
Serial.begin(9600);
}

voidloop(){
intpiezoVal=analogRead(piezo);
si(piezoVal>umbral){
intmaxPiezoVal=getMaxVal(piezoVal);
velocidadbyte=map(maxPiezoVal,0,1023,50,127);//velocidadentre50
y127sobrelabasedemaxvaldepiezo
MIDImessage(NoteOn,60,velocidad);
retardo(500);
MIDImessage(NoteOn,60,0);
}
}

//enviarmensajeMIDI
MIDImessagevaco(comandobyte,elbytedatos1,datos2bytes){
Serial.write(comando);
Serial.write(datos1);
Serial.write(data2);
}
Enelcdigoanterior,creunafuncinauxiliarllamadagetMaxValqueutilizaun
buclewhilepararegistrareldesplazamientomximodelpiezoelctrico,de
modoquepuedaserutilizadoparaestablecerlavelocidaddeunanotaMIDI.
Estecdigofuncionamidiendoelpiezoylacomprobacinparaversila
medicinesmayorquelaltimamedicinregistrada,siesentoncesnos
aferramosalanuevamedicin,yrepetirelproceso.Tanprontocomolanueva
medicindelpiezoesinferioralaltimamedicinregistrada,sabemosqueel
piezohaalcanzadosudesplazamientomximoycontinuaravolvernmeros
cadavezmsbajosdeanalogRead(),porloquelafuncindevuelveelvalor
mximo.

ElnmeroderegresardegetMaxVal()esenalgnlugarentre0y1023,porlo
queutilizaunafuncindelmapa()modificarlaescalaparaunavelocidadde
entre50y127.

Paso11:PitchbendcomandosMIDIconArduino
ParaenviarunPitchbend(http://en.wikipedia.org/wiki/Bent_note)mensajeMIDI,
seutilizaelcomando224.Comonotaactivada,losmensajesPITCHBEND
tienendosbytesdedatos,elprimerbytededatosestbienpitchbendyel
segundoespitchbendgruesa.Comonotayvelocidad,gruesoyfinoson
pitchbendnmeroentre0y127.Comoesdeimaginar,pitchbendgruesaleda
uncontrolclaroyfinopitchbendledauncontrolpreciso.PitchbendFineleda
una128pasosadicionalesdecontrolentrecadapasodegolfadyacente
pitchbendbienestanfinaquenosueloencuentroquenecesitanparausarlo.
Configuracinpitchbendgruesayfina=64=0pitchbendnodarninguna
pitchbend,nadamsaltoquevadeinflexindetonosusnotas,ynadams
bajaserPITCHBENDsusnotashaciaabajo.
Heaqucmoseenvaunmensajedepitchbend:

MIDImessage(pitchbendCmd,finePitchbend,coarsePitchbend)
HeconectadoelpiezodelltimopasoaanalgicopinA1,yporcableaun
potencimetroparaA0pinanalgicoyencontrelsiguientecdigo:

byteNoteOn=144;
bytepitchbendCmd=224;

intpiezo=A1;
intanalogPB=A0;
intumbral=50;//nadamsdecincuentasignificaquehemosdadoelpiezo

voidsetup(){
Serial.begin(9600);
}

voidloop(){
intpiezoVal=analogRead(piezo);

si(piezoVal>umbral){
MIDImessage(NoteOn,60,127);
tiempoint=0;
mientrasque(tiempo<300){
intanalogPBVal=analogRead(analogPB);
bytepitchbend=map(analogPBVal,0,1023,0,127);
MIDImessage(pitchbendCmd,0,pitchbend);
retardo(1);
tiempo++;
}
MIDImessage(NoteOn,60,0);
}
Enelcdigoanteriorqueutilizaronlassiguienteslneasparaleerlosdatosde
mipotencimetro,escalaraunvalorpitchbendentre0y127:
intanalogPBVal=analogRead(analogPB)

bytepitchbend=map(analogPBVal,0,1023,0,127)

Heutilizadoestecomandoparaenviarunmensajepitchbend,heusadomival
pitchbendparaestablecerelpitchbendgruesa,finapitchbendseestableceen
0.
MIDImessage(pitchbendCmd,0,pitchbend)

Paso12:Arduinoysensordeproximidad(Ping)
TambinsellamaunsensorPing,sensoresdeproximidad
(http://www.parallax.com/product/28015)utilizanunpulsoultrasnicoparamedir
sudistanciaaunobstculoporlaecolocalizacin
(http://en.wikipedia.org/wiki/Animal_echolocation).Estesensoresmuyfcilde
ponerenmarcha,queslorequieretresconexionesconelArduino:planta,5V,
yunaconexinaunpindigitalArduino(utilicelpin7).Arduinotieneunagran
piezadecdigodeejemploensupginaweb
(http://arduino.cc/en/Tutorial/Ping?from=Tutorial.UltrasoundSensor)quehe
repetidoacontinuacinparaobtenersensordelaproximidaden
funcionamiento:

intpingPin=7;

voidsetup(){
Serial.begin(9600);
}

voidloop(){

//gatillomedianteunpulsodepingpingPinALTAdurante2microsegundos
pinMode(pingPin,OUTPUT);
digitalWrite(pingPin,LOW);
delayMicroseconds(2);
digitalWrite(pingPin,HIGH);
delayMicroseconds(5);
digitalWrite(pingPin,LOW);

//establecerpingPinaINPUTycontarlacantidaddetiempoquetardaenrec
ibirunpingdenuevo
pinMode(pingPin,INPUT);
largaduracin=pulseIn(pingPin,HIGH);

//conviertaeltiempoaunadistancia
pulgadasdelargo=microsecondsToInches(duracin);
largoscm=microsecondsToCentimeters(duracin);

//imprimirlosresultados
UnacosainusualacercadeestecdigoesqueelpinModedepingPinse
cambiamientraselbucledeArduino()estenfuncionamiento.Hastaahora
slohemosusadoestecomandoenlaconfiguracin.Puestoqueelpasador
estsiendoutilizadocomounasalidaparaenviarelpulsoultrasnico,yluego
comounaentradaaescucharparaelpulso,queeselmodotienequecambiar
deformadinmica.TambindelayMicroseconds()
(http://arduino.cc/en/Reference/DelayMicroseconds)seutilizaparaestablecer
unretardodeunnmerodadodemicrosegundos(encontraposicinaretrasar
(),queutilizaunargumentoenmilisegundosparacrearunretraso).
Apartirdeaqusetratadeunejerciciosencillodeutilizarlafuncindemapa()
paraladistancialocaacualquiertipodedatosMIDIqueleinteresa,aligualque
enlospasosanteriores.Estossonalgunosejemplosdecmosepuedeutilizar
unsensordeproximidad:

Laproximidadcontroladatimbredeestilochiptunes:

Playing around with a ping-sensor and a buzzer

ObstculoevitandorobotMegustalaformaenqueheadjuntadounmotor
paraelsensordepingparaqueseaunpocomsefectiva:
Arduino obstacle avoidance tank robot with DC

Paso13:Arduinoypantallatctil

(/file/F07PKX9HRGP683L/)

Siustedestinteresadoeninterfacestctiles,hayuna($8+4$relativamente
barataconector(http://www.adafruit.com/products/334))depantallatctil
resistiva(http://www.adafruit.com/products/334)o(elmscaro)trackpad
(http://www.adafruit.com/products/837)deAdafruitquemidelaposicinXeYy
lapresinparaquepuedahacerestetipodeproyectos:
Kaossilator

LapantallatctilconectarsealaArduinoconcuatropasadoresdemarcadoX+,
X,Y+,yYlaasignacindeclavijassedanenelcdigodeabajo.Soladel
Adafruitbibliotecadelapantallatctil(https://github.com/adafruit/TouchScreen
Library)parainteractuarconlapantalla(aquestcmoagregarunabiblioteca
deArduino(http://arduino.cc/en/Guide/Libraries)).Heaquunbosquejosimple
paraempezar:

#include<stdint.h>
#include"TouchScreen.h"


intYPlus=A0;//debehaberunpinanalgico
intxminus=A1;//debehaberunpinanalgico
intYMinus=8;//puedeserunpindigital
intXPlus=9;//puedeserunpindigital

//Paraunamejorprecisindepresin,loquenecesitamossaberlaresistencia
//entreXyX+,puedeutilizarcualquiermultmetroparaleerlo
//Paraelqueestoyusando,es654ohmios
TouchScreents=pantallatctil(XPlus,YPlus,xminus,YMinus,654);

voidsetup(void){
Serial.begin(9600);
}

voidloop(void){
//unobjetodepuntosostieneXYyZcoordenadas
Puntop=ts.getPoint();//Obtenerdatosdepantalla

si(pz>ts.pressureThreshhold){//silapresinestporencimadeuncierto
umbral
Serial.print("X=");Serial.print(px);
Serial.print("Y=");Serial.print(py);
AquhayunamuysimpleimplementacinMIDIdelKaossilator,cartografadela
posicinxtenerencuentaylaposicinylavelocidada:
#include<stdint.h>
#include"TouchScreen.h"

NoteOnbytes=144;//notaalaorden

intYPlus=A0;//debehaberunpinanalgico,utilicelanotacin"Un"!
intxminus=A1;//debehaberunpinanalgico,utilicelanotacin"Un"!
intYMinus=8;//puedeserunpindigital
intXPlus=9;//puedeserunpindigital

//Paraunamejorprecisindepresin,loquenecesitamossaberlaresistencia
//entreXyX+Utilicecualquiermultmetroparaleerlo
//Paraelqueestamosutilizando,sus654ohmiosatravsdelaplacaX
TouchScreents=pantallatctil(XPlus,YPlus,xminus,YMinus,654);

voidsetup(void){
Serial.begin(9600);
}

voidloop(void){
//unobjetodepuntosostieneXYyZcoordenadas
Pointp=ts.getPoint();

//tenemosunpocodepresinmnimaseconsidera'vlida'
//presinde0significaquenohayurgente!
si(pz>ts.pressureThreshhold){
Yaquhayunvideo:

Arduino Touch Screen MIDI Kaossilator

Paso14:SensoresUstedpuedeconstruir
Cuandoseempiezaaconstruirproyectosconunagrancantidaddeinsumos,el
costodealgunossensorespuedeponerseenelcamino.Heaqualgunasideas
parahacersuspropiossensoresapartirdematerialesbaratoscomominade
lpiz,cintadecobre,tejidoconductorohilo,pinturaconductora,yespuma
conductora(ustedconsigueestodeformagratuitaalcomprarfichascomoel
595delaltimainstructable,espartedeelembalaje).

GrafitotctilcapacitivaSensor(https://www.instructables.com/id/Turnapencil
drawingintoacapacitivesensorfor/):
Make a Touch Sensor with a Pencil Drawing

Sensorcapacitivomultitctil"Touche"(https://www.instructables.com/id/Touche
forArduinoAdvancedtouchsensing/):

Forzarresistenciasensibleapartirdeespumaconductora
(https://www.instructables.com/id/DIYForceSensitiveResistorFSR/):
Sensordelacurvadetejidoconductor
(https://www.instructables.com/id/NeopreneBendSensorIMPROVED/):

Neoprene Bend Sensor IMPROVED (Sheep demo)

SensoresBendconcintaehiloconductor
(https://www.instructables.com/id/StickytapeSensors/):

Stick it to your wrist

StrokeSensorusandohiloconductor(https://www.instructables.com/id/Stroke
Sensor/):
Stroke Sensor

Conductoradepinturadeslizante(https://www.instructables.com/id/Makingan
RGBLEDColourSliderusingBarePaint/):

DetectordecolorconunLEDRGByunfotosensor
(https://www.instructables.com/id/ColorDetectionUsingRGBLED/):

Paso15:otrossensoresparaArduinoyelProyectoIdeas
Haytoneladasdeotrossensoresporahparaprobar,Adafruit
(http://www.adafruit.com/category/35)ySparkfun
(https://www.sparkfun.com/categories/23)sonbuenoslugaresparabuscar,y
tienenunmontndecdigodeejemploparaconectarsensoresparaArduino.
UstedpuedeencontrargrancantidaddeideasparaproyectosdeArduinoen
Google,YouTube,elsitiowebdeArduino
(http://playground.arduino.cc/Projects/Ideas)yelblog(http://blog.arduino.cc/),y
sepuedeencontrarcompletopasoapasoladocumentacinparacualquierade
losproyectosdeArduinoaquenInstructables
(https://www.instructables.com/id/ArduinoProjects/).
Aquestnalgunosejemplosdeproyectosqueutilizansensoresquenotena
tiempoparacubrirenestaclase:
acelermetro(http://www.adafruit.com/products/163?
gclid=CNGmts_ax7wCFURsfgodRAkADg):

Sensordetemperatura(https://www.sparkfun.com/search/results?
term=temperature)(utilizadoenArduinoSousVideCooker
(https://www.instructables.com/id/ArduinoSousVideCooker/)):

Sensormagntico(https://www.sparkfun.com/products/10530):
Arduino Magnetic Field Detector Project

Gas/sensordemetano(https://www.sparkfun.com/search/results?term=gas),
estaeslasilladeoficinaTwitteri(https://www.instructables.com/id/The
TwitteringOfficeChair/):

Paso16:ArduinoMIDIIN
Porltimo,puedeenviarMIDIenelArduinoyloutilizanparacontrolarlascosas
conectadasalassalidasdelArduino.Heaquunkitdebaterarobtica
(https://www.instructables.com/id/ArduinoControlledRoboticDrum/),hechapor
micompaerodetrabajo,randofo
(https://www.instructables.com/member/randofo/).

Arduino-Controlled Robotic Drum

Tambinunhroedelaguitarrahackeadoquedisparallamas:
FireHero: "For Those About to Rock (We Salute

AquestunejemplosencillodecmosepuedeanalizarunmensajeMIDI
entranteconArduinoyutilizarlainformacinparacontrolarelbirghtnessdeun
LED.Enmiejemplo,voyaencenderunLEDcuandosedisparalanota60(c
media),yvoyaescalarlaluminosidaddelLEDsegnlavelocidaddelanotade
entrada:

byteNoteOn=144;
intledPin=9;

noteToCheckbyte=60;

//laluzLEDenelpin13alrecibirelmensajeNoteOnconlanota=60

voidsetup(){
Serial.begin(9600);
pinMode(ledPin,OUTPUT);
}

voidloop(){
checkForNote();
deretardo(10);
}

checkForNotevaco(){
while(Serial.available()){//mientrasquehaydatosenserieavailble

byteincomingByte=Serial.read();//leerprimerobyte
si(incomingByte>127){//siunbytedecomando

si(==incomingByteNoteOn){//sinotaenelmensaje

bytenoteByte=Serial.read();//leersiguientebyte
Hayalgunosnuevoscomandosqueseutilizanaqu:
Serial.available()(http://arduino.cc/en/Serial/available)devuelveelnmerode
bytesdisponiblesparaleerdesdeelpuertoseriedelArduino.

Serial.read()(http://arduino.cc/en/Serial/read)eslocontrariodeSerial.print()
(http://arduino.cc/en/Serial/print),devuelveelsiguientebytededatosdisponible
desdeelpuertoseriedelArduino.
Enestecdigo,elArduinoleeprimerbyteycontrolesdisponiblesparaversies
unbytedecomando(recuerde,bytesdecomandoestnsiempre>127)
si(incomingByte>127)

Entonces,yaquesloestamosbuscandoNotaEncomandos,elArduino
compruebasielcomandoesuncomandodenotaactivada:
si(incomingByte==NoteOn)
Acontinuacin,elArduinoleeenlosprximosdosbytesylosalmacenacomo
noteByteyvelocityByte:

bytenoteByte=Serial.read()
bytevelocityByte=Serial.read()
Acontinuacin,elArduinocompruebasilanotaquetenemoseslanotaque
nosinteresa,ysilavelocidadesmayorque0(notasobreodesactivacinde
nota).SisetratadeNotaOn,elArduinoutilizamapa()paraescalarla
velocidad(0127)aunbrilloentre0y255,yenvaestebrilloparaanalogWrite
().Sisetratadeunmensajededesactivacindenota,elArduinogiraelLED.

Lanicacosadisimuladoaadaestecdigoeselretardo(10)enelbucle().
HedescubiertoqueelArduinofuecapazdeleerenlosmensajesMIDIdeforma
msfiableconesteretrasoenall.stostambindeberanperdereltiempocon
lavelocidaddetransmisinparaasegurarquenuncasepierdaunmensaje
MIDI.

I Mscomentarios

CANALES DESTACADOS

Tratamientode
lamadera Papel Hacksdecocina rompecabezas Corteporlser Espacio homesteading Impresin3d Decoser
(/tag/type (/tag/type (/tag/type (/tag/type (/tag/type (/tag/type (/tag/type (/tag/type (/tag/type
id/category id/category id/keyword id/category id/category id/keyword id/category id/category id/category
workshop/channelcraft/channel kitchen%20hacks/?play/channel workshop/channel astronomy/? home/channel technology/channel
craft/channel
woodworking/)
Hojainformativa
paper/) sort=FAVORITES)
Sobrenosotros
puzzles/) lasercutting/) sort=FAVORITES)homesteading/) 3DPrinting/) sewing/)
Dejequesubandejadeentrada, Quienessomos(/about/)
paradescubrirnuestrosmejores Anunciar(/advertise/)
proyectos,clasesyconcursos. Contacto(/about/contact.jsp)
Instructablesleayudara
Trabajos(/community/PositionsavailableatInstructables/)
aprendercmohacercualquier
Ayuda(/id/howtowriteagreatinstructable/)
cosa!

enteremail Estoydentro!
Encuntranos recursos
Facebook(http://www.facebook.com/instructables) paralosmaestros(/teachers/)
Youtube(http://www.youtube.com/user/instructablestv) Programaderesidencia(/pier9residency)
Gorjeo(http://www.twitter.com/instructables) CuentaPremiumderegalo(/account/give?sourcea=footer)
foros(/community/)
Pinterest(http://www.pinterest.com/instructables)
respuestas(/tag/typequestion/?sort=RECENT)
Google+(https://plus.google.com/+instructables)
mapadelsitio(/sitemap/)

Condicionesdelservicio(http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=21959721) |
Declaracindeprivacidad(http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=21292079) |
Avisoslegalesymarcascomerciales(http://usa.autodesk.com/legalnoticestrademarks/) | Sitiomovil(https://www.instructables.com)
(http://usa.autodesk.com/adsk/servlet/pc/index?id=20781545&siteID=123112)
2016Autodesk,Inc.