Pages: [1]   Go Down
Author Topic: Problemas contador de pulsos (Solucionado)  (Read 6914 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno estoy generando un proyecto simple con arduino (En realidad es un Seeeduino trabaja igual que arduino uno), es un contador de pulsos aca esta el código

Code:
/*
 ---------------------------------------------
  Contador de pulsos
 ---------------------------------------------
 
  Programa que muestra por pantalla (consola serial) el número
   de veces que el pulsador ha sido presionado, se realiza un
   proceso que de acuerdo al número de pulsaciones se enciende
   un LED,
 
 Cosas de Mecatrónica y Tienda de Robótica
 
*/
 
//--------------------------------------------------
//Declara puertos de entradas y salidas y variables
//--------------------------------------------------
int conta = 0;  //Variable para guardar el conteo de los pulsos
 
//------------------------------------
//Funcion principal
//------------------------------------
void setup() // Se ejecuta cada vez que el Arduino se inicia
{
  Serial.begin(9600);   //Inicia comunicación serial
  pinMode(2,INPUT);     //Configura el pin 2 como una entrada, pulsador
  pinMode(13,OUTPUT);   //Configura el pin 13 como una salida, LED
}
 
//------------------------------------
//Funcion ciclicla
//------------------------------------
void loop() // Esta funcion se mantiene ejecutando
{           //  cuando este energizado el Arduino
 
  // Si el pulsador esta oprimido
  if ( digitalRead(2) == HIGH )
  {
      // Si el pulsador no esta oprimido, flanco de bajada
      if ( digitalRead(2) == LOW )
      {
         conta++;               //Incrementa el contador
         Serial.println(conta); //Imprime el valor por consola
         delay (100);           // Retardo
      }
  }
 
  // Si el valor del contador es 5
  if (conta==5)
  {
    digitalWrite(13,HIGH);  //Enciende el LED
  }
 
  // Si el valor del contador es 8
  if (conta==8)
  {
    digitalWrite(13,LOW);  // Apaga el LED
  }
 
}

Acá este el link del proyecto para mas entendimiento

http://www.cosasdemecatronica.com/tutoriales/arduino/296-arduino-basico-t17ab-contador-de-pulsos

Como pudieron observar el código genera el conteo de pulsos imprimiéndolos por salida serial

Problema

El problema esta en que cuando se presiona el pulsador muy rápido o de repente al ir pulsando hay  pulsos que no son contabilizados ni impresos, me gustaría saber si hay alguna solución para eso , de ante mano muchas gracias
« Last Edit: September 26, 2011, 02:05:14 pm by titotitox » Logged

Madriz
Offline Offline
Full Member
***
Karma: 0
Posts: 176
Glober Arduiner
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Has pensado usar interrupciones? es justo lo que necesitas.

http://arduino.cc/en/Reference/AttachInterrupt
http://tronixstuff.wordpress.com/2010/04/20/getting-started-with-arduino-chapter-three/


Con ese código necesitas que el muestreo coincida con la pulsación, con interrupciones las cazas fijo.
« Last Edit: September 24, 2011, 03:55:11 pm by aero_yo » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Has pensado usar interrupciones? es justo lo que necesitas.

http://arduino.cc/en/Reference/AttachInterrupt
http://tronixstuff.wordpress.com/2010/04/20/getting-started-with-arduino-chapter-three/


Con ese código necesitas que el muestreo coincida con la pulsación, con interrupciones las cazas fijo.
Leí lo de los links pero no supe como aplicarlo a mi código si podrías indicarme como se puede aplicar estaría muy agradecido
Logged

Madrid
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

yo tengo hecho el proyecto del boton de facebook que cuenta los pulsos, al principio tenia los mísmos problemas que tu, (confieso que no he leido tu código) pero este funciona, solo tienes que implementar el led y quitar la pantalla
Code:
#include <LiquidCrystal.h>


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int boton = 8;
int valor=0;
int contador=0;
int estadoanteriorboton=0;
void setup() {
  pinMode(boton,INPUT);
  digitalWrite(boton,HIGH);
  lcd.begin(16, 2);
  lcd.setCursor(0, 1);
  lcd.print("People like this!");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print("People like this!");
  valor=digitalRead(boton);
  if(valor!=estadoanteriorboton){
  if(valor==1){
  contador++;
  lcd.setCursor(5 , 0);
  lcd.print(contador);
  lcd.print("!!");
  }
  }
  estadoanteriorboton=valor;
  
}

Ya he leido tu codigo, el problema es que no compruebas el estado anterior del pin, así que si tu loop{ } tarda en completarse 5 milisegundos te va a contar pulsaciones a patadas...

de todas maneras el contador es un ejemplo que está en el playground si no me equivoco
« Last Edit: September 26, 2011, 12:35:37 pm by Zid_ » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

yo tengo hecho el proyecto del boton de facebook que cuenta los pulsos, al principio tenia los mísmos problemas que tu, (confieso que no he leido tu código) pero este funciona, solo tienes que implementar el led y quitar la pantalla
Code:
#include <LiquidCrystal.h>


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int boton = 8;
int valor=0;
int contador=0;
int estadoanteriorboton=0;
void setup() {
  pinMode(boton,INPUT);
  digitalWrite(boton,HIGH);
  lcd.begin(16, 2);
  lcd.setCursor(0, 1);
  lcd.print("People like this!");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print("People like this!");
  valor=digitalRead(boton);
  if(valor!=estadoanteriorboton){
  if(valor==1){
  contador++;
  lcd.setCursor(5 , 0);
  lcd.print(contador);
  lcd.print("!!");
  }
  }
  estadoanteriorboton=valor;
  
}

Ya he leido tu codigo, el problema es que no compruebas el estado anterior del pin, así que si tu loop{ } tarda en completarse 5 milisegundos te va a contar pulsaciones a patad
de todas maneras el contador es un ejemplo que está en el playground si no me equivoco
Tenias toda la razón tenia que comprobar el estado anteriores muchas gracias solucione mi problema smiley

También lo de las interrupciones me funco pero con algunos problemas, gracias por su ayuda se les agradece smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos los que comparten este foro, me parece excelente la idea de poder ayudar y ser ayudado.
Yo soy estudiante de ITI y estoy con un proyecto de un robot movil con una tarjeta arduino mega 2560. No he programado nunca algo similar y me he leido mil y un foro, pero no consigo adelantar mis sketch, si alguien me pudiese ayudar.
El primer problema que me surge es que quiero leer la entrada de unos microswitch de 8 canales de tal manera que me muestre el valor decimal que corresponde en cada momento, la actualizacion la realizo mediante un pulsador. Al pulsar la primera vez me debería dar angulos y a la segunda distancias y así sucesivamente, pero con el codigo que he elaborado me da distancias y despues angulos y nunca mas se vuelve a repetir el ciclo.

Este es mi codigo:

//* TEST DE MICROSWTCH *//
//Este test se realiza para interepretar la configuración de un microswitch de 8 canales gobernado por //
//otro interruptor que marcará la diferencia entre interpretación de ángulos y de distancias           //
//Se asignan los pines de conexión de cada canal de los microswitch                                    //
int Sel=40;
int sw1=46;
int sw2=47;
int sw3=48;
int sw4=49;
int sw5=50;
int sw6=51;
int sw7=52;
int sw8=53;
//Se crea una variable que dependiendo de su valor interpretará ángulos en grados o distancia en ctms. //
//El identificador de dicha variable será AngDis. AngDis=1-->ángulos; AngDis=2-->distancia             //
int AngDis=0;
int Switch1;
int Switch2;
int Switch3;
int Switch4;
int Switch5;
int Switch6;
int Switch7;
int Switch8;
int Unid;
int Dec;
int Total;
int TotalG;
int TotalC;
int sel=1;
void setup ()
{
  Serial.begin (9600);
  Serial.println("!Test de Interpretacion Microswitchs!");
  pinMode (Sel,INPUT);
  pinMode (sw1,INPUT);
  pinMode (sw2,INPUT);
  pinMode (sw3,INPUT);
  pinMode (sw4,INPUT);
  pinMode (sw5,INPUT);
  pinMode (sw6,INPUT);
  pinMode (sw7,INPUT);
  pinMode (sw8,INPUT);
}
void loop ()
{
  if (sel==0);
    {
    while (digitalRead(Sel)==0);
    {
      sel=sel+1;
      Switch1= digitalRead(sw1);
      Switch2= digitalRead(sw2);
      Switch3= digitalRead(sw3);
      Switch4= digitalRead(sw4);
      Switch5= digitalRead(sw5);
      Switch6= digitalRead(sw6);
      Switch7= digitalRead(sw7);
      Switch8= digitalRead(sw8);
      Unid = Switch1*1+Switch2*2+Switch3*4+Switch4*8;
      Dec = Switch5*1+Switch6*2+Switch7*4+Switch8*8;
      Total = Unid + Dec*10;
      while(sel==1)
      {
        TotalG=Total;
        Serial.print("Angulo =");
//        delay(100);
        Serial.print( TotalG);
//        delay(100);
        Serial.println(" grados");
//        delay;
        while (digitalRead(Sel)==1)
        {
          sel=sel+1;
        }
      }
    }
    while(sel==2)
    {
      TotalC=Total;
      Serial.print("Distancia =");
//      delay(100);         
      Serial.print(TotalC);
//      delay(100);
      Serial.println(" centimetros");
      while (digitalRead(Sel)==HIGH);
      {
        sel=sel-2;
      }
    }
  }
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos,

Me acaba de llegar el arduino y viendo lo del contador de pulsos me he tomado la libertad de "fusionar" las implementaciones que habéis puesto aquí (la primera y la segunda) para aprovechar la escritura en el monitor serie del valor del contador y a la vez encender un led en cada pulsación.

Espero que sea útil a alguien.

Un saludo!!

/*
 ---------------------------------------------
  Contador de pulsos
 ---------------------------------------------
 
  Programa que muestra por pantalla (consola serial) el número
  de veces que el pulsador ha sido presionado. Además, cada vez
  que aumenta la cuenta, se enciende un LED.
 
*/
 
//--------------------------------------------------
//Declara puertos de entradas y salidas y variables
//--------------------------------------------------
const int boton = 2; //Le ponemos nombre al pin 2
const int led = 13; //Le ponemos nombre al pin 13
int contador = 0;  //Variable para guardar la cuenta de pulsaciones
int estadoAnteriorBoton = 0; //Declaramos e inicializamos la variable
int valorBoton = 0; //Declaramos e inicializamos la variable
//------------------------------------
//Funcion principal
//------------------------------------
void setup() // Se ejecuta cada vez que el Arduino se inicia
{
  Serial.begin(9600);   //Inicia comunicación serie
  pinMode(boton,INPUT);     //Configura el pin 2 como una entrada, pulsador
  pinMode(led,OUTPUT);   //Configura el pin 13 como una salida, LED
}
 
//------------------------------------
//Funcion ciclica
//------------------------------------
void loop() // Esta funcion se mantiene ejecutando
{           //  cuando este alimentado el Arduino

valorBoton=digitalRead(boton); //Leemos el estado del pulsador

if(valorBoton!=estadoAnteriorBoton){ //Si hay un cambio de estado, entramos en el if

  if(valorBoton==1){
    contador++; //Aumentamos en una unidad la cuenta
    Serial.println(contador); //Imprime el valor por consola
    digitalWrite(led,HIGH); //Encendemos el led
  }
if(valorBoton==0){
    digitalWrite(led,LOW); //Apagamos el led
  }
}
estadoAnteriorBoton=valorBoton; //guardamos el estado actual del pulsador para la siguiente iteración
}
 
//Fin programa
Logged

Pages: [1]   Go Up
Jump to: