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:
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:
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:
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:
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
}
Olá, eu quero substituir um potenciômetro comum (B200K) por um motorizado que possa ser controlado via Arduíno.
ResponderExcluirSabes me dizer onde consigo um ?
Obrigado.
Neimar
Olá, sabe me dizer aonde consigo um potenciômetro motorizado compatível com Arduino?
ResponderExcluirNeimar