Go Down

Topic: Contador de pulsos (Read 162 times) previous topic - next topic

Checho360

Jul 01, 2015, 09:55 pm Last Edit: Jul 01, 2015, 09:56 pm by Checho360
Hola. Estoy intentando encontrar una manera de contar pulsos. Para ello, tenía pensado utilizar en el código las interrupciones del arduino. Como esquema eléctrico tengo lo siguiente:


http://www.casimages.es/i/150701095649653834.jpg.html

El problema es que no me está funcionando. La idea es que, ya que los pulsos tienen una tensión entre 17 y 28V (marcado por el fabricante) utilizar un divisor de tensión y medir entre 2,5 y 5V en una entrada digital del arduino. En el arduino sin embargo no estoy recibiendo nada.

¿Sabéis que estoy haciendo mal?

Muchas gracias de antemano por la ayuda.

carmeloco

Yo usaría un optoacoplador. Es más seguro para el arduino.

Checho360

Me gusta esa idea, así que voy a intentar piyar uno. De todas formas, yo este esquema ya lo he enchufado y probado pero no llegué a conseguir leer nada en el arduino y no sé por qué :S. ¿Estoy haciendo algo mal?

Gracias por la ayuda!

mafesolutions

fijate te dejo un link con info facil de comprender de optoacopladores
guia optoacopladores

estaria bueno poder ver el codigo para ayudarte mejor !
 cual es la falla que se presenta ? despues del divisor que voltaje tenes ?  trata de dar la mayor cantida de datos para que los compañeros puedan entender y poder ayudarte de una mejor forma

StevenLlerena

Trata de subir el código para ver de que forma estas contando los pulsos y poder ayudarte.

Checho360

#5
Jul 02, 2015, 04:36 pm Last Edit: Jul 02, 2015, 06:41 pm by Checho360
Ahora mismo estoy probando un código muy sencillito simplemente para ver si consigo detectar algo en la entrada digital del arduino o no:

Code: [Select]
void setup() {
  Serial.begin (9600);
  pinMode (32, INPUT);
}

void loop() {

if (digitalRead (32)==LOW){Serial.println("LOW");}
    else {Serial.println("HIGH");}

}


La instalación que tengo hecha es esta:

The instalation i'm making is the next one:


https://www.dropbox.com/s/dceepbbk39ehmxm/2015-07-02%2016.01.46.jpg?dl=0


https://www.dropbox.com/s/obm568ru2gcqrr7/2015-07-02%2016.01.39.jpg?dl=0

Con el divisor de tensión formado por una resistencia de 22k y una de 5k. Además tengo una linea para conectar la tierra del arduino con la del emisor de pulsos, que en realidad es un contador de energía de las del cuadro de la casa (la idea es ver cuanto me consumen los aparatos con un arduino a través de los pulsos que emite).

El esquema que yo creo que estoy siguiendo es el siguiente, aunque es posible que esté equivocado en algo:

https://drive.google.com/file/d/0B57tAoUCVHR2OHByRFRSNG42U2c/view?usp=sharing

Muchísimas gracias por la ayuda!

mafesolutions

Primero que nada las imagenes estan mal subidas fijate en las reglas del foro esta como se suben podes intentar con este host que funciona bien es.tinypic.com/

lo siguiente  que que tendrias que contar los pulsos por medio de una interrupcion y volcarlos a una variable ya que no se que rango de frecuencias se trabaja  asi lo que estas asiendo es que te diga si esta en alto o en bajo el pulso y no los cuenta y cabe destacar que los medidores cambian varias veces el estado en pocos segundos ! un link con info sobre las interrupciones


http://www.prometec.net/interrupciones/


te mande un mensaje privado !

Checho360

Efectivamente, usando interrupciones "algo" coge. El código que intenté usar es el siguiente:

Code: [Select]
int pulGlobal = 0;
int cal = 0;

void setup() {
  Serial.begin (9600);
 
  attachInterrupt (2, detectarPulsos, RISING);
}

void loop() {
 
  if (pulGlobal == 3200){
   
    cal++;
   
    pulGlobal = 0;
   
    }
   
    Serial.print ("Calorias totales: ");
    Serial.print (cal);
    Serial.println (" kwh");
    Serial.print ("Pulsos: ");
    Serial.print (pulGlobal);
    Serial.println ("");
   
    delay (30000);

}

void detectarPulsos (){
 
  pulGlobal++;

}


Sin embargo, tengo dos cuestiones:

1. No entiendo por qué con el anterior código el arduino no detecta en ningún momento un estado HIGH en el pin

2. Me detecta muchos menos pulsos de los que el contador de energía me está enviando en realidad. ¿Por qué?

mafesolutions

ahora te detecta  menos pulsos ?o con el codigo anterior ? como sabes que detecta menos pulsos ? pudiste medir con un osciloscopio ? puedes mostrarnos una captura del monitor serial y otra de la referencia con la que comparas para ver la diferencia ?


_jose_

#9
Jul 02, 2015, 08:22 pm Last Edit: Jul 02, 2015, 08:38 pm by _jose_
Las variables  usadas en una interrupcion se han de usar con el modificador volatile
Code: [Select]
volatile int pulGlobal;
Asegurate tambien que el voltaje que le llega a la entrada sea de 5v o algo no mucho menor,arriba pones de 2.5v a 5 v,pero 2.5v podria no interpretarlo como high...
Tambien veo que has puesto un delay(30000) ,eso quiere decir que los datos que muestras por serial se actualizaran cada 30 segundos,tenlo en cuenta.

Checho360

#10
Jul 02, 2015, 08:36 pm Last Edit: Jul 02, 2015, 08:43 pm by Checho360
Ahora me detecta menos pulsos, con el código anterior sencillamente no detectaba nada, me sacaba todo el rato el mensaje LOW.

Cada vez que el contador de energía emite un pulso, también hace parpadear un led. Lo que estaba haciendo era comparar el número de parpadeos con la cuenta que hacía arduino.

Mañana probaré lo de volatile, no sabía que debía ser así. ¿Cuál es la diferencia y por qué me está cometiendo un error?

Otra cosa que he detectado es que cuando enciendo o apago el calentador (que es el aparato cuyo consumo quiero medir) me suma una gran cantidad a la variable pulGlobal. Es decir, yo apago el dispositivo y directamente me suma 36 o algo por el estilo. ¿Sabéis por qué puede ser esto?

Gracias por la ayuda.

_jose_

#11
Jul 02, 2015, 09:19 pm Last Edit: Jul 02, 2015, 09:26 pm by _jose_
Ahora me detecta menos pulsos, con el código anterior sencillamente no detectaba nada, me sacaba todo el rato el mensaje LOW.

Cada vez que el contador de energía emite un pulso, también hace parpadear un led. Lo que estaba haciendo era comparar el número de parpadeos con la cuenta que hacía arduino.

Mañana probaré lo de volatile, no sabía que debía ser así. ¿Cuál es la diferencia y por qué me está cometiendo un error?

Otra cosa que he detectado es que cuando enciendo o apago el calentador (que es el aparato cuyo consumo quiero medir) me suma una gran cantidad a la variable pulGlobal. Es decir, yo apago el dispositivo y directamente me suma 36 o algo por el estilo. ¿Sabéis por qué puede ser esto?

Gracias por la ayuda.
Puede ser lo que te he puesto arriba,muestras datos y haces un delay(30000) por lo que el sketch no hace nada durante 30 segundos ,solo funciona la interrupcion.cuando pasan los 30 segundos vuelves a mostrar el valor que ha podido aumentar en esos 30 segundos.cambia el delay(30000) por delay(1000) para que actualize los valores cada segundo a ver..

Checho360

#12
Jul 04, 2015, 12:15 am Last Edit: Jul 04, 2015, 12:18 am by Checho360
Pues nada. Hoy me he puesto con ello, le he dedicado un rato y no he conseguido detectar nada. Lo único que he llegado a conseguir contar en el programa del arduino son una serie de pulsos que salen cuando enciendo o apago la estufa. He llegado a la conclusión de que debía ser por inducción, osea, al pasar la corriente por el cable de la estufa haga crear un voltaje en el cable de datos al arduino. Es rarísimo, porque incluso si desenchufo los dos cables (rojo y azul) del contador de energía, me sigue detectando una gran cantidad de pulsos al encender o apagar la estufa, aunque no tenga ningún componente de ella conectado al arduino.... La verdad que esto empieza a ser desesperante... dejo unas imágenes por si alguien finalmente se le ocurre que estoy haciendo mal y por que no me mide... Muchas gracias a todos.









El código seguido es:

Code: [Select]
volatile int co = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode (18, INPUT);
  attachInterrupt (5, coE, RISING);
  Serial.begin (9600);

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.print ("Pulsos contados: ");
  Serial.println (co);

  delay(3000);
}

void coE (){

  co = co + 1;
 
}


Y el resultado:

Code: [Select]
Pulsos contados: 0
Pulsos contados: 25
Pulsos contados: 25
Pulsos contados: 25
Pulsos contados: 32
Pulsos contados: 32


Aumenta a 25 cuando enciendo la estufa, y a 32 cuando la apago. Mientras tanto no aumenta nada aunque el LED de enviar pulsos sí parpadea.

surbyte

A ver mi amigo. Todo lo que has contado hasta ahora es un perfecto caos.. si me permites.
Lo que entiendo es que quieres contar pulsos.
Que la señal  esta entre 17 y 28V.
Carmelo te dijo que usaras un optoacoplador, sabes porque? Pues porque vas a eleminar el ruido que puede entrar por el Arduino.

Asi que no me queda claro si lo has hecho y como lo has hecho.
Algo asi podria funcionar

Supongamos que el opto es un 4n25 que es facilmente conseguible.

Debe usar una R en el diodo de entrada de (17-3)V/40mA= aprox 330 ohms

En el lado transistor intenta como dice el esquema. Debería funcionar bien.

En estas condiciones una entrada 17 a 24V dará un HIGH en el pin del Arduino.

A tu lectura del pin deberias ponerle un delay que confirme que esta en HIGH como cuando se hace un sketch de pulsador con debounce.
algo de 10 a 20 mseg será suficiente.

Go Up