Bóson Treinamentos em Ciência e Tecnologia

Arduino – Função map() – Mapeando intervalos de valores numéricos

Função map() no arduino - remapeando valores numéricos

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:

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!

 

Sair da versão mobile