Arduino Parte 4 PWM Funcao Map
Arduino Parte 4 PWM Funcao Map
Arduino Parte 4 PWM Funcao Map
Esse experimento prope que a partir da leitura de um potencimetro ligado em uma porta analgica, e dos valores obtidos, eles sejam convertidos para o padro PWM (0~255), e enviados para uma porta digital no caso ligada a um led, o que ajudar na percepo do que ocorre fisicamente no uso do PWM atravs da intensidade com que o led acender/apagar. Nesse experimento sero utilizados os seguintes componentes: 1 potencimetro 10Kohms, 1 led, 1 resistor de 330 Ohm, alguns fios. Definio dos componentes: Potencimetro Potencimetros so dispositivos eltricos que tm a sua resistncia eltrica alterada mecanicamente, so muito usados para controlar/alterar as caractersticas de entrada/sada de aparelhos eletrnicos, como volume, balano, graves, brilho, contraste, cor, tempo de funcionamento( em tv's, dvd's, monitores, relgios, ... )... So tambm conhecidos como resistores variveis, ou ainda, reostatos. Possuem internamente uma trilha resistiva (de niquel-cromo ou de carbono), sobre a qual desliza um cursor, que altera a resistncia eltrica entre seu conector central e um dos dois laterais(normalmente so trs conectores), no so eletricamente polarizados.
O que PWM
Pulse Width Modulation - Modulao por Largura de Pulso veja no tutorial no site do Arduino http://www.arduino.cc/en/Tutorial/PWM Circuitos digitais s produzem dois nmeros: "0" e "1". J circuitos analgicos podem ter uma infinidade de variaes. Por exemplo, em um circuito digital s podemos ligar ("1") ou desligar ("0") um motor ou uma lmpada, enquanto que em um circuito analgico podemos controlar em infinitos gradientes o brilho da lmpada desde o seu estado total de apagamento at o seu brilho mximo. Com um motor acontece o mesmo, podemos controlar em gradientes sua velocidade, desde o seu estado de no rotao at a sua
1 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )
velocidade mxima. Para um circuito digital poder controlar um circuito analgico - um brilho de uma lmpada ou a velocidade de um motor - h basicamente duas tcnicas. A converso D/A (Digital/Analgico) e a modulao por largura de pulso (PWM). A converso digital/analgico usa uma quantidade de bits proporcionais quantidade de gradientes (brilhos, velocidades, etc) que pretendemos ter. Por exemplo, se forem usados 4 bits, temos uma possibilidade de 16 (2^4) gradientes de brilho/rotao, de 0000 a 1111. O problema desta tcnica que quanto mais gradientes voc quiser, mais bits so necessrios. J a tcnica PWM utiliza apenas um bit. Nela gerada uma forma de onda quadrada onde o ciclo de carga (tempo em que a forma de onda permanece em "1") define a velocidade/brilho do sistema analgico. Por exemplo, supondo uma forma de onda perfeitamente quadrada, onde 50% do tempo ela est em "0" e 50% do tempo ela est em "1", o resultado final ser que a lmpada ter 50% do seu brilho e um motor 50% de sua velocidade. Se configurarmos esta forma de onda para ficar 30% do seu tempo em "1" e 70% do seu tempo em "0", o resultado ser um brilho/velocidade de 30% de sua capacidade total. Em resumo, o PWM uma tcnica para converso digital/analgico usando apenas um bit, onde gerada uma forma de onda quadrada onde o tempo em que esta forma fica em "1" define o valor da sada (velocidade/brilho).
Obs: o PWM no Arduino utilizado atravs dos pinos digitais 3,5,6,9,10,11 e usando a funo analogWrite(); Nesse experimento utilizaremos a funo map que faz uma converso de escala entre valores, j que o potencimetro l valores em um intervalo 0~1023 (10bits) e o pwm usa valores no intervalo 0-255 (8bits).
void setup() { pinMode(A0, INPUT); pinMode(9, OUTPUT); } void loop(){ POT = analogRead(A0); CON = map(POT,0,1023,0,255); analogWrite(9, CON); } Observando a sada PWM com a entrada de microfone de um PC O circuito utilizado segue abaixo
Retirando o sinal atravs do resistor observa-se utilizando o audacity. Faa a varredura de uma nica vez.
Abra o arquivo no audacity e visualize o sinal a medida que variamos o valor de tenso na porta analgica 0.
5 Marisa Cavalcante e Eduardo Silva Damasceno ( marisac@pucsp.br )
Cdigo fonte:
int LDR; //declara variavel int som; // variavel som para o alarme void setup(){ Serial.begin(9600); pinMode(A0, INPUT);// entrada A0 } void loop(){ LDR = analogRead(A0);; Serial.print(LDR); Serial.print(" "); Serial.println ( "\t"); delay(2); som = map(LDR, 100, 200, 100, 1000); // toca o som com uma frequencia que //varia de 100 a 1000 Hz de acordo com a distancia: tone(9, som, 10000); } 6
Passo a passo: 1. Cole o cdigo acima na IDE do Arduino 2. Imprima os valores lidos no LDR e verifique o intervalo que pretende obter o sinal sonoro 3. A funo " som = map(LDR, 100, 200, 100, 1000)" far esta converso em valor lido no LDR (aqui est em decimal , varia de 0 a 1023 e est em vermelho) e a sada para o pino 9 ser um sinal cuja freqncia esta variando de 100 a 1000 e est em azul) 4. a funo " tone(9, som, 10000)" indica; pino de sada , freqncia, que no caso deixaremos dependente da distancia e portanto da leitura no LDR, e o tempo de durao em geral maior do que 100 ms, para retirar o rudo de fundo. Foto da montagem abaixo