Como utilizar Funções Matemáticas no Arduino?

Font Size

Olá tudo bem? Hoje será um post diferente. Pois não iremos abordar mais um componente de nossa loja virtual, iremos continuar o nosso estudo a respeito da programação com Arduino. Sendo assim, vamos estudar sobre as funções matemáticas no Arduino.

Você quer aprender a utilizar essas funções para criar efeitos super bacana no Processing? Então me acompanhe!

Contudo, antes de iniciarmos, você sabia que já utilizamos essas funções matemática? Elas foram utilizadas no projeto do radar, onde foram utilizadas para realizar a criação dos efeitos animados no Processing. Caso você não tenha visto, deixo o link do projeto logo abaixo:

Por que utilizar essas funções matemáticas?

A verdade é que buscar saber qual a importância de uma determinada função para o seu código é muito importante. Assim, a importância que essas funções levam é devido ao fato do Arduino, por si só, ser uma calculadora muito eficaz.

Além disso, a linguagem do Arduino possui uma grande quantidade de funções matemáticas para poder ajudá-lo a utilizar o seu Arduino como uma calculadora.

Qual as aplicações dessas funções matemáticas?

As utilidades são diversas, ficaria o dia inteiro falando só delas, mas basicamente elas podem ser usadas para cálculo simples. Por exemplo, para analisar rapidamente a tensão de um pino em comparação com outro pino, ou até mesmo, serem utilizados em funções mais complexas, para ajudar os robôs a se moverem e calcular o melhor caminho disponível.

Comandos da Funções Matemáticas

Sem muita enrolação, vamos começar a estudar os comandos matemáticos. Vamos iniciar com os mais básicos e indo progredindo aos poucos, combinado? Vamos nessa!

min() e max()

Essas funções eu creio que os seus nomes já falam por si só, né? Resumidamente, essas funções vão trabalhar da seguinte forma:

Função (valor1, valor2)

Então, no lugar de “função” você coloca uma das duas funções. Já dentro dos parênteses, você insere dois valores os quais serão comparados dependendo da função. Ou seja, vamos fazer um exemplo do min(), mas irá valer para o max() ok? A ideia é a mesma.

int dadosSensor = 100;

/*
Aqui a função vai fazer a seguinte pergunta: Qual dos dois valores
é o menor? A resposta dessa pergunta vai dizer que valor será
retornado pela função, ok?
*/

min(dadosSensor, 255); // Retorna 100 (pois dadosSensor é menor.)
min(dadosSensor, 100); // Retorna 100 (ninguém é menor, então retorna o valor que está na função)
min(dadosSensor, 64); //Retorna 64

Uma implementação legal dessas funções é de restringir um intervalo de dados, por exemplo, você pode utilizar o comando min() para definir uma faixa aceitável. “Caso o valor seja menor que uma variável X, ele não é armazenado”. Pegou a ideia?

constrain()

Esta função é muito bacana! Mas por que? Pois sabe a ideia de criar uma faixa de restrição com o min() ou max()? Adivinha, você pode fazer isso diretamente com o constrain(). Funciona assim:

constrain(dados, mínimo, máximo)

Dessa forma, no lugar de dados você irá colocar uma variável que esteja configurada para receber valores de um sensor, no qual ao utilizar essa função, restringimos a faixa de valores aceitáveis. Observe o exemplo abaixo:

valorSensor = constrain(dadosSensor, 40, 127);

Ou seja, aqui a função está falando assim: “a variável valorSensor só vai receber os valores da variável dadosSensor que estejam entre os valores 40 e 127”. Uma implementação bacana desta função, é quando se pretende controlar a luminosidade ambiente de um lugar da casa, onde diversos fatores podem atrapalhar a leitura do sensor.

Podendo ocorrer de chegar a retornar valor 0, o que iria complicar nos cálculos do código. Mas, ao definir um intervalo de valores, podemos controlar melhor a luminosidade.

Mas porque? Isso porque caso o intervalo esteja dentro da faixa, então está tudo bem. Mas se aproximar demais do 40, é preciso ligar a lâmpada, e se aproximar demais do 127, é preciso desliga-la, pegou a ideia?

map()

Essa função sem dúvida é muito utilizada. Você sabe dizer o porque? Vamos entender agora. Ela trabalha da seguinte forma:

map(dados, min, max, novoMin, novoMax);

Neste caso, no lugar de dados é colocado a variável que vai receber o valor do sensor. Já no min e max, vamos colocar normalmente a faixa de pwm (que vai de 0 a 1023).

Mas, no lugar de novoMin e novoMax, é onde vamos colocar a nova faixa. Por exemplo, podemos transformar 0 -> 1023 para a faixa de 0V -> 5V. Observe o exemplo abaixo:

angulo = map(angulo, 0, 1023, 0, 180);

Aqui estamos controlando um servo motor (que gira 180º) através de um potenciômetro. Por este motivo que temos a faixa de 0,1023 convertida para 0,180. Aliás você sabia que temos no blog este tutorial? Basta clicar no link do post abaixo e confere lá uma das aplicações dessa função ok?

random()

Mas o que será que essa função faz em nosso código? Tem alguma ideia? Bom, basicamente esta função vai gerar um número pseudo-aleatório. Como assim né? Um número pseudo-aleatório é resultado de um algoritmo que gera uma seqüência de números, os quais são aproximadamente independentes um dos outros. É algo muito complexo, mas, que o nosso Arduino consegue gerar facilmente utilizando a função random(), bacana não? Ela funciona assim:

random(min, max);

Como podemos observar, essa função tem uma faixa de atuação (por isso os dois parâmetros dentro dela). Mas caso ela não tenha um máximo ou mínimo, basta colocar um desses dois parâmetros ok? Mas é preciso ter algum deles.

Então ela vai funcionar assim: “Crie um número aleatório entre os valores 10 e 1056” ou “Crie um valor que aleatório que não pode passar de 1745”. Entendeu?

Uma aplicação muito simples e que você pode encontrar nos livros sobre Arduino é o “Dado Eletrônico”. Um projeto que trabalha basicamente esse comando, caso você queira um tutorial desse no blog, comenta abaixo combinado?

sin(), cos(), e tan()

Triângulo Retângulo para calcular seno, cosseno e tangente.

Fonte: AutoCore Robótica

Por fim, temos esses três comandos da nossa velha trigonometria do ensino médio. A ideia é muito simples, você vai calcular o seno, cosseno ou tangente do valor que está dentro de uma variável. Elas têm a seguinte sintaxe:

função (dados)

Mas um detalhe importante aqui é de que a função que você chamar, vai voltar um valor do tipo double entre -1 e 1. Além disso, a variável que vai ser colocada no lugar de dados, deve ser do tipo float.

Por que será que ocorre dessa forma? Primeiramente, não pense que esses dois tipos de variáveis são diferentes, pois não são, elas são iguais, isto é, elas são duas variáveis que retornam números com vírgula! Contudo, a diferença é que o tipo double vai utilizar mais casa decimais, por consequência, ele será muito mais preciso.

Um exemplo muito legal com essas funções é mostrado em um dos nossos projetos do blog. Você por acaso já viu o post do radar com arduino?

Nele, foram utilizadas essas funções para calcular e gerar os efeitos de radar que é mostrado no projeto. Se você não viu ainda, clique no link abaixo e confere lá uma aplicação super legal para essas funções, combinado?

Conclusão

Por fim, espero que você tenha adquirido um pouco mais de conhecimento a respeito da programação em Arduino. Agora é hora de praticar todas essas funções e criar projetos super bacanas!

Mas e ai? Gostou? Caso tenha ficado algo incompleto para você, comenta abaixo 

Dicas?  Dúvidas?  Idéias de post? Críticas?  Só comentar também! 

Forte abraço!

Posts relacionados

Como Construir um Robô de Resgate Competitivo – Parte 1: Introdução

por autocore
6 anos ago

As 7 Dicas Importantes para Trabalhar com Arduino

por Danilo Nogueira
3 anos ago

Como programar um Braço Robótico Educacional? – Parte III

por Davi Colares
5 anos ago
Sair da versão mobile