desenvolvimento de um trompete eletronico de^ … · figura 50 { algoritmo (em vermelho) versus...

117
UNIVERSIDADE FEDERAL DO PARAN ´ A DEPARTAMENTO DE ENGENHARIA EL ´ ETRICA SETOR DE TECNOLOGIA FELIPE DOUGLAS MAKARA DESENVOLVIMENTO DE UM TROMPETE ELETR ˆ ONICO DE BAIXO CUSTO TRABALHO DE CONCLUS ˜ AO DE CURSO CURITIBA 2017

Upload: hatruc

Post on 13-Dec-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

UNIVERSIDADE FEDERAL DO PARANADEPARTAMENTO DE ENGENHARIA ELETRICA

SETOR DE TECNOLOGIA

FELIPE DOUGLAS MAKARA

DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE

BAIXO CUSTO

TRABALHO DE CONCLUSAO DE CURSO

CURITIBA2017

Page 2: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

FELIPE DOUGLAS MAKARA

DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE

BAIXO CUSTO

Trabalho de Conclusao de Curso apresentado ao Setor deTecnologia da Universidade Federal do Parana, como requisitoparcial para a obtencao do tıtulo de Bacharel em EngenhariaEletrica.

Orientador: Luis Henrique A. LolisUniversidade Federal do Parana

CURITIBA2017

Page 3: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

As duas mulheres da minha vida: minha maee minha namorada, por todos os momentosinesquecıveis, palavras de conforto e carinhosempre presente. Que este trabalho inspire aspessoas assim como elas me inspiraram.

Page 4: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

AGRADECIMENTOS

Com relacao a confeccao deste trabalho, agradeco a meu orientador pela ajuda e

orientacao deste trabalho. Agradeco tambem a Fabio Barbosa de Sousa e Anderson Karas pela

orientacao musical, opinioes e por terem se voluntariado para a gravacao de amostras. Agradeco

tambem ao professor James Baraniuk pelo incentivo a tornar este trabalho um produto de fato.

Finalmente, agradeco a todos os amigos que apoiaram e deram ideias para o projeto.

Page 5: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

”Everything is hard before it is easy.”(Johann Wolfgang von Goethe)

Page 6: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

RESUMO

MAKARA, Felipe. Desenvolvimento de um Trompete Eletronico de Baixo Custo. 2017. 103f. Trabalho de Conclusao de Curso – Setor de Tecnologia, Universidade Federal do Parana.Curitiba, 2017.

Neste trabalho foi desenvolvido um trompete eletronico simulando o instrumento real, com asvantagens de reducao de ruıdo audıvel gerado, gravacao de notas tocadas e transmissao viaWiFi. O corpo foi modelado para imitar um trompete convencional e para abafar o ruıdo sonorocausado pelo bocal. Foi escolhido um algoritmo de identificacao de frequencias por cruzamentocom limiares variaveis para a deteccao das notas tocadas. A reproducao de audio funciona viadecimacao da forma de onda desejada e reproducao via PWM sobre um buffer digital e filtrosRC.Palavras-chave: Trompete. Decimacao. Schmitt-trigger variavel. Instrumento. Eletronico.

Page 7: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

ABSTRACT

MAKARA, Felipe. Development of a Low-Cost Electronic Trumpets . 2017. 103 f. Trabalho deConclusao de Curso – Setor de Tecnologia, Universidade Federal do Parana. Curitiba, 2017.

In this work, an electronic trumpet simulating the real instrument was developed, with theadvantages of reducing generated noise, recording notes played and transmitting via WiFi. Thebody was modeled to imitate a conventional trumpet and to muffle the noise caused by thenozzle. An algorithm of frequency identification by crossing with variable thresholds was chosento detect the notes played. Audio playback works via decimation of the desired waveform andplayback via PWM over a digital buffer and RC filters.Keywords: Trumpet. Decimation. Variable Schmitt-trigger. Electronic. Instrument.

Page 8: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

LISTA DE FIGURAS

Figura 1 – Instrumentos da famılia dos metais: 1.Trompa 2.Trompete 3.Trombone de

vara 4.Tuba 5.Tuba Wagner 6.Corneta 7.Eufonio/Bombardino 8.Saxotrompa

9.Helicon 10.Clarim. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Figura 2 – Componentes de um trompete . . . . . . . . . . . . . . . . . . . . . . . . 6

Figura 3 – Detalhe para a parte interna (pisto 1) e encaixe no corpo (pisto 2) . . . . . 6

Figura 4 – Exemplo de pisto, em sua posicao solta (esquerda) e pressionada (direita) . 8

Figura 5 – Surdina SB7X2 da Yamaha . . . . . . . . . . . . . . . . . . . . . . . . . 8

Figura 6 – EZ-TP da Yamaha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Figura 7 – Trompete digital de James Morrison . . . . . . . . . . . . . . . . . . . . . 10

Figura 8 – Instrumento Eletronico de Pistos . . . . . . . . . . . . . . . . . . . . . . . 10

Figura 9 – Diagrama geral do trompete eletronico . . . . . . . . . . . . . . . . . . . 11

Figura 10 – Exemplo de circuito de filtro para PWM de audio . . . . . . . . . . . . . . 12

Figura 11 – Exemplos de pistos usando molas de compressao (esquerda) e tracao (direita) 13

Figura 12 – Exemplo de microswitch . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Figura 13 – Funcionamento do Reed-Switch . . . . . . . . . . . . . . . . . . . . . . . 14

Figura 14 – Sensor capacitivo usando placa MSP432 . . . . . . . . . . . . . . . . . . . 15

Figura 15 – Esquema de oscilador por relaxacao . . . . . . . . . . . . . . . . . . . . . 15

Figura 16 – Exemplo de botao mecanico . . . . . . . . . . . . . . . . . . . . . . . . . 16

Figura 17 – Exemplo de bargraph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Figura 18 – Exemplo de display de 7 segmentos, com 4 dıgitos . . . . . . . . . . . . . 17

Figura 19 – Exemplo de display LCD 16x2 . . . . . . . . . . . . . . . . . . . . . . . . 18

Figura 20 – Exemplo de display LCD grafico . . . . . . . . . . . . . . . . . . . . . . . 19

Figura 21 – Circuito de saıda MIDI DIN . . . . . . . . . . . . . . . . . . . . . . . . . 19

Figura 22 – Circuito de entrada MIDI DIN . . . . . . . . . . . . . . . . . . . . . . . . 20

Figura 23 – Placa de desenvolvimento para o ESP-32 . . . . . . . . . . . . . . . . . . 22

Figura 24 – Placa de desenvolvimento NodeMCU . . . . . . . . . . . . . . . . . . . . 22

Figura 25 – Placa de desenvolvimento para o ESP-01 . . . . . . . . . . . . . . . . . . 22

Figura 26 – Placa de desenvolvimento Xbee com antena imbutida . . . . . . . . . . . . 23

Figura 27 – Circuito equivalente para fazer a FFT deslizante . . . . . . . . . . . . . . 24

Figura 28 – Circuito e exemplo de funcionamento de um Shmitt-trigger, ilustrando os

limiares superior/inferior . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Figura 29 – Vista em perfil do tubo atenuador, mostrando a posicao do microfone primario 28

Figura 30 – Visoes (a) lateral fechada, (b) lateral em corte, (c) explodida e (d) explodida

em corte de um pisto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Figura 31 – Visoes em corte e isometrica do segurador do LCD . . . . . . . . . . . . . 30

Figura 32 – Imagem do dedal em sua posicao, logo a frente do encaixe com o trompete 31

Page 9: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Figura 33 – Visao em wireframe e realista do corpo . . . . . . . . . . . . . . . . . . . 32

Figura 34 – Visao em wireframe e realista do corpo . . . . . . . . . . . . . . . . . . . 33

Figura 35 – Launchpad MSP432P401R da Texas Instruments . . . . . . . . . . . . . . 33

Figura 36 – Esquematico da placa superior . . . . . . . . . . . . . . . . . . . . . . . . 34

Figura 37 – Esquematico da adaptacao feita no circuito de audio . . . . . . . . . . . . 35

Figura 38 – Esquematico da placa inferior . . . . . . . . . . . . . . . . . . . . . . . . 36

Figura 39 – Layout logico (esquerda) e para impressao invertido (direita) da placa top . 37

Figura 40 – Layout logico (esquerda) e para impressao invertido (direita) da placa bot . 38

Figura 41 – Montagem extra no LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

Figura 42 – Microfone com isolamento hermetico . . . . . . . . . . . . . . . . . . . . 39

Figura 43 – Circuito de um pisto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Figura 44 – Trecho de amostra de dados brutos . . . . . . . . . . . . . . . . . . . . . 41

Figura 45 – Montagem vista de lateral posterior . . . . . . . . . . . . . . . . . . . . . 48

Figura 46 – Montagem vista de lateral anterior . . . . . . . . . . . . . . . . . . . . . . 48

Figura 47 – Montagem vista como pelo usuario . . . . . . . . . . . . . . . . . . . . . 49

Figura 48 – Tela principal vista pelo usuario . . . . . . . . . . . . . . . . . . . . . . . 49

Figura 49 – Tela do menu de opcoes . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

Figura 50 – Algoritmo (em vermelho) versus densidade de potencia em sweep . . . . . 51

Figura 51 – Algoritmo (em vermelho) versus densidade de potencia em Ta-Ta-Ta . . . 51

Figura 52 – Algoritmo (em vermelho) versus densidade de potencia em Ta-Ta-Taaa . . 52

Figura 53 – Valores brutos para uma reproducao de 30Hz . . . . . . . . . . . . . . . . 52

Figura 54 – Valores brutos para uma reproducao de 300Hz . . . . . . . . . . . . . . . 53

Figura 55 – Valores brutos para uma reproducao de 1000Hz . . . . . . . . . . . . . . . 53

Figura 56 – Forma de onda padrao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

Page 10: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

LISTA DE TABELAS

Tabela 1 – Custos Fixos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

Tabela 2 – Custos Variaveis - Producao artesanal . . . . . . . . . . . . . . . . . . . 54

Tabela 3 – Custos Variaveis - Producao semi-industrial . . . . . . . . . . . . . . . . 55

Page 11: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

LISTA DE ABREVIATURAS E SIGLAS

MIDI Musical Instrument Digital Interface

DAC Digital to Analogic Converter

ADC Analogic to Digital Converter

PWM Pulse Width Modulation

LCD Liquid Crystal Display

UART Universal Asyncronous Receiver/Transmitter

FFT Fast Fourier Transform

LED Light Emiting Diode

PVC PolyVinyl Chloride, ou policloreto de polivinila

SP Stack Pointer

PC Program Counter

RMS Root Mean Square

FAT File Allocation Table

DC Direct Current

MSPS Mega Samples Per Second

Page 12: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

LISTA DE SIMBOLOS

Pa Pascal(ais), unidade de pressao

dB Decibel(eis), unidade de ganho ou, em ambito acustico, potencia logarıtmica

do som com referencia ao mınimo audıvel pelo ser humano

Ω Ohm(s), unidade de resistencia eletrica

V Volt(s), unidade de tensao eletrica

F Farad(s), unidade de capacitancia

Hz Hertz, unidade de frequencia

m Metro, unidade de comprimento

mil Milesimo de uma polegada

M mega (106)

k kilo (103)

h hecto (102)

c centi (10−2)

m milli (10−3)

µ micro (10−6)

n nano (10−9)

B Nota musical Si

C Nota musical Do

D Nota musical Re

E Nota musical Mi

# Sustenido

b Bemol

Page 13: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

SUMARIO

1 – INTRODUCAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1 CONTEXTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.2 OBJETIVO GERAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.2.1 OBJETIVOS ESPECIFICOS . . . . . . . . . . . . . . . . . . . . . . 2

1.3 PUBLICO ALVO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.4 ORGANIZACAO DO TRABALHO . . . . . . . . . . . . . . . . . . . . . . 3

2 – ESTUDO BIBLIOGRAFICO . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.1 ESTUDO DO INSTRUMENTO . . . . . . . . . . . . . . . . . . . . . . . . 4

2.1.1 O TROMPETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.1.2 A FISICA DO TROMPETE . . . . . . . . . . . . . . . . . . . . . . 7

2.1.3 TROMPETES E ACESSORIOS ELETRONICOS . . . . . . . . . . . 8

2.1.4 TOPOLOGIA ADOTADA . . . . . . . . . . . . . . . . . . . . . . . 9

2.2 ESTUDO DOS COMPONENTES . . . . . . . . . . . . . . . . . . . . . . . 11

2.2.1 ENTRADA DE SOM . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.2.2 SAIDA DE AUDIO . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.2.3 PISTOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.2.4 INTERFACE COM USUARIO - ENTRADA . . . . . . . . . . . . . . 14

2.2.5 INTERFACE COM USUARIO - SAIDA . . . . . . . . . . . . . . . . 16

2.2.6 INTERFACE MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.2.7 COMUNICACAO SEM FIO . . . . . . . . . . . . . . . . . . . . . . 20

2.3 ESTUDO DE TECNICAS . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.3.1 TECNICAS DE IDENTIFICACAO DE FREQUENCIA . . . . . . . . 23

2.3.1.1 TRANSFORMADA (RAPIDA) DE FOURIER . . . . . . . . 23

2.3.1.2 FFT DESLIZANTE . . . . . . . . . . . . . . . . . . . . . 24

2.3.1.3 DFT COM METODO NUMERICO . . . . . . . . . . . . . 24

2.3.1.4 CRUZAMENTO POR ZERO E IDENTIFICACAO DE PICOS 25

2.3.1.5 CRUZAMENTO POR LINEAR PROPORCIONAL . . . . . 25

2.3.2 TECNICAS DE SINTESE DE AUDIO . . . . . . . . . . . . . . . . . 26

2.3.2.1 SINTESE DE SOM VIA TABELA DE TONS . . . . . . . . 26

2.3.2.2 SINTESE DE SOM VIA SERIE DE FOURIER . . . . . . . 26

2.3.2.3 SINTESE DE SOM VIA DECIMACAO . . . . . . . . . . . 27

3 – DESENVOLVIMENTO DO PROTOTIPO . . . . . . . . . . . . . . . . . . 28

3.1 DESENVOLVIMENTO MECANICO . . . . . . . . . . . . . . . . . . . . . . 28

3.1.1 TUBO ATENUADOR DE SOM . . . . . . . . . . . . . . . . . . . . 28

Page 14: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

3.1.2 PISTOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.1.3 SUPORTE DO LCD E DEDAL . . . . . . . . . . . . . . . . . . . . 30

3.1.4 CORPO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.2 DESENVOLVIMENTO DO HARDWARE . . . . . . . . . . . . . . . . . . . 31

3.2.1 MICROCONTROLADOR . . . . . . . . . . . . . . . . . . . . . . . 31

3.2.2 PLACA SUPERIOR - TOP . . . . . . . . . . . . . . . . . . . . . . 32

3.2.3 PLACA INFERIOR - BOT . . . . . . . . . . . . . . . . . . . . . . . 35

3.2.4 LAYOUTS E PLACAS MONTADAS . . . . . . . . . . . . . . . . . 37

3.2.5 PERIFERICOS: LCD, MICROFONES E PISTOS . . . . . . . . . . . 38

3.3 DESENVOLVIMENTO DO FIRMWARE . . . . . . . . . . . . . . . . . . . 39

3.3.1 AMOSTRAGEM DE AUDIO . . . . . . . . . . . . . . . . . . . . . 40

3.3.2 TECNICA DE PROCESSAMENTO USADA . . . . . . . . . . . . . 40

3.3.3 REPRODUCAO DE AUDIO . . . . . . . . . . . . . . . . . . . . . . 41

3.3.4 ESCALONADOR . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

3.3.5 PROCESSAMENTO PERMANENTE . . . . . . . . . . . . . . . . . 43

3.3.6 LEDS, BOTOES E METRONOMO . . . . . . . . . . . . . . . . . . 44

3.3.7 MENUS - LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

3.3.8 ARMAZENAMENTO - CARTAO SD . . . . . . . . . . . . . . . . . 46

3.3.9 PROGRAMACAO DO ESP-01 E COMPUTADOR . . . . . . . . . . 46

4 – VALIDACAO DO PROTOTIPO . . . . . . . . . . . . . . . . . . . . . . . . 48

4.1 INTERFACE COM USUARIO . . . . . . . . . . . . . . . . . . . . . . . . . 48

4.2 PROCESSAMENTO DE AUDIO . . . . . . . . . . . . . . . . . . . . . . . 50

4.3 CUSTOS DO PROJETO . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

5 – CONCLUSAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Apendices 59

APENDICE A–APENDICE: CODIGOS FONTE MSP432 . . . . . . . . . . . 60

APENDICE B–APENDICE: CODIGOS FONTE ESP-01 . . . . . . . . . . . 98

Page 15: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

1

1 INTRODUCAO

1.1 CONTEXTO

Instrumentos eletronicos vem despertando ha muitos anos o interesse de instrumentistas

e plateias por tons, ritmos e combinacoes diferentes do comum.

Cada um dos instrumentos eletronicos, com seus graus de sucesso, contribuiu para

o jeito que a musica e tocada e ensinada hoje em dia. Seja a popularidade da guitarra, a

versatilidade do teclado, ou ainda a tecnologia em um teclado sintetizador de musica eletronica.

Mas nenhum destes tende a ser desenvolvido igual. Alguns, como o Theremin, sao

feitos porque se desejava algo completamente diferente, o unico instrumento que nao necessita

toque, e que vende a ideia que poderia durar para sempre. Outros, como a bateria eletronica,

tenta mudar uma das caracterısticas mais amadas e odiadas de uma bateria convencional, que

e o volume do som. Outros ainda, como o Keytar e combinacoes de guitarra e baixo, existem

simplesmente pois se imaginou que unir os dois instrumentos favoritos da banda seria uma boa

ideia.

Apesar de todos os instrumentos eletronicos existentes, o trompete ainda nao tem

uma boa solucao em versao eletronica, seja pelo custo do instrumento ou do treinamento,

ou ainda pelo ruıdo sonoro gerado, ou ainda pela baixa publicidade. Quando este TCC foi

proposto, somente existiam 2 alternativas de trompete eletronico que tem um custo altamente

proibitivo, provavelmente calculados pela baixa demanda.

Devido a reducao de varias variaveis relacionadas ao processamento digital de sinais

como o custo dos microcontroladores, a integracao de mais modulos em um mesmo encap-

sulamento, consumo de potencia, conectividade sem fio e bibliotecas para as mais diversas

operacoes, ja e bem viavel se ter uma solucao completamente implementavel por um so circuito

integrado e poucos perifericos.

Alem disso, existe o incentivo pessoal, uma vez que o autor, como a grande maioria

das pessoas que aprende a tocar um instrumento, estudou o trompete na fanfarra municipal

de Picarras durante alguns anos no ensino medio. Assim como a maioria das pessoas que

aprendem um instrumento, quando se mudou para Curitiba percebeu que haviam muitos mais

vizinhos para desapreciar o treino.

1.2 OBJETIVO GERAL

Desenvolver um instrumento musical eletronico que replique o funcionamento de um

trompete usando como base um microcontrolador, buscando principalmente reduzir o ruıdo

audıvel causado pela operacao do trompete bem como adicionar funcionalidades extras como

configurabilidade e conectividade.

Page 16: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 1. INTRODUCAO 2

1.2.1 OBJETIVOS ESPECIFICOS

Para atingir o objetivo principal, bem como atingir algumas metas que possivelmente

vao ajudar na popularizacao do instrumento, os seguintes objetivos especıficos sao desenvolvidos:

• Desenvolvimento mecanico

– Pesquisar e implementar uma estrutura simples para a atenuacao de ruıdos audıveis

provenientes do bocal;

– Pesquisar e implementar dispositivos de aquisicao das vibracoes provenientes do

bocal para processamento pelo microcontrolador;

– Avaliar e implementar a melhor opcao para substituir os pistos;

• Desenvolvimento do Hardware

– Avaliar e implementar circuito de baixo custo para reproducao de audio para uso de

fones de ouvido;

– Pesquisar e implementar uma interface com o usuario, que possibilite configuracao

de parametros do trompete e feedback da afinacao do usuario;

– Implementar todos os circuitos usando tecnicas basicas de fabricacao, visando a

facil reproducao por pessoas com mınimo de equipamentos para construcao.

• Processamento de audio

– Analisar e verificar viabilidade de tecnicas de processamento de audio para a

determinacao da frequencia tocada;

– Implementar algoritmo de deteccao da nota e amplitude tocada pelo usuario;

• Desenvolvimento de Firmware

– Implementar algoritmo para reproducao de audio a partir da nota e amplitude que

esta sendo tocada, proporcionando uma baixa latencia e visando a reproducao de

um som fiel ao instrumento original;

– Implementar um metronomo configuravel pelo usuario;

– Pesquisar e implementar a gravacao e transmissao via cabo e rede WiFi do que for

tocado pelo usuario via padrao MIDI;

1.3 PUBLICO ALVO

O primeiro publico alvo do instrumento sao as pessoas, jovens e adultos, que buscam

o aprendizado e treinamento de instrumentos de sopro da famılia dos metais.

Devido a reducao de custos, outro publico alvo sao as escolas, bandas e fanfarras,

que podem treinar seus alunos sem necessidade de abafamento acustico ou a possibilidade de

entregar os instrumentos para treinamento em casa.

Aproveitando a reconfigurabilidade do instrumento, outro publico alvo desejado sao os

profissionais de musica contemporanea, eletronica ou outros nichos musicais, que podem servir

tambem de publicidade para o projeto.

Page 17: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 1. INTRODUCAO 3

1.4 ORGANIZACAO DO TRABALHO

Primeiramente, por se tratar de um tema nao correlacionado com qualquer curso de

engenharia eletrica, sera feita uma explicacao sobre o funcionamento e caracterısticas de um

trompete, incluindo historia, nocoes musicais, nocoes fısicas/mecanicas e comentarios sobre

outros instrumentos da famılia dos metais. Aqui tambem serao abordados os estados da arte

para componentes relacionados a trompetes e trompetes eletronicos.

Feito isso, serao descritos os passos para a realizacao de cada um dos objetivos especı-

ficos, primeiro para a parte de hardware, passando pelo processamento de sinais e finalmente a

implementacao em firmware/software, examinando a viabilidade de cada possibilidade verificada

no decorrer deste trabalho.

Finalmente serao apresentados resultados, esquemas eletricos e mecanicos alem do

codigo fonte do projeto, para que seja possıvel reproduzir o trabalho.

Page 18: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

4

2 ESTUDO BIBLIOGRAFICO

2.1 ESTUDO DO INSTRUMENTO

Neste capıtulo serao abordados todos os aspectos do trompete que sejam interessantes

a este trabalho. Primeiramente sera apresentada uma descricao de varios componentes e instru-

mentos similares, para que seja observado que muitos deles apresentam o mesmo fundamento,

apenas mudando o timbre ou a faixa de notas tocada. Serao tambem apresentadas alternativas

existentes similares a este trabalho, seja por serem instrumentos de treino ou similares.

Apesar de se tratar de uma decisao do autor (e portanto se encaixar no Secao 3.2

ou no Secao 3.3), a topologia usada neste trabalho sera apresentada logo em seguida, com o

intuito de deixar clara a linha de raciocınio usada no trabalho ja que o Secao 2.2 e guiado ja

sabendo quais metodos serao usados.

2.1.1 O TROMPETE

O Trompete e um instrumento musical de sopro da famılia dos metais (brasswind ou

simplesmente brass em ingles). A Figura 1 mostra alguns dos mais famosos instrumentos dessa

famılia. Segundo Apel (1950), ele consiste de um tubo fino cilındrico durante tres quartos do

seu comprimento e se alarga no final em uma campana de tamanho moderado. O trompete

tem 3 valvulas, podendo ser rotarias ou mais comumente pistoes, e um timbre brilhante e

penetrante. O trompete moderno para orquestra e afinado em B (si) bemol e tem alcance

desde E3 ate C5. Dentre as partes integrantes de um trompete convencional, se destacam:

• Bocal

• Tubos

• Tubos dos pistos

• Botoes

• Pistos

• Campana

• Afinador

• Afinador do terceiro pisto

• Eliminadores de condensacao (Chave de pisto)

Tais partes podem ser encontradas na Figura 2 e a montagem e o aspecto interno dos pistos

podem ser vistos na Figura 3.

Com o intuito de facilitar a compreensao, cada um destes elementos sera explicado

historicamente, dada sua necessidade no instrumento. Nao se tem com certeza de quando

o primeiro trompete ou clarim primordial surgiu, mas segundo Apel (1950), sabe-se que foi

feito com chifres de animais. Em torno de dos anos 1000dC, sabe-se que existiu a buisine,

instrumento consistindo de um tubo reto com uma das extremidades em forma de funil.

Page 19: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 5

Figura 1 – Instrumentos da famılia dos metais: 1.Trompa 2.Trompete 3.Trombone de vara4.Tuba 5.Tuba Wagner 6.Corneta 7.Eufonio/Bombardino 8.Saxotrompa 9.Helicon10.Clarim.

Fonte: (APEL, 1950, p. 97)

Page 20: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 6

Figura 2 – Componentes de um trompete

Fonte: O autor

Figura 3 – Detalhe para a parte interna (pisto 1) e encaixe no corpo (pisto 2)

Fonte: O autor

Page 21: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 7

No comeco do seculo XV, se percebeu que era possıvel fazer curvas com os tubos,

deixando o instrumento mais compacto. No final do seculo, se percebeu que era possıvel tocar

notas diferentes usando um tubo deslizante, precursor do trombone de vara.

Ainda segundo Apel (1950), em 1813 se termina o desenvolvimento do trompete

moderno, atraves da invencao das valvulas, que permitiam ate certo ponto uma agilidade maior

entre notas, uma vez que nao se precisava deslizar a vara ate a posicao exata da nota desejada.

Hoje em dia, existem diversas marcas e afinacoes de trompetes com uma ampla faixa

de precos, assim como qualquer instrumento convencional. Foram encontrados valores desde a

partir de R$400 por um exemplar da marca Vogga ate alguns milhares de reais por marcas mais

nobres como Yamaha. Note que, como este preco e feito para o consumidor final, e provavel

que em um acordo de varios instrumentos seja feito um desconto.

2.1.2 A FISICA DO TROMPETE

No trabalho de Berkopec (2003) e feita uma analise matematica dos componentes

principais de um trompete do ponto de vista acustico sao: o tubo (que inclui os pistos), os

labios (sob ponto de vista de gerador de vibracoes) e a campana. Em sua analise e mostrado

que o trompete se trata de um tubo ressonante com uma ponta fechada. A Figura 4 mostra

ilustrativamente o que acontece quando um pisto e pressionado: o caminho que a onda sonora

faz e maior que o caminho original efetivamente aumentando o comprimento acustico e

reduzindo a frequencia.

O comprimento acustico de um trompete esta, segundo Berkopec, em torno de 140cm,

apesar de seu comprimento real (desdobrado) seja menor, ja que a campana tem o efeito de

estender a ponta frontal do tubo. Os pistos por sua vez funcionam chaveando o caminho que a

onda acustica percorre, sendo adicionados 17.9cm com o pisto 1, 8.6cm com o pisto 2 e 27.8cm

com o pisto 3, causando, nao por acaso, uma queda de 2, 1 e 3 semitons nas frequencias de

ressonancia.

Como nao e exatamente um processo linear (gracas ao formato da campana e outros

efeitos de borda), o tubo do terceiro pisto pode ser alongado usando o apoio de dedo colocado

nele para a afinacao correta destas notas, especificamente nas notas mais baixas que D#4.

Este efeito nao-linear tambem faz com que as frequencias ressonantes nao sejam perfeitamente

alinhadas com as frequencias das notas tocadas, sendo necessario portanto que o instrumentista

faca a afinacao correta usando os labios.

A primeira alternativa em reducao de ruıdos de um trompete convencional e o uso

de uma surdina. Segundo Apel, uma surdina e uma peca em formato de pera feita de metal,

madeira ou papelao com o objetivo de mudar o timbre do instrumento e reduzir o volume.

Note que com isso, a reducao de ruıdo e apenas um sub-produto do efeito da surdina, e nao e

muito grande.

Page 22: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 8

Figura 4 – Exemplo de pisto, em sua posicao solta (esquerda) e pressionada (direita)

Fonte: https://en.wikipedia.org/wiki/Trumpet, acessada em 16/11/2017

2.1.3 TROMPETES E ACESSORIOS ELETRONICOS

Dentre os produtos eletronicos para trompete existentes no mercado, um que se

ressalta e a surdina SB7X2 da Yamaha, mostrada na Figura 5. Encontrada no preco de 180

U$D (em torno de R$560) e, segundo os compradores, uma otima surdina que permite a pratica

em qualquer horario e com qualidade de som proxima do instrumento original. Apesar do preco

reduzido ser um atrativo, note que ainda e necessaria a compra do instrumento neste caso.

Figura 5 – Surdina SB7X2 da Yamaha

Fonte: https://www.amazon.com/Yamaha-SB7X2-Trumpet-Mute/dp/B01MTOAHSA, acessada em16/11/2017

Ainda sobre os produtos da Yamaha, o ja descontinuado EZ-TP (Figura 6) e uma

solucao completa e inspiracao principal para este trabalho. Como ele converte a entrada para o

Page 23: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 9

equivalente MIDI, e possıvel escolher entre 22 ”vozes”(instrumentos) dentre elas 7 de trompete,

ou simplesmente conectar a um outro dispositivo MIDI para a geracao de virtualmente qualquer

voz. Note no entanto que como Music (2017) menciona, este instrumento nao aceita que seja

assoprado como um trompete convencional, devendo ser apenas ”murmurar”as notas. Apesar

de estar descontinuado, os instrumentos usados chegam a custar 600U$D (R$1800).

Figura 6 – EZ-TP da Yamaha

Fonte: (MUSIC, 2017)

Assim como o EZ-TP, o Trompete digital de James Morrison ou MDT (Figura 7)

e mais um instrumento eletronico completo que da uma grande variedade de vozes e faixas

tocaveis no trompete. Em seu site de 2005, o instrumento aparenta ser vendido por 2195 U$D

(R$6900) juntamente com todos os equipamentos necessarios para o funcionamento. Nao foi

verificado se o dispositivo ainda e fabricado.

E interessante mencionar tambem Instrumento de Pistos Eletronico, de acronimo em

ingles EVI, mostrado na Figura 8. Todas as instrucoes de funcionamento e como foi feito sao

mostrados no proprio video. Este instrumento, apesar de interessante, e bem pouco completo,

e independe da nota feita bela boca, precisando de uma roda de selecao de oitavas na parte

inferior e precisa de um sintetizador para a saıda do som.

2.1.4 TOPOLOGIA ADOTADA

Em um instrumento convencional, as vibracoes geradas pelo labio sao amplificadas ou

atenuadas pelos tubos, pistos e campana do trompete e sao emitidas para todos os ouvintes

da area inclusive o instrumentista, que a partir desta realimentacao pode se afinar do jeito que

deseja.

Page 24: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 10

Figura 7 – Trompete digital de James Morrison

Fonte: (MORRISON, 2005)

Figura 8 – Instrumento Eletronico de Pistos

Fonte: https://www.youtube.com/watch?v=A33XAioIHQ8, acessada em 16/11/2017

Com este modelo em mente (exceto pela parte de emissao para todos os ouvintes na

area), a topologia do trompete eletronico foi desenvolvida para ser processada por componentes

eletronicos. A Figura 9 mostra os principais componentes deste trabalho bem como as areas da

eletronica que tais partes se baseiam. Note que este diagrama e bastante generico e menciona

apenas os componentes no ambito eletronico do trompete, nao se mencionando por exemplo o

mecanismo de atenuacao do ruıdo sonoro causado pelo bocal (acustica) ou o desenho mecanico

dos pistos e corpo do trompete.

Page 25: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 11

Figura 9 – Diagrama geral do trompete eletronico

Fonte: O autor

2.2 ESTUDO DOS COMPONENTES

2.2.1 ENTRADA DE SOM

Seja diretamente no bocal ou na saıda da campana do trompete, e necessario um

instrumento para a aquisicao do sinal de pressao acustica, tambem conhecido popularmente

como microfone. Outra estrategia para medir a pressao acustica seria usar um barometro. O

problema nesse caso e que circuitos integrados que facam tal medida tem pouca precisao: por

exemplo, para o BMP180 da Bosch (2013), a acuracia e dada por +- 0.12hPa, o que implica

em uma pressao acustica de pelo menos 95dB.

Dentre as alternativas com tamanho e custo reduzidos, estao os microfones de eletreto

e piezoeletricos. Microfones de eletreto sao compostos por uma membrana polarizada que,

quando vibra, causa um fluxo de eletrons pela base de um transistor, que por sua vez amplifica

este sinal, fazendo com que o circuito funcione essencialmente como um transdutor de pressao

acustica para resistencia. Isto implica que e necessaria uma impedancia ou fonte de corrente

que polarize o microfone corretamente.

Ja o transdutor piezoeletrico pode funcionar tanto como microfone quanto alto-falante,

gracas a propriedade do material piezoeletrico de deformar com tensao aplicada e de gerar tensao

com a deformacao. Uma vantagem deste transdutor e a facilidade de isolar hermeticamente

da condensacao, bastando uma camada de verniz sobre o microfone. No entanto, como um

Page 26: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 12

dos eletrodos consiste de uma camada fina de estanho, dependendo da construcao e nıvel de

vibracoes este eletrodo se abre com facilidade.

2.2.2 SAIDA DE AUDIO

Quando se busca emular um instrumento de som, deve-se implementar uma saıda

para alto-falantes ou fone de ouvido. Como o primeiro objetivo e justamente reduzir o som, e

possıvel focar o desenvolvimento em fones de ouvido.

Para se usar um alto-falante e necessario um conversor digital-analogico (D/A). Como

geralmente estes componentes tem uma alta impedancia de saıda, eles sao usados em conjunto

com um amplificador de potencia. Em geral microcontroladores nao possuem conversores D/A,

muito menos amplificadores de potencia integrados, o que implicaria em um componente

externo ao sistema.

Em compensacao, praticamente todos os microcontroladores atualmente tem algum

modulo temporizador (Timer) com possibilidade de saıda de um sinal com largura de pulso

modulavel (PWM). A estrategia de usar PWM para chavear transistores nao se limita a

microcontroladores, uma vez que este desenho tem alta eficiencia energetica (ja que os

transistores estao em corte ou saturacao, dissipando energia apenas no instante de chaveamento)

em comparacao com amplificadores lineares. E necessario apenas um circuito de filtro passa-

baixas para filtrar a frequencia chaveada e um capacitor para nao aplicar tensao DC diretamente

ao fone de ouvido, como mostra a Figura 10. Note que e comum colocar a frequencia de

chaveamento acima da frequencia audıvel o que muitas vezes elimina a necessidade do filtro

passa-baixas.

Figura 10 – Exemplo de circuito de filtro para PWM de audio

Fonte: http://www.diyaudio.com/forums/class-d/132955-pwm-signal-audio-signal.html

Outra alternativa e a utilizacao de circuitos integrados de audio completos como o

ALC272, que ja tem toda a estrutura de comunicacao serial, bufferizacao, geracao de sinais de

clock e amplificadores integrados. Devido ao objetivo de simplificacao do circuito, foi escolhido

para este projeto a geracao de audio via PWM.

2.2.3 PISTOS

Os pistos sao de um mecanismo de chaveamento de tubos, acionado pressionando os

botoes e usando molas para retornar a posicao original, com exemplo mostrado na Figura 3. A

primeira forma que poderia se imaginar para a implementacao de tal instrumentacao seria o

Page 27: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 13

uso de um botao, ate mesmo de fliperama. O problema evidente desta estrategia e a falta de

similaridade com o instrumento real:

• O curso do botao de fliperama e mais curto que o curso de um pisto

• A forca necessaria para apertar e maior

• O botao somente fecha contato no final do curso, ao contrario do instrumento real que

troca de sintonia na metade do curso.

Alem disso, como toda interface mecanica de contatos, um botao tem os inconvenientes

de desgaste e bouncing. Portanto, para emular um pisto, e interessante ter a mesma construcao

basica de um pisto: um “botao” (parte que fica em contato direto com o dedo), um eixo e uma

mola, como mostra a Figura 11. Note que no lugar de molas de tracao e possıvel tambem usar

elastico e que e possıvel deixar a mola alinhada ao eixo, sendo necessaria apenas 1 mola.

Figura 11 – Exemplos de pistos usando molas de compressao (esquerda) e tracao (direita)

Fonte: O autor

A partir daı, e possıvel ter algumas ideias para que um sinal eletrico seja gerado quando

o pisto passa da metade do curso. Uma ideia mais basica seria colocar um contato mecanico

do tipo microswitch (Figura 12) no curso do eixo. Tal estrategia teria como desvantagens

o tamanho do microswitch, problemas de bouncing e possibilidade de travamento (ou pelo

menos, aumento da forca necessaria para apertar e retornar) do eixo pela chave mecanica.

Figura 12 – Exemplo de microswitch

Fonte: https://en.wikipedia.org/wiki/Miniature snap-action switch. Acessada em 16/11/2017.

Outra alternativa avaliada foi o uso de ımas nos eixos e chaves magneticas, ou reed-

switches, na lateral do pisto. Reed-switch, como mostra a Figura 13, e um contato mecanico

Page 28: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 14

que se fecha na presenca de um campo magnetico proximo. Contando que nao sao esperadas

interferencias magneticas forte o suficiente para causar um falso-positivo no sensor e que ele

nao deve causar muita interferencia na forca aplicada no pisto, esta e uma alternativa valida

para o uso no instrumento.

Figura 13 – Funcionamento do Reed-Switch

Fonte: http://www.sunrom.com/p/reed-switch, acessada em 16/11/2017

Mais uma alternativa possıvel e o uso de chaves opticas. Chaves opticas sao feitas

com uma fonte de radiacao, visıvel ou infravermelho em geral, e um transdutor deste tipo de

radiacao, acoplado oticamente ao transmissor. Neste metodo, quando suficientemente acoplado

e protegido de luz externa, nao apresenta maiores causadores de interferencia, tanto que e

usado como mecanismo de transferencia de dados de alta velocidade em sistemas que devem

ser isolados galvanicamente. Outra vantagem e a possibilidade de comprar os componentes

individuais (emissor e receptor) e montar a chave optica diretamente na estrutura desejada,

reduzindo o custo e volume necessario.

2.2.4 INTERFACE COM USUARIO - ENTRADA

Apesar de haverem sidos mencionados varios sistemas de entrada de dados para os

algoritmos (audio e pistos), nenhum deles esta realmente relacionado a entrada de configuracoes

do usuario. Claro, seria bem possıvel criar um sistema que controla algum menu via frequencia

gerada pelo bocal ou ainda usar os pistos para tal tarefa, no entanto seria necessario algum

mecanismo para alternar entre o modo“tocar”e o modo“configurar”, o que e bem difıcil ja que

nao se deseja falsos-positivos ou falsos-negativos nesse metodo.

A primeira alternativa realıstica, do ponto de vista de custo de implementacao, e o uso

de sensores capacitivos como botoes. Um exemplo funcional e mostrado na Figura 14, usando

o MSP432 e uma matriz de sensores capacitivos, mostrando o resultado em uma tela LCD.

Tal metodo e a primeira alternativa realıstica pois e relativamente facil de implementar

por microcontroladores e se torna ainda mais facil com o MSP432 que conta com circuito

Page 29: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 15

Figura 14 – Sensor capacitivo usando placa MSP432

Fonte: http://43oh.com/2016/08/captivate-multi-touch-with-the-msp432/, acessada em 16/11/2017

dedicado para fazer um oscilador por relaxacao. Um oscilador por relaxacao e um circuito com

uma porta inversora com entrada estilo schmitt trigger com o capacitor ligado a entrada e o

resistor ligando a saıda a entrada. Gracas a realimentacao e aos limiares de tensao, o circuito se

torna um oscilador com frequencia variavel em funcao das tensoes, resistencia e a capacitancia.

Ao cobrir um pedaco de condutor por um isolante, quando uma pessoa ou outro

pedaco de condutor toca na superfıcie, cria-se uma capacitancia extra, que fara com que a

frequencia de saıda seja menor que a referencia. Um exemplo retirado do datasheet da biblioteca

deste microcontrolador e mostrado na Figura 14.

Figura 15 – Esquema de oscilador por relaxacao

Fonte: O autor

Como tal metodo somente necessita uma determinada area de condutor, o custo

final desta metodologia se torna basicamente o custo da placa de circuito impresso. Note no

Page 30: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 16

entanto que qualquer contato com o corpo ou outro condutor pode acionar tais sensores o que,

considerando a natureza dos instrumentos musicais, pode levar a geracao de falsos toques.

O uso de sensores capacitivos sobre telas tambem cai sob esta categoria, com o

agravante do custo relativamente elevado e a necessidade de um firmware capaz de gerar telas

de menu.

O ultimo candidato na avaliacao de entradas e o botao mecanico, como mostra a

Figura 14. Profundamente difundido na industria, ele se trata fisicamente apenas de um contato

mecanico que e forcado a ficar em estado desconectado ate que uma forca aplicada sobre

ele feche o contato mecanico e eletrico. Por ser um mecanismo mecanico, existe o conhecido

efeito de bouncing que, durante poucos milissegundos depois do acionamento do botao, pode

causar mau contato e erros na leitura do botao. Outro problema e que, quando usado de forma

incorreta (principalmente aplicando forca nao-perpendicular a superfıcie do botao), pode ter

sua vida util muito reduzida.

Figura 16 – Exemplo de botao mecanico

Fonte: https://www.sparkfun.com/products/97, acessada em 16/11/2017

Mesmo assim, existem maneiras de contornar tais inconveniencias, usando por exemplo

circuitos e algoritmos de debouncing e colocando o botao dentro de alguma forma mecanica

que restrinja o movimento. Alem do custo relativamente baixo e a facilidade de uso, outra

vantagem do botao e a resposta tactil: Ao encostar no botao, o mesmo nao se ativa, sendo

necessario o uso de um pouco de forca. Quando o botao passa para o estado ativo, e possıvel

sentir que o mesmo foi ativado, possibilitando o uso sem precisar olhar diretamente ao botao,

o que se torna interessante ja que pode se tornar inviavel deixar um botao que esteja sempre

visıvel ao usuario. Por todos estes motivos, o botao tactil foi escolhido como interface principal

de entrada com o usuario.

2.2.5 INTERFACE COM USUARIO - SAIDA

Assim como as entradas para o usuario, tambem e possıvel pensar nos menus de

configuracoes usando o hardware de feedback existente (no caso, fones de ouvido). Tal sistema

funcionaria tal como sistemas de atendimento via telefone, onde o usuario digita opcoes e e

guiado por uma mensagem pre-gravada. Devido a impopularidade de tais sistemas, causada

principalmente pela demora ate se chegar na opcao desejada, esta ideia foi descartada.

Page 31: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 17

A primeira ideia mais basica portanto e o uso de LEDs. Apesar de ser possıvel o

uso com modulacao de largura de pulso (PWM) para fazer variar o brilho, normalmente

estes dispositivos sao usados em seu modo mais basico: indicar uma variavel binaria. No

trompete eletronico, seria viavel portanto usar LEDs tanto nos pistos, para indicar quais devem

ser pressionados, quanto tambem em formato de bar graph (como mostrado na Figura 17),

indicando por exemplo o quao desafinado o usuario esta.

Figura 17 – Exemplo de bargraph

Fonte: https://core-electronics.com.au/10-segment-led-bar-graph-red.html, acessada em 16/11/2017

Note no entanto que para outros tipos de informacao, como valores numericos, e

difıcil fazer uma leitura rapida a partir de LEDs simples apenas. Uma alternativa seria o uso de

displays de 7 segmentos (Figura 18). Tais displays sao bem populares em equipamentos com

temporizadores como fornos micro-ondas, ou ainda na afericao de medidas, como termometros,

calculadoras e multımetros digitais. Em sua forma mais facil de obter sao feitos com LEDs

com pino de catodo ou anodo comum, mas provavelmente sua forma mais comum seja o uso

em displays de LCD.

Figura 18 – Exemplo de display de 7 segmentos, com 4 dıgitos

Fonte: https://core-electronics.com.au/green-7-segment-clock-display-1-2-digit-height.html, acessadaem 16/11/2017

Este display seria perfeito portanto para exibir valores de configuracoes, mas apenas

isso. Mesmo sendo mais raros de se encontrar para venda, existem displays de 16 segmentos que

tentam replicar praticamente todas as letras. O proximo passo na procura de um display que

mostre toda a informacao necessaria e o uso de displays monocromaticos, mais especificamente

o classico display de LCD de 16 colunas por 2 linhas, como mostra a Figura 19.

Page 32: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 18

Figura 19 – Exemplo de display LCD 16x2

Fonte: http://www.orientlcd.com/AMC1602BR B B6WTDW I2C 16x2 Char in I2C p/amc1602ar-b-b6wtdw-i2c.htm, acessada em 16/11/2017

Estes displays em geral acompanham um led de retroiluminacao para facilitar a leitura,

alem de possibilitar o uso de caracteres customizados (de 8x5 bits). Pela facilidade de uso e

sua aplicacao fortemente difundida, este display e frequentemente a escolha da maioria dos

projetistas amadores e boa parte dos profissionais, uma vez que geralmente acaba tendo um

preco mais acessıvel que displays de 7 segmentos.

O ultimo passo na customizacao de caracteres e desenhos e o uso de um display

grafico, como por exemplo o display dos celulares Nokia 5110 mostrado na Figura 20. Tanto em

suas versoes monocromaticas quanto coloridas no entanto, e necessaria o uso ou a programacao

de uma biblioteca grafica que vai converter, por exemplo, caracteres ASCII em pixeis acesos e

apagados, ou ainda o desenho de linhas e curvas. Mesmo assim, dependendo do tamanho da

tela, uma oportunidade ao usar algum display com maior resolucao e a possibilidade de integrar

partituras a tela do trompete, eliminando portanto a necessidade da mesma impressa a frente

do instrumentista.

2.2.6 INTERFACE MIDI

MIDI (Musical Instrument Digital Interface, ou Interface Digital de Instrumentos

Musicais) e um padrao de protocolo de comunicacao, interface eletrica e armazenamento

de notas produzidas por instrumentos musicais ou usuarios. Atualmente, a MIDI Association

especifica diversos padroes para armazenamento e transmissao do protocolo, incluindo Bluetooth,

Firewire e o classico MIDI DIN, que teve uma atualizacao em 2014 para dispositivos de 3.3V.

A Figura 21 mostra o circuito de saıda para o MIDI DIN enquanto a Figura 22 mostra

o circuito de entrada, que nao sera necessario neste projeto mas e interessante ser mostrada

pois demonstra que o protocolo eletrico se trata de uma ligacao de corrente atraves de um

opto-acoplador, o que elimina problemas de ruıdos eletricos e incompatibilidade de terras. Todos

os valores para componentes bem como especificacoes para o cabo podem ser encontradas em

Page 33: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 19

Figura 20 – Exemplo de display LCD grafico

Fonte: https://learn.adafruit.com/nokia-5110-3310-monochrome-lcd/overview, acessada em16/11/2017

sua pagina WEB.

A Figura 21 ja mostra que o protocolo preve que os sinais sao gerados por um circuito

UART de 31250 bits/segundo enquanto a especificacao preve uma comunicacao de 8N1 (8 bits,

sem paridade e 1 bit de parada), com o bit menos significativo sendo enviado antes. Sobre esta

Figura 21 – Circuito de saıda MIDI DIN

Fonte: https://www.midi.org/specifications/item/the-midi-1-0-specification

Page 34: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 20

Figura 22 – Circuito de entrada MIDI DIN

Fonte: https://www.midi.org/specifications/item/the-midi-1-0-specification

camada fısica e implementado um protocolo baseado em, mas nao limitado a, comandos para:

• Comecar a tocar uma nota

• Terminar de tocar nota

• Mudar amplitude de nota

• Mudar frequencia de nota

• Acionar efeitos, como pedais

Tambem e previsto o armazenamento de tais comandos em um arquivo (de extensao

.mid ou .midi) compatıvel com todos os tocadores de mıdia conhecidos e ainda softwares de

edicao de partituras. Note que como se tratam apenas de comandos, e nao de timbres, os sons

finais destes tocadores podem ter timbre completamente diferente entre si.

2.2.7 COMUNICACAO SEM FIO

Mesmo que comunicacao sem fio seja um termo amplo, com varias formas nao

ortodoxas tais como:

• Sinais de fumaca (culturas antigas)

• Comunicacao audıvel (culturas atuais)

• Ultrassom

• Infrassom (usado por submarinos)

• Infravermelho (controles de TV)

• LiFi (Sistemas de rede local transmitindo via luz)

• Carta, ou outros meios impressos (com tempos de entrega de pacotes bastante variaveis)

Page 35: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 21

Neste trabalho serao focadas as comunicacoes via radio em bandas ISM com modulos

comerciais de facil obtencao e programacao. Nesta categoria podem se mencionar principalmente

modulos WiFi, Bluetooth, ZigBee e de link direto de radio por suas caracterısticas particulares.

Note que como a distancia do link nao depende tanto da tecnologia quanto de outros parametros

como potencia de saıda, entrada, e ganho das antenas, os mesmos nao serao avaliados aqui.

Bluetooth e WiFi estao integrados na maioria dos, senao todos os, smartfones e

notebooks, o que tornam estas opcoes bastante atraentes por poder ser integrados diretamente

com o computador/smartfone e no caso especıfico do WiFi e possıvel tambem se conectar

diretamente com a internet e publicar conteudo. No entanto estas comunicacoes (principalmente

o WiFi), como dependem de camadas logicas, tem uma latencia de transmissao de dados

consideravelmente alto em comparacao com transceivers de radio puros. Uma solucao atual

que implementa ambos os protocolos e o ESP-32 (Figura 23) que tem como caracterısticas:

• Bluetooth 4.2 BLE

• Dual core 32bits LX6 Xtensa

• 448KB ROM

• 520KB SRAM

• 16KB SRAM no RTC

• 3x SPI

• 2x I2C

• 2x I2S

• SDIO/SD/MMC

• 3x UART

• CAN

• Ethernet 10/100Mbps

• IR (Infrared)

• 16x PWM

• Sensor de Temperatura interno

• Sensor touch de 10 canais

• ADC de 12bits e suporte para ate 18 canais (multiplexado)

• DAC de 8bits e 2 canais

Infelizmente, este conjunto so foi lancado no decorrer deste trabalho, quando boa

parte do mesmo ja tinha sido feito, mas fica de sugestao a implementacao de todo o trabalho,

inclusive as comunicacoes, inteiramente com este processador.

Antes do ESP32 ser lancado, um dos modulos WiFi mais usados por amadores e

o ESP8266, que e disponıvel em diversos formatos desde os NodeMcu’s (Figura 24) ate a

placa com apenas 8 pinos ESP-01 (Figura 25). Como existem dezenas de modelos existentes,

somente sera dada a descricao completa da placa escolhida no capıtulo correspondente.

Finalmente, o Zigbee/Xbee (mostrado na Figura 26) sao protocolos e placas de

desenvolvimento com um protocolo de rede mesh embutidos. Estes circuitos foram projetados

Page 36: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 22

Figura 23 – Placa de desenvolvimento para o ESP-32

Fonte: https://www.banggood.com/pt/ESP32-Development-Board-WiFiBluetooth-Ultra-Low-Power-Consumption-Dual-Cores-ESP-32-ESP-32S-Board-p-1109512.html

Figura 24 – Placa de desenvolvimento NodeMCU

Fonte: https://acrobotic.com/acr-00018

Figura 25 – Placa de desenvolvimento para o ESP-01

Fonte: https://https://www.sparkfun.com/products/13678

para uso em sensoriamento remoto com possibilidade de auto-cura (isto e, se um dos nos

falha, a rede se reestrutura para continuar funcionando) e auto-roteamento de pacotes. Note

que mesmo com vantagens no uso de multiplos sensores, ainda e necessario ter um end-point

Page 37: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 23

compatıvel com o computador/smartfone, ja que nao existem produtos conhecidos com esta

tecnologia embutida.

Figura 26 – Placa de desenvolvimento Xbee com antena imbutida

Fonte: https://www.sparkfun.com/products/11215

2.3 ESTUDO DE TECNICAS

Nessa secao serao tratadas as tecnicas de reconhecimento de frequencia e de geracao

de som que foram cogitadas para a confeccao deste trabalho. Para o reconhecimento, serao

mencionadas em primeiro lugar as tecnicas que usam o domınio da frequencia e em seguida

as tecnicas temporais para identificacao de frequencias. Para a geracao serao mencionadas as

tecnicas de LUT, serie de Fourier e decimacao.

2.3.1 TECNICAS DE IDENTIFICACAO DE FREQUENCIA

2.3.1.1 TRANSFORMADA (RAPIDA) DE FOURIER

A transformada de Fourier e uma tecnica de resolucao de problemas no domınio da

frequencia, o que parece ser o caminho principal a se seguir quando se deseja descobrir a

frequencia de um sinal de entrada. Uma vez feita a transformada, bastaria procurar o ponto de

maximo, ou ainda o primeiro maximo local, da funcao no regime da frequencia.

Segundo Oppenheim (1998), a transformada discreta de Fourier consiste na Equacao (1)

para N pontos (denominados x[n]). Note que e facil argumentar que este metodo, ainda nessa

forma, e bastante oneroso em processamento, uma vez que para a geracao de N pontos de saıda

(por exemplo), sao necessarios o calculo de N2 exponenciais complexas (ou cossenos e senos).

Em termos de complexidade de calculo, a transformada discreta tem portanto complexidade

O(N2). Mesmo usando tabelas de seno (pre-calculando os valores, uma vez que eles nao

mudam durante a execucao), em muitos casos o uso de varios pontos de entrada se torna

Page 38: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 24

proibitivo para aplicacoes em tempo real.

X[k] =N−1∑n

x[n] · e−jkn2π/N (1)

Para aliviar este problema, existe a transformada rapida de Fourier: um algoritmo que

usa de algumas simplificacoes matematicas no calculo da transformada discreta de Fourier para

reduzir o numero de operacoes, e que deixa a complexidade do calculo na ordem O(Nlog(N)).

E interessante notar no entanto que FFTs devem ter seu tamanho em potencia de 2, alem de

ter os tamanhos de saıda e de entrada iguais, com pontos igualmente espacados em frequencia.

Note amostrando a uma taxa de Fs, a frequencia maxima de saıda do algoritmo e

tambem Fs. Com N pontos de entrada (e de saıda), a resolucao em frequencia se torna Fs/N.

2.3.1.2 FFT DESLIZANTE

Uma simplificacao proposta por Jacobsen e Lyons (2003) na DFT e o uso de uma

janela deslizante. A equacao da DFT para um dado numero de pontos pode ser escrita, ao

usar o ultimo valor de X[k], pela Equacao (2). Como e facil computacionalmente armazenar

os ultimos N valores lidos e o ultimo valor da DFT calculado, este metodo acaba tendo uma

reducao significativa na complexidade de calculo da DFT, bastando apenas 2 somas e uma

multiplicacao complexa por ponto de saıda, como mostra a Figura 27

Xk[n] = (Xk[n− 1]− x[n−N ] + x[n]) · e−jkn2π/N (2)

Figura 27 – Circuito equivalente para fazer a FFT deslizante

Fonte: https://www.dsprelated.com/showarticle/776.php

Ela ainda apresenta a vantagem de sempre ter em sua saıda os valores mais atuais

de frequencia. Com um esquema de buffer circular implementado, o unico inconveniente e a

necessidade de calcular todos os pontos de interesse a cada amostra de sinal de entrada, o que

dependendo do numero de operacoes por ciclo do processador.

2.3.1.3 DFT COM METODO NUMERICO

Uma ultima alternativa usando DFT imaginada foi o uso de algum metodo numerico

juntamente com a DFT. Considerando que metodos numericos buscam um maximo/mınimo

Page 39: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 25

local e que com (relativamente) poucos passos, ja inclusive dando o resultado (frequencia onde

a DFT e maxima) diretamente.

No entanto, apesar da precisao dada, e no mınimo muito difıcil usar tabelas para o

calculo dos senos neste caso uma vez que as frequencias nao estao mais fixas, precisando

de pelo menos mais algumas multiplicacoes extras e mais memoria disponıvel. Tambem e

impossıvel usar o metodo de DFT deslizante, uma vez que e muito difıcil que se use as mesmas

frequencias de saıda e portanto os valores sao descartados.

2.3.1.4 CRUZAMENTO POR ZERO E IDENTIFICACAO DE PICOS

No regime do tempo, uma tecnica empregada quando o sinal de entrada e livre de

ruıdos e o uso do cruzamento por zero do sinal de entrada. A frequencia e medida pelo valor

inverso da subtracao do tempo do ultimo cruzamento de mesmo sentido do cruzamento atual.

Usando mais cruzamentos e possıvel fazer efetivamente uma media da frequencia lida na

entrada. E interessante nesses casos, ainda mais para microcontroladores de baixo poder de

calculo, usar todas as referencias internas como sendo em tempo, ao contrario da frequencia

propriamente dito.

Um processo similar ocorre na identificacao de picos da funcao, que nesse caso avalia

os maximos e mınimos locais do sinal de entrada e aplica a mesma logica para a determinacao

de frequencia. No entanto, dependendo do nıvel de ruıdo do sinal de entrada, e comum se

ter em ambos os metodos deteccoes falsas de cruzamentos multiplos, o que leva a frequencia

considerada pelo microcontrolador ser duas ou mais vezes maior que a frequencia de entrada

real.

2.3.1.5 CRUZAMENTO POR LINEAR PROPORCIONAL

Para a reducao dos ruıdos, como engenheiro eletricista, o primeiro pensamento e de

usar um filtro passa-baixa no sinal de entrada, filtrando os ruıdos indesejaveis. O problema no

caso do trompete e a longa faixa de frequencias tocaveis, se estendendo por pelo menos duas

oitavas. Isto faz com que, por exemplo, o ruıdo de cruzamento por zero (da primeira harmonica,

principalmente) para uma frequencia baixa de entrada esteja na faixa tocavel do dispositivo.

Em geral, este tipo de problema e entao resolvido usando Schmitt-trigger (Figura 28).

O Schmitt-trigger e um circuito com realimentacao positiva sobre o sinal de entrada que altera

o nıvel de comparacao, que pode ser implementado com facilidade via firmware. Isto faz com

que o ruıdo de entrada precise ser maior que a diferenca entre os limiares para disparar.

O instrumentista no entanto nao vai tocar a todo o momento na mesma amplitude,

por isso e necessaria a variacao destes nıveis conforme a amplitude (pico-a-pico ou RMS) do

sinal de entrada.

Page 40: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 26

Figura 28 – Circuito e exemplo de funcionamento de um Shmitt-trigger, ilustrando os limiaressuperior/inferior

Fonte: http://howtomechatronics.com/how-it-works/electrical-engineering/schmitt-trigger/

2.3.2 TECNICAS DE SINTESE DE AUDIO

2.3.2.1 SINTESE DE SOM VIA TABELA DE TONS

O som de um instrumento musical e composto por uma onda repetitiva na qual sao

aplicadas alteracoes de volume e, dependendo do nıvel do instrumentista, alteracoes de timbre.

Devido a todos os desafios de identificar o timbre da onda que sai dos labios e a correspondencia

com a saıda do sintetizador.

Portanto a primeira maneira imaginada para sintetizar audio repetitivo, dado um

conjunto de notas possıveis, e ter uma lookup table (LUT). O processador entao copia as

formas de onda dessa LUT quantas vezes forem necessarias para reproduzir o som, aplicando as

devidas correcoes de volume. Uma vantagem desse metodo e a individualidade das frequencias:

cada frequencia pode ter seu proprio timbre

O primeiro problema nesta tecnica e que o processador esta limitado as frequencias

da LUT, impossibilitando por exemplo o uso de instrumentos com vara. Como o tamanho da

LUT para uma dada frequencia e sempre inteiro, havera erros entre a frequencia desejada e a

reproduzida.

2.3.2.2 SINTESE DE SOM VIA SERIE DE FOURIER

Segundo Oppenheim (1998, p.542), uma sequencia periodica pode ser expressa por

uma soma de exponenciais complexas (senos e cossenos) harmonicamente correlacionadas.

E possıvel portanto sintetizar a onda caracterıstica do trompete pela soma multiplicacao de

coeficientes pre-determinados por suas funcoes trigonometricas correspondentes. Esta operacao

e chamada de serie de Fourier (Equacao (3)).

T (t) =a02

+∞∑n=1

[ancos(nπt

L) + bnsin(

nπt

L)] (3)

Usando uma tabela de senos e possıvel fazer essa operacao com velocidade razoavel-

mente baixa, uma vez que quanto mais fiel se desejar o som, mais coeficientes e mais fases

Page 41: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 2. ESTUDO BIBLIOGRAFICO 27

necessarias. Note que pode-se alterar estes coeficientes para causar uma mudanca no timbre,

case seja identificada uma mudanca no timbre do bocal.

2.3.2.3 SINTESE DE SOM VIA DECIMACAO

A partir da sıntese da serie de Fourier pode-se imaginar em armazenar o resultado da

soma das multiplicacoes no lugar da tabela de senoide e reproduzir esta onda com apenas uma

fase percorrendo a LUT. Tal metodo tem nome de decimacao e e frequentemente usado para

re-amostrar um sinal em uma frequencia de amostragem diferente da original.

Para o uso no trompete, o processo envolve a sobre-amostragem da onda original

por algum fator fixo, filtragem passa-baixa desse valor sobre-amostrado e a sub-amostragem

do sinal filtrado. Como as duas primeiras etapas sao simples de se fazer usando um software

de edicao matematica com funcoes de interpolacao, basta que o microcontrolador percorra

essa LUT com a velocidade (incrementos) necessaria. Por nao ser tao onerosa em termos de

processamento e por possibilitar o uso de instrumentos de vara com frequencias nao-exatas,

este e o metodo usado para a sıntese de audio.

Page 42: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

28

3 DESENVOLVIMENTO DO PROTOTIPO

3.1 DESENVOLVIMENTO MECANICO

Esta parte do trabalho consiste no desenvolvimento de todas as estruturas mecanicas,

o que inclui a carcaca do trompete, pistos, segurador de LCD, mas tambem o que foi feito

para atenuacao de som e montagem mecanica.

3.1.1 TUBO ATENUADOR DE SOM

O bocal e a unica peca original do trompete que continuara a ser usada, uma vez que

ela aplica pressao nos labios e seu formato influencia tanto o timbre quanto pode ajudar no

treinamento. Por canalizar a pressao sonora para dentro do trompete, o bocal se torna uma

fonte sonora pontual e direcional. Isso implica que a melhor forma de atenuar o som e conduzir

o mesmo atraves de um cone ou cilindro ate e atraves do atenuador.

Para a estrutura do atenuador foi escolhido como um tubo de PVC de 25mm de

diametro por alguns motivos como:

• Tubos sao mais faceis de trabalhar que cones;

• PVC e relativamente facil de trabalhar (podendo-se usar serras rapidas e modelagem

com calor;

• Material barato e disponıvel;

• Material rıgido, o que ajuda a conter a pressao sonora e o stress; mecanico;

• Material atoxico e nao reagente com o ar nem agua;

• Usando capas de tubo com furos de tamanhos diferentes possibilita o uso de varios

bocais, sem trocar o tubo;

Foi decidido pelo uso de atenuadors sonoro passivo de polipropileno de baixa densidade.

A Figura 29 mostra como a espuma e o microfone estao posicionados dentro do tubo. E

interessante que o polipropileno tenha uma baixa densidade para que a onda sonora nao seja

refletida mas absorvida em todo o comprimento da espuma. Alem disso, uma espuma densa

que bloquearia o fluxo de ar.

Figura 29 – Vista em perfil do tubo atenuador, mostrando a posicao do microfone primario

Fonte: O autor

Page 43: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 29

3.1.2 PISTOS

Esta e a parte mecanica mais detalhada do trompete eletronico, uma vez que sua

implementacao no trompete convencional e tambem uma das partes mais complexas.

Como explicado na secao 2.2.3, a melhor estrategia e imitar o que ja existe nos

trompetes convencionais. O resultado deste processo pode ser visto na Figura 30. Este conjunto

de pecas foi projetado em AutoCAD e confeccionado em uma impressora 3D e tem dimensoes

24x24x54mm.

Nela e possıvel observar quase todos os componentes de um pisto. Somente faltam

nesse caso o eixo e a mola. O eixo e uma peca cilındrica mais rıgida e lisa. Ele se encaixa no

meio da peca central, passa pelo furo inferior do corpo e tem uma saliencia que impede que a

peca central saia do corpo. O eixo foi implementado por um prego 15x21 com cabeca. A mola

fica entre o corpo e a peca central, passando em torno do eixo.

Figura 30 – Visoes (a) lateral fechada, (b) lateral em corte, (c) explodida e (d) explodida emcorte de um pisto

Fonte: O autor

Page 44: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 30

3.1.3 SUPORTE DO LCD E DEDAL

Para que o usuario possa acompanhar em tempo real o estado de sua afinacao e

outros parametros, o LCD foi colocado sobre o tubo, dentro de uma estrutura de protecao,

mostrada na Figura 31. Esta peca foi projetada em AutoCAD, impressa em impressora 3D e

tem 16x84x56mm.

O cabo do display passa por uma abertura desta peca e o display se encaixa na fresa

prevista e a peca se encaixa no tubo de atenuacao. Como nao tem nenhum vinco, ela pode

girar para os lados caso seja interessante (para ver os pistos, por exemplo).

Figura 31 – Visoes em corte e isometrica do segurador do LCD

Fonte: O autor

Mesmo que nao seja pratico por longos perıodos, e possıvel tocar o trompete somente

com a mao direita, usando o polegar e mindinho como suporte do trompete. O mindinho

acaba fazendo a (nem um pouco desprezıvel) forca para manter pressao no bocal enquanto

o polegar suporta o peso do trompete. Pelo menos para fins de prototipo e para aumentar a

forca suportada pela peca, o dedal foi feito com um pedaco de PVC, cortado e moldado para

se encaixar firmemente ao tubo, dando suporte ao mindinho, como e possıvel ver na Figura 32.

3.1.4 CORPO

O corpo e a maior e mais complexa estrutura mas tambem a mais simples de descrever

funcionalmente, ja que tem por objetivo implementar protecao para os botoes e unir todas as

partes: tubo atenuador, placas eletronicas e pistos, alem de ter cortes para que seja possıvel a

passagem de cabos atraves. E possıvel ver a sua renderizacao na Figura 33 e Figura 34. Ela

Page 45: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 31

Figura 32 – Imagem do dedal em sua posicao, logo a frente do encaixe com o trompete

Fonte: O autor

tambem foi projetada pelo AutoCAD e pelo seu tamanho (70x67x110mm) e tambem a peca

mais demorada, levando 12 horas para ser feita via impressora 3D.

Note que os botoes foram incorporados ao corpo, tanto pela facilidade de fabricacao

quanto pela adequacao das forcas usadas ja que, como citado na secao 2.2.5, somente deve-se

aplicar forca perpendicular ao botao para que sua vida util nao seja prejudicada. Tambem foi

previsto o uso de 2 parafusos na parte superiora para fixar o tubo firmemente ao corpo.

3.2 DESENVOLVIMENTO DO HARDWARE

Neste trabalho, devido ao tempo reduzido, foram desenvolvidas duas placas de face

simples que se acoplam a placa de desenvolvimento do MSP432. A necessidade de duas placas

vem da colisao (mecanica) com o proprio MSP, pela densidade de componentes THT e pela

tecnologia de fabricacao (dimensoes de vias e trilhas). Todo o processo desde o esquematico

ate o layout foi gerado pelo software KiCAD.

3.2.1 MICROCONTROLADOR

Para a execucao deste trabalho foi escolhido o microcontrolador MSP432P401R da

Texas Instruments (2015), principalmente devido a existencia de um kit de prototipagem com

conector em ambos os lados da placa (Figura 35) e a suas caracterısticas de processamento:

• Processador ARM de 32 bits Core M4F (com modulo de calculo de ponto flutuante)

• ADC com ate 16 bits de precisao a 1 MSPS

• 256kb de memoria FLASH

• 64kb de memoria RAM

Page 46: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 32

Figura 33 – Visao em wireframe e realista do corpo

Fonte: O autor

• Frequencia de operacao de ate 48MHz

• 4 modulos temporizadores de 16 bits com ate 5 modulos PWM

• 2 modulos temporizadores de 32 bits

• 4 mudulos eUSCI A, com possibilidade de escolha entre UART, SPI e IrDA

• 4 mudulos eUSCI B, com possibilidade de escolha entre SPI e I2C

• Baixo consumo de energia (80uA/MHz)

3.2.2 PLACA SUPERIOR - TOP

Na placa superior, ou ”top”(Esquema na Figura 36), foram colocados elementos basicos

de interface com o usuario como os botoes tacteis, cartao micro SD, conectores 3.5mm para o

protocolo MIDI e para o fone de ouvido, display LCD, circuito para tratamento do PWM do

audio e capacitores de desacoplamento.

Os resistores para o conector MIDI (R101 e R102) sao definidos pela MIDI Association

para terem valores de 10Ω e 22Ω respectivamente. Como o microcontrolador ja tem resistores

de pull-up configuraveis em cada um de seus pinos, os botoes nao precisam de resistores.

Para o display LCD, mesmo nao sendo necessario o pino RW, o mesmo e conectado a

Page 47: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 33

Figura 34 – Visao em wireframe e realista do corpo

Fonte: O autor

Figura 35 – Launchpad MSP432P401R da Texas Instruments

Fonte: https://www.embarcados.com.br/microcontroladores-texas-instruments-msp432/

Page 48: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 34

Figura 36 – Esquematico da placa superior

Fonte: O autor

uma GPIO. O resistor do contraste foi imaginado inicialmente para ter um valor relativamente

elevado (1∼10kΩ), mas foi verificado que deve ter no maximo 100Ω para que seja funcional.

O transistor para o LED de backlight pode ser implementado com um MOSFET-N ou um BJT

NPN com resistor de limite de polarizacao calculado para operar de maneira digital.

Para o buffer de audio, foi considerado que a impedancia dos fones de ouvido disponıveis

no mercado comeca em torno de 30Ω. Apesar do ideal e que haja casamento de impedancia

entre o buffer e o fone de ouvido, como nao existe maneira de prever a impedancia do fone, foi

usado nos calculos o caso de menor impedancia para os calculos. Como nao e possıvel fazer

transferencia da potencia, os transistores foram calculados para transferencia de tensao.

Para isto, e preciso que a impedancia do buffer seja muito menor que a do fone de

ouvido, o que faz com que a impedancia da fonte esteja em torno de ∼3Ω. Ao montar a placa,

no entanto, se verificou que ligando a saıda do microcontrolador atraves de um resistor de

100Ω ate os capacitores C114 e C115 da Figura 36 ja se tem um volume audıvel razoavel,

portanto o circuito foi alterado e o buffer nao foi montado na placa.

Os capacitores de desacoplamento, em conjunto com a impedancia do fone de ouvido,

formam um circuito RC passa-altas. Para que nao sejam filtrados sinais audıveis (20Hz) o

capacitor foi calculado pela Equacao (4).

Fc =1

2 ∗ π ∗R ∗ C⇒ Chighpass =

1

2 ∗ π ∗ Fc ∗R=

1

2 ∗ π ∗ 20 ∗ 35= 227uF (4)

Page 49: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 35

Devido a indutancia intrınseca ao fone de ouvido e a falta de sensibilidade auditiva

acima dos 20kHz no ser humano, a frequencia de chaveamento nao e ouvida. No entanto,

ao conectar a saıda a uma caixa de som, um ruıdo de chaveamento foi ouvido. Apesar de

se desconhecer o circuito interno da caixa de som, foi pressuposto que ela tem um circuito

de amplificacao digital de audio, ja que o problema nao ocorreu com fones de ouvidos e

outras caixas mais antigas, o que se encaixa com a teoria que o que estava sendo ouvido era

na realidade um efeito de aliazing do sinal de chaveamento. Para solucionar este problema,

mais uma modificacao foi feita ao circuito original, colocando um capacitor ligado ao no dos

capacitores de corte de DC e ao terra, fazendo um filtro passa-baixas. O valor do capacitor e

dado pela formula Equacao (5) e o trecho modificado pode ser visto na Figura 37.Devido a

impedancia da caixa de som ser desconhecida, foi suposta uma impedancia resultante de 80Ω.

Clowpass =1

2 ∗ π ∗ Fc ∗R=

1

2 ∗ π ∗ 20000 ∗ 80= 99.4nF (5)

Figura 37 – Esquematico da adaptacao feita no circuito de audio

Fonte: O autor

O cartao micro SD usa protocolo similar ao SPI para transferencia de dados com

o microcontrolador, por isso, foi conectado aos pinos correspondentes dos modulos SPI. O

conector ainda conta com pinos de indicacao de existencia de cartao SD, que teve um dos

seus contatos aterrados. Ao aplicar um resistor de pull-up no outro pino, se tem um nıvel alto

quando o cartao nao esta presente.

3.2.3 PLACA INFERIOR - BOT

Ja a placa inferior, ou ”bot”(Esquema na Figura 38) e mais voltada as conexoes internas

e de alimentacao do circuito. Ela tem os conectores da futura vara, dos pistos, dos microfones,

da bateria, do ESP-01 e da placa do LM2596.

Primeiramente, se optou por usar neste esquema o LM2596 em uma placa individual,

montada em cima da placa ”bot”pela densidade de componentes que esta placa apresenta

(dentre eles capacitores eletrolıticos e ceramicos SMD), pelo preco, facilidade de montagem

e a certeza que vai funcionar. O maior componente desta placa, um trimpot que ajusta a

tensao de saıda, foi removido e foi substituıdo com um resistor de 220Ω para obter 5V na

saıda. Inicialmente, esta placa com o LM2596 foi configurada para gerar a tensao de 3.3V, mas

Page 50: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 36

Figura 38 – Esquematico da placa inferior

Fonte: O autor

se notou que o display LCD funcionava na verdade com 5V. Portanto, se optou por usar um

regulador via queda de tensao de diodos para gerar 3.3V.

De maneira similar ao LM2596, a placa ESP-01 e conectada via barra de pinos na

placa. Como a comunicacao e feita usando UART, nenhuma adaptacao (exceto a necessidade

em usar os pinos dedicados) foi necessaria.

A alimentacao externa se da por um conector P2 que, quando conectado, abre o

contato da alimentacao do circuito com a bateria. Esta tensao vai diretamente para o LM2596,

o que faz com que o trompete eletronico possa ser alimentado com uma ampla faixa de fontes

e baterias. Alem disso, a tensao da bateria passa por um divisor resistivo e e conectada a uma

das entradas do ADC, para que seja feito o monitoramento da carga.

Como os pistos e o circuito da vara sao feitos para serem auto-contidos (isto e,

gerarem uma tensao sem precisar de componentes na placa), eles sao conectados diretamente

ao microcontrolador. O microfone tambem e auto-contido de uma certa forma, pois o resistor

de polarizacao foi montado logo ao lado do microfone.

Page 51: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 37

No entanto, para que nao haja sobreposicao (aliasing) no sinal amostrado, capacitores

foram adicionado em paralelo com as entradas analogicas e, em conjunto com a impedancia de

saıda do microfone e o resistor de polarizacao, ele forma um filtro RC passa-baixas. Tendo em

vista que a frequencia maxima (com folga para a margem de 3dB) e de 2kHz e a impedancia

medida do microfone e de aproximadamente 2kΩ, o capacitor adicionado e calculado na

Equacao (6).

Fc =1

2 ∗ π ∗R ∗ C⇒ C =

1

2 ∗ π ∗ Fc ∗R=

1

2 ∗ π ∗ 2000 ∗ 2000= 40nF (6)

3.2.4 LAYOUTS E PLACAS MONTADAS

Para a confeccao dos layouts, foi adotado como base:

• Isolamento mınimo: 10mils

• Trilha padrao: 24mils

• Trilha mınima: 12mils (apenas para passagens entre pinos)

• Isolamento do plano terra: 20mils

• Largura das vias: 80mils (sao feitas usando cabos soldados ponto-a-ponto)

• Conexoes na face oposta feitas com cabos soldados ponto a ponto.

A placa ”top”(Figura 39) acabou tendo uma area de 58x62mm enquanto a placa

”bot”(Figura 40) tem uma area de 54x76mm.

Figura 39 – Layout logico (esquerda) e para impressao invertido (direita) da placa top

Fonte: O autor

Page 52: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 38

Figura 40 – Layout logico (esquerda) e para impressao invertido (direita) da placa bot

Fonte: O autor

3.2.5 PERIFERICOS: LCD, MICROFONES E PISTOS

As conexoes do display LCD sao praticamente transparentes aos pinos de saıda da

placa. Os unicos detalhes sao, como se pode ver na Figura 41, resistores de pulldown adicionados

nos pinos de dados nao usados e tambem foi curto-circuitado o anodo do LED de backlight na

linha de 5V.

Ja o microfone precisou ter um cuidado especial na isolacao hermetica, uma vez que

apesar de microfones de eletreto serem resistentes a umidade, em teses iniciais eles paravam

de funcionar com facilidade no ambiente saturado de umidade proveniente da respiracao. A

solucao com maior sucesso foi o uso de fita adesiva plastica na parte frontal e finalizacao de

cola quente na parte das conexoes eletricas. Foi previsto o uso de dois microfones: um logo

a frente do bocal e outro apos o abafamento acustico, para que fosse possıvel usar alguma

tecnica de reducao de falsos-positivos devidos a ruıdos que nao sejam do bocal.

Para nao precisar se preocupar com a montagem eletrica, antes de finalizar foi

adicionado um resistor de polarizacao que deixava a tensao de saıda em torno dos 1.6V (quando

alimentado com 3.3V), maximizando assim a faixa de tensoes/amplitudes uteis. O microfone ja

com a protecao pode ser visto na Figura 42 enquanto uma ilustracao de vista em perfil (para

mostrar aonde o microfone fica no esquema geral) pode ser vista na Figura 29.

O circuito dos pistos tambem e auto-contido e seu esquema basico (repetido para os

3 pistos) pode ser visto na Figura 43. Para prever a variabilidade do conjunto LED/fotodiodo e

para possibilitar um menor consumo de corrente, a saıda deste circuito e lida atraves de um

Page 53: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 39

Figura 41 – Montagem extra no LCD

Fonte: O autor

Figura 42 – Microfone com isolamento hermetico

Fonte: O autor

pino analogico e e comparada com um limiar pre-programado. A reducao do consumo e possıvel

injetando menos corrente pelo LED e polarizando o fotodiodo de acordo. Os nıveis de saıda

nao sao compatıveis com as entradas digitais, mas podem ser comparador analogicamente.

3.3 DESENVOLVIMENTO DO FIRMWARE

Neste capitulo serao mencionadas as decisoes de programacao de firmware no micro-

controlador escolhido. Desde frequencias de amostragem usadas, passando pelo funcionamento

interno ate a interface com o usuario. Tambem serao mencionados os elementos externos ao

microcontrolador, como o cartao SD e a programacao do ESP-01.

Page 54: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 40

Figura 43 – Circuito de um pisto

Fonte: O autor

3.3.1 AMOSTRAGEM DE AUDIO

Como ja mencionado na Subsecao 2.1.1, o trompete e o instrumento mais agudo do

grupo dos metais e sua frequencia maxima esta em torno dos 1kHz. Segundo o teorema de

amostragem de Nyquist em Oppenheim (1998, p.146), a frequencia amostrada de um sinal

analogico deve ser de pelo menos duas vezes a frequencia do sinal, mas para dar uma margem

a este calculo, a frequencia de amostragem sera de 4kHz.

3.3.2 TECNICA DE PROCESSAMENTO USADA

Primeiramente, e interessante ressaltar que para uma taxa de amostragem de 4kHz

existem 48mHz/4kHz = 12.000 ciclos de clock entre amostra, o que para fins de simplicidade

dos calculos serao assumidos serem instrucoes executadas. E interessante ressaltar tambem que

tendo a portabilidade para outros instrumentos em vista, o algoritmo de reconhecimento de

frequencia deveria funcionar tanto para trombones (que podem alcancar ate C1, 33Hz) quanto

para trompetes(que podem alcancar 1kHz). Note que C#1 (um semitom acima da frequencia

mınima) tem frequencia de 35Hz, o que indica que idealmente a transformada a ser aplicada

deve ter resolucao frequencial na casa dos Hertz.

Isso exibe o problema das solucoes de processamento envolvendo regime da frequencia,

uma vez que para se fazer uma FFT com tanta resolucao frequencial (digamos, 1Hz), devido

a caracterıstica integradora da operacao, qualquer alteracao na frequencia tocada teria um

atraso com tempo na ordem inversa da frequencia que se deseja amostrar (1/1Hz=1s).

Ao usar a FFT de janela deslizante com, por exemplo, 2000 frequencias de saıda se tem

o equivalente de 6 ciclos de clock por grupo de calculo (neste caso, duas somas complexas, que

sao na realidade 4 operacoes e uma multiplicacao complexa, que sao 6). Mesmo se considerar

que as frequencias mais elevadas nao precisam de tanta resolucao, ainda e necessario computar

o tempo de acesso as tabelas e o funcionamento dos outros modulos.

Isto deixa como opcao resultante as alternativas no domınio do tempo. Para avaliar

qual metodo seria necessario e a eficiencia, foram salvas amostras do valor lido pelo ADC de

Page 55: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 41

trompetistas, para que fosse possıvel a verificacao do funcionamento sem precisar implementar

diretamente no trompete. A Figura 44 foi extraıda do meio de uma destas aquisicoes e mostra

que o sinal de entrada pode, mesmo com uma nota estatica, pode ter cruzamentos e picos

duplos. Portanto a melhor alternativa para verificar a frequencia e o uso de cruzamento por

limiares proporcionais.

Figura 44 – Trecho de amostra de dados brutos

Fonte: O autor

3.3.3 REPRODUCAO DE AUDIO

Sem um hardware independente, a reproducao de audio e a tarefa que mais consumiu

recursos neste projeto, uma vez que precisa ser executada sem erros e praticamente o tempo todo.

O primeiro parametro a ser definido aqui e a taxa de reproducao. A maioria dos reprodutores de

som consiste de um DAC mudando de valores a uma taxa de 44100 amostras a cada segundo,

seguindo a onda que desejam reproduzir. Tal valor foi definido baseado na acuidade audıvel

do ser humano que, por nao conseguir ouvir frequencias maiores que 20kHz, nao consegue

distinguir sinais gerados por amostragens tao rapidas.

O microcontrolador tem um clock principal de 48MHz, o que possibilitaria uma taxa

proxima de 44100Hz, mas com objetivo de encaixar a amostragem de audio em conjunto com

a reproducao, foi definida para este trabalho uma taxa de reproducao de som de 40kHz. De

tal maneira, o PWM pode ter uma resolucao de ate 48Mhz/40kHz=1200 posicoes ou um

pouco mais de 10 bits, caso a frequencia do PWM seja a mesma das amostras. Principalmente

para ser compatıvel com trombone de vara, foi adotada a estrategia de decimacao descrita na

Subsubsecao 2.3.2.3 para a geracao de tons tocados.

Page 56: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 42

3.3.4 ESCALONADOR

Durante o desenvolvimento do projeto, existem tarefas que devem ser executadas

de maneira temporizada e com restricoes relacionadas a temporizacao, como por exemplo a

atualizacao do PWM para o audio que precisa ser executado com intervalos regulares de 25µs

para a reproducao correta do audio.Ja outras tarefas nao sao necessarias para o funcionamento,

como por exemplo a leitura do cartao SD. Neste meio termo, existe toda a logica de identificacao

e decisao sobre as notas tocadas, que nao precisa ser executado com tana frequencia ou precisao

quanto o audio, mas tambem nao pode depender de alguma operacao bloqueante do cartao

SD.

Por isso, foi tomado como decisao de deixar todas as tarefas basicas para a execucao

do programa principal do trompete dentro das interrupcoes. Estas tarefas sao:

• Leitura das entradas analogicas

• Identificacao da posicao dos pistos

• Calculo da media e RMS do sinal

• Identificacao das bordas de cruzamento

• Identificacao da frequencia

• Identificacao da nota e amplitude correspondentes

• Reproducao (copia da onda gravada de base no buffer) de audio

E interessante notar aqui que com o processador escolhido e com o processador

controlando diretamente o audio, nao e interessante ter varios nıveis de interrupcao, uma vez

que:

• Ao entrar e sair de uma interrupcao, o processador precisa de tempo para fazer copia

dos registradores/SP/PC

• Apesar de nao ser o caso do MSP432, alguns processadores processam apenas uma

interrupcao de cada vez, o que pode fazer om que a interrupcao de audio fique atrasada.

No MSP432, as interrupcoes de baixa prioridade sao interrompidas pelas de alta prioridade.

• Com interrupcoes separadas, e preciso ter alguns cuidados com relacao as variaveis

compartilhadas usando operacoes atomicas ou semaforos, ja que nao existe sequencia

conhecida/fixa entre as duas interrupcoes.

Nao por coincidencia, as frequencias de amostragem e de reproducao de audio foram

escolhidas como multiplo inteiro, para que fosse possıvel incluir a instrucao de amostra analogica

para ser executada a cada contagem desse multiplo inteiro de interrupcoes de audio. Como

cada tarefa necessaria depende apenas das tarefas anteriores (nao precisa, por exemplo, calcular

a media novamente depois de identificar a amplitude), foi possıvel separar com uma certa folga

cada uma das tarefas em cada um dos 10 slots disponıveis. A funcao que trata o escalonador

esta no arquivo apendice ”adc.c” da linha 67 a 95.

Page 57: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 43

3.3.5 PROCESSAMENTO PERMANENTE

As linhas entre 97 e 133 do arquivo ”adc.c” mostram os primeiros slots do escalonador.

Note que no primeiro, a operacao de conversao e apenas ativada e retorna da interrupcao,

uma vez que a conversao A/D leva algum tempo (∼8us). A decisao sobre a posicao dos pistos

(pressionado ou nao) e feita logo em seguida. Note que aqui tambem existe codigo para a

calibracao dos valores analogicos possıveis, ja que foi previsto que os emissores/receptores

infravermelho fossem sub-polarizados para reducao do consumo de energia.

Em seguida sao (entre as linhas 135 e 150 de ”adc.c”) extraıdas a media e o valor RMS

(que tem a raiz quadrada em um slot separado) se baseando no ultimos valores analogicos

de entrada lidos. Como o valor RMS depende diretamente da subtracao da media atual, para

que nao sejam calculadas milhares de adicoes a cada amostragem, e aplicada uma estrategia

de integracao via fila, onde uma variavel integradora e incrementada pela diferenca entre o

novo valor e o valor mais antigo da fila, que e implementada de maneira circular (novo valor

substitui o antigo e ponteiro e incrementado).

Note que o processo de media e de RMS deve usar pelo menos uma onda completa

do sinal de entrada. Considerando que o projeto preve o uso de trombones, que podem tocar

frequencias de ate 33Hz, o numero de amostras deve ser maior que 4000/33 = 121 amostras,

o que foi estendido para 200 amostras por seguranca.

Em seguida, no trecho entre as linhas 288 e 314 de ”adc.c”, e aplicada a estrategia

de identificacao de bordas discutida na Subsubsecao 2.3.1.5. Note que aqui o tempo de cada

cruzamento e armazenado em um buffer circular para a proxima etapa. Na seta etapa e feita a

verificacao de frequencia, nota e reproducao de som.

Em primeiro lugar, a verificacao de frequencia era inicialmente feita de maneira

”assıncrona”, pois dependia de um dado numero de cruzamentos mınimos e um tempo mınimo

desde o primeiro cruzamento considerado. No esquema antigo, a decisao sobre que nota estava

sendo tocada era feita no loop principal e portanto poderia ser bloqueada por outras operacoes,

prejudicando a experiencia, alem de ser mais difıcil a producao da forma de onda do audio de

saıda.

Note que no esquema atual sempre havera uma decisao de notas a cada (4000/200)

50ms, o que limita em 20 o numero de transicoes por segundo, o que pode significar ate 20

notas de frequencia diferente ou 10 notas de mesma frequencia (ja que e necessario identificar

que o usuario parou de tocar por pelo menos um ciclo) por segundo.

Na segunda vez que este passo do escalonador e executado (linhas 315 a 318 de ”adc.c”

que chama a funcao tocar trompete Bb da linha 196), e feita a verificacao de nota e amplitude

do trompete (ou outro instrumento), que, a partir da frequencia e do valor RMS da entrada

define a nota e a amplitude que o usuario esta tocando. Esta determinacao e feita observando

as notas fundamentais (dada a posicao dos pistos) e entao e verificada qual fundamental

esta mais proxima da frequencia atual (considerando como limiar a metade entre as duas

frequencias). Com isso, mesmo que haja algum erro pequeno na identificacao da frequencia,

Page 58: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 44

enquanto ele estiver dentro da faixa de frequencias, a nota sera identificada com sucesso. Como

o comportamento do ganho do conjunto microfone, labios e tubo foi percebido nao ser igual

com faixas de frequencias diferentes, tambem e necessario nessa etapa normalizar o valor da

amplitude.

Finalmente nesta parte do codigo, os ciclos restantes (dos 200 originais) sao dedicados

a geracao da forma de onda do trompete (linhas 371 a 400 de ”adc.c”). E usado o metodo

de decimacao de uma onda pre-definida pelo usuario, como explicado na Subsubsecao 2.3.2.3.

Inicialmente se optou por reproduzir uma onda pre-calculada (Subsubsecao 2.3.2.1) pelo numero

de vezes que fosse necessario (ate encher o buffer), mas se verificou que transicoes de notas

eram muito abruptas e esta logica no futuro dificultaria a implementacao de trombones de

vara, que nao seguem o modelo de frequencias tabeladas. Como o tempo restante para esta

operacao e menos que 10% da capacidade de calculo do trompete (deve-se lembrar que qualquer

operacao neste escalonador nao deve ultrapassar o tempo entre 2 amostras saıda de som), a

operacao foi dividida entre os ciclos restantes.

Depois deste passo do escalonador, sao tratados o metronomo, os LEDs e os botoes,

que sao discutidos em detalhe em sua propria secao. Para fins de verificacao de erros e para

gravacao de formas de onda esta previsto a escrita de alguma das variaveis internas na variavel

SCOPE (linha 471 de ”adc.c”). Este metodo foi usado para a gravacao dos valores brutos

do ADC para fazer a simulacao dos metodos de determinacao de frequencia. O passo final

(linha 454 de ”adc.c”) e a atualizacao de variaveis do escalonador e, como foi conveniente, a

verificacao se o cartao SD foi conectado/desconectado.

3.3.6 LEDS, BOTOES E METRONOMO

Os LEDs sao acionados via PWM dentro do escalonador. O PWM e implementado via

hardware e tem ate 50 nıveis de intensidade (o que implica que a frequencia de oscilacao e de

80Hz) e pode ter seu valor programado via variaveis globais. Como sao um sistema nao-crıtico,

nao implementam nenhuma logica mais avancada para evitar glitches.

Os botoes sao tratados na mesma funcao (linhas 21 a 34 de ”leds.c”) e usam uma

logica de debouncing baseada em set/decremento de uma variavel. Com essa logica, a qualquer

momento em que o botao estiver apertado, a variavel interna e setada em um valor maximo. A

qualquer momento, sao necessarios pelo menos 10 amostras (10/4000=2.5ms de debouncing)

com o botao ”solto”(ou oscilando) para que o mesmo seja considerado apropriadamente solto.

O metronomo e executado em sua propria funcao dentro do escalonador (linhas 433 a

453 de ”adc.c”). Ele funciona verificando a cada vez se precisa tocar o bipe, enquanto o bipe em

si adiciona uma onda quadrada de parametros programaveis no buffer de audio. Esta funcao

executa um bipe a cada 60/BPM segundos e tambem implementa logica de compasso: 1 a

cada n (onde n e o valor do compasso) bipes e diferenciado para indicar a barra de compasso

em uma partitura). O programa tecnicamente aceita ate 65535BPM com compasso 4:255 (255

bipes em um compasso), mas e limitado pelo menu correspondente a 300BPM e 4:16.

Page 59: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 45

3.3.7 MENUS - LCD

Os displays de LCD de 16x2 caracteres tem comportamento derivado do ADM1602K,

que e um circuito integrado controlador de displays deste genero. O funcionamento e relativa-

mente simples, podendo-se fazer todo o controle usando os pinos:

• R/S - Seletor de leitura/escrita de dados do/para o display

• E - Enable/clock

• C/D - Seletor de modo comando/dados

• D[4/8] - Pinos de dados transmitidos/lidos

• LED - Backlight

• Contraste

Um detalhe interessante de ser notado e que a programacao pode ser feita comple-

tamente via apenas 4 pinos de dados. Alem disso, comumente nao e necessario ler dados

do display, portanto pode-se colocar um resistor de pull-up no pino R/S. Como mencionado

na construcao eletronica, os pinos de LED e de Contraste serao controlados pelo firmware,

possibilitando ao usuario o ajuste sem precisar alterar o circuito nem mexer em potenciometros.

Como o funcionamento de displays desse tipo e bem documentado (existindo ate um emulador

on-line desse modelo de display Home (2017)), nao sera explicado o comportamento em baixo

nıvel, sendo que o mesmo pode ser encontrado no arquivo do apendice ”lcd.c”.

Ja o funcionamento dos menus usando o display e os botoes foi projetado para ser

modular, facilitando a adicao de novas funcionalidades. Os menus tem o formato:

• Painel/janela principal

– Submenu 1 (por exemplo ”Metronomo”)

∗ Item 1 (por exemplo ”Tempo”)

∗ Item 2 (por exemplo ”Ritmo”)

∗ ...

– Submenu 2 (por exemplo ”Audio”)

∗ ...

– Submenu 3 (por exemplo ”LCD”)

∗ ...

– ...

O painel principal mostra em tempo real informacoes sobre o que esta sendo tocado

como por exemplo afinacao, nota, amplitude (desde pianıssimo ate fortıssimo) e nıvel de bateria

(se ligado via bateria). Os botoes laterais e inferior foram reservados para implementar uma

funcionalidade de ”preset”, para o caso de, por exemplo, em um evento ao-vivo, o instrumentista

trocar o funcionamento do trompete com apenas um botao.

Ao apertar no botao de cima a tela mostra o submenu, que tem o objetivo de agrupar

configuracoes de maneira intuitiva. Botoes laterais selecionam o submenu desejado. O botao

superior volta a tela principal e o botao inferior entra no submenu desejado.

Os itens em um submenu podem ter modos de funcionamento diferentes, uma vez que

Page 60: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 46

e prevista a entrada de valores inteiros (para, por exemplo, selecao de tempo no metronomo),

valores em ponto fixo (como por exemplo selecao de frequencia do bipe do metronomo), selecao

de itens (salvar/carregar configuracoes do cartao SD, por exemplo) ou entrada de strings

(selecao de rede WiFi, senha ou nome padrao de arquivo MIDI).

Dentro dos itens, os botoes laterais selecionam o item desejado enquanto o botao

central volta aos submenus. Os botoes superior/inferior selecionam o valor para campos enume-

raveis (itens em uma lista, valores inteiros ou ponto fixo). Os botoes de incremento/decremento

apresentam comportamento exponencial: Ao se manter apertado, o incremento de valores

aumenta com o tempo, o que ajuda a fazer grandes mudancas de valor em pouco tempo. Os

outros botoes funcionam de maneira convencional: somente a transicao de solto para apertado

gera um comportamento de ”botao apertado”.

3.3.8 ARMAZENAMENTO - CARTAO SD

Apesar de ser possıvel o armazenamento de configuracoes e ate arquivos MIDI no

ESP-01, seu tamanho reduzido e necessidade do trompete estar ligado fazem com que o cartao

micro SD seja uma boa opcao para armazenamento de alta velocidade e densidade.

Para acelerar o desenvolvimento e seguranca, foi usada a biblioteca FatFs por ChaN

(2017), que implementa o protocolo SD e tambem o sistema de arquivos FAT, bastando apenas

descrever como e feita a interface com hardware (envio e recebimento de dados pela SPI). No

projeto foram implementadas funcoes para o salvamento de musicas e tambem configuracoes

do usuario via protocolo de formato fixo (cada configuracao fica em uma posicao conhecida do

arquivo, unico para aquela versao do firmware).

3.3.9 PROGRAMACAO DO ESP-01 E COMPUTADOR

O codigo fonte do ESP-01 pode ser encontrado no Apendice B. O ESP tem duas

funcoes basicas: a transmissao de pacotes MIDI via UDP e uma interface WEB para a

configuracao do trompete. Os dados sao transmitidos via UDP pela rede pela necessidade

da entrega rapida dos pacotes do trompete ao protocolo e tambem porque nao e realmente

necessario ter garantias de entrega dos pacotes, uma vez que este trabalho so se propoe a

entregar tais pacotes na rede local.

O ESP-01 transmite os pacotes em modo broadcast, o que significa que todos os

dispositivos da rede local recebem dados do trompete. Devido ao ID do MIDI, a limitacao de

numero de trompetes tocando ao mesmo tempo na mesma rede e de 16 instrumentos. Para

a conversao dos pacotes UDP para sinais internos MIDI (que por sua vez sao adquiridos por

programas sintetizadores) e usado o MidiUdpRouter por Poirel (2011) que faz exatamente este

trabalho.

Todas as preferencias do trompete estao disponıveis pela interface WEB. de maneira

interna, caso o usuario altere alguma propriedade em uma das duas interfaces, o programa

Page 61: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 3. DESENVOLVIMENTO DO PROTOTIPO 47

desta interface vai pedir a outra para atualizar sua tabela de propriedades, o que para nıvel de

aplicacao vai fazer com que a tabela seja espelhada nos dois dispositivos.

Page 62: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

48

4 VALIDACAO DO PROTOTIPO

4.1 INTERFACE COM USUARIO

A montagem do prototipo (mostrada na Figura 45, na Figura 46 e na Figura 47)

protege as placas eletronicas e se encaixa na mao como um trompete convencional, apesar de

ter peso e centro de massa diferente do trompete convencional.

Figura 45 – Montagem vista de lateral posterior

Fonte: O autor

Figura 46 – Montagem vista de lateral anterior

Fonte: O autor

Page 63: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 4. VALIDACAO DO PROTOTIPO 49

Figura 47 – Montagem vista como pelo usuario

Fonte: O autor

Os menus (Figura 48 e Figura 49) sao acessıveis pela mao direita enquanto a mao

esquerda segura o trompete. Apesar de nao ser possıvel dedilhar os pistos, e possıvel usar o

menu enquanto se usa o bocal. E interessante remarcar que a tela principal(Figura 48) mostra

a amplitude/forca do som tocado, indicada pelo mf (ou mezzo forte), a nota tocada (G4)

enquanto mostra com uma barra vertical a afinacao. O quao mais proximo do centro a barra

esta, mais afinado o usuario esta.

Figura 48 – Tela principal vista pelo usuario

Fonte: O autor

Page 64: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 4. VALIDACAO DO PROTOTIPO 50

Figura 49 – Tela do menu de opcoes

Fonte: O autor

4.2 PROCESSAMENTO DE AUDIO

Devido as providencias tomadas com relacao a temporizacoes, se sabe que o tempo

entre o usuario tocar uma nota e a nota ser reproduzida no volume correto esta entre 50

e 100ms (correspondente ao tempo entre identificacoes de nota e o tempo de rampa na

reproducao do som).

A Figura 50 mostra o desempenho do algoritmo em uma situacao de varredura de

frequencias. Ja a Figura 51 mostra o instrumentista praticando golpes com a lıngua, executando

o movimento conhecido por ”Ta-Ta-Ta”. A Figura 52 e similar, mas com a manutencao da nota

no final do ultimo golpe. E interessante notar que apesar de haverem incoerencias pequenas,

estas em geral sao corrigidas pelo algoritmo que decide a nota, corrigindo a nota tocada.

A reproducao do som acontece sem falhas e consegue reproduzir a onda base em

qualquer frequencia na faixa de utilizacao, como mostra a Figura 53 (reproduzindo uma onda

de 30Hz), a Figura 54 (reproduzindo uma onda de 300Hz) e a Figura 55 (reproduzindo uma

onda de 1000Hz). A Figura 56 mostra a forma de onda original que e usada para o calculo de

todas as frequencias.

4.3 CUSTOS DO PROJETO

A Tabela 1 mostra os custos totais de desenvolvimento do projeto. Devido a proposta

inicial ser voltada a facil confeccao por amadores, a tabela de custos esta dividida em tres

tabelas: uma para a confeccao dos componentes deste trabalho com 2 placas, componentes

comprados no comercio local, placas de desenvolvimento (Tabela 2) e outra com uma estimativa

media de custo de producao, comprando componentes individuais em media escala (100 pecas)

e fabricando placas exclusivas (Tabela 3).

Page 65: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 4. VALIDACAO DO PROTOTIPO 51

Figura 50 – Algoritmo (em vermelho) versus densidade de potencia em sweep

Fonte: O autor

Figura 51 – Algoritmo (em vermelho) versus densidade de potencia em Ta-Ta-Ta

Fonte: O autor

Note que mesmo que seja adotado um preco de venda relativamente reduzido de

Page 66: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 4. VALIDACAO DO PROTOTIPO 52

Figura 52 – Algoritmo (em vermelho) versus densidade de potencia em Ta-Ta-Taaa

Fonte: O autor

Figura 53 – Valores brutos para uma reproducao de 30Hz

Fonte: O autor

R$200,00, o ponto de equilıbrio (numero de vendas mınimas para se ter lucro nulo) esta em

torno dos 180 instrumentos.

Page 67: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 4. VALIDACAO DO PROTOTIPO 53

Figura 54 – Valores brutos para uma reproducao de 300Hz

Fonte: O autor

Figura 55 – Valores brutos para uma reproducao de 1000Hz

Fonte: O autor

Page 68: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 4. VALIDACAO DO PROTOTIPO 54

Figura 56 – Forma de onda padrao

Fonte: O autor

Tabela 1 – Custos Fixos

Item Custo (Hh) Custo (R$) Custo (US$)

Licenca empresarial Matlab 2650,00Impressora 3D 1500,00

Desenvolvimento do trabalho 500Computador 3000,00

Molde de injecao de plastico 5000,00Estacao de solda 300,00

Ferramentaria 200,00Fator de conversao 15R$/h 1 3,30R$/US$

Total 26.245,00

Page 69: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 4. VALIDACAO DO PROTOTIPO 55

Tabela 2 – Custos Variaveis - Producao artesanal

Item Custo (Hh) Custo (R$) Custo (US$)

Tubo e partes de PVC 3,00Corpo em PLA (Impresso 3D) 30,00Pistos em PLA (Impresso 3D) 10,00

LCD holder em PLA (Impresso 3D) 6,00Componentes para as placas 15,28

Conjunto emissor/receptor IR 4,77LCD 16x2 10,00

Placa MSP-EXP432P401R 13,50Placa Regulador LM2596 5,00

Conector micro SD 8,00Confeccao das placas 2 10,00Montagem das placas 3

Fator de conversao 8R$/h 1 3,30R$/US$Total 186,60

Tabela 3 – Custos Variaveis - Producao semi-industrial

Item Custo (Hh) Custo (R$) Custo (US$) Fornecedor

Mecanica em plastico injetado 5,00 EstimativaComponentes para as placas 1,00 Farnell

Conjunto emissor/receptor IR 0,46 AlibabaLCD 16x2 2,20 Alibaba

MSP-EXP432P401R 5,82 FarnellLM2596 0,65 Alibaba

Conector micro SD 0,10 AlibabaPlacas 4 camadas 50x40mm 2,25 x EasyEDA

Montagem das placas 1Fator de conversao 8R$/h 1 3,30R$/US$

Total 54,18

Page 70: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

56

5 CONCLUSAO

Neste trabalho foi desenvolvido um instrumento eletronico com objetivo de imitar

todas as funcionalidades de um trompete, tendo como pontos principais a reducao de custo e

de ruıdo sonoro causado pela pratica.

Para atenuar o ruıdo sonoro, foi implementado um tubo em PVC com atenuador

de ondas sonoras em espuma de polipropileno com encaixe para o bocal, que atenuou o

ruıdo gerado pelo bocal passivamente. Foram apresentadas aqui tambem todas as tecnicas de

processamento de audio pesquisadas para identificacao de frequencia, sendo que a mais viavel

para o cenario foi a deteccao de cruzamento por nıvel variavel com a amplitude da onda. A

frequencia tocada foi determinada via media dos ultimos 50ms ou pelo menos 5 cruzamentos

(para as frequencias mais baixas) e a amplitude e determinada pelo valor RMS do sinal de

entrada.

Foi feito um estudo detalhado dos pistos e foi implementada uma solucao impressa

em PLA com sensor de infravermelho, simulando o funcionamento, deslocamento e forcas

necessarias para o uso assim como o pisto real.

A identificacao da nota a ser tocada e feita usando um criterio de nota possıvel mais

proxima da frequencia identificada, sendo que a amplitude e determinada atraves de uma

adequacao do valor RMS da onda para os limites verificados dada a frequencia de entrada.

Foi implementado um circuito de saıda de audio para fones de ouvido baseado em

PWM do sinal de audio gerado internamente, passando apenas por um buffer de potencia e um

capacitor de corte de DC, sendo o trabalho de filtro de altas frequencias feito pela indutancia

do fone de ouvido e pelo ouvido humano.

Para gerar tal sinal de audio, foi implementado uma tecnica de subamostragem de uma

forma de onda conhecida e programavel pelo usuario, sendo feita no laco principal com latencia

maxima de 50ms. A interface com o usuario foi implementava via um display LCD e botoes,

com acesso a todas as opcoes configuraveis em um esquema de menus de facil utilizacao. A

tela principal mostra informacoes de afinacao, amplitude tocada, nota identificada e estado da

bateria.

Foi implementado um metronomo via fone de ouvido, com volume, tempo, compasso

e frequencias configuraveis pelo usuario. A escrita em dados e notas tocadas foi implementada,

juntamente com a transmissao de pacotes UDP contendo dados MIDI para um computador

com um conversor adequado.

As notas detectadas ainda passam via WiFi para um computador que tem a capacidade

de gerar notas a partir dos codigos MIDI enviados, o que possibilita a geracao de um audio

mais fiel ao trompete ou ainda gravacao de notas. E interessante notar que devido a demora

perceptıvel pela cadeia que passa por uma serial, WiFi usando UDP e finalmente captura

pelo computador, este metodo nao e recomendado para a reproducao em tempo real, tendo o

Page 71: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Capıtulo 5. CONCLUSAO 57

instrumentista que usar a saıda via fone de ouvido.

Finalmente, todos os itens acima (pelo menos os que nao foram comprados prontos

do exterior) foram implementados usando placas de face simples, uma impressora 3D caseira e

materiais de facil obtencao, facilitando a replicacao por amadores. Devido a conclusao de cada

um dos objetivos especıficos, pode se considerar que este trabalho teve sucesso na confeccao

de um trompete eletronico.

Devido a natureza do projeto e do funcionamento do trompete, e possıvel incrementar

este trabalho para fazer tarefas alem do escopo deste trabalho de TCC, sendo algumas delas

provavelmente possıveis apenas com o envolvimento de profissionais das respectivas areas:

• Pesquisar e implementar uma estrutura passiva ou ativa para a reducao significativa do

ruıdo audıvel causado pelo bocal (Tendo como meta alcancar 20dB ou menos de ruıdo,

o que equivale a um sussurro);

• Implementar o projeto em apenas uma placa dedicada, para a comercializacao do hardware;

• Implementar uma vara de trombone que meca a distancia aplicada pelo usuario

• Implementar todos os instrumentos da famılia dos metais no mesmo instrumento (mu-

dando apenas o bocal e pecas adicionais)

• Implementar e criar material para um tutor eletronico, que ensine o usuario a tocar o

instrumento com o mınimo de outros equipamentos.

Page 72: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

58

Referencias

APEL, W. Harward Dictionary of Music. 6. ed. Cambridge, Massachussets: Harvard Univer-sity Press, 1950. Citado 3 vezes nas paginas 4, 5 e 7.

BERKOPEC, B. The physics of the trumpet. Burlington: University of Ljubljana, 2003.Citado na pagina 7.

BOSCH. BMP180 DIGITAL PRESSURE SENSOR Datasheet. [S.l.], 2013. Citado napagina 11.

CHAN. MidiUdpRouter. 2017. Disponıvel em: <http://elm-chan.org/fsw/ff/00index e.html>. Acesso em: 16 de novembro de 2017. Citado na pagina 46.

HOME, D. A. Dincer’s JavaScript LCD Simulator V 1.06. 2017. Disponıvel em: <http://www.dinceraydin.com/djlcdsim/djlcdsim.html>. Acesso em: 16 de novembro de 2017. Citadona pagina 45.

JACOBSEN, E.; LYONS, R. The sliding dft. IEEE Signal Processing Magazine, p. 74–80,2003. Citado na pagina 24.

MORRISON, J. Morrison Digital Trumpet. 2005. Disponıvel em: <http://www.digitaltrumpet.com.au/>. Acesso em: 16 de novembro de 2017. Citado na pagina 10.

MUSIC, F. Yamaha trots out EZ-TP - Electronic Teaching ins-trument. 2017. Disponıvel em: <http://futuremusic.com/2008/10/27/yamaha-trots-out-ez-tp-electronic-teaching-trumpet/>. Acesso em: 16 de novembrode 2017. Citado na pagina 9.

OPPENHEIM, R. W. S. A. V. Discrete-time signal processing. 2. ed. New Jersey: PrenticeHall, 1998. Citado 3 vezes nas paginas 23, 26 e 40.

POIREL, O. MidiUdpRouter. 2011. Disponıvel em: <http://opoirel.free.fr/MidiKeyboard/MidiUdpRouter.exe>. Acesso em: 16 de novembro de 2017. Citado na pagina 46.

TEXAS INSTRUMENTS. MSP432P401R, MSP432P401M SimpleLinkTM Mixed-SignalMicrocontrollers. [S.l.], 2015. Citado na pagina 31.

Page 73: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

Apendices

Page 74: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

60

APENDICE A – APENDICE: CODIGOS FONTE MSP432

1

2 #include "driverlib.h"

3 #include <stdint.h>

4 #include "src/globals.h"

5 #include "src/leds.h"

6 #include "src/player.h"

7 #include "src/audio.h"

8 #include "src/adc.h"

9 #include "src/instrumentos.h"

10 #include "src/sdcard.h"

11 #include "src/testes.h"

12 #include "res/seno_puro.h"

13 #include "src/lcd_16x2.h"

14 #include "src/telas.h"

15

16

17 //#include "time.h"

18 //#include "adc.h"

19 //#include "instrumento.h"

20 //#include "ff12c/ff.h"

21

22

23 //FATFS FatFs;

24 //FIL Fil;

25 //int nota=48, volume =255, decalagem = 70;

26 //UINT bw;

27

28

29 void TA1_N_IRQHandler(void)

30 audio_interrupt_handler ();

31

32 const int16_t fortissimo_2x [4000] =

33

34 ;

35 const int16_t pianissimo_2x [4000] =

36

37 ;

38 int main(void)

39 MAP_WDT_A_holdTimer ();

40 MAP_FPU_enableModule ();

41 inicializar_osciladores ();

42 inicializar_leds ();

43 inicializar_notas (( int16_t *) default_string_notas);

44 inicializar_adc ();

45 inicializar_lcd16x2 ();

46 inicializar_audio ();

47 MAP_Interrupt_enableMaster ();

48 inicializar_sdcard ();

49 if(sdcard_load_configs("cfg/cfg.txt") <0)

50 lcd_printStr (0,0," Falha Carregam ");

51 lcd_printStr (1,0," Configuracoes ");

52 delay_us (300000);

53

54

55 PISTOS_CALIBRACAO = 0;

Page 75: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 61

56 PISTOS_LIMIAR_DECISAO [0] = 1500;

57 PISTOS_LIMIAR_DECISAO [1] = 1500;

58 PISTOS_LIMIAR_DECISAO [2] = 1500;

59

60 PLAYER_TIMBRE_TAMANHO = 4000;

61 PLAYER_TIMBRE_FF = (int16_t *) fortissimo_2x;

62 PLAYER_TIMBRE_PP = (int16_t *) pianissimo_2x;

63

64 // PLAYER_FREQ_NOVA_10 = 3300;

65 // PLAYER_AMPLI_NOVA = 60;

66 // METRONOMO_BPM = 0;

67 //while (1)

68 // delay_us (1000*1000);

69 // // PLAYER_FREQ_NOVA_10 = 3300;

70 // delay_us (1000*1000);

71 // // PLAYER_FREQ_NOVA_10 = 4000;

72 // delay_us (1000*1000);

73 // // PLAYER_FREQ_NOVA_10 = 6000;

74 // // inicializar_audio ();

75 //

76

77

78

79 // test_microfone_c_sdcard (" rawdata.txt");

80 // test_pistos_c_leds ();

81 //while(BOTOES [1])

82 // delay_us (1000);

83 //

84 //while(! BOTOES [1])

85 // delay_us (1000);

86 //

87 //LEDS [9] = 50;

88 //x = sdcard_save_configs ();

89 //x = sdcard_load_configs ();

90 // test_leds_c_pistos ();

91 // test_pistos_c_leds ();

92 // test_metronomo_tempo_c_pistos ();

93 // test_player_c_pistos ();

94 // test_sdcard_write_c_leds ();

95 // test_microfone_c_sdcard ("mic.raw");

96

97 while (1)

98 telas_executar ();

99

100

101 void verificarTarefas ()

102 char strerr []=" ERRO! cod ";

103

104 if(CMD_LOADFROMSD)

105 int8_t status = sdcard_load_configs("cfg/cfg.txt");

106 if(status ==0)

107 lcd_printStr (1,0," CFG CARREGADAS!");

108 else

109 if(status <0)

110 strerr [11]=’-’;

111 strerr [12]=’0’-status;

112 else

113 strerr [11]=’0’+status;

114

115 lcd_printStr (1,0,strerr);

Page 76: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 62

116

117 CMD_LOADFROMSD = 0;

118 delay_us (300000);

119

120 if(CMD_SAVETOSD)

121 int8_t status = sdcard_save_configs("cfg/cfg.txt");

122 if(status ==0)

123 lcd_printStr (1,0," CFG SALVAS! ");

124 else

125 if(status <0)

126 strerr [11]=’-’;

127 strerr [12]=’0’-status;

128 else

129 strerr [11]=’0’+status;

130

131 lcd_printStr (1,0,strerr);

132

133 CMD_SAVETOSD = 0;

134 delay_us (300000);

135

136 if(CMD_SAVERAW)

137 FIL File;

138 unsigned int bw;

139 char endereco [20];

140 lcd_printStr (1,0," Gravando ... ");

141 if(sdcard_find_next_with("mic.raw",endereco) <0)

142 CMD_SAVERAW = 0;

143 return;

144

145 LEDS [7] = 50;

146 LEDS [9] = 0;

147 if(f_open (&File ,endereco ,FA_CREATE_ALWAYS | FA_WRITE)!=FR_OK)

148 lcd_printStr (1,0,"Erro criar arq. ");

149 delay_us (300000);

150 else

151 while(! BOTOES[BUTTONID_MID ])

152 LEDS [9] = 50;

153 LEDS [7] = 50;

154 while(SCOPE_POS <SCOPE_SIZE /2);

155 LEDS [7] = 0;

156 f_write (&File , &SCOPE [0][0] , SCOPE_WIDTH*SCOPE_SIZE , &bw);

157 LEDS [9] = 0;

158 if(bw!= SCOPE_WIDTH*SCOPE_SIZE)

159 f_close (&File);

160 BOTOES[BUTTONID_MID] = 1;

161 continue;

162

163 LEDS [7] = 50;

164 while(SCOPE_POS >= SCOPE_SIZE /2);

165 LEDS [7] = 0;

166 LEDS [9] = 50;

167 f_write (&File , &SCOPE[SCOPE_SIZE /2][0] , SCOPE_WIDTH*SCOPE_SIZE , &bw);

168 LEDS [9] = 0;

169 if(bw!= SCOPE_WIDTH*SCOPE_SIZE)

170 f_close (&File);

171 BOTOES[BUTTONID_MID] = 1;

172 continue;

173

174 f_sync (&File);

175

Page 77: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 63

176 f_close (&File);

177 while(BOTOES[BUTTONID_MID ]) delay_us (1000);

178

179 CMD_SAVERAW = 0;

180

181

1 /*

2 * adc.h

3 *

4 * Implementacao do escalonador de tarefas do ADC.

5 *

6 */

7 #ifndef _ADC_H_

8 #define _ADC_H_

9

10 #include "globals.h"

11 #include "player.h"

12 #include "leds.h"

13

14 void inicializar_adc ();

15 inline void adc_interrupt_handler ();

16 inline static void adcsch_iniciar_leitura ();

17 inline static void adcsch_leitura_pistos ();

18 inline static void adcsch_media_rms2 ();

19 inline static void adcsch_rms ();

20 inline static void adcsch_identificacao_bordas ();

21 inline static void adcsch_verificar_frequencia ();

22 inline static void adcsch_metronomo ();

23 inline static void adcsch_final ();

24 inline static void adcsch_scope ();

25

26

27 #endif

1 /*

2 * adc.h

3 *

4 * Implementacao do escalonador de tarefas do ADC.

5 *

6 */

7 #include "adc.h"

8

9

10 void inicializar_adc ()

11 int i;

12 MAP_ADC14_enableModule ();

13 MAP_ADC14_initModule(ADC_CLOCKSOURCE_MCLK , ADC_PREDIVIDER_1 , ADC_DIVIDER_4 , 0);

14 MAP_ADC14_setPowerMode(ADC_UNRESTRICTED_POWER_MODE);

15 MAP_ADC14_setResolution(ADC_14BIT);

16 MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P4 ,

17 GPIO_PIN0 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN7 ,

18 GPIO_TERTIARY_MODULE_FUNCTION);

19 MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6 ,

20 GPIO_PIN0 | GPIO_PIN1 ,

21 GPIO_TERTIARY_MODULE_FUNCTION);

22 MAP_ADC14_configureMultiSequenceMode(ADC_MEM0 , ADC_MEM7 , false);

23 MAP_ADC14_configureConversionMemory(ADC_MEM0 ,ADC_VREFPOS_AVCC_VREFNEG_VSS ,

ADC_INPUT_A14 , false);

Page 78: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 64

24 MAP_ADC14_configureConversionMemory(ADC_MEM1 ,ADC_VREFPOS_AVCC_VREFNEG_VSS ,

ADC_INPUT_A13 , false);

25 MAP_ADC14_configureConversionMemory(ADC_MEM2 ,ADC_VREFPOS_AVCC_VREFNEG_VSS ,

ADC_INPUT_A11 , false);

26 MAP_ADC14_configureConversionMemory(ADC_MEM3 ,ADC_VREFPOS_AVCC_VREFNEG_VSS ,

ADC_INPUT_A9 , false);

27 MAP_ADC14_configureConversionMemory(ADC_MEM4 ,ADC_VREFPOS_AVCC_VREFNEG_VSS ,

ADC_INPUT_A8 , false);

28 MAP_ADC14_configureConversionMemory(ADC_MEM5 ,ADC_VREFPOS_AVCC_VREFNEG_VSS ,

ADC_INPUT_A6 , false);

29 MAP_ADC14_configureConversionMemory(ADC_MEM6 ,ADC_VREFPOS_AVCC_VREFNEG_VSS ,

ADC_INPUT_A15 , false);

30 MAP_ADC14_configureConversionMemory(ADC_MEM7 ,ADC_VREFPOS_AVCC_VREFNEG_VSS ,

ADC_INPUT_A10 , false);

31 MAP_ADC14_enableSampleTimer(ADC_AUTOMATIC_ITERATION);

32 MAP_ADC14_enableConversion ();

33 for(i=0;i<ADC_BUFFER_SIZE;i++)

34 ADC_BUFFER_MEDIA[i]=0;

35 ADC_BUFFER_RMS[i]=0;

36

37 for(i=0;i<8;i++)

38 ADC_SUBBUFFER[i] = 0;

39

40 for(i=0;i<3;i++)

41 PISTOS_LIMIAR_POS[i] = 0;

42 PISTOS_LIMIAR_NEG[i] = 0xFFFF;

43 PISTOS_LIMIAR_DECISAO[i] = 0x8000;

44

45 PISTOS = 0;

46 ADC_BUFFER_POS = 0;

47 ADC_ESCALONADOR = 0;

48 ADC_TICK =0;

49 ADC_SOMA_MEDIA =0;

50 ADC_SOMA_RMS =0;

51 ADC_MEDIA =0;

52 ADC_RMS2 =0;

53 ADC_RMS =0;

54 ADC_CRUZAMENTO_DIRECAO = 0;

55 ADC_CRUZAMENTO_LIMIAR = 0;

56 ADC_CRUZAMENTO_MAIOR_TEMPO = 0;

57 ADC_CRUZAMENTO_MENOR_TEMPO = 0;

58 ADC_CRUZAMENTO_NR_PULSOS = 0;

59 ADC_CRUZAMENTO_TEMPO_PRIMEIRO = 0;

60 ADC_CRUZAMENTO_TEMPO_ULTIMO = 0;

61 PISTOS_CALIBRACAO = 1;

62 for(i=0;i<ADC_LAST_CROSSING_SIZE;i++)

63 ADC_LAST_CROSSINGS[i]=0;

64

65

66

67 inline void adc_interrupt_handler ()

68 if(ADC_ESCALONADOR ==0)

69 adcsch_iniciar_leitura ();

70 else if(ADC_ESCALONADOR ==1)

71 adcsch_leitura_pistos ();

72 else if(ADC_ESCALONADOR ==2)

73 adcsch_media_rms2 ();

74 else if(ADC_ESCALONADOR ==3)

75 adcsch_rms ();

76 else if(ADC_ESCALONADOR ==4)

Page 79: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 65

77 adcsch_identificacao_bordas ();

78 else if(ADC_ESCALONADOR ==5)

79 adcsch_verificar_frequencia ();

80 else if(ADC_ESCALONADOR ==6)

81 adcsch_metronomo ();

82 else if(ADC_ESCALONADOR ==7)

83 leds_interrupt_handler ();

84 #ifdef SCOPE_ON

85 else if(ADC_ESCALONADOR ==8)

86 adcsch_scope ();

87 #endif

88 else if(ADC_ESCALONADOR ==9)

89 adcsch_final ();

90

91 ADC_ESCALONADOR ++;

92 if(ADC_ESCALONADOR >= ADC_DIVISION)

93 ADC_ESCALONADOR =0;

94

95

96

97 inline static void adcsch_iniciar_leitura ()

98 MAP_ADC14_toggleConversionTrigger ();

99

100

101 inline static void adcsch_leitura_pistos ()

102 MAP_ADC14_getMultiSequenceResult(ADC_SUBBUFFER);

103 if(PISTOS_CALIBRACAO)

104 if(ADC_SUBBUFFER[ISB_PISTO1]>PISTOS_LIMIAR_POS [0])

105 PISTOS_LIMIAR_POS [0] = ADC_SUBBUFFER[ISB_PISTO1 ]+1;

106 PISTOS_LIMIAR_DECISAO [0] = (PISTOS_LIMIAR_POS [0]+ PISTOS_LIMIAR_NEG [0]) >>1;

107

108 if(ADC_SUBBUFFER[ISB_PISTO1]<PISTOS_LIMIAR_NEG [0])

109 PISTOS_LIMIAR_NEG [0] = ADC_SUBBUFFER[ISB_PISTO1 ]-3;

110 PISTOS_LIMIAR_DECISAO [0] = (PISTOS_LIMIAR_POS [0]+ PISTOS_LIMIAR_NEG [0]) >>1;

111

112 if(ADC_SUBBUFFER[ISB_PISTO2]>PISTOS_LIMIAR_POS [1])

113 PISTOS_LIMIAR_POS [1] = ADC_SUBBUFFER[ISB_PISTO2 ]+1;

114 PISTOS_LIMIAR_DECISAO [1] = (PISTOS_LIMIAR_POS [1]+ PISTOS_LIMIAR_NEG [1]) >>1;

115

116 if(ADC_SUBBUFFER[ISB_PISTO2]<PISTOS_LIMIAR_NEG [1])

117 PISTOS_LIMIAR_NEG [1] = ADC_SUBBUFFER[ISB_PISTO2 ]-3;

118 PISTOS_LIMIAR_DECISAO [1] = (PISTOS_LIMIAR_POS [1]+ PISTOS_LIMIAR_NEG [1]) >>1;

119

120 if(ADC_SUBBUFFER[ISB_PISTO3]>PISTOS_LIMIAR_POS [2])

121 PISTOS_LIMIAR_POS [2] = ADC_SUBBUFFER[ISB_PISTO3 ]+1;

122 PISTOS_LIMIAR_DECISAO [2] = (PISTOS_LIMIAR_POS [2]+ PISTOS_LIMIAR_NEG [2]) >>1;

123

124 if(ADC_SUBBUFFER[ISB_PISTO3]<PISTOS_LIMIAR_NEG [2])

125 PISTOS_LIMIAR_NEG [2] = ADC_SUBBUFFER[ISB_PISTO3 ]-3;

126 PISTOS_LIMIAR_DECISAO [2] = (PISTOS_LIMIAR_POS [2]+ PISTOS_LIMIAR_NEG [2]) >>1;

127

128

129 PISTOS = 0;

130 if(ADC_SUBBUFFER[ISB_PISTO1]>PISTOS_LIMIAR_DECISAO [0]) PISTOS +=2;

131 if(ADC_SUBBUFFER[ISB_PISTO2]>PISTOS_LIMIAR_DECISAO [1]) PISTOS +=1;

132 if(ADC_SUBBUFFER[ISB_PISTO3]>PISTOS_LIMIAR_DECISAO [2]) PISTOS +=3;

133

134

135 inline static void adcsch_media_rms2 ()

136 int32_t i, k;

Page 80: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 66

137 i = ADC_SUBBUFFER[ISB_MICROFONE_BOCAL ];

138 k = (int32_t)i - (int32_t)ADC_BUFFER_MEDIA[ADC_BUFFER_POS ];

139 ADC_SOMA_MEDIA = (int32_t)ADC_SOMA_MEDIA+k;

140 ADC_MEDIA = ADC_SOMA_MEDIA/ADC_BUFFER_SIZE;

141 k = i - ADC_MEDIA;

142 ADC_SOMA_RMS += (( int32_t)k*k) - (int32_t)ADC_BUFFER_RMS[ADC_BUFFER_POS ];

143 ADC_RMS2 = ADC_SOMA_RMS/ADC_BUFFER_SIZE;

144 ADC_BUFFER_MEDIA[ADC_BUFFER_POS] = i;

145 ADC_BUFFER_RMS[ADC_BUFFER_POS] = (uint32_t)(k*k);

146

147

148 inline static void adcsch_rms ()

149 ADC_RMS = uisqrt32(ADC_RMS2);

150

151

152 inline static void adcsch_identificacao_bordas ()

153 int32_t k;

154 k = ADC_SUBBUFFER[ISB_MICROFONE_BOCAL ];

155 if(ADC_CRUZAMENTO_DIRECAO)

156 if(k<ADC_CRUZAMENTO_LIMIAR -2* ADC_RMS)

157 ADC_CRUZAMENTO_DIRECAO = 0;

158 ADC_CRUZAMENTO_LIMIAR = k;

159 else if(k>ADC_CRUZAMENTO_LIMIAR)

160 ADC_CRUZAMENTO_LIMIAR = k;

161

162 else

163 if(k>ADC_CRUZAMENTO_LIMIAR +2* ADC_RMS)

164 ADC_CRUZAMENTO_DIRECAO = 1;

165 ADC_CRUZAMENTO_LIMIAR = k;

166

167 ADC_LAST_CROSSINGS_INDEX ++;

168 if(ADC_LAST_CROSSINGS_INDEX >= ADC_LAST_CROSSING_SIZE)ADC_LAST_CROSSINGS_INDEX

=0;

169 ADC_LAST_CROSSINGS[ADC_LAST_CROSSINGS_INDEX] = ADC_TICK;

170 /*

171 j = ADC_TICK - ADC_CRUZAMENTO_TEMPO_ULTIMO;

172 ADC_CRUZAMENTO_TEMPO_ULTIMO = ADC_TICK;

173 if(ADC_CRUZAMENTO_TEMPO_PRIMEIRO ==0)

174 ADC_CRUZAMENTO_TEMPO_PRIMEIRO=ADC_TICK;

175 else

176 if(j>ADC_CRUZAMENTO_MAIOR_TEMPO)

ADC_CRUZAMENTO_MAIOR_TEMPO=j;

177 if(j<ADC_CRUZAMENTO_MENOR_TEMPO)

ADC_CRUZAMENTO_MENOR_TEMPO=j;

178

179 ADC_CRUZAMENTO_NR_PULSOS ++;

180 */

181 else if(k<ADC_CRUZAMENTO_LIMIAR)

182 ADC_CRUZAMENTO_LIMIAR = k;

183

184

185 /*

186 if(ADC_CRUZAMENTO_TEMPO_ULTIMO +110< ADC_TICK)

187 ADC_CRUZAMENTO_TEMPO_PRIMEIRO = 0;

188 ADC_CRUZAMENTO_TEMPO_ULTIMO = 0;

189 ADC_CRUZAMENTO_NR_PULSOS = 0;

190 ADC_CRUZAMENTO_MAIOR_TEMPO = 0;

191 ADC_CRUZAMENTO_MENOR_TEMPO = 0xFFFF;

192

193 */

Page 81: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 67

194

195

196 inline void tocar_trompete_bB ()

197 int i,harmonica , amplitude;

198 uint16_t limiar;

199 const int harmonicas [9]=36 ,46 ,53 , 58,62,65, 68 ,70 ,72;

200 const int a_min [9]= 50, 100, 150, 200, 250, 300, 350, 400, 400;

201 const int a_max [9]= 300, 300, 500, 700, 900 ,1100 ,1200 ,1200 ,1200;

202 if(BOCAL_FREQUENCIAx10 ==0)

203 INSTRUMENTO_NOTA_NOMINAL = 0;

204 INSTRUMENTO_NOTA_CORRETO = 0;

205 PLAYER_AMPLI_NOVA =0;

206 PLAYER_FREQ_NOVA_10 = 0;

207 INSTRUMENTO_DESAFINACAO = 0;

208 // play_nota (0,0,600);

209 return;

210

211 harmonica = 0;

212 for(i=0;i<9;i++)

213 limiar = (NOTAS_FREQUENCIASx10[harmonicas[i+1]- PISTOS ]+

214 NOTAS_FREQUENCIASx10[harmonicas[i]-PISTOS ])/2;

215 if(BOCAL_FREQUENCIAx10 <limiar)

216 harmonica = i;

217 break;

218

219

220

221 // MIN x MAX

222 // 100 y 255

223 // y = 100+(255 -100) *(x-MIN)/(MAX -MIN)

224 if(harmonica ==0 || harmonica >=9)

225 INSTRUMENTO_NOTA_NOMINAL = 0;

226 INSTRUMENTO_NOTA_CORRETO = 0;

227 INSTRUMENTO_AMPLITUDE = 0;

228 PLAYER_AMPLI_NOVA =0;

229 PLAYER_FREQ_NOVA_10 = 0;

230 INSTRUMENTO_DESAFINACAO = 0;

231 // play_nota (0,0,600);

232 else

233 amplitude = 100+((255 -100) *(( int32_t)BOCAL_AMPLITUDE -a_min[harmonica ]))/(a_max[

harmonica]-a_min[harmonica ]);

234 if(amplitude <0) amplitude =0;

235 if(amplitude >255) amplitude =255;

236

237 INSTRUMENTO_NOTA_CORRETO = harmonicas[harmonica]-PISTOS;

238 INSTRUMENTO_NOTA_NOMINAL = INSTRUMENTO_NOTA_CORRETO +2;

239 INSTRUMENTO_AMPLITUDE = amplitude;

240

241 if(PLAYER_AMPLI_NOVA ==0) PLAYER_AMPLI_NOVA =255;

242 else PLAYER_AMPLI_NOVA=INSTRUMENTO_AMPLITUDE;

243 PLAYER_FREQ_NOVA_10 = NOTAS_FREQUENCIASx10[INSTRUMENTO_NOTA_CORRETO ];

244

245 if(BOCAL_FREQUENCIAx10 >NOTAS_FREQUENCIASx10[INSTRUMENTO_NOTA_CORRETO ])

246 uint32_t lim = (NOTAS_FREQUENCIASx10[harmonicas[harmonica +1]- PISTOS]-

247 NOTAS_FREQUENCIASx10[harmonicas[harmonica ]-PISTOS ])/2;

248 //Lim = diferen?absoluta entre a nota correta e a acima

249 uint32_t delta = BOCAL_FREQUENCIAx10 -NOTAS_FREQUENCIASx10[harmonicas[

harmonica]-PISTOS ];

250 //Delta: diferenca entre a tocada e a ideal

251 INSTRUMENTO_DESAFINACAO = 100+(100* delta)/lim;

Page 82: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 68

252 else

253 uint32_t lim = (NOTAS_FREQUENCIASx10[harmonicas[harmonica ]-PISTOS]-

254 NOTAS_FREQUENCIASx10[harmonicas[harmonica -1]- PISTOS ])/2;

255 //Lim = diferen?absoluta entre a nota abaixo e a correta

256 uint32_t delta = NOTAS_FREQUENCIASx10[harmonicas[harmonica]-PISTOS]-

BOCAL_FREQUENCIAx10;

257 //Delta: diferenca entre a tocada e a ideal

258 INSTRUMENTO_DESAFINACAO = 100 -(100* delta)/lim;

259

260 // play_nota(INSTRUMENTO_NOTA_REAL -2, INSTRUMENTO_AMPLITUDE ,800);

261 // play_nota(INSTRUMENTO_NOTA_REAL -2, INSTRUMENTO_AMPLITUDE ,400);

262

263

264

265

266

267

268

269

270

271 inline static void adcsch_verificar_frequencia ()

272

273 static int32_t step_freq_fxp16 =0;

274 static int32_t step_ampli_fxp16_ff =0;

275 static int32_t step_ampli_fxp16_pp =0;

276 static int32_t freq_fxp16 =0;

277 static int32_t ampli_fxp16_ff =0;

278 static int32_t ampli_fxp16_pp =0;

279 static uint32_t audio_in_pos_fxp16 = 0;

280 static uint_fast16_t audio_out_pos = 0;

281 static uint32_t audio_in_pos_max = 0;

282 static uint_fast8_t ok_to_play = 0;

283 static uint32_t freqNova , ampliNova;

284

285 uint_fast8_t subtick = ADC_TICK %200;

286 if(subtick ==0)

287 int32_t j;

288 if(ADC_RMS >ADC_MINIMUM_RMS && ADC_LAST_CROSSINGS[ADC_LAST_CROSSINGS_INDEX ]+110>

ADC_TICK)

289 uint32_t max=0, min=0, time=0, i, count;

290 uint32_t deltas[ADC_LAST_CROSSING_SIZE -1];

291 for(i=0, j=ADC_LAST_CROSSINGS_INDEX ; i<ADC_LAST_CROSSING_SIZE -1 ; i++)

292 int32_t nextj = j;

293 if(nextj ==0) nextj=ADC_LAST_CROSSING_SIZE;

294 nextj --;

295 deltas[i]= ADC_LAST_CROSSINGS[j]-ADC_LAST_CROSSINGS[nextj];

296 if(deltas[i]>deltas[max])max=i;

297 if(deltas[i]<deltas[min])min=i;

298 time+= deltas[i];

299 if(ADC_LAST_CROSSINGS[j]+200 <= ADC_TICK && i>5) break;

300 j = nextj;

301

302 if(i<ADC_LAST_CROSSING_SIZE -1)

303 time -= deltas[max] + deltas[min];

304 count = i - 2;

305 BOCAL_FREQUENCIAx10 = (count*ADC_SAMPLING *10)/time;

306 BOCAL_AMPLITUDE = ADC_RMS;

307 else// 64*4000/200=1280 Hz => Frequencia alta demais

308 BOCAL_FREQUENCIAx10 = 0;

309 BOCAL_AMPLITUDE = 0;

Page 83: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 69

310

311 else

312 BOCAL_FREQUENCIAx10 = 0;

313 BOCAL_AMPLITUDE = 0;

314

315 else if(subtick ==1)

316 // identificar nota ....

317 tocar_trompete_bB ();

318 else if(subtick ==2)

319 //Tocar nota - 200 samples ADC -> 2000 samples audio.

320 //Esta tarefa deve ser executada em menos de 48Mhz/40k=1200 instrucoes (~1000 s??

ra esta subtarefa)

321 // Dividindo ela em 182 etapas (11 samples por vez)

322 // Inicializar variaveis para bufferizacao de audio

323 freqNova = PLAYER_FREQ_NOVA_10;

324 ampliNova = PLAYER_AMPLI_NOVA;

325 if(PLAYER_FREQ_VELHA_10 ==0)

326 PLAYER_FREQ_VELHA_10 = freqNova;

327

328 if(ampliNova ==0 || freqNova ==0)

329 ampliNova =0;

330 freqNova = PLAYER_FREQ_VELHA_10;

331

332 // audio_in_pos deve se manter entre chamadas

333 // Exceto se o buffer for alterado. POr seguran? tamanho do buffer

334 //deve ser zerado , ponteiro deve ser alterado , entao tamanho setado

335 if(PLAYER_TIMBRE_TAMANHO ==0 || (PLAYER_AMPLI_VELHA ==0 && ampliNova ==0))

336 ok_to_play =0;

337 else

338 if(audio_in_pos_max != PLAYER_TIMBRE_TAMANHO <<16)

339 audio_in_pos_max = PLAYER_TIMBRE_TAMANHO <<16;

340 audio_in_pos_fxp16 = 0;

341 //(AUDIO_B_POS +10)%AUDIO_BUFFER_SIZE;

342

343 audio_out_pos = (AUDIO_B_POS +10)%AUDIO_BUFFER_SIZE;

344 float buffer;

345 buffer = ((float)PLAYER_FREQ_VELHA_10)*(( float)PLAYER_TIMBRE_TAMANHO)*(( float

)(1<<16));

346 buffer /= (float)2*10* AUDIO_RATE;

347 freq_fxp16 = buffer;

348

349 buffer = ((float)freqNova - PLAYER_FREQ_VELHA_10)*(( float)

PLAYER_TIMBRE_TAMANHO)*(( float)(1<<16));

350 buffer /= (float)2*10* AUDIO_RATE *2000;

351 step_freq_fxp16 = buffer;

352

353 // ampli_fxp16 = (PLAYER_AMPLI_VELHA <<16);

354 // buffer = (float)((ampliNova -PLAYER_AMPLI_VELHA) <<16);

355 // buffer /= (float)2000;

356 // step_ampli_fxp16 = buffer;

357

358 ampli_fxp16_ff = ((( uint32_t)PLAYER_AMPLI_VELHA) <<16);

359 buffer = (float)((( int32_t)ampliNova -( int32_t)PLAYER_AMPLI_VELHA) <<16);

360 buffer /= (float)2000.0;

361 step_ampli_fxp16_ff = buffer;

362

363 ampli_fxp16_pp = ((255- PLAYER_AMPLI_VELHA) <<14);

364 buffer = (float)(( PLAYER_AMPLI_VELHA -ampliNova) <<14);

365 buffer /= (float)2000.0;

366 step_ampli_fxp16_pp = buffer;

Page 84: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 70

367

368 ok_to_play =1;

369

370 else if(subtick <181+3)

371 if(ok_to_play)

372 uint_fast16_t pos;

373 uint_fast8_t i;

374 for(i=0;i<11;i++)

375 pos = audio_in_pos_fxp16 >>16;

376 AUDIO_BUFFER[audio_out_pos] += (PLAYER_TIMBRE_FF[pos]*( ampli_fxp16_ff >>8)

) >>16;//+

377 // PLAYER_TIMBRE_PP[pos]*( ampli_fxp16_pp

>>8)) >>16;

378 audio_in_pos_fxp16 = (audio_in_pos_fxp16+freq_fxp16)%audio_in_pos_max;

379 // ampli_fxp16 += step_ampli_fxp16;

380 ampli_fxp16_ff += step_ampli_fxp16_ff;

381 ampli_fxp16_pp += step_ampli_fxp16_pp;

382 freq_fxp16 += step_freq_fxp16;

383 audio_out_pos = (audio_out_pos +1)%AUDIO_BUFFER_SIZE;

384

385

386 else if(subtick ==181+3)

387 if(ok_to_play)

388 uint_fast16_t pos;

389 uint_fast8_t i;

390 for(i=0;i<9;i++)

391 // AUDIO_BUFFER[audio_out_pos] += (PLAYER_TIMBRE_FF[audio_in_pos_fxp16

> >16]*( ampli_fxp16 >>8)) >>16;

392 pos = audio_in_pos_fxp16 >>16;

393 AUDIO_BUFFER[audio_out_pos] += (PLAYER_TIMBRE_FF[pos]*( ampli_fxp16_ff >>8)

) >>16;//+

394 // PLAYER_TIMBRE_PP[pos]*( ampli_fxp16_pp

>>8)) >>16;

395 audio_in_pos_fxp16 = (audio_in_pos_fxp16+freq_fxp16)%audio_in_pos_max;

396 ampli_fxp16_ff += step_ampli_fxp16_ff;

397 ampli_fxp16_pp += step_ampli_fxp16_pp;

398 freq_fxp16 += step_freq_fxp16;

399 audio_out_pos = (audio_out_pos +1)%AUDIO_BUFFER_SIZE;

400

401

402 else if(subtick ==181+4)

403 PLAYER_FREQ_VELHA_10 = freqNova;

404 PLAYER_AMPLI_VELHA = ampliNova;

405

406 /*

407 uint32_t tempo , contagem;

408 if(ADC_CRUZAMENTO_TEMPO_ULTIMO >0 && ADC_RMS >ADC_MINIMUM_RMS)

409 if(ADC_CRUZAMENTO_TEMPO_ULTIMO >200+ ADC_CRUZAMENTO_TEMPO_PRIMEIRO &&

ADC_CRUZAMENTO_NR_PULSOS >2)

410 if(ADC_CRUZAMENTO_NR_PULSOS >5)

411 tempo = ADC_CRUZAMENTO_TEMPO_ULTIMO -ADC_CRUZAMENTO_TEMPO_PRIMEIRO

412 -ADC_CRUZAMENTO_MAIOR_TEMPO -ADC_CRUZAMENTO_MENOR_TEMPO;

413 contagem = ADC_CRUZAMENTO_NR_PULSOS - 2;

414 else //Sem valores suficientes para retirar maior e menor

415 tempo = ADC_CRUZAMENTO_TEMPO_ULTIMO -ADC_CRUZAMENTO_TEMPO_PRIMEIRO;

416 contagem = ADC_CRUZAMENTO_NR_PULSOS;

417

418 BOCAL_FREQUENCIAx10 = (ADC_SAMPLING*contagem *10)/tempo;

419 BOCAL_AMPLITUDE = ADC_RMS;

420 ADC_CRUZAMENTO_TEMPO_PRIMEIRO = 0;

Page 85: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 71

421 // ADC_CRUZAMENTO_TEMPO_ULTIMO = 0;

422 ADC_CRUZAMENTO_NR_PULSOS = 0;

423 ADC_CRUZAMENTO_MAIOR_TEMPO = 0;

424 ADC_CRUZAMENTO_MENOR_TEMPO = 0xFFFF;

425

426 else

427 BOCAL_FREQUENCIAx10 = 0;

428 BOCAL_AMPLITUDE = 0;

429

430 */

431

432

433 inline static void adcsch_metronomo ()

434 if(METRONOMO_BPM >0 && METRONOMO_COMPASSO >0)

435 LEDS [6]=0;

436 LEDS [7]=0;

437 if(METRONOMO_CONTAGEM >=( ADC_SAMPLING *60)/METRONOMO_BPM )

438 METRONOMO_CONTAGEM -=( ADC_SAMPLING *60)/METRONOMO_BPM;

439 METRONOMO_STATUS ++;

440 if(METRONOMO_STATUS >= METRONOMO_COMPASSO)

441 METRONOMO_STATUS = 0;

442 LEDS [6]=50;

443 beep_1 ();

444 else

445 LEDS [7]=50;

446 beep_2 ();

447

448

449 else

450 METRONOMO_CONTAGEM = 0;

451 METRONOMO_STATUS = 0;

452

453

454 inline static void adcsch_final ()

455 ADC_BUFFER_POS ++;

456 if(ADC_BUFFER_POS >= ADC_BUFFER_SIZE)

457 ADC_BUFFER_POS =0;

458

459 ADC_TICK ++;

460 METRONOMO_CONTAGEM ++;

461 if(SD_PRESENT ())

462 if(FILESYSTEM_CAN_BE_MOUNTED <1000) FILESYSTEM_CAN_BE_MOUNTED ++;

463 FILESYSTEM_PLUGGED =1000;

464 else

465 if(FILESYSTEM_PLUGGED)FILESYSTEM_PLUGGED --;

466 FILESYSTEM_CAN_BE_MOUNTED =0;

467

468

469

470 #ifdef SCOPE_ON

471 inline static void adcsch_scope ()

472 SCOPE[SCOPE_POS ][0] = ADC_SUBBUFFER[ISB_MICROFONE_BOCAL ];

473 SCOPE[SCOPE_POS ][1] = ADC_SUBBUFFER[ISB_MICROFONE_BOCAL2 ];

474 SCOPE_POS ++;

475 if(SCOPE_POS >= SCOPE_SIZE)SCOPE_POS =0;

476

477 #endif

1 /*

2 * audio.h

Page 86: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 72

3 *

4 * Implementa c~ao de baixo nıvel para o driver de audio

5 *

6 */

7 #ifndef _AUDIO_H_

8 #define _AUDIO_H_

9

10 #include "globals.h"

11 #include "adc.h"

12

13 void inicializar_audio ();

14 inline void audio_interrupt_handler ();

15 inline void audio_mute ();

16

17 #endif

1 /*

2 * audio.c

3 *

4 * Implementa c~ao de baixo nıvel para o driver de audio

5 *

6 */

7 #include "audio.h"

8 uint16_t avanco = 200;

9 void inicializar_audio ()

10 const Timer_A_PWMConfig audioPWM =

11 TIMER_A_CLOCKSOURCE_SMCLK ,

12 TIMER_A_CLOCKSOURCE_DIVIDER_1 ,

13 FREQ_SMCLK/FREQ_PWM -1,

14 TIMER_A_CAPTURECOMPARE_REGISTER_2 ,

15 TIMER_A_OUTPUTMODE_RESET_SET ,

16 AUDIO_MID

17 ;

18 const Timer_A_UpModeConfig timer40k =

19 TIMER_A_CLOCKSOURCE_SMCLK ,

20 TIMER_A_CLOCKSOURCE_DIVIDER_1 ,

21 FREQ_SMCLK/AUDIO_RATE -1,

22 TIMER_A_TAIE_INTERRUPT_ENABLE ,

23 TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE ,

24 TIMER_A_DO_CLEAR

25 ;

26 MAP_Timer_A_configureUpMode(TIMER_A1_BASE , &timer40k);

27 MAP_Interrupt_enableInterrupt(INT_TA1_N);

28 MAP_Interrupt_setPriority(INT_TA1_N ,PRIORIDADE_AUDIO);

29 MAP_Timer_A_startCounter(TIMER_A1_BASE , TIMER_A_UP_MODE);

30

31 MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2 , GPIO_PIN5 ,

GPIO_PRIMARY_MODULE_FUNCTION);

32 MAP_Timer_A_generatePWM(TIMER_A0_BASE , &audioPWM);

33 audio_mute ();

34 AUDIO_B_POS = 0;

35

36 MAP_CS_disableClockRequest(CS_SMCLK);

37 TIMER_A0 ->R = 0;

38 TIMER_A1 ->R = avanco;

39 MAP_CS_enableClockRequest(CS_SMCLK);

40

41

42 inline void audio_interrupt_handler ()

43 TIMER_A0 ->CCR[2] = AUDIO_BUFFER[AUDIO_B_POS ];

Page 87: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 73

44 Timer_A_clearInterruptFlag(TIMER_A1_BASE);

45 AUDIO_BUFFER[AUDIO_B_POS] = AUDIO_MID;

46 AUDIO_B_POS ++;

47 if(AUDIO_B_POS >= AUDIO_BUFFER_SIZE)AUDIO_B_POS =0;

48 adc_interrupt_handler ();

49

50

51 inline void audio_mute ()

52 int i;

53 for(i=0;i<AUDIO_BUFFER_SIZE;i++) AUDIO_BUFFER[i] = AUDIO_MID;

54

1 /*

2 * globals.h

3 *

4 * Defini c~oes de variaveis compartilhadas e constantes

5 *

6 * Notas e frequ e ncias (extraido de http ://www.zytrax.com/tech/audio/audio.html)

7 * Instrumento | Escopo | Observa c~oes

8 * ------------------------------------------------------------------------

9 * French Horn A2 (110 Hz) to A5 (880 Hz)

10 * Trombone Tenor E2 (82 Hz) to D5 (587 Hz) Exceptionally F5 (698 Hz). Bb

fundamental , sometimes F.

11 * Trombone Contrabass E1 (41 Hz) to E4 (330 Hz) F fundamental , sometimes Bb.

12 * Trombone Bass C1 (33 Hz) to C5 (523 Hz) Can start around Bb0 (A#0 - 29Hz)

. Bb fundamental.

13 * Trumpet E3 (165 Hz) to B5 (988 Hz)

14 * Tuba (Bass) F1 (44 Hz) to F4 (349 Hz) Many play around Bb0 (A#0 - 29hz)

15 *

16 * Clarinet E3 (165 Hz) to G6 (1,568 Hz) C7 sometimes possible (2,093 Hz)

17 * Saxophone Tenor G#2 (104 Hz) to E5 (659 Hz) Bb fundamental.

18 * Saxophone Barritone C2 (65 Hz) to A4 (440 Hz) Eb fundamental.

19 *

20 * Notas vs frequencia (quando nao tiver alguma coisa que fa ca raiz 12a por perto ...)

21 * Note 0 1 2 3 4 5 6 7 8 9 10

22 * C 16 33 65 131 262 523 1047 2093 4186 8372 16744

23 * C# 17 35 69 139 277 554 1109 2217 4435 8870 17740

24 * D 18 37 73 147 294 587 1175 2349 4699 9397 18794

25 * D# 19 39 78 156 311 622 1245 2489 4978 9956 19912

26 * E 21 41 82 165 330 659 1319 2637 5274 10548 21096

27 * F 22 44 87 175 349 698 1397 2794 5588 11175 22351

28 * F# 23 46 93 185 370 740 1480 2960 5920 11840 23680

29 * G 25 49 98 196 392 784 1568 3136 6272 12544 25088

30 * G# 26 52 104 208 415 831 1661 3322 6645 13229 26580

31 * A 28 55 110 220 440 880 1760 3520 7040 14080 28159

32 * A# 29 58 117 233 466 932 1864 3729 7459 14917 29832

33 * B 31 62 123 247 493 988 1976 3951 7902 15804 31604

34 *

35 *

36 */

37 #ifndef GLOBALS_H

38 #define GLOBALS_H

39

40 #define VERSAO 1

41

42 #define SCOPE_ON

43 #define SCOPE_SIZE (4*512)

44 #define SCOPE_WIDTH 2

45

46 #define FREQ_MCLK (48000000 UL)

Page 88: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 74

47 #define FREQ_SMCLK (48000000 UL)

48 #define FREQ_HSMCLK (48000000 UL)

49 #define FREQ_LFXT (32000)

50 #define FREQ_PWM (40000 UL)

51

52 #define AUDIO_RATE (40000)

53 #define AUDIO_BUFFER_SIZE (8000)

54 #define AUDIO_MAX (FREQ_SMCLK/FREQ_PWM)

55 #define AUDIO_MIN (100)

56 #define AUDIO_MID (( AUDIO_MAX+AUDIO_MIN)/2)

57

58 #define ADC_INTERRUPT_FREQ (40000)

59 #define ADC_SAMPLING (4000)

60 #define ADC_BUFFER_SIZE (200)

61 #define ADC_DIVISION (ADC_INTERRUPT_FREQ/ADC_SAMPLING)

62 #define ADC_MINIMUM_RMS (20)

63

64 #define NOTAS_NR (84)

65 #define NOTAS_MAXSTR (12000)

66

67 #define BOTOES_NR (7)

68 #define LEDS_NR (10)

69 #define LEDS_MAX (50)

70 #define LEDS_FREQ_HZ (100)

71

72 #define PRIORIDADE_AUDIO (0x00)

73 #define PRIORIDADE_LEDS (0x80)

74

75 #define ISB_PISTO1 (3)

76 #define ISB_PISTO2 (2)

77 #define ISB_PISTO3 (1)

78 #define ISB_MICROFONE_BOCAL (5)

79 #define ISB_MICROFONE_BOCAL2 (4)

80

81 #define BUTTONID_UP 4

82 #define BUTTONID_DOWN 6

83 #define BUTTONID_LEFT 2

84 #define BUTTONID_RIGHT 5

85 #define BUTTONID_MID 3

86

87 #define ADC_LAST_CROSSING_SIZE 64

88

89 #define SD_PRESENT_INIT () GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P5 ,GPIO_PIN7)

90 #define SD_PRESENT () (! GPIO_getInputPinValue(GPIO_PORT_P5 ,GPIO_PIN7))

91

92 #include <stdint.h>

93 #include <stdlib.h>

94 #include "driverlib.h"

95 #include "ff12c/ff.h"

96

97 extern const char NOTAS_NOMES[NOTAS_NR ][4];

98 extern const uint16_t NOTAS_FREQUENCIASx10[NOTAS_NR ];

99 extern uint16_t NOTAS_DURACOES[NOTAS_NR ];

100 extern int16_t *NOTAS[NOTAS_NR ];

101 // int16_t NOTAS_STRING[NOTAS_MAXSTR ];

102 // PLAYER: Informa c~oes do tocador de notas para que n~ao haja interrup c~oes

103 // de fase ou de amplitude bruscas

104 extern uint16_t PLAYER_FASE , PLAYER_POS;

105 extern uint8_t PLAYER_NOTA , PLAYER_VOLUME;

106 extern uint_fast8_t PLAYER_BEEP_VEZES1;

Page 89: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 75

107 extern uint_fast8_t PLAYER_BEEP_SEMIPERIODO1;

108 extern uint_fast8_t PLAYER_BEEP_VEZES2;

109 extern uint_fast8_t PLAYER_BEEP_SEMIPERIODO2;

110 extern uint_fast8_t PLAYER_BEEP_VOLUME;

111 //AUDIO: Informa c~oes brutas usadas pelo drive de audio

112 extern uint16_t AUDIO_BUFFER[AUDIO_BUFFER_SIZE ];

113 extern uint_fast16_t AUDIO_B_POS;

114 //LEDS: Variaveis relacionadas ao acionamento dos LEDS RGB

115 extern uint_fast8_t LEDS[LEDS_NR ];

116 extern uint_fast16_t LEDS_RAMPA;

117 // METRONOMO: Controle do metr onomo

118 extern uint_fast8_t METRONOMO_COMPASSO , METRONOMO_STATUS;

119 extern uint_fast16_t METRONOMO_BPM , METRONOMO_CONTAGEM;

120 // PISTOS: Leitura de estado dos pistos

121 extern uint8_t BOTOES[BOTOES_NR ];

122 extern uint8_t PISTOS;

123 extern uint8_t PISTOS_CALIBRACAO;

124 extern uint_fast16_t PISTOS_LIMIAR_POS [3];

125 extern uint_fast16_t PISTOS_LIMIAR_NEG [3];

126 extern uint_fast16_t PISTOS_LIMIAR_DECISAO [3];

127 //ADC: Variaveis de leitura brutos e semirefinados

128 extern uint16_t ADC_SUBBUFFER [8];

129 extern uint_fast16_t ADC_BUFFER_MEDIA[ADC_BUFFER_SIZE ];

130 extern uint_fast16_t ADC_BUFFER_RMS[ADC_BUFFER_SIZE ];

131 extern uint_fast16_t ADC_BUFFER_POS;

132 extern uint_fast8_t ADC_ESCALONADOR;

133 extern uint32_t ADC_TICK;

134 extern uint32_t ADC_SOMA_MEDIA;

135 extern uint32_t ADC_SOMA_RMS;

136 extern uint32_t ADC_MEDIA;

137 extern uint32_t ADC_RMS2;

138 extern uint32_t ADC_RMS;

139 extern uint_fast8_t ADC_CRUZAMENTO_DIRECAO;

140 extern uint_fast16_t ADC_CRUZAMENTO_LIMIAR;

141 extern uint_fast16_t ADC_CRUZAMENTO_MAIOR_TEMPO;

142 extern uint_fast16_t ADC_CRUZAMENTO_MENOR_TEMPO;

143 extern uint_fast16_t ADC_CRUZAMENTO_NR_PULSOS;

144 extern uint32_t ADC_CRUZAMENTO_TEMPO_PRIMEIRO;

145 extern uint32_t ADC_CRUZAMENTO_TEMPO_ULTIMO;

146 extern uint32_t ADC_LAST_CROSSINGS[ADC_LAST_CROSSING_SIZE ];

147 extern uint_fast16_t ADC_LAST_CROSSINGS_INDEX;

148 //BOCAL: Informa c~oes da frequencia e amplitude no bocal

149 extern uint_fast16_t BOCAL_FREQUENCIAx10;

150 extern uint_fast16_t BOCAL_AMPLITUDE;

151 // INSTRUMENTO: Dados da nota tocada pelo instrumento

152 extern uint_fast8_t INSTRUMENTO_NOTA_NOMINAL;

153 extern uint_fast8_t INSTRUMENTO_NOTA_CORRETO;

154 extern uint_fast8_t INSTRUMENTO_AMPLITUDE;

155 extern uint_fast8_t INSTRUMENTO_DESAFINACAO;

156 // PLAYER: Tocador de audio dentro da interrupcao

157 extern uint_fast16_t PLAYER_FREQ_NOVA_10 , PLAYER_FREQ_VELHA_10;

158 extern uint_fast8_t PLAYER_AMPLI_NOVA , PLAYER_AMPLI_VELHA;

159 extern int16_t *PLAYER_TIMBRE_FF , *PLAYER_TIMBRE_PP;

160 extern uint_fast16_t PLAYER_TIMBRE_TAMANHO;

161 // FILESYSTEM

162 extern FATFS FILESYSTEM;

163 extern uint16_t FILESYSTEM_PLUGGED;

164 extern uint16_t FILESYSTEM_CAN_BE_MOUNTED;

165 extern uint8_t CMD_SAVETOSD;

166 extern uint8_t CMD_LOADFROMSD;

Page 90: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 76

167 extern uint8_t CMD_SAVERAW;

168 //LCD: variaveis globais do LCD

169 extern uint_fast16_t LCD_CONTRASTE;

170 extern uint_fast8_t LCD_LED;

171

172 #ifdef SCOPE_ON

173 //SCOPE: Usado para amostrar o sinal de alguma variavel sem interrup c~ao

174 volatile extern uint16_t SCOPE[SCOPE_SIZE ][ SCOPE_WIDTH ];

175 volatile extern uint32_t SCOPE_POS;

176 #endif

177

178

179 void inicializar_osciladores ();

180 uint32_t uisqrt32(uint32_t r);

181 void delay_us (uint32_t n);

182 void delay_ms (uint32_t n);

183

184 #endif

1 /*

2 * globals.c

3 *

4 * Defini c~oes de vari aveis compartilhadas e constantes

5 *

6 */

7 #include "globals.h"

8

9 //NOTAS: Defini c~oes de todas as notas , incluindo nome que ser a escrito

10 // por extenso , frequencia e as amostras de cada nota a ser tocada

11 const char NOTAS_NOMES[NOTAS_NR ][4] =

12 //0 1 2 3 4 5 6 7 8 9 10 11

13 "--", "C0#","D0", "D0#","E0", "F0", "F0#","G0", "G0#","A0" ,"A0#","B0",//0

14 "C1", "C1#","D1", "D1#","E1", "F1", "F1#","G1", "G1#","A1" ,"A1#","B1",//12

15 "C2", "C2#","D2", "D2#","E2", "F2", "F2#","G2", "G2#","A2" ,"A2#","B2",//24

16 "C3", "C3#","D3", "D3#","E3", "F3", "F3#","G3", "G3#","A3" ,"A3#","B3",//36

17 "C4", "C4#","D4", "D4#","E4", "F4", "F4#","G4", "G4#","A4" ,"A4#","B4",//48

18 "C5", "C5#","D5", "D5#","E5", "F5", "F5#","G5", "G5#","A5" ,"A5#","B5",//60

19 "C6", "C6#","D6", "D6#","E6", "F6", "F6#","G6", "G6#","A6" ,"A6#","B6",//72

20 ;//84

21 const uint16_t NOTAS_FREQUENCIASx10[NOTAS_NR] =

22 164, 173, 184, 194, 206, 218, 231, 245, 260, 275, 291, 309,

23 327, 346, 367, 389, 412, 437, 462, 490, 519, 550, 583, 617,

24 654, 693, 734, 778, 824, 873, 925, 980, 1038, 1100, 1165, 1235,

25 1308, 1386, 1468, 1556, 1648, 1746, 1850, 1960, 2077, 2200, 2331, 2469,

26 2616, 2772, 2937, 3111, 3296, 3492, 3700, 3920, 4153, 4400, 4662, 4939,

27 5233, 5544, 5873, 6223, 6593, 6985, 7400, 7840, 8306, 8800, 9323, 9878,

28 10465 ,11087 ,11747 ,12445 ,13185 ,13969 ,14800 ,15680 ,16612 ,17600 ,18647 ,19755 ,

29 ;

30 uint16_t NOTAS_DURACOES[NOTAS_NR ];

31 int16_t *NOTAS[NOTAS_NR ];

32 // int16_t NOTAS_STRING[NOTAS_MAXSTR ];

33 // PLAYER: Informa c~oes do tocador de notas para que n~ao haja interrup c~oes

34 // de fase ou de amplitude bruscas

35 uint16_t PLAYER_FASE =0, PLAYER_POS =0;

36 uint8_t PLAYER_NOTA =0, PLAYER_VOLUME =0;

37 uint_fast8_t PLAYER_BEEP_VEZES1 =6;

38 uint_fast8_t PLAYER_BEEP_SEMIPERIODO1 =20;

39 uint_fast8_t PLAYER_BEEP_VEZES2 =3;

40 uint_fast8_t PLAYER_BEEP_SEMIPERIODO2 =40;

41 uint_fast8_t PLAYER_BEEP_VOLUME =10;

Page 91: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 77

42 //AUDIO: Informa c~oes brutas usadas pelo drive de audio

43 uint16_t AUDIO_BUFFER[AUDIO_BUFFER_SIZE ];

44 uint_fast16_t AUDIO_B_POS =0;

45 //LEDS: Variaveis relacionadas ao acionamento dos LEDS RGB

46 uint_fast8_t LEDS[LEDS_NR ];

47 uint_fast16_t LEDS_RAMPA =0;

48 // METRONOMO: Controle do metr onomo

49 uint_fast8_t METRONOMO_COMPASSO =4, METRONOMO_STATUS =0;

50 uint_fast16_t METRONOMO_BPM =120, METRONOMO_CONTAGEM =0;

51 // PISTOS: Leitura de estado dos pistos

52 uint8_t BOTOES[BOTOES_NR ];

53 uint8_t PISTOS =0;

54 uint8_t PISTOS_CALIBRACAO = 1;

55 uint_fast16_t PISTOS_LIMIAR_POS [3];

56 uint_fast16_t PISTOS_LIMIAR_NEG [3];

57 uint_fast16_t PISTOS_LIMIAR_DECISAO [3];

58 //ADC: Variaveis de leitura brutos e semirefinados

59 uint16_t ADC_SUBBUFFER [8];

60 uint_fast16_t ADC_BUFFER_MEDIA[ADC_BUFFER_SIZE ];

61 uint_fast16_t ADC_BUFFER_RMS[ADC_BUFFER_SIZE ];

62 uint_fast16_t ADC_BUFFER_POS =0;

63 uint_fast8_t ADC_ESCALONADOR =0;

64 uint32_t ADC_TICK =0;

65 uint32_t ADC_SOMA_MEDIA =0;

66 uint32_t ADC_SOMA_RMS =0;

67 uint32_t ADC_MEDIA =0;

68 uint32_t ADC_RMS2 =0;

69 uint32_t ADC_RMS =0;

70 uint_fast8_t ADC_CRUZAMENTO_DIRECAO =0;

71 uint_fast16_t ADC_CRUZAMENTO_LIMIAR =8000;

72 uint_fast16_t ADC_CRUZAMENTO_MAIOR_TEMPO =0;

73 uint_fast16_t ADC_CRUZAMENTO_MENOR_TEMPO =0;

74 uint_fast16_t ADC_CRUZAMENTO_NR_PULSOS =0;

75 uint32_t ADC_CRUZAMENTO_TEMPO_PRIMEIRO =0;

76 uint32_t ADC_CRUZAMENTO_TEMPO_ULTIMO =0;

77 uint32_t ADC_LAST_CROSSINGS[ADC_LAST_CROSSING_SIZE ];

78 uint_fast16_t ADC_LAST_CROSSINGS_INDEX =0;

79 //BOCAL: Informa c~oes da frequencia e amplitude no bocal

80 uint_fast16_t BOCAL_FREQUENCIAx10 =0;

81 uint_fast16_t BOCAL_AMPLITUDE =0;

82 // INSTRUMENTO: Dados da nota tocada pelo instrumento

83 uint_fast8_t INSTRUMENTO_NOTA_NOMINAL =0;

84 uint_fast8_t INSTRUMENTO_NOTA_CORRETO =0;

85 uint_fast8_t INSTRUMENTO_AMPLITUDE =0;

86 uint_fast8_t INSTRUMENTO_DESAFINACAO =0;

87 // PLAYER: Tocador de audio dentro da interrupcao

88 uint_fast16_t PLAYER_FREQ_NOVA_10 =0, PLAYER_FREQ_VELHA_10 =0;

89 uint_fast8_t PLAYER_AMPLI_NOVA =0, PLAYER_AMPLI_VELHA =0;

90 int16_t *PLAYER_TIMBRE_FF = NULL , *PLAYER_TIMBRE_PP = NULL;

91 uint_fast16_t PLAYER_TIMBRE_TAMANHO =0;

92 // FILESYSTEM: Relativo a arquivos e cart~ao SD

93 FATFS FILESYSTEM;

94 uint16_t FILESYSTEM_PLUGGED =0;

95 uint16_t FILESYSTEM_CAN_BE_MOUNTED =0;

96 //CMD: Variaveis que s~ao setadas quando o usuario pede por algum comando

97 uint8_t CMD_SAVETOSD =0, CMD_LOADFROMSD =0, CMD_SAVERAW =0;

98 //LCD: variaveis globais do LCD

99 uint_fast16_t LCD_CONTRASTE = 100;

100 uint_fast8_t LCD_LED = 100;

101

Page 92: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 78

102 #ifdef SCOPE_ON

103 //SCOPE: Usado para amostrar o sinal de alguma variavel sem interrup c~ao

104 volatile uint16_t SCOPE[SCOPE_SIZE ][ SCOPE_WIDTH ];

105 volatile uint32_t SCOPE_POS = 0;

106 #endif

107

108 void inicializar_osciladores ()

109 PJ->SEL0 |= BIT2 | BIT3; // Configure PJ.2/3 for HFXT function

110 PJ->SEL1 &= ~(BIT2 | BIT3);

111 MAP_CS_setExternalClockSourceFrequency(FREQ_LFXT ,FREQ_MCLK);

112 MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);

113 MAP_FlashCtl_setWaitState(FLASH_BANK0 , 2);

114 MAP_FlashCtl_setWaitState(FLASH_BANK1 , 2);

115 MAP_CS_startHFXT(false);

116 MAP_CS_initClockSignal(CS_MCLK , CS_HFXTCLK_SELECT , CS_CLOCK_DIVIDER_1);

117 MAP_CS_initClockSignal(CS_HSMCLK , CS_HFXTCLK_SELECT , CS_CLOCK_DIVIDER_1);

118 MAP_CS_initClockSignal(CS_SMCLK , CS_HFXTCLK_SELECT , CS_CLOCK_DIVIDER_1);

119

120

121 // Retirado e alterado de: https ://www.ccsinfo.com/forum/viewtopic.php?t=21137

122 uint32_t uisqrt32(uint32_t r)

123 uint32_t t,b,c=0;

124 for (b=0 x40000000;b!=0;b>>=2)

125 t = c + b;

126 c >>= 1;

127 if (t <= r)

128 r -= t;

129 c += b;

130

131

132 return(c);

133

134

135 void delay_us (uint32_t n)

136 do

137 asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");

138 asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");

139 asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");

140 while (--n);

141

142

143 extern void reinicializarSD ();

144 extern void verificarTarefas ();

145 void delay_ms (uint32_t n)

146 uint32_t end = ((n*ADC_SAMPLING)/1000)+ADC_TICK;

147 do

148 reinicializarSD ();

149 verificarTarefas ();

150 delay_us (200);

151 while (end >ADC_TICK);

152

1 /*

2 * lcd_16x2.h

3 *

4 * Created on: 17 de set de 2017

5 * Author: Makara

6 */

7

8 #ifndef SRC_LCD_16X2_H_

Page 93: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 79

9 #define SRC_LCD_16X2_H_

10

11 #include "globals.h"

12

13 uint8_t lcd_printStr(uint8_t l, uint8_t c, const char* str);

14 void inicializar_lcd16x2 ();

15

16

17

18

19

20 #endif /* SRC_LCD_16X2_H_ */

1 /*

2 * lcd_16x2.c

3 *

4 * Created on: 17 de set de 2017

5 * Author: Makara

6 */

7

8 #include "lcd_16x2.h"

9

10 #define LCD_CMD () GPIO_setOutputLowOnPin(GPIO_PORT_P2 ,GPIO_PIN4)

11 #define LCD_DATA () GPIO_setOutputHighOnPin(GPIO_PORT_P2 ,GPIO_PIN4)

12

13 #define LCD_SET_READ () GPIO_setOutputHighOnPin(GPIO_PORT_P5 ,GPIO_PIN6)

14 #define LCD_SET_WRITE () GPIO_setOutputLowOnPin(GPIO_PORT_P5 ,GPIO_PIN6)

15

16 #define LCD_E_ON () GPIO_setOutputHighOnPin(GPIO_PORT_P6 ,GPIO_PIN6)

17 #define LCD_E_OFF () GPIO_setOutputLowOnPin(GPIO_PORT_P6 ,GPIO_PIN6)

18

19 #define LCD_LED_ON () GPIO_setOutputHighOnPin(GPIO_PORT_P2 ,GPIO_PIN6)

20 #define LCD_LED_OFF () GPIO_setOutputLowOnPin(GPIO_PORT_P2 ,GPIO_PIN6)

21 #define LCD_CONT_ON () GPIO_setOutputHighOnPin(GPIO_PORT_P2 ,GPIO_PIN7)

22 #define LCD_CONT_OFF () GPIO_setOutputLowOnPin(GPIO_PORT_P2 ,GPIO_PIN7)

23

24 #define LCD_SET_D7 () GPIO_setOutputHighOnPin(GPIO_PORT_P3 ,GPIO_PIN7)

25 #define LCD_RESET_D7 () GPIO_setOutputLowOnPin(GPIO_PORT_P3 ,GPIO_PIN7)

26 #define LCD_SET_D6 () GPIO_setOutputHighOnPin(GPIO_PORT_P3 ,GPIO_PIN5)

27 #define LCD_RESET_D6 () GPIO_setOutputLowOnPin(GPIO_PORT_P3 ,GPIO_PIN5)

28 #define LCD_SET_D5 () GPIO_setOutputHighOnPin(GPIO_PORT_P5 ,GPIO_PIN1)

29 #define LCD_RESET_D5 () GPIO_setOutputLowOnPin(GPIO_PORT_P5 ,GPIO_PIN1)

30 #define LCD_SET_D4 () GPIO_setOutputHighOnPin(GPIO_PORT_P6 ,GPIO_PIN7)

31 #define LCD_RESET_D4 () GPIO_setOutputLowOnPin(GPIO_PORT_P6 ,GPIO_PIN7)

32

33 #define LCD_CMD_CLEAR_DISPLAY 0x01

34 #define LCD_CMD_RETURN_HOME 0x02

35 #define LCD_CMD_ENTRYMODE 0x04

36 #define LCD_CMD_ENTRYMODE_I 0x02

37 #define LCD_CMD_ENTRYMODE_D 0x00

38 #define LCD_CMD_ENTRYMODE_SH 0x01

39 #define LCD_CMD_ONOFF 0x08

40 #define LCD_CMD_ONOFF_DISPLAY 0x04

41 #define LCD_CMD_ONOFF_CURSOR 0x02

42 #define LCD_CMD_ONOFF_BLINK 0x01

43 #define LCD_CMD_SHIFT 0x10

44 #define LCD_CMD_SHIFT_DISPLAY 0x08

45 #define LCD_CMD_SHIFT_CURSORR 0x04

46 #define LCD_CMD_FUNCTION 0x20

47 #define LCD_CMD_FUNCTION_8BIT 0x10

Page 94: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 80

48 #define LCD_CMD_FUNCTION_2LINE 0x08

49 #define LCD_CMD_FUNCTION_5X11 0x04

50 #define LCD_CMD_SETADDR_CGRAM 0x40

51 #define LCD_CMD_SETADDR_DDRAM 0x80

52

53 Timer_A_PWMConfig LED_PWM =

54 TIMER_A_CLOCKSOURCE_SMCLK ,

55 TIMER_A_CLOCKSOURCE_DIVIDER_1 ,

56 FREQ_SMCLK/FREQ_PWM -1,

57 TIMER_A_CAPTURECOMPARE_REGISTER_3 ,

58 TIMER_A_OUTPUTMODE_RESET_SET ,

59 AUDIO_MAX

60 ;

61 Timer_A_PWMConfig contraste_PWM =

62 TIMER_A_CLOCKSOURCE_SMCLK ,

63 TIMER_A_CLOCKSOURCE_DIVIDER_1 ,

64 FREQ_SMCLK/FREQ_PWM -1,

65 TIMER_A_CAPTURECOMPARE_REGISTER_4 ,

66 TIMER_A_OUTPUTMODE_RESET_SET ,

67 100

68 ;

69

70 void lcd_send8bit(uint8_t byte)

71 LCD_CMD ();

72 LCD_SET_WRITE ();

73 if(byte&0x80)LCD_SET_D7 ();

74 else LCD_RESET_D7 ();

75 if(byte&0x40)LCD_SET_D6 ();

76 else LCD_RESET_D6 ();

77 if(byte&0x20)LCD_SET_D5 ();

78 else LCD_RESET_D5 ();

79 if(byte&0x10)LCD_SET_D4 ();

80 else LCD_RESET_D4 ();

81 LCD_E_ON ();

82 asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");

83 LCD_E_OFF ();

84

85 void lcd_send4bitCmd(uint8_t byte)

86 LCD_CMD ();

87 LCD_SET_WRITE ();

88 if(byte&0x80)LCD_SET_D7 ();

89 else LCD_RESET_D7 ();

90 if(byte&0x40)LCD_SET_D6 ();

91 else LCD_RESET_D6 ();

92 if(byte&0x20)LCD_SET_D5 ();

93 else LCD_RESET_D5 ();

94 if(byte&0x10)LCD_SET_D4 ();

95 else LCD_RESET_D4 ();

96 LCD_E_ON ();

97 asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");

98 LCD_E_OFF ();

99 asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");

100 if(byte&0x08)LCD_SET_D7 ();

101 else LCD_RESET_D7 ();

102 if(byte&0x04)LCD_SET_D6 ();

103 else LCD_RESET_D6 ();

104 if(byte&0x02)LCD_SET_D5 ();

105 else LCD_RESET_D5 ();

106 if(byte&0x01)LCD_SET_D4 ();

107 else LCD_RESET_D4 ();

Page 95: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 81

108 LCD_E_ON ();

109 asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");

110 LCD_E_OFF ();

111 asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");

112

113 void lcd_send4bitData(uint8_t byte)

114 LCD_DATA ();

115 LCD_SET_WRITE ();

116 if(byte&0x80)LCD_SET_D7 ();

117 else LCD_RESET_D7 ();

118 if(byte&0x40)LCD_SET_D6 ();

119 else LCD_RESET_D6 ();

120 if(byte&0x20)LCD_SET_D5 ();

121 else LCD_RESET_D5 ();

122 if(byte&0x10)LCD_SET_D4 ();

123 else LCD_RESET_D4 ();

124 LCD_E_ON ();

125 asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");

126 LCD_E_OFF ();

127 asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");

128 if(byte&0x08)LCD_SET_D7 ();

129 else LCD_RESET_D7 ();

130 if(byte&0x04)LCD_SET_D6 ();

131 else LCD_RESET_D6 ();

132 if(byte&0x02)LCD_SET_D5 ();

133 else LCD_RESET_D5 ();

134 if(byte&0x01)LCD_SET_D4 ();

135 else LCD_RESET_D4 ();

136 LCD_E_ON ();

137 asm(" nop");asm(" nop");asm(" nop");asm(" nop");asm(" nop");

138 LCD_E_OFF ();

139

140 void inicializar_lcd16x2 ()

141 GPIO_setAsOutputPin(GPIO_PORT_P2 ,GPIO_PIN4);//RS

142 GPIO_setAsOutputPin(GPIO_PORT_P5 ,GPIO_PIN6);//RW

143 GPIO_setAsOutputPin(GPIO_PORT_P6 ,GPIO_PIN6);//E

144 GPIO_setAsOutputPin(GPIO_PORT_P3 ,GPIO_PIN7);//D7

145 GPIO_setAsOutputPin(GPIO_PORT_P3 ,GPIO_PIN5);//D6

146 GPIO_setAsOutputPin(GPIO_PORT_P5 ,GPIO_PIN1);//D5

147 GPIO_setAsOutputPin(GPIO_PORT_P6 ,GPIO_PIN7);//D4

148 // GPIO_setAsOutputPin(GPIO_PORT_P2 ,GPIO_PIN6);//LED

149 // GPIO_setAsOutputPin(GPIO_PORT_P2 ,GPIO_PIN7);// Contrast

150 MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2 , GPIO_PIN6 ,

GPIO_PRIMARY_MODULE_FUNCTION);

151 MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2 , GPIO_PIN7 ,

GPIO_PRIMARY_MODULE_FUNCTION);

152 MAP_Timer_A_generatePWM(TIMER_A0_BASE , &LED_PWM);

153 MAP_Timer_A_generatePWM(TIMER_A0_BASE , &contraste_PWM);

154

155 LCD_CMD ();

156 LCD_SET_WRITE ();

157 LCD_E_OFF ();

158 // Inicializa c~ao para 4 bits

159 delay_us (20000);

160 lcd_send8bit(LCD_CMD_FUNCTION|LCD_CMD_FUNCTION_8BIT);

161 delay_us (10000);

162 lcd_send8bit(LCD_CMD_FUNCTION|LCD_CMD_FUNCTION_8BIT);

163 delay_us (1000);

164 lcd_send8bit(LCD_CMD_FUNCTION|LCD_CMD_FUNCTION_8BIT);

165 delay_us (1000);

Page 96: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 82

166 lcd_send8bit(LCD_CMD_FUNCTION);

167 delay_us (50);

168 // Inicializa c~ao do display

169 //4 bits , 2 linhas , 5x8 pixels

170 lcd_send4bitCmd(LCD_CMD_FUNCTION | LCD_CMD_FUNCTION_2LINE );

171 delay_us (50);

172 //Se tiver cursor , ele vai para a direita

173 lcd_send4bitCmd(LCD_CMD_ENTRYMODE | LCD_CMD_ENTRYMODE_I );

174 delay_us (50);

175 //Shift pra direita , endere co aumentado

176 lcd_send4bitCmd(LCD_CMD_SHIFT | LCD_CMD_SHIFT_CURSORR );

177 delay_us (50);

178 //Liga o display , sem cursor ou blink

179 lcd_send4bitCmd(LCD_CMD_ONOFF | LCD_CMD_ONOFF_DISPLAY );

180 delay_us (50);

181 // Pronto para reiniciar

182 lcd_send4bitCmd(LCD_CMD_CLEAR_DISPLAY);

183 delay_us (1530);

184

185

186

187 uint8_t lcd_printStr(uint8_t l, uint8_t c, const char* str)

188 if(l>2) return 0;

189 if(l==1) lcd_send4bitCmd(LCD_CMD_SETADDR_DDRAM | (c&0x0F) | 0x40 );

190 else lcd_send4bitCmd(LCD_CMD_SETADDR_DDRAM | (c&0x0F) );

191 delay_us (50);

192 while(c<16 && *str!=’\0’)

193 lcd_send4bitData (*str);

194 delay_us (50);

195 str++;

196 c++;

197

198 TIMER_A0 ->CCR[4] = LCD_CONTRASTE;

199 TIMER_A0 ->CCR[3] = (LCD_LED*AUDIO_MAX)/100;

200 return c;

201

1 /*

2 * leds.h

3 *

4 * Lida com o PWM gerado por software dos leds

5 *

6 */

7 #ifndef LEDS_H

8 #define LEDS_H

9

10 #include "globals.h"

11

12 void leds_interrupt_handler ();

13 void inicializar_leds ();

14

15 #endif

1 /*

2 * leds.c

3 *

4 * Lida com o PWM gerado por software dos leds

5 *

6 */

7 #include "leds.h"

Page 97: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 83

8

9 const uint_fast8_t LEDS_PORTS[LEDS_NR ]= GPIO_PORT_P5 ,GPIO_PORT_P5 ,GPIO_PORT_P3 ,

10 GPIO_PORT_P3 ,GPIO_PORT_P3 ,GPIO_PORT_P5 ,GPIO_PORT_P2 ,GPIO_PORT_P2 ,GPIO_PORT_P2 ,

11 GPIO_PORT_P1 ;

12 const uint_fast16_t LEDS_PINS[LEDS_NR ]= GPIO_PIN2 ,GPIO_PIN0 ,GPIO_PIN6 ,

13 GPIO_PIN5 ,GPIO_PIN7 ,GPIO_PIN1 ,GPIO_PIN0 ,GPIO_PIN1 ,GPIO_PIN2 ,

14 GPIO_PIN0 ;

15

16 const uint_fast8_t BOTOES_PORTS[BOTOES_NR ]= GPIO_PORT_P1 ,GPIO_PORT_P1 ,

17 GPIO_PORT_P5 ,GPIO_PORT_P5 ,GPIO_PORT_P3 ,GPIO_PORT_P4 ,GPIO_PORT_P4 ;

18 const uint_fast16_t BOTOES_PINS[BOTOES_NR ]= GPIO_PIN1 ,GPIO_PIN4 ,

19 GPIO_PIN0 , GPIO_PIN2 , GPIO_PIN6 , GPIO_PIN6 , GPIO_PIN1 ;

20

21 void leds_interrupt_handler ()

22 uint_fast8_t i;

23 for(i=6;i<LEDS_NR;i++)

24 if(LEDS[i]>LEDS_RAMPA)GPIO_setOutputHighOnPin(LEDS_PORTS[i],LEDS_PINS[i]);

25 else GPIO_setOutputLowOnPin(LEDS_PORTS[i],LEDS_PINS[i]);

26

27 for(i=0;i<BOTOES_NR;i++)

28 if(! GPIO_getInputPinValue(BOTOES_PORTS[i],BOTOES_PINS[i]))BOTOES[i]=10;

29 else if(BOTOES[i]>0) BOTOES[i]--;

30

31 LEDS_RAMPA ++;

32 if(LEDS_RAMPA >= LEDS_MAX)LEDS_RAMPA =0;

33 // Timer_A_clearInterruptFlag(TIMER_A2_BASE);

34

35 void inicializar_leds ()

36 int i;

37 /*

38 const Timer_A_UpModeConfig timerLed1 =

39 TIMER_A_CLOCKSOURCE_SMCLK ,

40 TIMER_A_CLOCKSOURCE_DIVIDER_1 ,

41 FREQ_SMCLK /( LEDS_FREQ_HZ*LEDS_MAX)-1,

42 TIMER_A_TAIE_INTERRUPT_ENABLE ,

43 TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE ,

44 TIMER_A_DO_CLEAR

45 ;

46 MAP_Timer_A_configureUpMode(TIMER_A2_BASE , &timerLed1);

47 MAP_Interrupt_enableInterrupt(INT_TA2_N);

48 MAP_Interrupt_setPriority(INT_TA2_N ,PRIORIDADE_LEDS);

49 MAP_Timer_A_startCounter(TIMER_A2_BASE , TIMER_A_UP_MODE); */

50 LEDS_RAMPA =0;

51 for(i=6;i<LEDS_NR;i++)

52 LEDS[i]=0;

53 GPIO_setAsOutputPin(LEDS_PORTS[i],LEDS_PINS[i]);

54 GPIO_setOutputLowOnPin(LEDS_PORTS[i],LEDS_PINS[i]);

55

56 for(i=0;i<BOTOES_NR;i++)

57 BOTOES[i]=0;

58 GPIO_setAsInputPinWithPullUpResistor(BOTOES_PORTS[i],BOTOES_PINS[i]);

59

60 // MAP_Interrupt_enableMaster ();

61

1 /*

2 * player.h

3 *

4 * Reprodutor de amostras , responsavel por escrever

5 * sincronizadamente no

Page 98: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 84

6 *

7 */

8 #ifndef _PLAYER_H_

9 #define _PLAYER_H_

10

11 #include "globals.h"

12

13 void inicializar_notas(int16_t *string);

14 void play_nota(uint8_t nota , uint8_t volume , uint16_t tempo);

15 inline void beep_1 ();

16 inline void beep_2 ();

17

18 #endif

1 /*

2 * player.c

3 *

4 * Reprodutor de amostras , responsavel por escrever

5 * sincronizadamente no

6 *

7 */

8 #include "player.h"

9

10

11 void inicializar_notas(int16_t *string)

12 int i, j;

13 for(i=0,j=72;i<72;i++)

14 NOTAS_DURACOES[i] = string[i];

15 NOTAS[i] = string+j;

16

17 if(i<21)j += NOTAS_DURACOES[i]>>2;//Nota < A1

18 else if(i<33)j += NOTAS_DURACOES[i]>>1;//Nota < A2

19 else j += NOTAS_DURACOES[i];

20

21 PLAYER_POS = 0;

22 PLAYER_FASE = 0;

23 PLAYER_NOTA = 0;

24 PLAYER_VOLUME = 0;

25

26

27 void play_nota(uint8_t nota , uint8_t volume , uint16_t tempo)

28 int i;

29 uint32_t fase , volume_subindo , volume_descendo , sa = 0, sb = 0, duracao_NOTA_ATUAL;

30 int32_t delta_volume;

31 if(nota >=72) nota =0;

32 if(PLAYER_NOTA <21)sa = 2; //Nota < A1

33 else if(PLAYER_NOTA <33)sa = 1; //Nota < A2

34 if(nota <21)sb = 2;//Nota < A1

35 else if(nota <33)sb = 1;//Nota < A2

36 duracao_NOTA_ATUAL = NOTAS_DURACOES[PLAYER_NOTA ];

37 i = (PLAYER_POS -AUDIO_B_POS+AUDIO_BUFFER_SIZE)%AUDIO_BUFFER_SIZE;

38 PLAYER_POS = AUDIO_B_POS;

39 PLAYER_FASE = (PLAYER_FASE -(i%duracao_NOTA_ATUAL)+duracao_NOTA_ATUAL)%

duracao_NOTA_ATUAL;

40 if(nota== PLAYER_NOTA)

41 for(i=0;i<tempo;i++)

42 delta_volume=PLAYER_VOLUME +(i*(( int32_t)volume -PLAYER_VOLUME))/tempo;

43 AUDIO_BUFFER[PLAYER_POS] = AUDIO_MID +(( int32_t)NOTAS[PLAYER_NOTA ][ PLAYER_FASE

>>sa]* delta_volume)/255;

44 PLAYER_FASE ++;

Page 99: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 85

45 if(PLAYER_FASE >= duracao_NOTA_ATUAL)PLAYER_FASE =0;

46 PLAYER_POS ++;

47 if(PLAYER_POS >= AUDIO_BUFFER_SIZE)PLAYER_POS =0;

48

49 PLAYER_VOLUME = volume;

50 else

51 fase = 0;

52 for(i=0;i<tempo;i++)

53 volume_subindo =(i*volume)/tempo;

54 volume_descendo =( PLAYER_VOLUME *(tempo -i))/tempo;

55 AUDIO_BUFFER[PLAYER_POS] = AUDIO_MID +(( int32_t)NOTAS[PLAYER_NOTA ][ PLAYER_FASE

>>sa]* volume_descendo +

56 (int32_t)NOTAS[nota][fase >>sb]* volume_subindo)

/255;

57 PLAYER_FASE ++;

58 if(PLAYER_FASE >= duracao_NOTA_ATUAL)PLAYER_FASE =0;

59 fase ++;

60 if(fase >= NOTAS_DURACOES[nota])fase =0;

61 PLAYER_POS ++;

62 if(PLAYER_POS >= AUDIO_BUFFER_SIZE)PLAYER_POS =0;

63

64 PLAYER_FASE = fase;

65 PLAYER_NOTA = nota;

66 PLAYER_VOLUME = volume;

67

68

69

70 inline void beep_1 ()

71 uint8_t i,j;

72 uint16_t k=AUDIO_B_POS;

73 for(i=0;i<PLAYER_BEEP_VEZES1;i++)

74 for(j=0;j<PLAYER_BEEP_SEMIPERIODO1;j++)

75 AUDIO_BUFFER[k]+= PLAYER_BEEP_VOLUME;

76 k++;

77 if(k>= AUDIO_BUFFER_SIZE)k=0;

78

79 for(j=0;j<PLAYER_BEEP_SEMIPERIODO1;j++)

80 AUDIO_BUFFER[k]-= PLAYER_BEEP_VOLUME;

81 k++;

82 if(k>= AUDIO_BUFFER_SIZE)k=0;

83

84

85

86 inline void beep_2 ()

87 uint8_t i,j;

88 uint16_t k=AUDIO_B_POS;

89 for(i=0;i<PLAYER_BEEP_VEZES2;i++)

90 for(j=0;j<PLAYER_BEEP_SEMIPERIODO2;j++)

91 AUDIO_BUFFER[k]+= PLAYER_BEEP_VOLUME;

92 k++;

93 if(k>= AUDIO_BUFFER_SIZE)k=0;

94

95 for(j=0;j<PLAYER_BEEP_SEMIPERIODO2;j++)

96 AUDIO_BUFFER[k]-= PLAYER_BEEP_VOLUME;

97 k++;

98 if(k>= AUDIO_BUFFER_SIZE)k=0;

99

100

101

Page 100: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 86

1 /*

2 * sdcard.h

3 *

4 * Utilitarios para o uso do cart~ao SD

5 *

6 */

7

8 #ifndef SDCARD_H

9 #define SDCARD_H

10

11 #include "globals.h"

12 #include "ff12c/ff.h"

13 #include "player.h"

14

15 extern int16_t SDCARD_SAMPLES_BUFFER [15000];

16

17 void reinicializarSD ();

18 int8_t inicializar_sdcard ();

19 int8_t sdcard_save_configs(char *local);

20 int8_t sdcard_load_configs(char *local);

21 int8_t sdcard_find_next_with(char *prefix , char *generated);

22

23 #endif /* SRC_SDCARD_H_ */

1 /*

2 * sdcard.c

3 *

4 * Utilitarios para o uso do cart~ao SD

5 *

6 */

7

8 #include "sdcard.h"

9 #include "lcd_16x2.h"

10

11 void reinicializarSD ()

12 static uint8_t wasPlugged = 0;

13 if(FILESYSTEM_CAN_BE_MOUNTED ==1000)

14 int8_t status;

15 lcd_printStr (0,0," Iniciando SD ");

16 lcd_printStr (1,0," ... ");

17 status = inicializar_sdcard ();

18 switch(status)

19 case 0: lcd_printStr (1,0," OK! ");delay_us( 300000);break;

20 case -1: lcd_printStr (1,0,"ERRO: cfg != dir");delay_us (2000000);break;

21 case -2: lcd_printStr (1,0," ERRO criar cfg ");delay_us (2000000);break;

22 case -3: lcd_printStr (1,0,"ERRO nao ident. ");delay_us (2000000);break;

23

24 FILESYSTEM_CAN_BE_MOUNTED ++;

25 else if(! FILESYSTEM_PLUGGED && wasPlugged)

26 lcd_printStr (0,0," Cartao SD ");

27 lcd_printStr (1,0," DESCONECTADO! ");

28 delay_us( 300000);

29

30 wasPlugged = FILESYSTEM_PLUGGED;

31

32 int8_t inicializar_sdcard ()

33 FILINFO Finfo;

34 f_mount (&FILESYSTEM , "", 1);

35 switch(f_stat("cfg",&Finfo))

36 case FR_OK:

Page 101: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 87

37 if((Finfo.fattrib & AM_DIR) == 0) return -1;

38 break;

39 case FR_NO_PATH:

40 case FR_NO_FILE:

41 if(f_mkdir("cfg")!=FR_OK)return -2;

42 break;

43 default:

44 return -3;

45

46 return 0;

47

48 int8_t sdcard_save_configs(char *local)

49 FIL File;

50 if(f_open (&File ,local ,FA_CREATE_ALWAYS|FA_WRITE)==FR_OK)

51 f_printf (&File ,"%010d,%010d,%010d,%010d,%010d,%010d,%010d,%010d,%010d,%010d,%010d

\n",VERSAO ,PLAYER_BEEP_VEZES1 ,PLAYER_BEEP_SEMIPERIODO1 ,PLAYER_BEEP_VEZES2 ,

52 PLAYER_BEEP_SEMIPERIODO2 ,PLAYER_BEEP_VOLUME ,METRONOMO_COMPASSO ,

METRONOMO_BPM ,PISTOS_LIMIAR_DECISAO [0],

53 PISTOS_LIMIAR_DECISAO [1], PISTOS_LIMIAR_DECISAO [2]);

54 f_printf (&File ,"VERSAO ,BeepVezes1 ,BeepSemi1 ,BeepVezes2 ,BeepSemi2 ,BeepVolume

,Compasso ,BPM ,Pisto1 ,Pisto2 ,Pisto3 ");

55 f_close (&File);

56 else

57 return -1;

58

59 return 0;

60

61 int32_t lazy_atoi(char *buff)

62 uint32_t i, j, k;

63 for(i=9,j=1,k=0;i>0;i--,j*=10)k+=( buff[i]-’0’)*j;

64 return k;

65

66 int8_t sdcard_load_configs(char *local)

67 unsigned int bw, i;

68 FIL File;

69 char buff [11];

70 uint32_t *configs [10] = & PLAYER_BEEP_VEZES1 ,& PLAYER_BEEP_SEMIPERIODO1 ,&

PLAYER_BEEP_VEZES2 ,

71 &PLAYER_BEEP_SEMIPERIODO2 ,& PLAYER_BEEP_VOLUME ,& METRONOMO_COMPASSO ,&

METRONOMO_BPM ,

72 &PISTOS_LIMIAR_DECISAO [0],& PISTOS_LIMIAR_DECISAO [1],& PISTOS_LIMIAR_DECISAO

[2];

73 uint32_t leituras [10];

74 if(f_open (&File ,local ,FA_READ)==FR_OK)

75 f_read (&File ,buff ,11,&bw);

76 if(bw!=11 || buff [10]!= ’,’)

77 f_close (&File);

78 return -2;

79

80 if(lazy_atoi(buff)!= VERSAO)

81 f_close (&File);

82 return -3;

83

84 f_lseek (&File ,10);

85 for(i=0;i<10;i++)

86 f_read (&File ,buff ,11,&bw);

87 if(bw!=11 || buff [0]!=’,’)

88 f_close (&File);

89 return -4;

90

Page 102: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 88

91 leituras[i] = lazy_atoi(buff +1);

92

93 for(i=0;i<10;i++) // Somente sobrescrever se todos estiverem OK

94 *configs[i] = leituras[i];

95

96 else

97 return -1;

98

99 return 0;

100

101 int16_t SDCARD_SAMPLES_BUFFER [15000];

102 int8_t sdcard_load_samples(char *local)

103 FILINFO Finfo;

104 FIL File;

105 unsigned int br;

106 if(f_stat("cfg",&Finfo)!=FR_OK)

107 return -1;

108

109 if(Finfo.fsize >30000)

110 return -2;

111

112 if(f_open (&File ,local ,FA_READ)!=FR_OK)

113 return -3;

114

115 f_read (&File ,SDCARD_SAMPLES_BUFFER ,Finfo.fsize ,&br);

116 if(Finfo.fsize != br)

117 return -4;

118

119 inicializar_notas (( int16_t *) SDCARD_SAMPLES_BUFFER);

120 return 0;

121

122

123 int8_t sdcard_find_next_with(char *name , char *generated)

124 FILINFO Finfo;

125 int pre1 , pre2 , i;

126 int index_posfix , index_fim;

127 if(f_stat(name ,&Finfo) == FR_NO_FILE)

128 for(i=0; name[i]!=0;i++) generated[i] = name[i];

129 return 0;

130

131 for(i=0; name[i]!=0;i++);

132 index_fim = i;

133 for(;name[i]!=’.’&&name[i]!=’/’&&i>0;i--);

134 index_posfix = i;

135 for(i=0;i<index_posfix;i++) generated[i]=name[i];

136 for(;i<index_fim;i++) generated[i+2]= name[i];

137 for(pre2 =0;pre2 <10; pre2 ++)

138 generated[index_posfix] = ’0’+pre2;

139 for(pre1 =0;pre1 <10; pre1 ++)

140 generated[index_posfix +1] = ’0’+pre1;

141 if(f_stat(generated ,&Finfo) == FR_NO_FILE)

142 return pre1+pre2 *10;

143

144

145

146 return -1;

147

1 /*

2 * telas.h

Page 103: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 89

3 *

4 * Created on: 27 de set de 2017

5 * Author: Makara

6 */

7

8 #ifndef SRC_TELAS_H_

9 #define SRC_TELAS_H_

10

11

12

13 void telas_executar ();

14

15

16 #endif /* SRC_TELAS_H_ */

1 /*

2 * telas.c

3 *

4 * Created on: 27 de set de 2017

5 * Author: Makara

6 */

7

8 #include "globals.h"

9 #include "telas.h"

10 #include "lcd_16x2.h"

11 #include "instrumentos.h"

12

13 #define APENAS_LEITURA 0x01

14 #define DISPLAY_HEX 0x02

15

16 enum TYPECAST

17 UINT8 ,

18 INT8 ,

19 UINT16 ,

20 INT16 ,

21 UINT32 ,

22 INT32 ,

23 STRING ,

24 CHOICE ,

25 ;

26 struct edicao_tela

27 enum TYPECAST typecast;

28 uint8_t modifier;

29 void* variavel;

30 int32_t min;

31 int32_t max;

32 void* min_addr;

33 void* max_addr;

34 char strtop [17];

35 char strbot [17];

36 ;

37 struct edicao_submenu

38 char strtop [17];

39 char strbot [17];

40 int16_t telas [32];

41 ;

42 const struct edicao_submenu MENUS[] =

43 " Menu Principal ","< Metronomo >" ,0,1,2,-1,

44 " Salvar/Carregar","< Configuracoes >" ,3,4,-1,

45 " ","< Pistos >" ,5,6,7,8,9,10,11,-1,

Page 104: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 90

46 " ","< Display >" ,12,13,-1,

47 " ","< Leituras >" ,14,15,16,-1,

48 ;

49 const char STDSTR_SALVAR [][16]=

50 " v Salvar! v "," Salvando ... ",

51 ;

52 const char STDSTR_CARREGAR [][16]=

53 " v Carregar! v "," Carregando ... ",

54 ;

55 const struct edicao_tela TELAS[] =

56 UINT32 , 0, &METRONOMO_COMPASSO , 0, 16, NULL , NULL , "< Compasso >", " \xFF

\xFF /4 ",//0

57 UINT32 , 0, &METRONOMO_BPM , 0, 300, NULL , NULL , "< Frequencia >", " \xFF\

xFF\xFF BPM ",//1

58 UINT32 , 0, &PLAYER_BEEP_VOLUME , 0, 300, NULL , NULL , "< Volume >", " \xFF\

xFF\xFF ",//2

59

60 CHOICE , 0, &CMD_SAVETOSD , 0, 1, (void*) STDSTR_SALVAR [0] , NULL , "< Salvar P

/ SD >", "",//3

61 CHOICE , 0, &CMD_LOADFROMSD , 0, 1, (void*) STDSTR_CARREGAR [0], NULL , "<Carregar

de SD>", "",//4

62

63 UINT16 , APENAS_LEITURA , &( ADC_SUBBUFFER[ISB_PISTO1 ]), 0, 4095, NULL , NULL , "< Valor

Pisto 1>", " \xFF\xFF\xFF\xFF ",//5

64 UINT32 , 0 , PISTOS_LIMIAR_DECISAO +0 , 0, 4095, NULL , NULL , "<Limiar

Pisto 1>", " \xFF\xFF\xFF\xFF ",//6

65 UINT16 , APENAS_LEITURA , &( ADC_SUBBUFFER[ISB_PISTO2 ]), 0, 4095, NULL , NULL , "< Valor

Pisto 2>", " \xFF\xFF\xFF\xFF ",//7

66 UINT32 , 0 , PISTOS_LIMIAR_DECISAO +1 , 0, 4095, NULL , NULL , "<Limiar

Pisto 2>", " \xFF\xFF\xFF\xFF ",//8

67 UINT16 , APENAS_LEITURA , &( ADC_SUBBUFFER[ISB_PISTO3 ]), 0, 4095, NULL , NULL , "< Valor

Pisto 3>", " \xFF\xFF\xFF\xFF ",//9

68 UINT32 , 0 , PISTOS_LIMIAR_DECISAO +2 , 0, 4095, NULL , NULL , "<Limiar

Pisto 3>", " \xFF\xFF\xFF\xFF ",//10

69 UINT8 , APENAS_LEITURA , &PISTOS , 0, 255 , NULL , NULL , "<Valor

Digitado >", " \xFF ",//11

70

71 UINT32 , 0, &LCD_CONTRASTE , 0, AUDIO_MAX , NULL , NULL , "< Contraste >", " \xFF

\xFF\xFF\xFF ",//12

72 UINT32 , 0, &LCD_LED , 0, 100 , NULL , NULL , "< Backlight >", " \xFF

\xFF\xFF % ",//13

73

74 UINT32 , APENAS_LEITURA , &BOCAL_FREQUENCIAx10 , 0, 9999, NULL , NULL , "< Frequencia >

", " \xFF\xFF\xFF\xFF.\xFF Hz ",//14

75 UINT32 , APENAS_LEITURA , &ADC_RMS , 0, 9999, NULL , NULL , "< RMS >", "

\xFF\xFF\xFF\xFF ",//15

76 CHOICE , 0, &CMD_SAVERAW , 0, 1, (void*) STDSTR_SALVAR [0] , NULL , "< Salvar P/

SD >", "",//16

77 ;

78 const int NR_TELAS = sizeof(TELAS)/sizeof(struct edicao_tela);

79 const int NR_MENUS = sizeof(MENUS)/sizeof(struct edicao_submenu);

80

81

82

83 void telas_executar ()

84 uint32_t sticky_counter = 0;

85 uint8_t tela_atual [3] = 0,0,0;

86 char bin2ascii []=’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’A’,’B’,’C’,’D’,’E’,’F’,’*’

,’*’,’*’,’*’;

87 while (1)

Page 105: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 91

88 if(tela_atual [0]==0)

89 char buff [17]=" ";

90 // tocar_trompete_bB ();

91 // lcd_printStr (0,0," Trompete ");

92 // lcd_printStr (1,0," Eletronico ");

93 buff[( INSTRUMENTO_DESAFINACAO *15) /200]= ’I’;

94 lcd_printStr (0,0," ");

95 lcd_printStr (0,12, NOTAS_NOMES[INSTRUMENTO_NOTA_NOMINAL ]);

96 lcd_printStr (1,0,buff);

97

98 if(BOTOES[BUTTONID_MID ])

99 tela_atual [0] = 1;

100 while(BOTOES[BUTTONID_MID ]) delay_ms (50);

101

102 delay_ms (100);

103 else if(tela_atual [0]==1)

104 lcd_printStr (0,0,MENUS[tela_atual [1]]. strtop);

105 lcd_printStr (1,0,MENUS[tela_atual [1]]. strbot);

106

107 if(BOTOES[BUTTONID_MID] || BOTOES[BUTTONID_UP ])

108 tela_atual [0]=0;

109 while(BOTOES[BUTTONID_MID ]|| BOTOES[BUTTONID_UP ]) delay_ms (50);

110 else if(BOTOES[BUTTONID_LEFT ])

111 tela_atual [1]=( tela_atual [1]-1+ NR_MENUS)%NR_MENUS;

112 tela_atual [2] = 0;

113 while(BOTOES[BUTTONID_LEFT ]) delay_ms (50);

114 else if(BOTOES[BUTTONID_RIGHT ])

115 tela_atual [1]=( tela_atual [1]+1)%NR_MENUS;

116 tela_atual [2] = 0;

117 while(BOTOES[BUTTONID_RIGHT ]) delay_ms (50);

118 else if(BOTOES[BUTTONID_DOWN ])

119 tela_atual [0]=2;

120 while(BOTOES[BUTTONID_DOWN ]) delay_ms (50);

121 else

122 delay_ms (50);

123

124 else if(tela_atual [0]==2)

125 struct edicao_tela atual = TELAS[MENUS[tela_atual [1]]. telas[tela_atual [2]]];

126 if(atual.typecast ==UINT8 || atual.typecast ==INT8 ||

127 atual.typecast == UINT16 || atual.typecast ==INT16 ||

128 atual.typecast == UINT32 || atual.typecast ==INT32 )

129 int32_t var_atual;

130 int32_t min = (atual.min_addr ==NULL) ? atual.min : *( int32_t *)atual.

min_addr;

131 int32_t max = (atual.max_addr ==NULL) ? atual.max : *( int32_t *)atual.

max_addr;

132 int32_t i, j, last , mod = (atual.modifier&DISPLAY_HEX) ? 16 : 10;

133 char buf [17];

134 switch(atual.typecast)

135 case UINT8:

136 var_atual = 0xFF & *(( uint8_t *)atual.variavel);

137 break;

138 case INT8:

139 var_atual = 0xFF & *(( int8_t *)atual.variavel);

140 break;

141 case UINT16:

142 var_atual = 0xFFFF & *(( uint16_t *)atual.variavel);

143 break;

144 case INT16:

145 var_atual = 0xFFFF & *(( int16_t *)atual.variavel);

Page 106: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 92

146 break;

147 case UINT32:

148 var_atual = *(( uint32_t *)atual.variavel);

149 break;

150 case INT32:

151 default:

152 var_atual = *(( int32_t *)atual.variavel);

153

154 for(i=0;i<17;i++)buf[i]=atual.strbot[i];

155

156 for(i=16; buf[i]!=0 xFF && i>=0;i--);

157 j = (var_atual >0) ? var_atual : -var_atual;

158 buf[i]= bin2ascii[j % mod];

159 j = j/mod;

160 last = i;

161 i--;

162 for(;i>=0;i--)

163 if(buf[i]==0 xFF)

164 if(j==0) buf[i]=’ ’;

165 else buf[i]= bin2ascii[j % mod];

166 j = j/mod;

167 last = i;

168

169

170 if(var_atual <0)buf[last]=’-’;

171 if(!( atual.modifier&APENAS_LEITURA))

172 uint32_t incremento;

173 if(BOTOES[BUTTONID_UP] || BOTOES[BUTTONID_DOWN ])

174 incremento =0;

175 if(sticky_counter %3==0)

176 if(sticky_counter >1 && sticky_counter <10) incremento =0;

177 else if(sticky_counter <30 || (var_atual %10!=0))incremento =1;

178 else if(sticky_counter <60 || (var_atual %100!=0))incremento

=10;

179 else if(sticky_counter <100 || (var_atual %1000!=0))incremento

=100;

180 else incremento =1000;

181

182 if(BOTOES[BUTTONID_UP ])

183 var_atual += incremento;

184 if(var_atual >max)var_atual=max;

185 else

186 var_atual -= incremento;

187 if(var_atual <min)var_atual=min;

188

189 sticky_counter ++;

190 else

191 sticky_counter = 0;

192

193 *(( int32_t *)atual.variavel) = var_atual;

194

195 lcd_printStr (0,0,atual.strtop);

196 lcd_printStr (1,0,buf);

197 if(BOTOES[BUTTONID_MID ])

198 tela_atual [0]=1;

199 while(BOTOES[BUTTONID_MID ]) delay_ms (50);

200 else if(BOTOES[BUTTONID_LEFT ])

201 if(tela_atual [2]==0)

202 while(MENUS[tela_atual [1]]. telas[tela_atual [2]] >=0) tela_atual

[2]++;

Page 107: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 93

203

204 tela_atual [2]--;

205 while(BOTOES[BUTTONID_LEFT ]) delay_ms (50);

206 else if(BOTOES[BUTTONID_RIGHT ])

207 tela_atual [2]++;

208 if(MENUS[tela_atual [1]]. telas[tela_atual [2]] <0)

209 tela_atual [2]=0;

210

211 while(BOTOES[BUTTONID_RIGHT ]) delay_ms (50);

212 else

213 delay_ms (50);

214

215 else if(atual.typecast == CHOICE)

216 uint8_t var_atual = *(( uint8_t *)atual.variavel);

217 int32_t min = atual.min;

218 int32_t max = (atual.max_addr ==NULL) ? atual.max : *( int32_t *)atual.

max_addr;

219 if(!( atual.modifier&APENAS_LEITURA))

220 if(BOTOES[BUTTONID_UP ])

221 var_atual ++;

222 if(var_atual >max)var_atual=min;

223 while(BOTOES[BUTTONID_UP ]) delay_ms (50);

224 else if(BOTOES[BUTTONID_DOWN ])

225 if(var_atual >min)var_atual --;

226 else var_atual = max;

227 while(BOTOES[BUTTONID_DOWN ]) delay_ms (50);

228

229 *(( int8_t *)atual.variavel) = var_atual;

230

231 lcd_printStr (0,0,atual.strtop);

232 lcd_printStr (1,0,((char*)atual.min_addr)+17*( var_atual -min));

233 if(BOTOES[BUTTONID_MID ])

234 tela_atual [0]=1;

235 while(BOTOES[BUTTONID_MID ]) delay_ms (50);

236 else if(BOTOES[BUTTONID_LEFT ])

237 if(tela_atual [2]==0)

238 while(MENUS[tela_atual [1]]. telas[tela_atual [2]] >=0) tela_atual

[2]++;

239 tela_atual [2]--;

240

241 while(BOTOES[BUTTONID_LEFT ]) delay_ms (50);

242 else if(BOTOES[BUTTONID_RIGHT ])

243 tela_atual [2]++;

244 if(MENUS[tela_atual [1]]. telas[tela_atual [2]] <0)

245 tela_atual [2]=0;

246

247 while(BOTOES[BUTTONID_RIGHT ]) delay_ms (50);

248 else

249 delay_ms (50);

250

251

252 else tela_atual [0]=0;

253

254

1 /*

2 * testes.h

3 *

4 * Arquivo contendo todos os testes de hardware que podem ser feitos

5 *

Page 108: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 94

6 */

7

8 #ifndef TESTES_H

9 #define TESTES_H

10

11 #include "globals.h"

12 #include "player.h"

13 #include "sdcard.h"

14 #include "lcd_16x2.h"

15

16 void test_leds_c_pistos ();

17 void test_pistos_c_leds ();

18 void test_metronomo_tempo_c_pistos ();

19 void test_player_c_pistos ();

20 void test_sdcard_write_c_leds ();

21 void test_microfone_c_sdcard(char *prefixo);

22 void test_lcd16x2 ();

23

24 #endif /* SRC_TESTES_H_ */

1 /*

2 * testes.c

3 *

4 * Arquivo contendo todos os testes de hardware que podem ser feitos

5 *

6 */

7

8 #include "testes.h"

9

10 void test_leds_c_pistos ()

11 int i, pos=0, val =50;

12 METRONOMO_COMPASSO = 0;

13 while (1)

14 if(PISTOS ==2)

15 while(PISTOS ==2) delay_us (8000);

16 if(val <50) val +=10;

17 else if(PISTOS ==1)

18 while(PISTOS ==1) delay_us (8000);

19 if(pos==LEDS_NR -1)pos=0;

20 else pos++;

21 else if(PISTOS ==3)

22 while(PISTOS ==3) delay_us (8000);

23 if(val >1)val -=10;

24 else

25 delay_us (8000);

26

27 for(i=0;i<LEDS_NR;i++) LEDS[i]=0;

28 LEDS[pos]=val;

29

30

31 void test_pistos_c_leds ()

32 METRONOMO_COMPASSO = 0;

33 while(! BOTOES [1])

34 LEDS [0]=0;

35 LEDS [1]=0;

36 LEDS [2]=0;

37 if(ADC_SUBBUFFER[ISB_PISTO1]>PISTOS_LIMIAR_DECISAO [0]) LEDS [6]=10;

38 if(ADC_SUBBUFFER[ISB_PISTO2]>PISTOS_LIMIAR_DECISAO [1]) LEDS [7]=10;

39 if(ADC_SUBBUFFER[ISB_PISTO3]>PISTOS_LIMIAR_DECISAO [2]) LEDS [8]=10;

40 delay_us (80000);

Page 109: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 95

41

42

43

44

45 void test_metronomo_tempo_c_pistos ()

46 METRONOMO_COMPASSO = 4;

47 METRONOMO_BPM = 120;

48 while (1)

49 if(PISTOS ==2)

50 while(PISTOS ==2) delay_us (1000);

51 if(METRONOMO_BPM <500) METRONOMO_BPM ++;

52 else if(PISTOS ==1)

53 METRONOMO_CONTAGEM = (ADC_SAMPLING *60)/METRONOMO_BPM;

54 METRONOMO_STATUS = 4;

55 while(PISTOS ==1) delay_us (1000);

56 else if(PISTOS ==3)

57 while(PISTOS ==3) delay_us (1000);

58 if(METRONOMO_BPM >0) METRONOMO_BPM --;

59 else if(PISTOS ==5)

60 if(METRONOMO_COMPASSO ==6) METRONOMO_COMPASSO =2;

61 else METRONOMO_COMPASSO ++;

62 while(PISTOS ==5) delay_us (1000);

63 else if(PISTOS ==6)

64 METRONOMO_COMPASSO = 4;

65 METRONOMO_BPM = 120;

66 while(PISTOS ==6) delay_us (1000);

67 else

68 delay_us (1000);

69

70

71

72

73 void test_player_c_pistos ()

74 int nota=36, amplitude =250;

75 METRONOMO_BPM = 0;

76 while (1)

77 if(PISTOS ==2)

78 while(PISTOS ==2) delay_us (1000);

79 if(nota <71) nota ++;

80 else if(PISTOS ==1)

81 while(PISTOS ==1) delay_us (1000);

82 if(amplitude <=0) amplitude =250;

83 else amplitude -=50;

84 else if(PISTOS ==3)

85 while(PISTOS ==3) delay_us (1000);

86 if(nota >0)nota --;

87 else if(PISTOS ==6)

88 nota =36;

89 amplitude =250;

90 while(PISTOS ==6) delay_us (1000);

91 else

92 delay_us (1000);

93

94 play_nota(nota ,amplitude ,AUDIO_BUFFER_SIZE);

95

96

97 void test_sdcard_write_c_leds ()

98 FIL File;

99 char string_usada [] = "Teste do cart~ao SD. Este teste tamb em inclui acentos.";

100 int i=0;

Page 110: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 96

101 UINT bw;

102 while(i==0)

103 LEDS [6] = 50;

104 inicializar_sdcard ();

105 delay_us (10000);

106 if (f_open (&File , "teste com nome grande.txt", FA_CREATE_ALWAYS | FA_WRITE) ==

FR_OK) //

107 LEDS [7] = 50;

108 f_write (&File , string_usada , sizeof(string_usada), &bw);

109 if(bw== sizeof(string_usada))

110 i=1;

111

112

113 LEDS [6] = 0;

114 delay_us (10000);

115

116 f_close (&File);

117 while (1)

118 LEDS [8] = 50;

119 delay_us (1);

120

121

122 void test_microfone_c_sdcard(char *prefixo)

123 FIL File;

124 unsigned int bw;

125 char endereco [20];

126 while (1)

127 if(sdcard_find_next_with(prefixo ,endereco) <0)return;

128 LEDS [7] = 50;

129 LEDS [9] = 0;

130 while(! BOTOES[BUTTONID_MID ]) delay_us (1000);

131 while(BOTOES[BUTTONID_MID ]) delay_us (1000);

132 if(f_open (&File ,endereco ,FA_CREATE_ALWAYS | FA_WRITE)!=FR_OK)continue;

133 while(! BOTOES[BUTTONID_MID ])

134 LEDS [9] = 50;

135 LEDS [7] = 50;

136 while(SCOPE_POS <SCOPE_SIZE /2);

137 LEDS [7] = 0;

138 f_write (&File , &SCOPE [0][0] , SCOPE_WIDTH*SCOPE_SIZE , &bw);

139 LEDS [9] = 0;

140 if(bw!= SCOPE_WIDTH*SCOPE_SIZE)

141 f_close (&File);

142 BOTOES[BUTTONID_MID] = 1;

143 continue;

144

145 LEDS [7] = 50;

146 while(SCOPE_POS >= SCOPE_SIZE /2);

147 LEDS [7] = 0;

148 LEDS [9] = 50;

149 f_write (&File , &SCOPE[SCOPE_SIZE /2][0] , SCOPE_WIDTH*SCOPE_SIZE , &bw);

150 LEDS [9] = 0;

151 if(bw!= SCOPE_WIDTH*SCOPE_SIZE)

152 f_close (&File);

153 BOTOES[BUTTONID_MID] = 1;

154 continue;

155

156 f_sync (&File);

157

158 f_close (&File);

159 while(BOTOES[BUTTONID_MID ]) delay_us (1000);

Page 111: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE A. APENDICE: CODIGOS FONTE MSP432 97

160

161

162

163 void test_lcd16x2 ()

164 inicializar_lcd16x2 ();

165

166

Page 112: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

98

APENDICE B – APENDICE: CODIGOS FONTE ESP-01

1 #include <ESP8266WiFi.h>

2 #include <WiFiClient.h>

3 #include <ESP8266WebServer.h>

4 #include <FS.h>

5

6 const char* ssid = "wifi -ssid";

7 const char* password = "wifi -password";

8 const char* host = "E-Trompete";

9 IPAddress myIp(0,0,0,0);

10

11 ESP8266WebServer server (80);

12

13 String formatBytes(size_t bytes)

14 if (bytes < 1024)

15 return String(bytes)+"B";

16 else if(bytes < (1024 * 1024))

17 return String(bytes /1024.0)+"KB";

18 else if(bytes < (1024 * 1024 * 1024))

19 return String(bytes /1024.0/1024.0)+"MB";

20 else

21 return String(bytes /1024.0/1024.0/1024.0)+"GB";

22

23

24 String getContentType(String filename)

25 if(server.hasArg("download")) return "application/octet -stream";

26 else if(filename.endsWith(".htm")) return "text/html";

27 else if(filename.endsWith(".html")) return "text/html";

28 else if(filename.endsWith(".css")) return "text/css";

29 else if(filename.endsWith(".js")) return "application/javascript";

30 else if(filename.endsWith(".png")) return "image/png";

31 else if(filename.endsWith(".gif")) return "image/gif";

32 else if(filename.endsWith(".jpg")) return "image/jpeg";

33 else if(filename.endsWith(".ico")) return "image/x-icon";

34 else if(filename.endsWith(".xml")) return "text/xml";

35 else if(filename.endsWith(".pdf")) return "application/x-pdf";

36 else if(filename.endsWith(".zip")) return "application/x-zip";

37 else if(filename.endsWith(".gz")) return "application/x-gzip";

38 return "text/plain";

39

40 bool handleFileRead(String path)

41 if(path.endsWith("/")) path += "index.htm";

42 String contentType = getContentType(path);

43 String pathWithGz = path + ".gz";

44 if(SPIFFS.exists(pathWithGz) || SPIFFS.exists(path))

45 if(SPIFFS.exists(pathWithGz))

46 path += ".gz";

47 File file = SPIFFS.open(path , "r");

48 size_t sent = server.streamFile(file , contentType);

49 file.close();

50 return true;

51

52 return false;

53

54 void handleFileDelete ()

55 if(server.args() == 0) return server.send (500, "text/plain", "BAD ARGS");

Page 113: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE B. APENDICE: CODIGOS FONTE ESP-01 99

56 String path = server.arg(0);

57 if(path == "/")

58 return server.send (500, "text/plain", "BAD PATH");

59 if(! SPIFFS.exists(path))

60 return server.send (404, "text/plain", "FileNotFound");

61 SPIFFS.remove(path);

62 server.send (200, "text/plain", "");

63 path = String ();

64

65 void handleFileList ()

66 if(! server.hasArg("dir")) server.send (500, "text/plain", "BAD ARGS"); return ;

67

68 String path = server.arg("dir");

69 Dir dir = SPIFFS.openDir(path);

70 path = String ();

71

72 String output = "[";

73 while(dir.next())

74 File entry = dir.openFile("r");

75 if (output != "[") output += ’,’;

76 bool isDir = false;

77 output += "\" type \":\"";

78 output += (isDir)?"dir":"file";

79 output += "\",\" name \":\"";

80 output += String(entry.name()).substring (1);

81 output += "\"";

82 entry.close();

83

84

85 output += "]";

86 server.send (200, "text/json", output);

87

88 void WIFI_connectNonblock ()

89 if (String(WiFi.SSID()) != String(ssid))

90 WiFi.begin(ssid , password);

91

92 if(WiFi.status () == WL_CONNECTED)

93 if(myIp [0]==0)

94 myIp = WiFi.localIP ();

95 //TODO: send string to trumpet saying it is connected

96

97 else

98 if(myIp [0]!=0)

99 myIp = IPAddress (0,0,0,0);

100 //TODO: send string to trumpet saying it is not connected

101

102

103

104 void WIFI_setupWeb ()

105 server.on("/list", HTTP_GET , handleFileList);

106 server.on("/edit", HTTP_DELETE , handleFileDelete);

107 server.onNotFound ([]()

108 if(! handleFileRead(server.uri()))

109 server.send (404, "text/plain", "FileNotFound");

110 );

111 server.begin();

112

113

114

115 void setup()

Page 114: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE B. APENDICE: CODIGOS FONTE ESP-01 100

116 SERIAL_init ();

117 SPIFFS.begin();

118 WIFI_connectNonblock ();

119 WIFI_setupWeb ();

120

121

122 void loop()

123 WIFI_connectNonblock ();

124 SERIAL_tratar ();

125 server.handleClient ();

126

1

2 const uint8_t CRC8_TABLE [256] =

3 0x00 , 0x07 , 0x0e , 0x09 , 0x1c , 0x1b , 0x12 , 0x15 , 0x38 , 0x3f , 0x36 , 0x31 , 0x24 , 0x23 , 0

x2a , 0x2d ,

4 0x70 , 0x77 , 0x7e , 0x79 , 0x6c , 0x6b , 0x62 , 0x65 , 0x48 , 0x4f , 0x46 , 0x41 , 0x54 , 0x53 , 0

x5a , 0x5d ,

5 0xe0 , 0xe7 , 0xee , 0xe9 , 0xfc , 0xfb , 0xf2 , 0xf5 , 0xd8 , 0xdf , 0xd6 , 0xd1 , 0xc4 , 0xc3 , 0

xca , 0xcd ,

6 0x90 , 0x97 , 0x9e , 0x99 , 0x8c , 0x8b , 0x82 , 0x85 , 0xa8 , 0xaf , 0xa6 , 0xa1 , 0xb4 , 0xb3 , 0

xba , 0xbd ,

7 0xc7 , 0xc0 , 0xc9 , 0xce , 0xdb , 0xdc , 0xd5 , 0xd2 , 0xff , 0xf8 , 0xf1 , 0xf6 , 0xe3 , 0xe4 , 0

xed , 0xea ,

8 0xb7 , 0xb0 , 0xb9 , 0xbe , 0xab , 0xac , 0xa5 , 0xa2 , 0x8f , 0x88 , 0x81 , 0x86 , 0x93 , 0x94 , 0

x9d , 0x9a ,

9 0x27 , 0x20 , 0x29 , 0x2e , 0x3b , 0x3c , 0x35 , 0x32 , 0x1f , 0x18 , 0x11 , 0x16 , 0x03 , 0x04 , 0

x0d , 0x0a ,

10 0x57 , 0x50 , 0x59 , 0x5e , 0x4b , 0x4c , 0x45 , 0x42 , 0x6f , 0x68 , 0x61 , 0x66 , 0x73 , 0x74 , 0

x7d , 0x7a ,

11 0x89 , 0x8e , 0x87 , 0x80 , 0x95 , 0x92 , 0x9b , 0x9c , 0xb1 , 0xb6 , 0xbf , 0xb8 , 0xad , 0xaa , 0

xa3 , 0xa4 ,

12 0xf9 , 0xfe , 0xf7 , 0xf0 , 0xe5 , 0xe2 , 0xeb , 0xec , 0xc1 , 0xc6 , 0xcf , 0xc8 , 0xdd , 0xda , 0

xd3 , 0xd4 ,

13 0x69 , 0x6e , 0x67 , 0x60 , 0x75 , 0x72 , 0x7b , 0x7c , 0x51 , 0x56 , 0x5f , 0x58 , 0x4d , 0x4a , 0

x43 , 0x44 ,

14 0x19 , 0x1e , 0x17 , 0x10 , 0x05 , 0x02 , 0x0b , 0x0c , 0x21 , 0x26 , 0x2f , 0x28 , 0x3d , 0x3a , 0

x33 , 0x34 ,

15 0x4e , 0x49 , 0x40 , 0x47 , 0x52 , 0x55 , 0x5c , 0x5b , 0x76 , 0x71 , 0x78 , 0x7f , 0x6a , 0x6d , 0

x64 , 0x63 ,

16 0x3e , 0x39 , 0x30 , 0x37 , 0x22 , 0x25 , 0x2c , 0x2b , 0x06 , 0x01 , 0x08 , 0x0f , 0x1a , 0x1d , 0

x14 , 0x13 ,

17 0xae , 0xa9 , 0xa0 , 0xa7 , 0xb2 , 0xb5 , 0xbc , 0xbb , 0x96 , 0x91 , 0x98 , 0x9f , 0x8a , 0x8d , 0

x84 , 0x83 ,

18 0xde , 0xd9 , 0xd0 , 0xd7 , 0xc2 , 0xc5 , 0xcc , 0xcb , 0xe6 , 0xe1 , 0xe8 , 0xef , 0xfa , 0xfd , 0

xf4 , 0xf3

19 ;

20 inline uint8_t crc8(uint8_t msg , uint8_t crc)

21 return CRC8_TABLE[crc^msg];

22

23 uint8_t crc8str(uint8_t *msg , uint16_t size , uint8_t crc)

24 while(size >0)

25 crc = CRC8_TABLE [*msg ^ crc];

26 msg++;

27 size --;

28

29 return crc;

30

1 #include <FS.h>

Page 115: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE B. APENDICE: CODIGOS FONTE ESP-01 101

2

3 File MIDIF_file;

4 String MIDIF_name;

5 String MIDIF_prefix = "musica";

6 unsigned long int MIDIF_begin;

7 unsigned long int MIDIF_size;

8

9 String MIDIF_findNextName ()

10 for(int i=0;i <1000;i++)

11 String prox = String(MIDIF_prefix+String(i,10)+".mid");

12 if(! SPIFFS.exists(prox))return prox;

13

14 return String("ultimo_arquivo.mid");

15

16

17 uint8_t MIDIF_start ()

18 MIDIF_name = MIDIF_findNextName ();

19 MIDIF_file = SPIFFS.open(MIDIF_name , "wb");

20 if(! MIDIF_file)

21 MIDIF_name = "";

22 return 1;

23

24 // Single track MIDI - Format 0 - 192 ticks / quarter

25 // Iniatially we dont know the size. Thus MIDIF_end () MUST be called

26 // 120 BPM -> 2bps. 0x01F4 = 500 -> 1 tick = 1 ms

27 const uint8_t header [] = ’M’,’T’,’h’,’d’ ,0,0,0,6, 0,0, 0,1, 0x01 ,0xF4 ,’M’,’T’,’r’,’k’

,0,0,0,0;

28 MIDIF_file.write(header , sizeof(header));

29 MIDIF_size = 0;

30 const uint8_t instrument [] = 0xFF , 0x04 , 19 ,’T’,’r’,’o’,’m’,’p’,’e’,’t’,’e’,’ ’,’E’,’

l’,’e’,’t’,’r’,’o’,’n’,’i’,’c’,’o’;

31 MIDIF_file.write(instrument , sizeof(instrument));

32 MIDIF_size += sizeof(instrument);

33 //0x07A120 = 500000

34 const uint8_t tempo[] = 0xFF , 0x51 , 0x03 , 0x07 , 0xA1 , 0x20;

35 MIDIF_file.write(tempo , sizeof(tempo));

36 MIDIF_size += sizeof(tempo);

37 MIDIF_begin = millis ();

38 return 0;

39

40

41 uint8_t MIDIF_register(uint8_t *data , uint8_t len)

42 if(MIDIF_file)

43 uint8_t toWrite [10], size , i;

44 unsigned long int time = millis () - MIDIF_begin;

45 toWrite [2] = (time >>0)&0x7F;

46 toWrite [1] = 0x80|(time >>7)&0x7F;

47 toWrite [0] = 0x80|(time >>14)&0x7F;

48 size = 3;

49 switch(data [0]&0 xF0)

50 case 0x80:

51 case 0x90:

52 case 0xA0:

53 case 0xB0:

54 case 0xE0:

55 for(i=0;i<3;i++) toWrite[i+size]=data[i];

56 size +=3;

57 break;

58 case 0xC0:

59 case 0xD0:

Page 116: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE B. APENDICE: CODIGOS FONTE ESP-01 102

60 for(i=0;i<2;i++) toWrite[i+size]=data[i];

61 size +=2;

62 break;

63 default:

64 return 1;

65

66 MIDIF_file.write(toWrite , size);

67 MIDIF_size += size;

68 return 0;

69

70

71

72 uint8_t MIDIF_end ()

73 const uint8_t endOfTrack [] = 0xFF , 0x2F , 0x00;

74 MIDIF_file.write(endOfTrack , sizeof(endOfTrack));

75 MIDIF_size += sizeof(endOfTrack);

76 //TODO: Escrever na posi c~ao correta o tamanho do arquivo

77 MIDIF_file.seek(18,fs:: SeekSet);

78 uint8_t size [4];

79 size [0] = (MIDIF_size >>24)&0xFF;

80 size [1] = (MIDIF_size >>16)&0xFF;

81 size [2] = (MIDIF_size >>8 )&0xFF;

82 size [3] = (MIDIF_size >>0 )&0xFF;

83 MIDIF_file.write(size , 4);

84 MIDIF_file.close();

85 MIDIF_name = "";

86 return 0;

87

1 #include <ESP8266WiFi.h>

2 #include <WiFiUdp.h>

3

4 WiFiUDP MUDP_obj;

5 unsigned int MUDP_port;

6 IPAddress MUDP_broadcastIp (192, 168, 1, 255);

7 bool MUDP_available = false;

8

9 inline void MUDP_refreshBroadcast ()

10 if(WiFi.status () == WL_CONNECTED)

11 MUDP_available = true;

12 MUDP_broadcastIp = ~WiFi.subnetMask () | WiFi.gatewayIP ();

13 else

14 MUDP_available = false;

15

16

17 void MUDP_send(uint8_t *bytes , uint8_t size)

18 if(MUDP_available)

19 MUDP_obj.beginPacket(MUDP_broadcastIp ,MUDP_port);

20 MUDP_obj.write(bytes ,size);

21 MUDP_obj.endPacket ();

22

23

1 // Tratamento da serial - Camada "fısica"

2

3 #define SERIAL_MAX_CIRCBUFFER 256

4 #define SERIAL_CIRCBUF_MASK 0xFF

5 #define SERIAL_MAX_MSGSIZE 127

6

7 String SERIAL_MSGSTR;

Page 117: DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus densidade de pot^encia em sweep ... o jeito que a mus ica e tocada e ensinada hoje

APENDICE B. APENDICE: CODIGOS FONTE ESP-01 103

8 uint8_t SERIAL_lastmsg[SERIAL_MAX_MSGSIZE +2];

9 uint8_t SERIAL_circbuffer[SERIAL_MAX_CIRCBUFFER ];

10 uint8_t SERIAL_top , SERIAL_bot;

11

12 void SERIAL_init ()

13 Serial.begin (115200);

14 SERIAL_top = 0;

15 SERIAL_bot = 0;

16 SERIAL_MSGSTR = "";

17

18

19 void SERIAL_ler ()

20 uint16_t i, j;

21 while(Serial.available ())

22 SERIAL_circbuffer[SERIAL_top] = Serial.read();

23 SERIAL_top = (SERIAL_top +1)&SERIAL_CIRCBUF_MASK;

24 if(SERIAL_circbuffer[SERIAL_bot]>SERIAL_MAX_MSGSIZE || SERIAL_circbuffer[SERIAL_bot

]!=0)

25 SERIAL_bot = (SERIAL_bot +1)&SERIAL_CIRCBUF_MASK;

26 else

27 uint8_t size = SERIAL_circbuffer[SERIAL_bot ];

28 uint8_t available = (SERIAL_top -SERIAL_bot)&SERIAL_CIRCBUF_MASK;

29 if(size+2>= available)

30 uint8_t crc = 0;

31 for(j=0,i=SERIAL_bot ; j<available; j++,i=(i+1)&SERIAL_CIRCBUF_MASK)

32 crc = crc8(SERIAL_circbuffer[i],crc);

33 SERIAL_lastmsg[j] = SERIAL_circbuffer[i];

34

35 if(crc!=0x00)

36 SERIAL_bot = (SERIAL_bot +1)&SERIAL_CIRCBUF_MASK;

37 else

38 SERIAL_bot = (SERIAL_bot+size +2)&SERIAL_CIRCBUF_MASK;

39 SERIAL_tratar ();

40

41

42

43

44

45

46 #define SERIAL_CMD_MSGSTR 255

47 #define SERIAL_CMD_MSGSTR 1

48

49 void SERIAL_tratar ()

50 uint8_t *data = SERIAL_lastmsg +2;

51 uint8_t size = SERIAL_lastmsg [0]-3;

52 uint8_t cmd = SERIAL_lastmsg [1];

53 if(cmd&0x80)//MIDI command

54 MUDP_send(SERIAL_lastmsg +1, SERIAL_lastmsg [0]-2);

55 MIDIF_register(SERIAL_lastmsg +1, SERIAL_lastmsg [0]-2);

56 else

57 switch(cmd)

58 case SERIAL_CMD_MSGSTR:

59 data[size] = 0;

60 SERIAL_MSGSTR = String ((char*)data);

61 break;

62

63

64