No penultimo post, apresentamos os codigos usados no Arduino e no Processing para a captacao de frequencias, sem contudo uma explicacao mais aprofundada dos codigos, isso por se tratar do nosso primeiro teste bem sucedido com ele. Depois disso pudemos estudar melhor o codigo e manipula-lo de acordo com nosso proposito. Um detalhe importante, e ja falado no post anterior, e que para que o codigo funcione e preciso que se adicione a biblioteca ffft na pasta libraries do Arduino, a qual existe um link no post anterior.A primeira coisa que descobrimos e que o codigo do Arduino nao funciona com qualquer versao de software, mas sim com a versao Arduino 0022, quanto ao Processing funciona bem a comunicacao com a versao mais atual: Processing 1.5.1.Depois descobrimos que o software tem duas opcoes para a divisao de frequencias: a primeira divide o espectro de aproximadamente 19200Hz por 64 faixas de 300Hz e a segunda divide o espectro de aproximadamente 9600Hz por 64 faixas de 150Hz. Essas duas opcoes limitam nosso campo de acao, com elas nao podemos captar frequencias especificas de notas musicais, mas sim intervalos nos quais estas frequencias estao inseridas, pela segunda opcao apresentar um intervalo menor e portanto uma definicao maior optamos por ela.E importante observar que nosso projeto sofreu portanto uma modificacao de objetivo, nosso experimento nao reconhecera mais frequencias de notas musicais especificas, e sim intervalos de frequencias, para cada intervalo o Arduino acionara uma luz. Teremos nesse experimento sete intervalos de frequencias e portanto usaremos apenas 7 das 64 barras ou intervalos de frequencias geradas pela biblioteca, essas barras comecarao a captar a frequencia aproximadamente de 400Hz ate 1000Hz.Para que o Arduino identifique a frequencia predominante foi preciso criar uma funcao que acha o intervalo de frequencia de maior intensidade dentre os 7 escolhidos. Codigo abaixo:int Maior(uint16_t lista[]){int maior = 7;for(int i=7;i<14;i++){ if(lista[i]>lista[maior])maior=i; } if(lista[maior]<15)maior=0; return maior;}Como ainda nao compramos todos os Leds, utilizamos um LED RGB que utiliza a porta 3 para vermelho, 4 para negativo, 5 para verde e 6 para Azul. E para controla-lo, criamos uma funcao que recebe os tres parametros de intersidade 0-255 para cade um:void RGB(int r, int g, int b){ digitalWrite(4, HIGH); analogWrite(3,r); analogWrite(5,g); analogWrite(6,b);}E outra que a utilizara, esta recebe apenas um valor de 1-7 o qual acionara uma cor pre-definida para o RGB.void Cor(int n){switch(n){ case 1: RGB(255,0,0);break; case 2: RGB(0,255,0);break; case 3: RGB(0,0,255);break; case 4: RGB(255,255,0);break; case 5: RGB(255,0,255);break; case 6: RGB(150,255,10);break; case 7: RGB(255,255,255);break; default: RGB(0,0,0); }}Abaixo esta o codigo comentado do Arduino./*This Example acquire analog signal from A0 of Arduino, and Serial out to Processing application to visualize.Tested with preamplified audio data. Take a look at http://www.youtube.com/watch?v=drYWullBWcIAnalog signal is captured at 9.6 KHz, 64 spectrum bands each 150Hz which can be change from adcInit()Load the this file to Arduio, run Processing application.Original Fixed point FFT library is from ELM Chan, http://elm-chan.org/works/akilcd/report_e.htmlPorted to the library and demo codes are from AMurchick http://arduino.cc/forum/index.php/topic,37751.0.htmlProcessing code is from boolscott http://boolscott.wordpress.com/2010/02/04/arduino-processing-analogue-bar-graph-2/*/#include <stdint.h>#include <ffft.h>#define IR_AUDIO 0 // ADC canal para capturarvolatile byte position = 0;volatile long zero = 0;int16_t capture[FFT_N];