boa noite. estou fazendo uma vending machine onde utilizo um moedeiro (input) e um motor de passo (easydriver) . até ai tudo beleza, quando eu coloco uma moeda no input, este motor roda 360 graus. porem estou tentando fazer com que eu coloque 3 moedas para ai então o motor de passo se movimentar, porem ja tentei mais de 50 codigos e não funciona!!!! se alguem puder me dar umas dicas, fico agradecido.
segue abaixo o codigo
const int buttonPin = 5; //canal botao
const int ledPin = 13; // canal led
int dirPin = 2; //canal direção do motor
int stepperPin = 3; //canal posição do motor
int buttonState = 0;
int contador = 0;
void setup() {
pinMode(dirPin, OUTPUT);
pinMode(stepperPin, OUTPUT);
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
Serial.begin(9600);
}
void step(boolean dir,int steps){
digitalWrite(dirPin,dir);
delay(50);
for(int i=0;i<steps;i++){
digitalWrite(stepperPin, HIGH);
delayMicroseconds(100);
digitalWrite(stepperPin, LOW);
delayMicroseconds(100);
}
}
void loop(){
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH); // liga botão led
Serial.println(buttonState);
step(true,1600); //da uma volta motor de passo
delay(500);
digitalWrite(ledPin, LOW); //apaga o led
}
else {
// turn LED off:
digitalWrite(ledPin, LOW);
}
}
Tags:
É só você contar quantas vezes quer que o botão buttonPin seja pressionado (quantas moedas devem ser inseridas) antes de acionar o motor.
char nCoins = 0;
void loop()
{
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH)
{
/// Botao esta em HIGH, deve aguardar LOW para considerar moeda inserida
while( digitalRead( buttonPin ) == HIGH )
{ } /// Nao faz nada mesmo, vai ficar preso aqui ate o botao ser liberado
nCoins++;
}
else
{
// turn LED off:
digitalWrite(ledPin, LOW);
}
/// Se foram inseridas 3 moedas, aciona o motor e zera contador de moedas inseridas
if ( nCoins == 3 )
{
digitalWrite(ledPin, HIGH); // liga botão led
Serial.println(buttonState);
step(true,1600); //da uma volta motor de passo
delay(500);
digitalWrite(ledPin, LOW); //apaga o led
nCoins = 0;
}
}
Basicamente isso.
Happy hack :)
muito obrigado mesmo, amanha ja vou testar este codigo e falo se deu tudo ok!!!! agradeço muito pela ajuda amigo.
Acabei de testar o codigo, porem cada moeda que é inserida, o motor de passo aciona, igual ao codigo acima. segue o codigo como ficou:
const int buttonPin = 5; //canal botao
const int ledPin = 13; // canal led
int dirPin = 2; //canal direção do motor
int stepperPin = 3; //canal posição do motor
int buttonState = 0;
int contador = 0;
char nCoins = 0;
void setup() {
pinMode(dirPin, OUTPUT);
pinMode(stepperPin, OUTPUT);
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
Serial.begin(9600);
}
void step(boolean dir,int steps){
digitalWrite(dirPin,dir);
delay(50);
for(int i=0;i<steps;i++){
digitalWrite(stepperPin, HIGH);
delayMicroseconds(100);
digitalWrite(stepperPin, LOW);
delayMicroseconds(100);
}
}
void loop(){
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
// Botao esta em HIGH, deve aguardar LOW para considerar moeda inserida
while( digitalRead( buttonPin ) == HIGH )
{ } /// Nao faz nada mesmo, vai ficar preso aqui ate o botao ser liberado
nCoins++;
}
else {
// turn LED off:
digitalWrite(ledPin, LOW);
}
/// Se foram inseridas 3 moedas, aciona o motor e zera contador de moedas inseridas
if ( nCoins == 3 )
{
digitalWrite(ledPin, HIGH); // liga botão led
Serial.println(buttonState);
step(true,1600); //da uma volta motor de passo
delay(500);
digitalWrite(ledPin, LOW); //apaga o led
nCoins = 0;
}
}
Então a insersão da moeda pode estar gerando bouncing. No bloco que incrementa nCoins, coloca depuração e insere uma moeda só pra ver o que acontece:
if ( buttonState == HIGH )
{
while( buttonState == HIGH )
{}
Serial.println( "+M" );
nCount++;
}
Isso vai demonstrar o comportamento do contador a cada moeda inserida. Se for bouncing mesmo, é só corrigir o debounce por código ou mesmo por hardware.
Como é o circuito que vc tá montando isso? É um moedeiro mesmo? Ou é um botão?
boa tarde daniel, inclui no codigo Serial.println( "+M" ); e quando eu abro a serial print e coloco uma moeda, aparece:
+M
+M
+M
1
cada vez que eu insiro uma moeda aparece estas 4 linhas em 90% das vezes.
em 10% das vezes somente aparece
+M
+M
e o motor não roda, dai quando coloco outra moeda, ele completa as 2 linhas de baixo
+M
1
completando as 4 linhas e dai sim roda o motor de passo.
com relação ao meu circuito, estou usando um moedeiro 12v , segue link: http://produto.mercadolivre.com.br/MLB-612309065-moedeiro-eletrnico...
porem esta ligado diretamente na porta 5 do arduino (INPUT), sem nenhum resistor. sera que pode ser isto??
no arduino canais 2 e 3, tenho 2 vias(OUTPUT) DIR + STEEPER , que ligam em um easydriver, que esta conectado ao motor de passo.
segue link do easydriver: http://www.schmalzhaus.com/EasyDriver/Examples/EasyDriverExamples.html
Com a saída do teste que o Daniel pediu, é bem possível que esteja acontecendo boucing.
O boucing é uma oscilação que as chaves mecânicas apresentam quando são acionadas até estabilizar na saída esperada. No teu caso quando uma moeda é incluída na maquina, ele fica oscilando umas 3~4 vezes, e isso gera a saída errada. No link abaixo é explicado melhor, até com exemplo de gráfico e como tratar isso.
http://www.embarcados.com.br/leitura-de-chaves-mecanicas-e-o-proces...
Acho que seria interessante tu olhar o como eles fizeram via hardware, pq não é muito dificil de implementar.
A dica do Daniel é a lógica que deve funcionar tranquilamente.
Uma das coisas que pode ser necessário realizar, é adicionar algum delay ou alguma outra condição de controle antes da próxima leitura da moeda, visto que se o Arduino executar a segunda/terceira leitura enquanto o buttonState continua HIGH devido a leitura anterior pode acabar gerando um resultado errado.
Abraço
muito obrigado tambem pela ajuda!!!! vou amanha mesmo ja testar este codigo. abraço!!
valew galera pela ajuda!!! agradeço especialmente a daniel pela enorme ajuda e boa vontade em ajudar!!!!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por