Controlando valores de entradas digitales

Hola:

Teniendo Arduino UNO r3, puedo detectar una entrada pulsante con este esquema.

Si me entra hasta 1023 pulsos, que ocurra estas cosas, controlar un motor dependiendo de estos valores.

En un tacómetro me entra como máximo 35 Vac, 0 Vac cuando el motor esté parado. Cuando más aumenta el motor su velocidad, aumenta la tensión en corriente artena del tacómetro. No voy a medir la velocidad variaciónpor su tensión que también se puede hacer pero es menos preciso. PAra hacerse una idea, la onda senoidal se muestra abajo, la primera.

Un ejempmlo que hice fue hacerlo en Visual C# para que se hagan una idea. El valor tiene que estar entre 200 y 700 para mantener una valocidad lo más constante posible, pero no es la más rápida.

Con ello quiero que muestra en Arduino, los rpm.

Les dejo un ejemplo para que prueben.

¿Alguna idea?

Saludos.

Simulador_motor.zip (10.2 KB)

No se que tiene que ver el detector de cruce por cero con las formas de onda que muestras.

Si tienes esas formas de onda es que ya esta rectificado. Si esta rectificado, lo que debes hacer es usar un divisor de tensión y medir el valor pico de la señal rectificada.
Ese valor pico será proporcional a las RPM. La proporcionalidad la determinarás tu, pero la idea iría por ahi.

NOTA: a ti te voy a decir lo mismo que le digo a muchos. Veo en este hilo, un eje conductor al control de tu lavadora. Hubiese sido un gran trabajo que juntaras todo en un solo hilo y que fuera un Proyecto porque de hecho veo un proyecto entero y no consultas esparcidas por el foro sin aparente conexión cuando es todo lo contrario.

Una pena!!

Metaconta:
Teniendo Arduino UNO r3, puedo detectar una entrada pulsante con este esquema.

Es un optoacoplador detector de cruces en cero, y el fototransistor conecta el pin a tierra; por lo tanto, el cruce en cero es un flanco de subida (RISING).

Metaconta:
Si me entra hasta 1023 pulsos, que ocurra estas cosas, controlar un motor dependiendo de estos valores.

Eso es relativo al tiempo de espera (periodo) entre muestras de cantidad de pulsos. Lo que serían 1023 pulsos para una frecuencia de muestreo de 1 Hz, en 2 Hz serían 511. Aquí el único valor absoluto sería calcular las RPM, independientemente de la frecuencia y acorde a este (en el cálculo también se tiene que multiplicar por un factor que es igual a la frecuencia de muestreo).

Por cierto, ¿tu método de utilizar micros() para llevar la cuenta del tiempo te funciona?
Recuerda que a 16 MHz la resolución de micros() es de 4 microsegundos, lo que nos puede llevar a resultados más imprecisos a medida que se incrementan las RPM. Si te sobra el timer1, lo podrías usar para muestreos más precisos (con una resolución de 62.5 ns en 16 MHz, para frecuencias de muestreo no menores a 250 Hz).
Ya sea con TimerOne o configurado manualmente, creas una interrupción temporizada con precisión.

Eso sí, tiene una gran desventaja frente a tu método: la "resolución" de las RPM es inversamente proporcional a la frecuencia de muestreo. Dicho en otras palabras: cuanto más rápido mandas a calcular, peor se torna su precisión en bajas velocidades.

Tu método es el más preciso pero hasta cierto punto. No solo por la resolución de micros(), sino porque al acumular el tiempo transcurrido entre cálculos, estás creando un promedio más que la frecuencia absoluta del momento (estás promediando el lapso entre pulsos aunque en realidad no sean uniformes). ¿Tienes problemas de ruido?
Lo tenía en mente que hicieras, es que inmediatamente calcularas las RPM apenas se obtenga el tiempo entre dos pulsos. Si la ISR es lo suficientemente breve, no deberías perder el próximo pulso aún al ejecutar el cálculo.
Para medir el tiempo, de momento sería conformarnos con micros(); pero sé que se puede mejorar utilizando el contador del timer1.

Metaconta:
Con ello quiero que muestra en Arduino, los rpm.

¿Hacia dónde? ¿Puerto serial u otra pantalla?

Hola Lucario448:

Sí, es como dices. Flanco alto.

Tengo que ver todo sobre los RPM y hacer todo tipo de pruebas, se cogerá la mejor versión del proyecto y pruebas.

Sean en un LCD o en el puerto serie, o los dos, pero que vea resultados.

Prueba 1. Mostrar cantidad de pulsos recibidos.
Prueba 2. Mostrar los RMP.
Prueba 3. Lo que surja.

Si hay problemas con Arduino UNO con el tema de las rpm, pues usaré Arduino Micro.

Hola surbyte:

Ya el mal está hecho. Para que entiendas la gráfica del tacómetro que puse en el primer post.

Velocidad mínima de la primera señal senoida es unos 22 Vac, con una frecuencia. Si el motor aumenta su velocidad, el tacómetro sube hasta los 35 vac como máxmo, y la frecuencia es mayor.

Puedes medir la tensión, pero es más preciso los pulsos.

Por cierto, hay gente que se pasa con la precisión.

Saludos.

PD: Cuando acabe el proyecto, se presentará proyecto y tutorial muy minucioso para que lo haga todo el mundo.

Bueno la confunción la creaste tu jajaja. De lo que veía y del hecho que es un generador asociaba la manera antigua de medir RPM usando lo que te sugería.
Por otro lado, ahora vienes con precisión cuando dices que quieres algo entre

El valor tiene que estar entre 200 y 700 para mantener una valocidad lo más constante posible, pero no es la más rápida.

También en eso se basó mi respuesta.

ATENCION: Para qué abres 2 hilos con detectores de cruce por cero (que no cerraste), este, y otros que he visto con el mismo tema? Estoy a punto de juntarlos a todos en uno solo.

Hola:

Lo del 200 y 700 es un ejemplo en Visual C#. Ahí mi con fusión. Puede ser entre 499 y 501. Para que se quede ahí pase lo que pase.

En la velocidad del centrifugado se pega dos minutos entre 799 y 801. Velocidad máxima del centrifugado entre los 1000 y 1001. Si se pasa del valor como 1002 a 1023, se rompió la corre del motor.

Lo que puse en C#, hay que hacer en Arduino.

Por cierto, no he puesto código de C# alguno. Los ejemplos qu epongo no tiene que ser acertado, me puedo equivocar y en la precisión hay que ajustarlo o corregirlo. :wink:

Código C#:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace TrackBar_señal_pulso_tacometro_01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            int valorTrackBar = 0;

            label_Valor_TrackBar.Text = "" + trackBar1.Value;

            valorTrackBar = trackBar1.Value;

            if (valorTrackBar == 0)
            {
                label_Velocidad.Text = "0 pulsos. Motor detenido.";
                label_Velocidad.ForeColor = Color.White;
            }

            else if (valorTrackBar < 200)
            {
                label_Velocidad.Text = @"Menor de 200 pulsos.
Motor iniciando arranque.";
                label_Velocidad.ForeColor = Color.Orange;
            }

            else if (valorTrackBar < 701)
            {
                label_Velocidad.Text = @"Entre 200 y 700 pulsos.
Motor en marcha.";
                label_Velocidad.ForeColor = Color.Green;
            }

            else if (valorTrackBar < 1023)
            {
                label_Velocidad.Text = @"Por encima de 700 pulsos.
Correa suelta, se detiene el motor. 
Alarma.";
                label_Velocidad.ForeColor = Color.Red;
            }
        }
    }
}

Dejar claro que si en al entrada de ARduino hay que detectar el cruce por cero, en la salida de Arduino, donde controlar el motor, no hay que usar ningún tipo de cruce por cero.

Saludos.

PD: Entendido.

Metaconta:
Si hay problemas con Arduino UNO con el tema de las rpm, pues usaré Arduino Micro.

Uno, Micro; ambos son AVR y ambos trabajan a 16 MHz; no le veo la ganancia alguna.