Nesta terceira postagem da série “Hack do Fritzen” vou mostrar para vocês o meu mais recente projeto: um shield para testar diversas funções do Arduino (entrada e saídas, etc). A ideia é montar um circuito completo utilizando apenas o espaço de um shield de Arduino UNO, que contenha todos os circuito necessários para ter certeza que o Arduino sob teste está funcionando perfeitamente.
   Mas porque criar um shield para testar Arduinos, se eles já vem testados de fábrica? – Porque o autor deste blog está iniciando a produção (artesanal) de seus próprios compatíveis com Arduino, como vocês já viram neste artigo aqui. Como requisito de projeto defini que este shield deve ser capaz de testar a maior quantidade possível de funções do Arduino, fornecendo indicação visual de funcionamento dos seguintes circuitos:
– Entradas digitais (0-5V)
– Saídas digitais (0-5V)
– Entradas analógicas (0-5V0
– Saídas PWM
– Comunicação com protocolo i2C
– Comunicação Serial
   Com este objetivo em mente eu parti para escolha dos componentes e pinos para sua conexão; fiz questão de montar no shield somente componentes de fácil obtenção e operação, conforme lista e imagem abaixo:
– Pinos 0 e 1: comunicação serial com um computador
– Pinos 2 e 3: um LED (saída digital)
– Pinos 4 e 5: um LED (saída digital)
– Pino 6: um LED (saída PWM)
– Pinos 7 e 8: um LED (saída digital)
– Pino 9: um servomotor (saída digital)
– Pino 10: um chave/botão (entrada digital)
– Pinos 11, 12 e 13: gravação de firmware no ATMEGA328 via ICSP, antes de iniciar o teste
– Pinos A0..A3: Potenciômetro (entradas analógicas)
– Pinos A4 e A5: sensor de umidade/temperatura Si7021, comunicando via protocolo i2C
E o resultado final, o shield montado (hora de testar!!):
   Para efetuar o teste do Arduino utilizando este shield é necessário gravar um código no ATMEGA328 sob teste; escrevi um sketch que utiliza de forma simultânea todos os componentes do shield. O código se encontra abaixo, porém também pode ser baixado diretamente do meu Github, onde vou guardar qualquer alteração que fizer no mesmo.
 #include <Servo.h>  
   
 #define led1GND 2  
 #define led1VCC 3  
 #define led2GND 4  
 #define led2VCC 5  
 #define ledPWM 6  
 #define led3GND 7  
 #define led3VCC 8  
 #define botao 10  
   
 int lerBotao = 0;  
 int analogico0 = 0;  
 int analogico1 = 1;  
 int analogico2 = 2;  
 int analogico3 = 3;  
 int posServo = 0;  
 int subindo = 1;  
 int valorPWM = 0;  
   
 Servo meuServo;  
   
 void setup() {  
  meuServo.attach(9);  
  Serial.begin(9600);  
  pinMode(ledPWM, OUTPUT);  
  pinMode(led1VCC, OUTPUT);  
  pinMode(led1GND, OUTPUT);  
  pinMode(led2VCC, OUTPUT);  
  pinMode(led2GND, OUTPUT);  
  pinMode(led3VCC, OUTPUT);  
  pinMode(led3GND, OUTPUT);  
  pinMode(botao, INPUT);  
 }  
   
 void loop() {  
   
    
  lerBotao = digitalRead(botao);  
   
  if (lerBotao == HIGH) {  
   digitalWrite(led1VCC, HIGH);  
   digitalWrite(led1GND, LOW);  
   digitalWrite(led2VCC, HIGH);  
   digitalWrite(led2GND, HIGH);  
   digitalWrite(led3VCC, HIGH);  
   digitalWrite(led3GND, LOW);  
       
  } else {  
   digitalWrite(led1VCC, HIGH);  
   digitalWrite(led1GND, HIGH);  
   digitalWrite(led2VCC, HIGH);  
   digitalWrite(led2GND, LOW);  
   digitalWrite(led3VCC, HIGH);  
   digitalWrite(led3GND, HIGH);  
  }  
    
  delay(300);  
  analogico0 = analogRead(A0);  
  analogico1 = analogRead(A1);  
  analogico2 = analogRead(A2);  
  analogico3 = analogRead(A3);  
    
  Serial.print("A0= ");  
  Serial.println(analogico0);  
  Serial.print("A1= ");  
  Serial.println(analogico1);  
  Serial.print("A2= ");  
  Serial.println(analogico2);  
  Serial.print("A3= ");  
  Serial.println(analogico3);  
   
  if (subindo == 1){  
   posServo = posServo +18;  
   meuServo.write(posServo);  
   if (posServo >= 180){  
    subindo = 0;   
   }  
   delay(100);  
   }  
  if (subindo == 0){  
   posServo = posServo -18;  
   meuServo.write(posServo);  
    if (posServo <= 0){  
    subindo = 1;   
   }  
   delay(100);  
   }   
     
    
  valorPWM = map(posServo, 0, 180, 0, 175);  
  // change the analog out value:  
  analogWrite(ledPWM, valorPWM);  
  }  

 

 Eu não disponho de um conversor USB-Serial no momento (FT232, PL2303, CH340) por isso estou utilizando um Arduino UNO sem o ATMEGA328 como conversor serial (imagem abaixo).
Conectando o shield sobre o Fritzem UM, o servo-motor no conector e a fonte externa (12V) no Arduino:
O funcionamento do teste pode ser visto no vídeo abaixo onde o Arduino sob teste é Fritzen UM, meu compatível de cor amarela!.

 

   Dica: este é um trabalho em progresso, portanto novas versões e melhorias podem surgir; sugiro acompanhar a página deste projeto no hackaday.io (em Inglês) para saber dos detalhes mais atuais.
Hack do Fritzen [3] – Um Shield para testar Arduino
Classificado como:                                        

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Solve : *
24 + 5 =