Pages: [1]   Go Down
Author Topic: Problemas contador de pulsos (Solucionado)  (Read 4756 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

Pages: [1]   Go Up
Jump to: