Função map() no Arduino
A função map() permite efetuar o mapeamento de um intervalo numérico em outro intervalo numérico desejado. Isso significa que em um intervalo numérico que vai de um valor mínimo até um valor máximo, o valor mínimo será mapeado em um novo_mínimo, e o valor máximo será mapeado em um novo_máximo, e os valores intermediários serão remapeados em novos valores intermediários, de forma correspondente.
Sintaxe:
map(valor,Mínimo_Atual,Máximo_Atual,Novo_Mínimo,Novo_Máximo);
Onde:
- valor: Número a ser mapeado, geralmente contido em uma variável.
- Mínimo_Atual: Limite inferior do intervalo de valores atual
- Máximo_Atual: Limite superior do intervalo de valores atual
- Novo_Mínimo: Limite inferior do novo intervalo de valores mapeados
- Novo_Máximo: Limite superior do novo intervalo de valores mapeados
Exemplo: Queremos mapear os valores em um intervalo que vai de 0 a 1023 para um novo intervalo entre 0 e 200. Os valores atuais serão lidos a partir de uma variável chamada valor, e os novos valores mapeados serão gravados em uma variável de nome novo_valor:
novo_valor = map(valor,0,1023,0,200);
Desta forma, toda vez que um valor entre 0 e 1023 for gravado na variável valor, ele será mapeado para seu correspondente no intervalo entre 0 e 200, e esse novo valor será atribuído à variável novo_valor.
A função também pode mapear valores de forma inversa, bastando para isso trocar a posição dos valores mínimo e máximo novos:
novo_valor = map(valor,0,1023,200,0);
A função map() opera somente com números inteiros, não retornando valores de ponto flutuante (fracionários). Se um número fracionário for gerado, ele será truncado antes de ser retornado. A função não arredonda os valores mapeados.
Funcionamento interno
Internamente, a função map() é codificada da seguinte forma:
long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
Na prática
Vamos aplicar a função map() em um projeto simples. Vamos usar o mesmo circuito que foi utilizado anteriormente quando mostramos como ler um valor de tensão aplicado a um pino analógico. Os valores retornados, que por padrão estão no intervalo entre 0 e 1023 (resolução de 10 bits dos pinos analógicos), serão remapeados para um outro intervalo, de 8 bits (valores entre 0 e 255). Os valores lidos serão exibidos no monitor serial.
Abaixo temos o diagrama esquemático a ser utilizado:
Usaremos um potenciômetro de 10 kΩ (outros valores próximos também servirão), e um resistor de baixo valor (47 Ω são suficientes) para evitar que uma corrente em excesso possa danificar o Arduino.
Vamos começar conectando o potenciômetro entre os pinos 5V e GND, e seu terminal central (divisor de tensão) será conectado ao pino analógico A0, a partir de onde será feita a leitura do valor da tensão elétrica. Para maiores informações sobre o funcionamento do circuito utilizado, consulte o projeto “Lendo valores analógicos a partir de um potenciômetro“.
Código do sketch
Abaixo temos o código utilizado no projeto:
const int potenciometro = 0; int valor = 0.0; int valor_mapeado; void setup() { Serial.begin(9600); } void loop() { valor = analogRead(potenciometro); valor_mapeado = map(valor,0,1023,0,255); Serial.println(valor_mapeado); delay(200); } |
Testando a função map()
Após compilar e carregar o código no Arduino, abra o monitor serial clicando em Ferramentas -> Monitor serial no Arduino IDE (ou pressione a combinação de teclas Ctrl + Shift + M), e observe que os valores capturados na entrada analógica aparecerão. Movimente o eixo do potenciômetro e você verá os valores sendo alterados de acordo com a rotação aplicada, como podemos ver na captura de tela abaixo:
Na figura podemos ver que eu variei a rotação do potenciômetro de um valor próximo ao máximo até zero, e depois de volta ao valor máximo, ou seja, no terminal central do potenciômetro fomos da tensão máxima até 0V, e de volta à tensão máxima (aproximadamente 5V, fora a queda no resistor de 47Ω). Os valores mostrados estão no intervalo entre 0 e 255, e não entre 0 e 1023, como seria o normal, pois estão senado remapeados pela função.
É isso aí! Vamos utilizar essa função nos próximos projetos, a fim de efetuarmos a leitura de sinais de sensores e o controle de cargas a partir dos valores lidos.
Até mais!