DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus...
Transcript of DESENVOLVIMENTO DE UM TROMPETE ELETRONICO DE^ … · Figura 50 { Algoritmo (em vermelho) versus...
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
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
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.
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.
”Everything is hard before it is easy.”(Johann Wolfgang von Goethe)
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.
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.
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
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
LISTA DE TABELAS
Tabela 1 – Custos Fixos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Tabela 2 – Custos Variaveis - Producao artesanal . . . . . . . . . . . . . . . . . . . 54
Tabela 3 – Custos Variaveis - Producao semi-industrial . . . . . . . . . . . . . . . . 55
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
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
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
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
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.
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.
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.
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.
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)
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
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.
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
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.
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.
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
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
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
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
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
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.
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.
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
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
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)
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
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
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
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
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.
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
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.
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
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
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
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
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
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/
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)
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
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.
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
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
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.
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
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.
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.
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,
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.
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
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
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.
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
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
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).
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
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.
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
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
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
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
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.
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.
Apendices
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;
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);
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
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);
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)
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;
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 */
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;
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;
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;
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;
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
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 ];
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)
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;
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;
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;
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
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_
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
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 ();
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);
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"
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
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 ++;
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
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:
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
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
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,
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)
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);
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]++;
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 *
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);
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;
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);
APENDICE A. APENDICE: CODIGOS FONTE MSP432 97
160
161
162
163 void test_lcd16x2 ()
164 inicializar_lcd16x2 ();
165
166
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");
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()
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>
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:
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;
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