Issuu on Google+

ISTITUTO TECNICO INDUSTRIALE “E.FERMI” SIRACUSA

LABORATORIO DI T.D.P.

DATA 06/06/2013

Cognome Nome

Oggetto :

MUSUMECI DAVIDE

RELAZIONE

3

Classe

5° Sezione

B


INDICE

RELAZIONE………………………………………Pag. 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8

PREVENTIVO SPESA…………………………..Pag. 9

SCHEMA ELETTRICO……………………….....Pag. 10

FRITZING……………………………….………...Pag. 11

FORI…………………………………………..…...Pag. 12

PROGRAMMA…………………………………..Pag. 13 , 14 , 15 , 16 , 17 , 18


1

RELAZIONE Lo scopo di questa esperienza è quello di realizzare un midi controller in grado di inviare e ricevere messaggi MIDI(Musical instrument digital interface ,che indica l’interazione degli strumenti musicali elettronici in questo caso tramite un computer)al PC, consentendo il controllo diretto del software con Arduino. Esistono vari tipi di Arduino tra cui l’Arduino Leonardo, il quale è servito per svolgere il nostro progetto

Arduino Leonardo è una scheda elettronica basata sul microcontrollore ATMEGA32U4 (datasheet). Dispone di 20 piedini di ingresso / uscita digitali (di cui 7 possono essere utilizzate come uscite PWM e 12 come ingressi analogici), un cristallo oscillatore a 16 MHz, una connessione micro USB, un jack di alimentazione, un header ICSP e un pulsante di reset. Esso contiene tutto il necessario per supportare il microcontrollore; si collega semplicemente ad un computer con un cavo USB o si alimentar con un adattatore AC-DC o una batteria. Il Leonardo differisce dalle schede precedenti in quanto la


2 ATMEGA32U4 è dotato di comunicazione USB, eliminando la necessità di un processore secondario. Questo permette al Leonardo di apparire a un computer collegato come un mouse e tastiera, in aggiunta a una porta seriale / COM virtual (CDC). Sommario Microcontroller Operating Voltage Input Voltage (recommended) Input Voltage (limits) Digital I/O Pins PWM Channels Analog Input Channels DC Current per I/O Pin DC Current for 3.3V Pin Flash Memory SRAM EEPROM Clock Speed

ATmega32u4 5V 7-12V 6-20V 20 7 12 40 mA 50 mA 32 KB (ATmega32u4) of which 4 KB used by bootloader 2.5 KB (ATmega32u4) 1 KB (ATmega32u4) 16 MHz

Power La Arduino Leonardo può essere alimentato tramite il collegamento USB micro o con un alimentatore esterno. La fonte di alimentazione viene selezionata automaticamente. L’alimentazione esterna (non USB)può essere fornita da un alimentatore AC-DC o dalla batteria. La scheda può operare su un alimentatore esterno da 6 a 20 volt. Se fornito con meno di 7V, tuttavia, il pin 5V può fornire meno di cinque volt e la scheda potrebbe essere instabile. Se si utilizza più


3 di 12V, il regolatore di tensione potrebbe surriscaldarsi e danneggiare la scheda. L'intervallo raccomandato è di 7 a 12 volt. I piedini di alimentazione sono i seguenti: VIN. E’ La tensione di ingresso per la scheda Arduino quando sta utilizzando una fonte di alimentazione esterna (al contrario di 5 volt tramite la connessione USB o altra fonte di alimentazione regolata). 5V. E’ L'alimentatore stabilizzato utilizzato per alimentare il microcontrollore e altri componenti sulla scheda. 3V3. Una fornitura 3.3 volt generata dal regolatore di bordo. T GND. Pin di terra. IOREF. La tensione a cui i pin I / O della scheda sono in funzione (cioè VCC per la scheda). Questo è 5V sul Leonardo. MEMORY Il ATMEGA32U4 dispone di 32 KB (con 4 KB utilizzati per il bootloader). Essa ha anche 2,5 KB di SRAM e 1 KB di EEPROM (che può essere letta e scritta con la libreria EEPROM). Input and Output Ognuna delle 20 I / O digitali pin sul Leonardo possono essere utilizzati come ingresso o uscita, utilizzando le funzioni digitalRead () pinMode (), digitalWrite (), e. Operano a 5 volt. Ogni pin può fornire o ricevere un massimo di 40 mA ed ha una resistenza di pull-up interno di 20-50 kOhm. Inoltre, alcuni pin hanno funzioni specializzate:


4 Serial: 0 (RX) e 1 (TX). Usato per ricevere (RX) e trasmissione (TX) dati seriali TTL utilizzando la funzionalità di serie ATMEGA32U4 hardware. TWI: 2 (SDA) e 3 (SCL). Supportano la comunicazione TWI utilizzando la libreria Wire. PWM: 3, 5, 6, 9, 10, 11, e 13. Forniscono PWM a 8 bit con la funzione analogWrite (). SPI: sul connettore ICSP. Questi pin supportano la comunicazione SPI utilizzando la libreria SPI. Si noti che i pin SPI non sono collegati a uno qualsiasi dei pin di I / O digitali che sono sulla Uno. LED: 13. Vi è un built-in LED collegato al pin digitale 13. Quando il pin è a livello altp , il LED è acceso, quando il pin è a livello basso, è spento. Ingressi analogici: A0-A5, A6 - A11 (sui pin digitali 4, 6, 8, 9, 10 e 12). Il Leonardo dispone di 12 ingressi analogici, etichettati A0 attraverso la A11, ognuno dei quali può essere utilizzato anche come I / O digitale. I PIN A0-A5 appaiono nelle stesse posizioni come su la Uno,gli ingressi A6-A11 sono I / O E rispettivamente i pini ditali sono 4, 6, 8, 9, 10 e 12. Ogni ingresso analogico fornisce 10 bit di risoluzione (cioè 1024 valori diversi). Ci sono altri 2 pin sulla scheda: AREF. Tensione di riferimento per gli ingressi analogici. RESET . Portare questa linea a livello basso per resettare il microcontrollore. Tipicamente utilizzata per aggiungere un pulsante di reset per scudi che bloccano l'uno sul bordo Comunicazione. Il ATMEGA32U4 fornisce una comunicazione seriale (5V), che è disponibile su pin digitali 0 (RX) e 1 (TX). Il 32U4 consente anche la comunicazione di serie via USB e appare come


5 una porta COM virtuale per il software sul computer. Il chip funziona anche come dispositivo di piena velocità USB 2.0, utilizzando i driver COM USB standard. In Windows, è necessario un file. Inf. Il software Arduino include un monitor di serie, che consente ai dati testuali semplici per essere inviati da e per la scheda Arduino. Il LED TX e REX lampeggia sulla scheda quando i dati vengono trasmessi tramite la connessione USB al computer (ma non per la comunicazione seriale sui pin 0 e 1). Il Leonardo appare come una tastiera e un mouse generico, e può essere programmato per controllare questi dispositivi di input utilizzando la tastiera e mouse classi. Programmazione Il Leonardo può essere programmato con il software di Arduino Selezionare "Arduino Leonardo da Strumenti> menu di Board (scegliere l’ARDUINO). Caratteristiche fisiche : La massima lunghezza e la larghezza del Leonardo PCB sono 2.7 e 2.1 pollici rispettivamente, con il connettore USB e il jack di alimentazione . Quattro fori per le viti consentire per essere collegato a una superficie o. PROCEDIMENTO : Per prima cosa ci dobbiamo fornire degli strumenti per realizzare questa esperienza, ovvero : una scatola di plastica, 4 potenziometri lineari rotativi da 10 k con relative manopole, 2 potenziometri lineari a cursore da 10 k con manopole, 12 pulsanti a circuito aperto, 1 resistenza da 4,7 khom, fili di rame, cacciavite, pinze, trapano, flex. Dopo di che si disegnato una base 4 x 4di una griglia di pulsanti e di potenziometri basato sulle dimensioni del pulsante (14 millimetri di diametro totale, foro di montaggio 11 mm)e del potenziometro(88 millimetri di lunghezza). La profondità di montaggio per i pulsanti di è esattamente 32 mm, in modo che si adatti alla custodia che ho scelto.Una volta completato il disegno, lo


6 si stampa e si ritaglia il contorno del disegno con un taglierino. Poi il disegnato ritagliato lo si fissa con lo scotch nella base superiore di plastica in modo da rimanere fermo. Dopo si passa alla foratura,una buona idea quella di praticare un piccolo foro pilota prima e poi utilizzare i bit più grandi per praticare i fori di dimensioni complete. Si Inizia la perforazione attraverso il centro di ogni tasto sullo schema con un po 'di 2mm, e allo stesso modo per il potenziometro rotativo. Per quanto riguarda i potenziometri a cursore sia per la precisione e sia per la velocità di impiego abbiamo utilizzzato il flex.I potenziometri rotativi cosi come i pulsanti hanno una rondella e un dado esagonale avvitato su di loro. Quindi inserire il potenziometro e il pulsante attraverso i loro corrispondenti fori dal lato inferiore del coperchio dell'involucro. Tenerlo in posizione, e quindi dal lato superiore si fa slittare la rondella e si fa avvitare il dado verso il basso utilizzando la chiave esagonale. Per quanto riguarda i potenziometri a cursore li abbiamo fissati tramite delle viti. Lo stesso procedimento è stato svolto per l’arduino, fissandolo nella base inferiore. All’arduino Leonardo viene collegato un cavo micro-USB, e per far modo di passare il cavo abbiamo creato un foro su misura nella parte inferiore della base. Successivamente abbiamo saldato tutti i fili dei potenziometri e pulsanti e collegati all’arduino seguendo lo schema elettrico e di montaggio in allegato


7

. Una volta completato abbiamo collegato L’arduino al computer installato il driver e impostato nel programma “arduino� il nostro leonardo andando prima da strumenti e poi nella board, e infine selezionarlo. Verifare prima di tutto se ci sono errori nel programma e dopo caricare lo sketch. Dopo aver caricato il programma si va ad aprire il dj software(traktor) e iniziare la mappature di tutti i tasti.


8

Conclusioni : l’esperienza, nonostante qualche problema relativa alla configurazione dei tasti, è stata svolta con successo .


9 PREVENTIVO SPESA Scatola di plastica

€ 8,10

Pulsante

€ 0,70

Potenziometro rotativo 10 k

€ 0,80

Potenziometro a cursore 10 K

€ 0,80

Resistenza 4,7 Khom

€ 0,10


10 SCHEMA ELETTRICO V C C _ C IR C L E

SW 1 1

SW 2 2

SW 3

1

2

1

SW 4 2

1

2

5V V in

U1 Power

R1

GND

A2 A3 A4 A5

Analogic Input

A0 A1

D 13 D 12 D 11 D 10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0

Digital Input/Output

AREF R STF

1

SW 5 2

1

SW 6 2

1

SW 9 2

SW 10 1 2

1

SW 7

2

1

SW 8 2

R7 4 .7 k h o m

SW 11 1

2 SW 12 1

R2

R3

R4

R5

T it le S iz e A D a te :

2

R6

MUSUMECI DAVIDE < T it le > D ocum ent N um ber <D oc>

MIDI CONTROLLER

S a tu rd a y , J u n e 0 8 , 2 0 1 3

Sheet

R ev <R ev C ode> 1

of

1


11 FRITZING


12 FORI


13

PROGRAMMA #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif #define MIDI_CC_MODULATION 0x01 #define MIDI_CC_BREATH 0x02 #define MIDI_CC_VOLUME 0x07 #define MIDI_CC_BALANCE 0x08 #define MIDI_CC_PAN 0x0A #define MIDI_CC_EXPRESSION 0x0B #define MIDI_CC_EFFECT1 0x0C #define MIDI_CC_EFFECT2 0x0D #define MIDI_CC_GENERAL1 0x0E #define MIDI_CC_GENERAL2 0x0F #define MIDI_CC_GENERAL3 0x10 #define MIDI_CC_GENERAL4 0x11 #define MIDI_CC_GENERAL5 0x12 #define MIDI_CC_GENERAL6 0x13 #define MIDI_CC_GENERAL7 0x14 #define MIDI_CC_GENERAL8 0x15 #define MIDI_CC_GENERAL9 0x16 #define MIDI_CC_GENERAL10 0x17 #define MIDI_CC_GENERAL11 0x18 #define MIDI_CC_GENERAL12 0x19 #define MIDI_CC_GENERAL13 0x1A #define MIDI_CC_GENERAL14 0x1B #define MIDI_CC_GENERAL15 0x1C #define MIDI_CC_GENERAL16 0x1D #define MIDI_CC_GENERAL17 0x1E #define MIDI_CC_GENERAL18 0x1F #define MIDI_CC_GENERAL1_FINE 0x2E #define MIDI_CC_GENERAL2_FINE 0x2F #define MIDI_CC_GENERAL3_FINE 0x30 #define MIDI_CC_GENERAL4_FINE 0x31 #define MIDI_CC_GENERAL5_FINE 0x32 #define MIDI_CC_GENERAL6_FINE 0x33 #define MIDI_CC_GENERAL7_FINE 0x34 #define MIDI_CC_GENERAL8_FINE 0x35 #define MIDI_CC_GENERAL9_FINE 0x36 #define MIDI_CC_GENERAL10_FINE 0x37 #define MIDI_CC_GENERAL11_FINE 0x38 #define MIDI_CC_GENERAL12_FINE 0x39


14 #define MIDI_CC_GENERAL13_FINE 0x3A #define MIDI_CC_GENERAL14_FINE 0x3B #define MIDI_CC_GENERAL15_FINE 0x3C #define MIDI_CC_GENERAL16_FINE 0x3D #define MIDI_CC_GENERAL17_FINE 0x3E #define MIDI_CC_GENERAL18_FINE 0x3F #define MIDI_CC_SUSTAIN 0x40 #define MIDI_CC_REVERB 0x5B #define MIDI_CC_CHORUS 0x5D #define MIDI_CC_CONTROL_OFF 0x79 #define MIDI_CC_NOTES_OFF 0x78 #define NOTE_C0 0x00 // 0 #define NOTE_C1 0x12 // 18 #define NOTE_C2 0x24 // 36 #define NUM_DI 12 #define NUM_AI 6 #if defined(MIDI_FIGHTER) #define MIDI_CHANNEL 3 #define NOTE NOTE_C2 #define SKIP_ROW 2 #define DIGITAL_PIN_ORDER 10, 11, 12, 13, 6, 7, 8, 9, 2, 3, 4, 5 #else #define MIDI_CHANNEL 1 #define NOTE NOTE_C0 #define DIGITAL_PIN_ORDER 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 #endif #define ANALOGUE_PIN_ORDER A0, A1, A2, A3, A4, A5 #define LED_PIN 13 #define MIDI_CC MIDI_CC_GENERAL1 #define DEBOUNCE #define DEBOUNCE_LENGTH 2 #define ANALOGUE_FILTER #ifdef FASTADC #define FILTER_AMOUNT 3 #else #define FILTER_AMOUNT 2 #endif #define ANALOGUE_INPUT_CHANGE_TIMEOUT 250000 byte digitalInputMapping[NUM_DI] = {DIGITAL_PIN_ORDER}; byte analogueInputMapping[NUM_AI] = {ANALOGUE_PIN_ORDER}; byte digitalInputs[NUM_DI]; byte analogueInputs[NUM_AI]; byte tempDigitalInput; byte tempAnalogueInput; byte i = 0;


15 byte digitalOffset = 0; byte analogueDiff = 0; boolean analogueInputChanging[NUM_AI]; unsigned long analogueInputTimer[NUM_AI]; #ifdef DEBUG unsigned long loopTime = 0; unsigned long serialSendTime = 0; #endif void setup() { #ifdef FASTADC sbi(ADCSRA,ADPS2) ; cbi(ADCSRA,ADPS1) ; cbi(ADCSRA,ADPS0) ; #endif Serial.begin(115200); for (i = 0; i < NUM_DI; i++) { pinMode(digitalInputMapping[i], INPUT); if (digitalInputMapping[i] != LED_PIN) { digitalWrite(digitalInputMapping[i], HIGH); } digitalInputs[i] = digitalRead(digitalInputMapping[i]); } for (i = 0; i < NUM_AI; i++) { pinMode(analogueInputMapping[i], INPUT); analogueInputs[i] = analogRead(analogueInputMapping[i]); analogueInputChanging[i] = false; analogueInputTimer[i] = 0; } #ifdef DEBUG serialSendTime = millis(); #endif } void loop() { #ifdef DEBUG loopTime = micros(); #endif for (i = 0; i < NUM_DI; i++) { #ifdef MIDI_FIGHTER if (i >= SKIP_ROW * 4) {


16 digitalOffset = i + 4; } else { #endif digitalOffset = i; #ifdef MIDI_FIGHTER } #endif tempDigitalInput = digitalRead(digitalInputMapping[i]); if (digitalInputs[i] != tempDigitalInput) { #ifdef DEBOUNCE delay(DEBOUNCE_LENGTH); if (tempDigitalInput == digitalRead(digitalInputMapping[i])) { #endif digitalInputs[i] = tempDigitalInput; if (digitalInputs[i] == 0) { if (digitalInputMapping[i] != LED_PIN) { noteOn(MIDI_CHANNEL, NOTE + digitalOffset, 0x7F); // Channel 1, middle C, maximum velocity } else { noteOff(MIDI_CHANNEL, NOTE + digitalOffset); // Channel 1, middle C } } else { if (digitalInputMapping[i] != LED_PIN) { noteOff(MIDI_CHANNEL, NOTE + digitalOffset); // Channel 1, middle C } else { noteOn(MIDI_CHANNEL, NOTE + digitalOffset, 0x7F); // Channel 1, middle C, maximum velocity } } #ifdef DEBOUNCE } #endif }


17 } for (i = 0; i < NUM_AI; i++) { tempAnalogueInput = analogRead(analogueInputMapping[i]) / 8; #ifdef ANALOGUE_FILTER analogueDiff = abs(tempAnalogueInput - analogueInputs[i]); if ((analogueDiff > 0 && analogueInputChanging[i] == true) || analogueDiff >= FILTER_AMOUNT) { if (analogueInputChanging[i] == false || analogueDiff >= FILTER_AMOUNT) { analogueInputTimer[i] = micros(); analogueInputChanging[i] = true; } else if (micros() - analogueInputTimer[i] > ANALOGUE_INPUT_CHANGE_TIMEOUT) { analogueInputChanging[i] = false; } if (analogueInputChanging[i] == true) { analogueInputs[i] = tempAnalogueInput; controlChange(MIDI_CHANNEL, MIDI_CC + i, analogueInputs[i]); } } #else if (analogueInputs[i] != tempAnalogueInput) { analogueInputs[i] = tempAnalogueInput; controlChange(MIDI_CHANNEL, MIDI_CC + i, analogueInputs[i]); } #endif } #ifdef DEBUG loopTime = micros() - loopTime; if (millis() - serialSendTime > 1000) { Serial.print("Loop execution time (us): "); Serial.println(loopTime); serialSendTime = millis(); } #endif } void noteOn(byte channel, byte pitch, byte velocity) { channel += 0x90 - 1; if (channel >= 0x90 && channel <= 0x9F) { #ifdef DEBUG


18 Serial.print("Button pressed: "); Serial.println(pitch); #else Serial.write(channel); Serial.write(pitch); Serial.write(velocity); #endif } } void noteOff(byte channel, byte pitch) { channel += 0x80 - 1; if (channel >= 0x80 && channel <= 0x8F) { #ifdef DEBUG Serial.print("Button released: "); Serial.println(pitch); #else Serial.write(channel); Serial.write(pitch); Serial.write((byte)0x00); #endif } } void controlChange(byte channel, byte control, byte value) { channel += 0xB0 - 1; if (channel >= 0xB0 && channel <= 0xBF) { #ifdef DEBUG Serial.print(control - MIDI_CC); Serial.print(": "); Serial.println(value); #else Serial.write(channel); Serial.write(control); Serial.write(value); #endif } }


Midi controller