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);
}
}

Exibições: 818

Responder esta

Respostas a este tópico

É 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!!!!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço