Manual
do
Maker
.
com
O Arduino tem tantos recursos que a maioria dos makers não os utilizam em 100%. E muitos projetos, por mais compelxos que sejam, jamais fazem uso de todos esses recursos. Mas vamos falar de conversor AD.
Opa, esse parágrafo começa com Arduino mais uma vez. Bem, a razão é clara. O Arduino tem conversor AD, e são diversas portas. Mas a resolução é de 10 bits, enquanto o ADS1015 tem uma impressionante resolução de 12 bits. Parece pouco falando dessa forma, mas 10 bits correspondem a 1024 valores (0 à 1023), enquanto 12 bits te dá uma amostragem de 4096 valores (0 à 4095). Com isso, pode valer a pena utilizá-lo no Arduino, mas de qualquer modo, esse ADC é muito útil também para outras plataformas. Por exemplo, o ESP8266 tem 1 modesto ADC, apenas uma porta, e que só permite tensão de entrada de 1V. Ainda que utilizando um divisor de tensão para tentar garantir esse 1V, claro que haverá ruido advindo do resistor. Para solucionar os problemas de número de portas e tensão de entrada, o ADS1015 é uma ótima pedida. E não pára por aí; o Raspberry não tem conversor ADC, mas com esse minimalístico módulo você dá ao Raspberry o poder de ler sensores analógicos! Convencido? Ok, vamos aos detalhes, mas antes que eu me esqueça de colocar no artigo, esse é o link para o produto na UsinaInfo.
Primeiro, esse módulo tem apenas 8mm de largura por 35mm de comprimento. Com isso, você consegue incluí-lo em qualquer projeto sem a necessidade de projetar um espaço específico para ele.
Esse módulo conversa via I²C, cujo barramento está disponível em praticamente todas as plataformas e você poderá utilizá-lo inclusive com o Digispark.
Você pode entrar com tensão de até 5.5V, de modo que fica fácil trabalhar com nível lógico de 3V3 e 5V.
Esse módulo é bastante resiste, considerando a tabela de máximas dele, mas nem vou citar os valores para que você não corra o risco de trabalhar no limite.
Esse módulo oferece 4 portas analógicas, o que é suficiente para a maioria dos projetos, mas nada impede que você coloque mais dispositivos no barramento I²C.
Esse módulo pode ser utilizado de duas formas; conversão contínua ou single-shot. O ajuste para o modo de operação é feito no bit MODE do registrador Config. Não se preocupe com essa informação se lhe parecer estranha, ficará claro mais adiante.
Para o modo single-shot, o bit MODE do registrador Config deve ser configurado para o valor 1. Nesse modo de operação o ADS1015 fica em modo power-down e esse é o estado padrão quando o dispositivo é ligado pela primeira vez. Ainda que em modo power-down, o dispositivo responde a comandos. Se o valor 1 for atribuido ao bit OS do registrador Config, ele torna ao modo de operação ativo por 25 microsegundos, reconfigura o bit OS para 0 e inicia a conversão no modo single-shot. Quando o dado convertido estiver pronto, o dispositivo dorme novamente.
Se desejar configurar para o modo de leitura continua, o bit OS do registrador Config deve ser ajustado para o valor 0. No modo de leitura continua, o ADS1015 faz a conversão e coloca o resultado no registrador Conversion e imediatamente inicia uma nova conversão.
Se quiser dar uma olhada no datasheet, o PDF pode ser pego nesse linkads1015.pdf.
O ADS1015 tem um pino de endereçamento. Esse pino endereça o dispositivo de forma diferente, dependendo à quem ele é ligado. Por exemplo, ligando-o ao GND você terá o endereço 1001000, que equivale a 0x48 ou 72 na base decimal. Citei as 3 bases porque dependendo de onde você for utilizar o ADS1015, o endereço aparecerá em uma base diferente. Já no datasheet, ele está em binário.
É importante dar atenção a esse ponto. Por padrão, o ESP8266 inicia o I²C em 400kHz e se quiser utilizar esse ADC com ESP8266, ou deve reconfigurar o módulo, ou o mais simples - mudar a velocidade de comunicação ao instanciar o objeto de comunicação I²C. Até 400kHz você apenas controla na instância do objeto, mas se quiser utilizar o (desnecessário) high-speed, deverá enviar enviar um byte de endereço especial 00001xxx seguido da condição de START. O valor xxx são bits únicos para o Hs master. Mas pulemos isso, normalmente utilizamos "todos" os dispositivos I²C em 400kHz.
Me perdoe, mas não consigo transcrever datasheet. Prefiro ler, testar e colocar o código funcional no artigo (ou no github).
Para utilizar esse módulo em diversos Arduino's e inclusive em ESP8266, você pode optar pela bilbioteca disponível nesse link.
Gostaria de citar um pouco mais do mapa de registradores, mas depois de ter encontrado essa biblioteca confesso que me enchi de preguiça, porque escrever um código para esse conversor AD será reinventar a roda, concorda? Então, vamos direto para o uso da biblioteca. Depois me comprometo a migrar esse código para Python, de modo que você possa utilizar esse conversor também em um Raspberry de forma fácil.
Abra o sketch de exemplos ADS1x15->Comparator. O código desse exemplo está assim:
#include <Wire.h>
#include <Adafruit_ADS1015.h>
// Adafruit_ADS1115 ads; /* Use this for the 16-bit version */
Adafruit_ADS1015 ads; /* Use thi for the 12-bit version */
void setup(void)
{
Serial.begin(9600);
Serial.println("Hello!");
Serial.println("Single-ended readings from AIN0 with >3.0V comparator");
Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
Serial.println("Comparator Threshold: 1000 (3.000V)");
// The ADC input range (or gain) can be changed via the following
// functions, but be careful never to exceed VDD +0.3V max, or to
// exceed the upper and lower limits if you adjust the input range!
// Setting these values incorrectly may destroy your ADC!
// ADS1015 ADS1115
// ------- -------
// ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default)
// ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV
// ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV
// ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV
// ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV
// ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV
ads.begin();
// Setup 3V comparator on channel 0
ads.startComparator_SingleEnded(0, 1000);
}
void loop(void)
{
int16_t adc0;
// Comparator will only de-assert after a read
adc0 = ads.getLastConversionResults();
Serial.print("AIN0: "); Serial.println(adc0);
delay(100);
}
Como você pode ver em loop(), o trabalho é praticamente nulo para utilizar esse sensor. Se precisar utilizar em raspberry, você pode experimentar esse código em Python que escrevi para o ADS1115. Estou utilizando esse código em Raspberry, mas acredito que sirva para o ESP8266 com MicroPython, conforme o exemplo que escrevi no artigo. Eu não escrevi nenhuma lib, mas são apenas 27 linhas de código.
Primeiramente, tenhamos em mente o pinout do Arduino Nano. Devemos nos ater aos 5V, GND, SCL e SDA para fazermos o wiring do I²C.
Eu gosto de usar o Nano principalmente por esse shield que me ajuda a não usar uma protoboard. Mas existem outras razões para utilizá-lo; ele é muito pequeno e tem lá todos os recursos que você normalmente utiliza no UNO. Se ainda não tem um, recomendo que adquira nesse link da UsinaInfo. E caso queira o expansor para evitar protoboard, o link é esse.
Esse post é introdutório ao ADS1015, mas ele será utilizado na leitura de um sensor de temperatura industrial PT100, estou apenas aguardando que a #erd4$ do correio volte a trabalhar para entregar meus produtos que estão sob cárcere privado. Enfim, é só aguardar o próximo artigo relacionado.
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.