segunda-feira, 14 de abril de 2014

Potenciômetro com memória 2 - Agora com Arduino

Bom, como diriam os BORG: "Resistir é inútil". Então lá fui eu dar uma conferida no Arduino. Resolvi começar por algo conhecido para não ter muitas surpresas e refiz o "potenciômetro com memória" na plataforma. Segue o vídeo:


Montei o potenciômetro numa placa separada, com as chaves:
Potenciometro Alps RK168

Além da placa Arduino usei um clone do "motor shield" da Adafruit. O Arduino também é um clone Chines, e ao colocar o shield tive um problema com a conexão do motor 1A que ficou em cima do conector USB, provocando um curto circuito. Ainda bem que o L293D tem proteção contra curto na saída e apenas esquentou o CI. A solução foi cortar o pino mais rente a placa e isolar o conector USB com fita isolante:
Arduino Motor Shield

Com o motor shield instalado não existe a possibilidade de usar estes fios para protoboard encaixados nos conectores do Arduino, por isso tive que soldar diretamente na placa:
Arduino Motor Shield
As chaves de controle do circuito foram conectadas a duas entradas analógicas do Arduino, também por causa do motor shield. Ele ocupa quase todas as portas digitais do Arduino, sobrando apenas as duas da porta serial. O esquema ficou assim:

Esquema potenciometro com memória em Arduino


Quanto ao código não foi tão difícil converter do C usado na primeira versão (feito no Code Warrior da Freescale) para o Arduino. Achei a IDE fraca e senti falta de um debugger, mas para quem quer começar a brincar com microcontroladores ela é até que muito boa. 

A biblioteca do motor shield funcionou perfeitamente, foi só instalar e usar. O código de controle do potenciômetro ficou muito parecido com o original, apenas acrescentei uma função para fazer a média de 64 amostras da leitura do potenciômetro (na verdade ela soma as 64 amostras de 10 bits criando um valor de 16 bits, para maior precisão).

Segue o código do sketch (preciso encontrar uma forma melhor de publicar códigos no blog  ou no GitHub):

 //******************************  
 // Potenciometro com memoria  
 // http://www.pakequis.com.br  
 //******************************  
 #include <AFMotor.h>  
   
 const int Min_Value = 5;   //Valor minimo da leitura do potenciometro  
 const int Max_Value = 65000; //Valor maximo da leitura do potenciometro  
   
 AF_DCMotor motor(1);  //Define motor para a saida 1 do shield  
 int KeyStatus = 0;      //Valor da tecla  
 unsigned int Mem_Value = 0; //Valor memorizado do potenciometro  
   
 void setup(){  
  motor.setSpeed(200); //Velocidade maxima  
  motor.run(RELEASE);  //Desativa o motor  
 }  
   
 void loop(){  
  KeyStatus = analogRead(A4);  //Verifica a tecla de memoria  
   
  if (KeyStatus > 950){    //Tecla pressionada?  
   Mem_Value = AvgMeasure();  //Memoriza o valor do potenciometro  
   if(Mem_Value > Max_Value){  //Verifica se ultrapassou os limites  
    Mem_Value = Max_Value;   //Limite maximo atingido  
   }  
   if(Mem_Value < Min_Value){  
    Mem_Value = Min_Value;   //Limite minimo atingido  
   }  
   KeyStatus = 0;        //volta ao estado de tecla nao pressionada  
  }  
   
  KeyStatus = analogRead(A2);      //Verifica tecla de recuperar memoria  
  if (KeyStatus > 950){         //Tecla pressionada?  
   if (Mem_Value > AvgMeasure()){    //  
    while(Mem_Value >= AvgMeasure()){ //Ateh chegar na posicao correta  
     //Serial.println(analogRead(A0));  
     motor.run(FORWARD);       //aciona o motor  
    }    
    motor.run(RELEASE);        //Desliga o motor  
    delay(250);            //250ms de atraso  
   }else{  
    while(Mem_Value <= AvgMeasure()){ //Ateh chegar na posicao correta  
     motor.run(BACKWARD);       //Aciona o motor  
    }  
    motor.run(RELEASE);        //Desliga o motor  
    delay(250);            //250ms de atraso  
   }  
   KeyStatus = 0;        //volta ao estado de tecla nao pressionada  
  }  
 }  
   
 //Calcula a media de 64 amostras da entrada A0  
 //(de 10 bits para 16 bits)  
 unsigned int AvgMeasure(){  
  int i;  
  unsigned int Temp = 0;  
  for (i=0;i<64;i++){  
   Temp += analogRead(A0); //Soma 64 amostras do A0  
  }  
  return Temp; //Retorna valor da media  
 }  

Nenhum comentário:

Postar um comentário

1. Alguns comentários são moderados automaticamente. Caso isso ocorra pode levar algum tempo até que eu veja e o libere.
2. Comentários fora do assunto do post podem ser apagados.
3. Não, eu não posso consertar os seus aparelhos!

Related Posts Plugin for WordPress, Blogger...