Tabla de contenido:

Métodos de sincronización de Arduino con Millis (): 4 pasos
Métodos de sincronización de Arduino con Millis (): 4 pasos

Video: Métodos de sincronización de Arduino con Millis (): 4 pasos

Video: Métodos de sincronización de Arduino con Millis (): 4 pasos
Video: 🆕 ¿Cómo utilizar la función MILLIS() como un PRO en ARDUINO? ▶ EJECUTA tareas simultáneamente 2024, Septiembre
Anonim
Métodos de sincronización de Arduino con Millis ()
Métodos de sincronización de Arduino con Millis ()

En este artículo presentamos millis (); y utilícelo para crear varios ejemplos de temporización.

Millis? Nada que ver con los sincronizadores de labios … con suerte, reconociste mili como el prefijo numérico de las milésimas; es decir, multiplicar una unidad de medida por 0,001 (o diez elevado a menos 3).

Curiosamente, nuestros sistemas Arduino contarán el número de milisegundos (miles de segundo) desde el inicio de un boceto en ejecución hasta que el conteo alcance el número máximo que se puede almacenar en el tipo de variable unsigned long (un entero de 32 bits [cuatro bytes] - que va de cero a (2 ^ 32) -1. (2 ^ 32) -1, o 4294967295 milisegundos se convierte en 49,71027 días impares.

El contador se reinicia cuando se reinicia el Arduino, alcanza el valor máximo o se carga un nuevo boceto. Para obtener el valor del contador en una coyuntura particular, simplemente llame a la función, por ejemplo:

inicio = milis ();

Donde inicio es una variable larga sin signo. Aquí hay un ejemplo muy simple para mostrarle millis () en acción:

/ * demostración de millis () * /

comienzo largo sin firmar, terminado, transcurrido;

configuración vacía ()

{Serial.begin (9600); }

bucle vacío ()

{Serial.println ("Iniciar …"); inicio = milis (); retraso (1000); terminado = millis (); Serial.println ("Finalizado"); transcurrido = inicio-terminado; Serial.print (transcurrido); Serial.println ("milisegundos transcurridos"); Serial.println (); retraso (500); }

El boceto almacena el recuento de milisegundos actual al inicio, luego espera un segundo y luego almacena el valor de milisegundos nuevamente al finalizar. Finalmente calcula el tiempo transcurrido del retraso. En el siguiente volcado de pantalla del monitor en serie, puede ver que la duración no siempre fue exactamente de 1000 milisegundos, como se muestra en la imagen.

Paso 1:

Imagen
Imagen

En pocas palabras, la función millis hace uso de un contador interno dentro del microcontrolador ATmega en el corazón de su Arduino. Este contador incrementa cada ciclo de reloj, lo que ocurre (en Arduino estándar y compatibles) a una velocidad de reloj de 16 Mhz. Esta velocidad está controlada por el cristal de la placa Arduino (la cosa plateada con T16.000 estampada).

Paso 2:

Imagen
Imagen

La precisión del cristal puede variar según la temperatura externa y la tolerancia del cristal en sí. Esto, a su vez, afectará la precisión de su resultado en milisegundos. La experiencia anecdótica ha informado que la desviación en la precisión del tiempo puede ser de alrededor de tres o cuatro segundos por período de veinticuatro horas.

Si está utilizando una placa o su propia versión que utiliza un resonador cerámico en lugar de un cristal, tenga en cuenta que no son tan precisos y que introducirán la posibilidad de niveles de deriva más altos. Si necesita un nivel mucho más alto de precisión de sincronización, considere IC de temporizador específicos como el Maxim DS3231.

Ahora podemos hacer uso de los milis para varias funciones de temporización. Como se demostró en el esquema de ejemplo anterior, podemos calcular el tiempo transcurrido. Para llevar adelante esta idea, hagamos un simple cronómetro. Hacerlo puede ser tan simple o tan complejo como sea necesario, pero en este caso nos inclinaremos hacia lo simple.

En la perspectiva del hardware, tendremos dos botones, Iniciar y Detener, con las resistencias desplegables de 10k ohmios conectadas a los pines digitales 2 y 3 respectivamente. Cuando el usuario presiona iniciar, el boceto anotará el valor de milis; luego, después de presionar detener, el boceto nuevamente anotará el valor de milis, calculará y mostrará el tiempo transcurrido. Luego, el usuario puede presionar iniciar para repetir el proceso o detener para obtener datos actualizados. Aquí está el boceto:

/ * Cronómetro súper básico usando millis (); * /

comienzo largo sin firmar, terminado, transcurrido;

configuración vacía ()

{Serial.begin (9600); pinMode (2, ENTRADA); // botón de inicio pinMode (3, INPUT); // botón de parada Serial.println ("Pulse 1 para iniciar / reiniciar, 2 para tiempo transcurrido"); }

void displayResult ()

{flotar h, m, s, ms; sin firmar hace mucho tiempo; transcurrido = inicio-terminado; h = int (transcurrido / 3600000); sobre =% transcurrido 3600000; m = int (más de / 60000); más = más de% 60000; s = int (más de / 1000); ms = más de% 1000; Serial.print ("Tiempo transcurrido sin procesar:"); Serial.println (transcurrido); Serial.print ("Tiempo transcurrido:"); Serial.print (h, 0); Serial.print ("h"); Serial.print (m, 0); Serial.print ("m"); Serial.print (s, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }

bucle vacío ()

{if (digitalRead (2) == HIGH) {start = millis (); retraso (200); // para antirrebote Serial.println ("Iniciado …"); } if (digitalRead (3) == HIGH) {terminado = millis (); retraso (200); // para antirrebote displayResult (); }}

Las llamadas a delay () se utilizan para eliminar el rebote de los conmutadores; son opcionales y su uso dependerá de su hardware. La imagen es un ejemplo de la salida del monitor en serie del boceto: el cronómetro se inició y luego se presionó el botón dos seis veces a lo largo de períodos de tiempo.

Paso 3: Velocímetro…

Image
Image

Si tuviera un sensor al principio y al final de una distancia fija, la velocidad podría calcularse: velocidad = distancia ÷ tiempo.

También puede hacer un velocímetro para una forma de movimiento con ruedas, por ejemplo, una bicicleta. En la actualidad no tenemos una bicicleta con la que jugar, sin embargo, podemos describir el proceso para hacerlo, es bastante simple. (Descargo de responsabilidad: hágalo bajo su propio riesgo, etc.)

En primer lugar, repasemos las matemáticas necesarias. Necesitará conocer la circunferencia de la rueda. Hardware: necesitará un sensor. Por ejemplo, un interruptor de lengüeta y un imán. Considere que el interruptor de lengüeta es un botón normalmente abierto y conéctelo como de costumbre con una resistencia desplegable de 10k ohmios.

Otros pueden usar un sensor de efecto Hall, cada uno con el suyo). Recuerde de la clase de matemáticas, para calcular la circunferencia, use la fórmula: circunferencia = 2πr donde r es el radio del círculo.

Ahora que tiene la circunferencia de la rueda, este valor se puede considerar como nuestra "distancia fija" y, por lo tanto, la velocidad se puede calcular midiendo el tiempo transcurrido entre una rotación completa.

Su sensor, una vez instalado, debe actuar de la misma manera que un botón normalmente abierto que se presiona en cada rotación. Nuestro boceto medirá el tiempo transcurrido entre cada pulso del sensor.

Para hacer esto, nuestro ejemplo tendrá la salida del sensor conectada al pin digital 2, ya que activará una interrupción para calcular la velocidad. De lo contrario, el boceto mostrará la velocidad en un módulo LCD de interfaz I2C normal. Se sugiere la interfaz I2C ya que requiere solo 4 cables desde la placa Arduino a la pantalla LCD; cuantos menos cables, mejor.

Aquí está el boceto para su lectura:

/ * Velocímetro básico usando millis (); * /

#include "Wire.h" // para LCD de bus I2C

#include "LiquidCrystal_I2C.h" // para módulo LCD de bus I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // establece la dirección LCD en 0x27 para una pantalla de 16 caracteres y 2 líneas

inicio flotante, terminado;

flotador transcurrido, tiempo; flotador circMetric = 1.2; // circunferencia de la rueda relativa a la posición del sensor (en metros) float circImperial; // usando 1 kilómetro = 0.621371192 millas float speedk, speedm; // mantiene los valores de velocidad calculados en sistema métrico e imperial

configuración vacía ()

{attachInterrupt (0, speedCalc, RISING); // Se llama a la interrupción cuando los sensores envían digital 2 alto (cada rotación de la rueda) start = millis (); // configurar LCD lcd.init (); // inicializa el lcd lcd.backlight (); // enciende la luz de fondo de la pantalla LCD lcd.clear (); lcd.println ("¡Use un casco!"); retraso (3000); lcd.clear (); Serial.begin (115200); circImperial = circMetric *.62137; // convertir métrico a imperial para cálculos MPH}

void speedCalc ()

{transcurrido = milis () - inicio; inicio = milis (); speedk = (3600 * circMetric) / transcurrido; // km / h speedm = (3600 * circImperial) / transcurrido; // Millas por hora }

bucle vacío ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km / h"); lcd.print (int (speedm)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (transcurrido)); lcd.print ("ms / rev"); retraso (1000); // ajustar según las preferencias personales para minimizar el parpadeo}

No hay mucho que hacer - cada vez que la rueda completa una revolución, la señal del sensor pasará de baja a alta - activando una interrupción que llama a la función speedCalc ().

Esto toma una lectura de milis () y luego calcula la diferencia entre la lectura actual y la lectura anterior; este valor se convierte en el tiempo para cubrir la distancia (que es la circunferencia de la rueda en relación con el sensor, almacenada en

flotador circMetric = 1.2;

y se mide en metros). Finalmente calcula la velocidad en km / hy MPH. Entre interrupciones, el boceto muestra los datos de velocidad actualizados en la pantalla LCD, así como el valor de tiempo sin procesar para cada revolución por curiosidad. En la vida real, no creo que nadie montaría una pantalla LCD en una bicicleta, quizás una pantalla LED sería más relevante.

Mientras tanto, puede ver cómo funciona este ejemplo en el siguiente videoclip corto. En lugar de una combinación de rueda de bicicleta e interruptor de lengüeta / imán, he conectado la salida de onda cuadrada de un generador de funciones al pin de interrupción para simular los pulsos del sensor, para que pueda tener una idea de cómo funciona.

Paso 4:

Eso resume el uso de millis () por el momento. También están los micros (); función que cuenta microsegundos.

Ahí lo tiene, otra función práctica que puede permitir que se resuelvan más problemas a través del mundo de Arduino. Como siempre, ahora depende de ti y de tu imaginación encontrar algo que controlar o hacer otras travesuras.

Esta publicación presentada por pmdway.com: todo para fabricantes y entusiastas de la electrónica, con envío gratuito en todo el mundo.

Recomendado: