Escrito por: Alfonso Pérez

Operações matemáticas e lógicas, como adição, subtração, multiplicação, divisão, etc. podem ser feitas com o Arduino Uno. Isto permite que os projetos e circuitos desenvolvidos com o microcontrolador Arduino Uno podem computadorizar, isto é, medir, processar, aplicar algoritmos, etc. Em outras palavras, a placa do Arduino Uno é como uma calculadora. Neste artigo vamos ver como o Arduino Uno pode ser usado, com instruções matemáticas.

Muitas vezes, quando queremos calcular ou quantificar um problema, vamos à calculadora para resolver os possíveis valores encontrados no problema. Quando circuitos são desenvolvidos com microcontrolador, podemos ler sensores praticamente de qualquer tipo de sinal e, de acordo com algumas regras de operação, aplicar operações aritméticas para obter o resultado desejado. Vamos colocar, por exemplo, um controle de temperatura para o monitoramento de um ambiente. Temos o sensor de temperatura e temos alguns pontos de ajuste para refrigeração e aquecimento. Outro exemplo pode ser uma fábrica de sabão, onde são usadas esteiras transportadoras ou pontes volantes, com seus respectivos sensores para contar e atuadores para embalar os sabonetes em caixas. Embora este artigo não mostre os programas completos para esses exemplos, vamos usá-los como referência e entender o significado das operações aritméticas e como podemos usá-los em nossos projetos.

Na Figura 1 podemos ver a placa Arduino Uno e Figura 2 projeto de desenvolvimento de software, que pode ser baixado a partir do site Arduino. Na Figura 3 mostramos a similaridade ou igualdade que existe entre a placa Arduino Uno e uma Calculadora, pois as duas permitem operações aritméticas. Neste artigo, vamos estudar essas operações ou instruções.

 

 Figura 1. Um Arduino targeta
Figura 1. Um Arduino targeta

 

 

 Figura 2. Um Arduino
Figura 2. Um Arduino

 

 

 Figura 3. Igualdade entre o Arduino Uno e a Calculadora
Figura 3. Igualdade entre o Arduino Uno e a Calculadora

 

 

A INSTRUÇÃO SOMA (+)

A instrução soma é a operação matemática que nos permite adicionar um valor outro valor, por exemplo:

2 + 7 = 9

Na operação de adição ou soma anterior, usamos a instrução soma que geralmente encontramos em qualquer livro ou cálculo. Usamos diariamente, geralmente no trabalho, escola, escola, etc. Mas também podemos usá-lo nos circuitos que podemos criar ou inventar com o Arduino Uno. Como posso usar a soma para computar os circuitos eletrônicos feitos com o Arduino Uno? Esta questão pode ser desenvolvida ou entendida da seguinte forma: A placa do Arduino Uno possui uma memória RAM, que está em branco e não identificada. Ou seja, posso armazenar valores, mas preciso rotular ou nomear cada valor. Por exemplo, para criar uma variável ou localização de memória, posso usar uma instrução como:

Int sensor temperatura

A linha de código anterior está criando uma variável ou localização de memória chamada sensorTemperatura. Isto é, está marcando um espaço de RAM. A memória RAM pode ser vista como uma série de gavetas ou compartimentos, como mostrado na Figura 4.

 

 Figura 4. Memória RAM
Figura 4. Memória RAM

 

Quando um novo projeto é iniciado, essas gavetas não têm nome ou são rotuladas, mas depois de escrever uma instrução como:

Int sensortemperatura;

Então a RAM estará como mostrado na Figura 5.

 

 Figura 5. Memória RAM com tag
Figura 5. Memória RAM com tag

 

Assim, posso nomear ou rotular as variáveis ??necessárias nos projetos ou circuitos que estou criando. Vamos criar mais de uma variável na RAM. Nós vamos chamar isso de setpoint. O código seria parecido com:

Int sensorTemperatura;

Int setpoint

Agora a RAM se parecerá com o que é mostrado na Figura 6.

 

 Figura 6. Memória RAM com etiqueta
Figura 6. Memória RAM com etiqueta

 

Ao executar o programa, as variáveis ??podem ter qualquer valor entre 0 e 65.535. Isso ocorre porque a RAM é do tipo aleatório, isto é, energizando o microcontrolador, a memória RAM pode ter qualquer valor. Por exemplo, uma vez energizado, o microcontrolador pode ter valores como mostrado na Figura 7.

 

 Figura 7. Valores de início na memória RAM
Figura 7. Valores de início na memória RAM

 

Mas se desligarmos o circuito e energizarmos novamente, valores como os mostrados na Figura 8 podem aparecer.

 

 Figura 8. Valores de início na memória RAM
Figura 8. Valores de início na memória RAM

 

Se desligarmos e energizarmos novamente o circuito, a memória RAM pode ter os valores mostrados na Figura 9.

 

 Figura 9. Iniciar valores na memória RAM
Figura 9. Iniciar valores na memória RAM

 

Assim, podemos entender que, como a RAM é uma memória aleatória (Random Access Memory), seus valores iniciais são desconhecidos. Por esta razão, é aconselhável inicializar com algum valor, as variáveis ??que estamos usando em nosso projeto ou circuito. Para fazer isso, atribuímos um valor a ele quando damos o nome à variável. Observe o seguinte código:

Int sensorTemperatura = 0;

Int setpoint = 33;

Um valor foi atribuído a cada variável e, portanto, o compilador gera instruções para que as variáveis sejam iniciadas com seus respectivos valores. Se executarmos o programa no microcontrolador, os locais ou variáveis da memória terão os valores mostrados na Figura 10.

 

 Figura 10. Valores Atribuídos na Memória RAM
Figura 10. Valores Atribuídos na Memória RAM

 

Se desligarmos o circuito e ligá-lo novamente, os valores serão os mesmos que os mostrados na Figura 10. Isso é válido para cada vez que o circuito é desligado e energizado.

Vamos criar mais 3 variáveis em nosso programa, como mostra a Figura 11.

 

 Figura 11. Variáveis Atribuídas na RAM para Termostato
Figura 11. Variáveis Atribuídas na RAM para Termostato

 

Isso pode ser usado para a construção de um termostato ou controle de temperatura, como mostrado na Figura 12.

 

 Figura 12. Termostato digital
Figura 12. Termostato digital

 

Como dito anteriormente, os programas mostrados são exemplos básicos para explicar as operações aritméticas. Vamos inicializar seus valores conforme mostrado no seguinte programa:

 

int sensorTemperatura = 0;

Int setpoint = 33;

 

int setpointCalentamiento = 0;

int display = 0;

int histeresis = 2;

 

void setup() {

}

 

void loop() {

    setpointCalentamiento = setpoint + histerisis;

    sensorTemperatura = analogRead(A0);

    display = sensorTemperatura;

}

 

Ao executar o programa, os valores da memória RAM serão mostrados na Figura 13.

 

 Figura 13. Variáveis na RAM para termostato após o programa ter sido executado
Figura 13. Variáveis na RAM para termostato após o programa ter sido executado

 

Observe que a variável de exibição sempre terá o valor da variável sensorTemperature. Isto é porque a instrução:

display = sensorTemperature;

Esta instrução move o conteúdo de sensorTemperature para exibição. Lembre-se de que o símbolo de igual (=) é chamado na linguagem C / C ++, como o operador de atribuição e é usado para mover dados de um local de memória para outro. Podemos ver que o sensor de temperatura está lendo 17.

Além disso, podemos observar na Figura 13, que o valor do ponto de ajuste Aquecimento é 35. No início do programa, essa variável é iniciada com zero (0), conforme mostrado pela seguinte instrução:

int setpointCalentamiento = 0;

Mas ao executar o programa, essa variável acontece por 35, pois fazemos uma soma e o resultado é armazenado na variável setpointCalientamiento Isso é feito pela instrução:

setpointCalentamiento = setpoint + histerisis;

Assim, podemos usar a soma em nossos projetos ou circuitos com o Arduino Uno.

 

A INSTRUÇÃO RESTA (-)

A instrução de subtração é a operação que nos permite subtrair algo de um valor. Por exemplo:

7-5 = 3

Nós subtraímos de 7, o valor de 5 e então o resultado é 3. Mas como eu posso usar isso, no microcontrolador Arduino Uno? Vamos ver o seguinte exemplo de programa onde criamos uma variável chamada setpointEnfriamientos

 

 Figura 14. Variáveis atribuídas na RAM para o termostato
Figura 14. Variáveis atribuídas na RAM para o termostato

 

A Figura 14 mostra os valores atribuídos no início do programa. As outras variáveis são semelhantes ao exemplo usado anteriormente:

 

int sensorTemperatura = 0;

Int setpoint = 33;

 

int setpointCalentamiento = 0;

int setpointEnfriamiento = 0;

 

int display = 0;

int histéresis = 2;

 

void setup() {

}

 

void loop() {

   setpointCalentamiento = setpoint + histerisis;

   setpointEnfriamiento = setpoint - histerisis;

   sensorTemperatura = analogRead(A0);

   display = sensorTemperatura

 }

 

Quando executamos o programa, os valores serão como começando na Figura 15.

 

 Figura 15. Variáveis ??na RAM para termostato depois de executar o programa
Figura 15. Variáveis ??na RAM para termostato depois de executar o programa

 

Podemos ver que a variável setpointEnfriamiento foi iniciada em zero (0). Mas quando a instrução é executada:

setpointEnfriamiento = setpoint - histerisis;

a variável passa a ter o valor de 31, uma vez que estamos subtraindo ou subtraindo o valor da variável de histerese (2), do valor da variável setpoint (33).

No programa a seguir, inicializamos a variável de histerese para 4. Depois de executar o programa, os valores das variáveis ou locais de memória seriam mostrados na Figura 16.

 

 Figura 16. Variáveis na RAM para o termostato depois de executar o programa
Figura 16. Variáveis na RAM para o termostato depois de executar o programa

 

int sensorTemperatura = 0;

Int setpoint = 33;

int setpointCalentamiento = 0;

int setpointEnfriamiento = 0;

int display = 0;

int histéresis = 4;

 

void setup() {

}

 

void loop() {

   setpointCalentamiento = setpoint + histerisis;

   setpointEnfriamiento = setpoint - histerisis;

   sensorTemperatura = analogRead(A0);

   display = sensorTemperatura;

}

 

Analise os resultados e observe como podemos executar operações aritméticas na placa Arduino Uno, facilmente, como se fosse uma calculadora.

 

INSTRUÇÃO DE MULTIPLICAÇÃO (*)

A instrução de multiplicação usa o símbolo de asterisco (*) na linguagem C / C ++. Vamos ver o seguinte exemplo:

3 * 7 = 21

Lembre-se que na matemática normalmente usamos o X para operações de multiplicação. Assim, a operação anterior seria como:

3 x 7 = 21

O Arduino Uno usa a linguagem C / C ++, portanto, devemos usar o asterisco (*) para fazer operações de multiplicação matemática.

 

 Esteira
Esteira

 

Como exemplo didático, utilizaremos uma fábrica de sabonetes, que geralmente utiliza correias transportadoras e contadores para estatísticas e controle de produção. O peso de cada sabão (Jabon) é de 500 gramas ou meio quilo. Vamos ver o seguinte programa:

 

int pesoJabon = 500;

Int contadorJabon = 7;

int pesoTotal = 0;

 

void setup() {

}

 

void loop() {

   pesoTotal = pesoJabon * contadorJabon;

}

 

Na Figura 18 podemos ver os valores dos locais de memória usados no programa.

 

 Figura 18. Variáveis na RAM para esteira depois de executar o programa
Figura 18. Variáveis na RAM para esteira depois de executar o programa

 

Observe que a variável pesoTotal foi inicializada com zero (0), mas depois de executar o programa, esse valor é 3500. Assim, a instrução:

Peso total = pesoJabon * contadorJabon;

está calculando ou computando o peso total, cada vez que o contador variável de sabões (countadorJabones) é invcrementado. Vamos ver novamente o seguinte programa onde a variável soapBack foi inicializada com o valor de 12:

 

 

int pesoJabon = 500;

Int contadorJabon = 12;

int pesoTotal = 0;

 

void setup() {

}

 

void loop() {

   pesoTotal = pesoJabon * contadorJabon;

}

 

A Figura 19 mostra os resultados. Assim, podemos usar a instrução matemática multiplicar como desejamos em nosso circuito.

 

 Figura 19. Variáveis na RAM para esteira depois de executar o programa
Figura 19. Variáveis na RAM para esteira depois de executar o programa

 

 

A INSTRUÇÃO DE DIVISÃO (/)

A instrução de divisão na linguagem C / C ++ usa o caractere de barra (/), que se assemelha a uma barra. Vamos ver o seguinte exemplo:

7/3 = 2

Na operação anterior, o resultado é 2. Se houve um excedente ou resto, isso não faz parte do resultado, já que estamos trabalhando com inteiros, ou seja, sem um decimal ou fração. Vamos ver o seguinte programa:

 

int pesoJabon = 500;

Int contadorJabon = 237;

int pesoTotal = 0;

contadorCajas = 0;

 

void setup() {

}

 

void loop() {

   pesoTotal = pesoJabon * contadorJabon;

    contadorCajas = contadorJabon / 12;

}

 

Vamos supor que na fábrica de sabonetes queremos embalar 12 sabonetes por caixa. Então usamos a seguinte instrução:

countadorCajas = countadorJabon / 12;

 

A Figura 20 mostra o resultado do programa. Assim, podemos usar a operação de divisão em nossos circuitos feitos com o Arduino Uno.

 

 Figura 20. Variáveis na RAM para o transportador após a execução do programa
Figura 20. Variáveis na RAM para o transportador após a execução do programa

 

 

A INSTRUÇÃO DE INCREMENTAR (++)

A instrução para incrementar adiciona um (1) a um local de memória. Para fazer isso no programa usado anteriormente, na variável contador de sabão, temos que usar uma linha de código como:

countadorJabon = countadorJabon + 1;

Para facilitar as coisas, a linguagem C / C ++ usa uma instrução de incremento usando a seguinte nomenclatura:

countadorJabon ++;

Assim, você pode usar qualquer uma das duas maneiras de aumentar, mostradas acima, porque as duas dão o mesmo resultado. Vamos dar uma olhada no seguinte programa:

 

int pesoJabon = 500;

Int contadorJabon = 7;

int pesoTotal = 0;

contadorCajas = 0;

 

void setup() {

   contadorJabon ++;

}

 

void loop() {

   pesoTotal = pesoJabon * contadorJabon;

    contadorCajas = contadorJabon / 12;

}

 

A Figura 21 mostra os valores de inicialização da RAM.

 

 Figura 21. Variáveis ??inicializadas em RAM para correia transportadora
Figura 21. Variáveis inicializadas em RAM para correia transportadora

 

Note que a variável countadorJabon foi iniciada com 7. Na função setup (), a instrução foi usada:

countadorJabon ++;

Assim, na Figura 22 os valores são mostrados após a execução do programa e podemos ver que essa variável foi aumentada em um (1).

 

 Figura 22. Variáveis na RAM para esteira depois de executar o programa.
Figura 22. Variáveis na RAM para esteira depois de executar o programa.

 

 

Lembre-se de que a função setup() só é executada uma vez em um programa. Aqui, neste exemplo, ele foi colocado aumento instrução na configuração (função), para fins de ensino, mas esta afirmação deve ser no circuito principal e ser executado cada vez que o contador sensor detecta que o sabão passo a esteira

 

A INSTRUÇÃO DECREMENTAR (-)

A instrução decrementa, subtrai ou remove 1 da variável ou localização da memória. Por exemplo:

countadorJabon = countadorJabon + 1;

A instrução anterior, o que faz é subtrair ou subtrair 1 da variável do contador de sabão (contador de sabão). Na linguagem C / C ++, para simplificar a escrita do código, podemos usar a seguinte instrução:

contadorJabon--;

Assim, podemos usar qualquer uma das duas instruções vistas acima. Mas a segunda instrução é mais confortável e simples de escrever. Vamos ver o seguinte exemplo:

 

int pesoJabon = 500;

Int contadorJabon = 7;

int pesoTotal = 0;

contadorCajas = 0;

 

void setup() {

   contadorJabon--;

}

 

void loop() {

   pesoTotal = pesoJabon * contadorJabon;

   contadorCajas = contadorJabon / 12;

}

 

A figura 23 mostra os resultados. Observe que a variável do contador de sabão (contadorjabones) foi iniciada com 7.

 

 Figura 23. Variáveis na RAM para esteira depois de executar o programa - copiar
Figura 23. Variáveis na RAM para esteira depois de executar o programa - copiar

 

Na função setup(), ela é decrementada por 1, com a seguinte instrução:

contadorJabon--;

Por esse motivo, na Figura 23, a localização da memória counterSabones aparece com o valor 6.

 

ACELERÔMETRO DE 2 EIXOS.

Para ver o uso de operações aritméticas em circuitos e projetos eletrônicos, vamos usar um acelerômetro como exemplo. O circuito integrado Mensic 2125 é um acelerômetro de 2 eixos com saída digital capaz de medir a aceleração até mais ou menos 2g. Inclinação, rotação e vibração também podem ser medidas. O circuito pode ser visto na Figura 24 e na Figura 25.

 

 Figura 24. Acelerômetro MEMSIC 2125
Figura 24. Acelerômetro MEMSIC 2125

 

 

 Figura 25. Acelerômetro MEMSIC 2125
Figura 25. Acelerômetro MEMSIC 2125

 

Os pinos de saída emitem pulsos cuja duração corresponde à aceleração desse eixo. Com a função pulseIn(), podemos medir a duração de um pulso em microssegundos e assim saber a velocidade de aceleração. O circuito tem um triângulo no topo para o uso correto da orientação. Veja a Figura 26.

 

 Figura 26. Diagrama do MEMSIC 2125
Figura 26. Diagrama do MEMSIC 2125

 

Ligue os pinos de tensão a 5 Volts e GND ao terra. Conecte o pino digital 2 da placa Arduino Uno, ao pino de saída X do acelerômetro e o pino de saída digital 3 ao pino de saída Y. Observe como usamos as operações matemáticas para fazer os respectivos cálculos. Em artigos futuros podemos estender o uso e a prática com acelerômetros, que são cada vez mais utilizados em quase todos os equipamentos eletrônicos. A Figura 27 mostra o circuito eletrônico e a Figura 28 como montar o circuito em uma placa de montagem.

 

 Figura 27. Circuito eletrônico com Arduino Uno e MEMSIC 2125
Figura 27. Circuito eletrônico com Arduino Uno e MEMSIC 2125

 

 

 Figura 28. Montagem em Protoboard do MEMSIC 2125
Figura 28. Montagem em Protoboard do MEMSIC 2125

 

O seguinte código é encontrado no Arduino IDE, no menu: File-> Examples-> 06.Sensor-> Memsic2125. Veja a Figura 29 para ver o menu.

 

 Figura 29. Exemplo de menu de programação para o acelerômetro MEMSIC 2125
Figura 29. Exemplo de menu de programação para o acelerômetro MEMSIC 2125

 

// these constants won't change:

const int xPin = 2; // X output of the accelerometer

const int yPin = 3; // Y output of the accelerometer

 

void setup() {

   // initialize serial communications:

   Serial.begin(9600);

   // initialize the pins connected to the accelerometer as inputs:

   pinMode(xPin, INPUT);

   pinMode(yPin, INPUT);

}

 

void loop() {

    // variables to read the pulse widths:

   int pulseX, pulseY;

   // variables to contain the resulting accelerations

   int accelerationX, accelerationY;

    

   // read pulse from x- and y-axes:

   pulseX = pulseIn(xPin, HIGH);

   pulseY = pulseIn(yPin, HIGH);

 

   // convert the pulse width into acceleration

   // accelerationX and accelerationY are in milli-g's:

   // Earth's gravity is 1000 milli-g's, or 1 g.

   accelerationX = ((pulseX / 10) - 500) * 8;

   accelerationY = ((pulseY / 10) - 500) * 8;

 

   // print the acceleration

   Serial.print(accelerationX);

   // print a tab character:

   Serial.print("\t");

   Serial.print(accelerationY);

   Serial.println();

   delay(100);

}

 

CONCLUSÃO

A capacidade de um microcontrolador para realizar operações aritméticas é muito grande. Neste artigo, vimos as operações básicas, mas com elas podemos usar ou criar operações e cálculos praticamente ilimitados, como raiz quadrada, mínimos e máximos, estatísticas etc. Com a prática, você pode ver que podemos fazer qualquer cálculo matemático ou aritmético na placa do Arduino Uno. Também podemos fazer aritmética com uma parte decimal.