Continuando a série sobre o uso da ferramenta Tinkercad, neste artigo é mostrado como manipular o LED RGB e circuitos analógicos da placa PQDB.
LED RGB
Este componente consiste em 3 LEDs diferentes (vermelho, verde e azul) dispostos em conjunto, porém com terminais independentes. No exemplo, o LED utilizado será do tipo cátodo comum, sendo este terminal, então, conectado ao terra do circuito, de maneira que ao se aplicar uma tensão nos terminais individuais, o LED é aceso.
Para o funcionamento do LED RGB, os anodos serão conectados à portas do Arduino que possuam saídas PWM. Variando o ciclo de trabalho (duty cycle) destas portas, é variada a proporcionalidade de tempo com que elas possuem nível lógico alto e nível lógico baixo. Se o duty cicle de uma porta é de 50%, esta ficará o mesmo período de tempo ligada e desligada. Variando esse valor é produzido aos olhos humanos uma sensação de maior ou menor intensidade de brilho de cada cor dos LEDs. A resolução das portas PWM do Arduino UNO é de 8 bits, ou seja, o menor valor é 0 e o maior 255 (28 – 1=256 -1), como exemplificado na figura a seguir:
Link para a simulação aqui.
Código
#define R 2
#define G 4
#define B 3
void setup(){
pinMode(R, OUTPUT); //Configuração dos pinos como saída
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
}
void loop(){
analogWrite(R, random(255)); //Ligando as portas PWM com valor aleatório de duty cicle
analogWrite(G, random(255));
analogWrite(B, random(255));
delay(200); //Espera 200ms até atualizar o LED com novos valores aleatórios
}
Componentes Analógicos
Neste sketch será realizada a leitura de um sensor de temperatura, um resistor dependente de luz (LDR) e um potenciômetro através das portas analógicas e impressos no monitor serial. A reprodução de sons é feita por meio de um buzzer (piezoelétrico).
Ao conectar os componentes nas entradas analógicas do microcontrolador é necessário saber que o conversor analógico digital, que tem seus padrões de tensão de 0 a 5 V, tem uma resolução de 10 bits, portanto, seu valor mínimo é 0 e seu valor máximo, correspondente a 5 V, é de 1023 (210 – 1).
Link para a simulação aqui.
As particularidades do circuito são a interpretação da leitura do resistor dependente de luz (LDR), a utilização do transistor para acionar o buzzer e a escala do sensor de temperatura.
O LDR tem uma alta resistência (mega ohms) na ausência de luminosidade e uma baixa resistência (dezenas de ohms) na presença de uma forte luminosidade. Para realizar sua leitura é avaliada a queda de tensão em um resistor fixo, que é baixa na falta de luz e alta na presença de luz.
Para que o buzzer tenha mais volume em função da baixa corrente que a porta digital do microcontrolador é capaz de oferecer, esta será responsável apenas por polarizar o transistor que atua como uma chave fechada quando a saída digital tem nível lógico alto e como chave aberta quando a saída tem nível lógico baixo.
O sensor de temperatura presente no Tinkercad tem sua saída variando 10 mV para cada ºC, mas seu zero (0 V) corresponde a uma temperatura de -50 ºC, portanto a faixa de 0 a 5 V é traduzida em -50 ºC a 450 ºC.
Ao iniciar a simulação é possível alterar o valor dos sensores e do potenciômetro clicando sobre eles:
Código
#define BUZZER 9
#define LM A0
#define LDR A1
#define POT A2
void setup(){
pinMode(BUZZER, OUTPUT); //Configura a porta como saída
pinMode(LM, INPUT); //Configura as portas como entrada
pinMode(LDR, INPUT);
pinMode(POT, INPUT);
Serial.begin(9600); //Inicializa a comunicação serial
}
void loop(){
static unsigned long info = 0;
//A função millis() retorna há quantos milissegundos o microcontrolador está ligado
if (millis() - info > 200){ //É executado 200ms após o reset da variável info
info = millis(); //Reseta a variável info
Serial.print("Temp = ");
Serial.print(map(analogRead(LM),0, 1023, -50, 450)); // Converte 0 a 1023 em -50ºC a 450ºC
Serial.println("oC");
Serial.print("LDR = ");
Serial.println(analogRead(LDR)); //Imprime o valor sem conversão da leitura analógica
Serial.print("Potenciometro = ");
Serial.print(map(analogRead(LM),0, 1023, 0, 100)); // Converte 0 a 1023 em 0% a 100%
Serial.println("% \n");
}
if(analogRead(POT)>128){
static unsigned long timeBuzz = 0;
if(millis() - timeBuzz > 100){ //É executado 100ms após o reset da variável timeBuzz
tone(BUZZER, 100 + analogRead(POT)); // Liga o buzzer com uma frequência dependente do valor do potenciômetro
}
if(millis() - timeBuzz > 300){ //É executado 300ms após o reset da variável timeBuzz
noTone(BUZZER); //Desliga o BUZZER
timeBuzz = millis(); //Reseta a variável timeBuzz
}
}
else{
noTone(BUZZER); //Desliga o BUZZER
}
}
Conclusão
Neste artigo foram apresentados os conceitos de PWM para variar a intensidade do brilho dos LEDs, a leitura analógica de componentes, como sensores de temperatura e luminosidade e potenciômetros, e a reprodução de sons por meio de um buzzer (piezoelétrico).
Nos próximos artigos vamos trabalhar outros conceitos presentes nos circuitos na PQDB, como a multiplexação de displays 7 segmentos, a leitura de um teclado matricial e a utilização do display LCD 16×2.
Todos os códigos podem ser acessados em meu GitHub.
Saiba mais
Primeiros Passos com a PQDB Mini e Arduino UNO






