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  
 }  

2 comentários:

  1. Olá, eu quero substituir um potenciômetro comum (B200K) por um motorizado que possa ser controlado via Arduíno.
    Sabes me dizer onde consigo um ?
    Obrigado.
    Neimar

    ResponderExcluir
  2. Olá, sabe me dizer aonde consigo um potenciômetro motorizado compatível com Arduino?
    Neimar

    ResponderExcluir

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...