Paso 5: Explicando el código
Por qué utilizar VIPER
Uno de los conceptos que muchas personas encuentran difíciles al comenzar a escribir código para microcontroladores es cómo gestionar múltiples tareas relacionadas con el hardware, aparentemente todos corriendo al mismo tiempo. Diseñadores, en consecuencia, se sienten frustrados por las dificultades en la aplicación de tales funcionalidades en microcontroladores.
Para dar solución a estos dolores, soportes VIPER todas las características de alto nivel más utilizadas de Python como módulos, clases, multithreading, callbacks, temporizadores y excepciones, además de algunas funciones relacionadas con el hardware personalizados como interrumpe, PWM, E/S digitales, etc..
Cada subproceso en VIPER es una especie de proceso paralelo y separado que funciona autónomamente en su tabla. Un subproceso requiere de una función a ejecutarse como insumo para la definición. La misma función puede ser instanciada por varios hilos que le da la posibilidad de escribir código muy conciso y legible. Con hilos puede diseñar su arquitectura algoritmo suponiendo el paralelismo típico de alto nivel. Más información aquí.
En el código
La secuencia es implementada usando 4 hilos que se ejecutan en paralelo. Un hilo de rosca se utiliza para adquirir y normalizar las señales analógicas adquiridas a través de un potenciómetro y un sensor de proximidad infrarrojo. Los otros tres hilos se utilizan para crear una instancia de una función genérica blink() que lleva dos LEDs en diferentes frecuencias y una función de buzz() genérico que impulsa un zumbador en la longitud de e de frecuencia diferente del sueño (para crear un efecto de "beat"), calculado sobre la base de las señales adquiridas.
Obtener el script en github. El código tiene un montón de comentarios. Sólo un par de notas.
- Delay() vs convencionales
En Arduino y el cableado utilizando delay() tiene un efecto secundario - Arduino no hace nada durante ese tiempo. Para obtener dos o más "acciones" para funcionar independiente uno del otro, se puede utilizar delay().
En VIPER la función TIMESTAMPADD() suspende el subproceso actual para el tiempo expresado en time_units pero todos los hilos están libres continuar su ejecución.
- Funciones integradas de VIPER
VIPER VM extiende Python con funciones integradas para manejar los pines de salida de entrada de propósito General del dispositivo integrado. Estas funciones se asemejan a los utilizados por Arduino, pero son más flexibles.
analogRead() vs adc.read()
La función analogRead() se proporciona como un integrado para facilitar el paso del Arduino y el cableado a VIPER.
Sin embargo es la forma preferida para leer un pin analógico de víbora:
# importar el controlador adc
importación de adc
x = adc.read (pin, muestras = 1)
Lee los valores analógicos del pin que debe ser una de las patillas de hacha. Si las muestras son 1 o no dado, devuelve el valor de entero de pin. Si las muestras es mayor que 1, devuelve una tupla de números enteros de las muestras de tamaño.
analogWrite() vs pwm.write()
La función analogWrite() de Arduino proporciona una interfaz simple para el hardware PWM, pero no proporciona ningún control sobre frecuencia. La función analogWrite() se proporciona como un integrado para facilitar el paso del Arduino y el cableado a VIPER. Sin embargo es la forma preferida de usar pwm en VIPER:
# importar el controlador pwm
pwm de importación
PWM.Write (pin, periodo, pulso, time_unit = MILLIS)
El estado del pin se conecta periódicamente entre baja y alta según los parámetros:
-período es la duración de una onda cuadrada del pwm
-el pulso es el tiempo de la onda cuadrada del pwm permanece en estado alto
-time_unit es la unidad de tiempo y pulso se expresan en time_unit