La mayoría de los sensores tienen una salida analógica. Pocos sensores vienen con un controlador integrado y pueden transmitir mediciones de salida a través de un protocolo digital. Es por eso que la conversión de analógico a digital es una de las características básicas que tiene cada microcontrolador/puerta. Las otras características básicas incluyen entrada/salida digital, salida analógica, generación PWM y comunicación de datos en serie.
Con MicroPython, es útil leer voltajes analógicos de sensores en placas/puertos de microcontroladores compatibles. En comparación con otros ecosistemas de microcontroladores populares como Arduino, MicroPython incluso le permite acceder a los componentes internos de los periféricos ADC de las placas compatibles. No se pueden simplemente leer voltajes analógicos; Incluso puedes configurar periféricos ADC con configuraciones personalizadas. Este artículo analizará los módulos ADC en MicroPython y examinará cómo se utiliza el firmware MicroPython para leer señales analógicas en ESP8266 y ESP32.
Módulo de máquina
MicroPython consta de varios módulos específicos de hardware. Uno de estos módulos es la máquina. Este módulo consta de varias clases escritas para controlar entrada/salida digital, controlar señales de salida de dispositivos externos, modulación de ancho de pulso, conversión analógica a digital, control de ADC, UART, SPI, I2C, I2S, periféricos de temporizador, RTC, temporizador de vigilancia. y administrar la tarjeta SD. Hay una clase ADC en el módulo de la máquina para controlar las conversiones de analógico a digital; una clase adicional, ADCBlock, escrita para configuración y gestión personalizadas de periféricos ADC.
Clase ADC en módulo de máquina
La clase ADC es responsable de proporcionar una interfaz para convertidores de analógico a digital en puertos MicroPython. Proporciona funciones limpias y sencillas que le permiten configurar los ajustes del ADC y recuperar lecturas del ADC como valores discretos o voltajes directos. Este módulo se importa a un script MicroPython mediante la siguiente declaración.
de importación de máquina ADC
Después de importar la clase ADC desde el módulo de la máquina, debe crear una instancia de un objeto ADC. Esto se hace llamando al método machine.ADC con una asignación a una variable. El método machine.ADC tiene el siguiente prototipo.
clase máquina.ADC(id, *, sample_ns, atención)
El método ADC toma tres argumentos: id, sample_ns y atten, de los cuales sample_ns y atten son parámetros opcionales. El ID es la identificación de la fuente ADC. Puede ser un canal ADC o un pin ADC. La identificación de la fuente ADC depende del puerto específico. Se especifica mediante un número entero que representa el canal ADC o mediante un objeto PIN. El parámetro sample_ns es el tiempo de muestreo en nanosegundos. El parámetro atten especifica la atenuación de entrada.
Una vez que el objeto ADC se define con la ayuda del constructor ADC, se puede modificar más adelante llamando al método ADC.init. El método tiene el siguiente prototipo.
ADC.init(*, sample_ns, atención)
La clase ADC proporciona dos métodos para leer la entrada ADC como valores enteros. Toma sample_ns y atten como argumentos. El parámetro id no está permitido porque el identificador de objeto ADC no se puede cambiar.
ADC.ler : este método toma la lectura analógica y devuelve un valor de 0 a 1023. El valor devuelto es una representación proporcional del voltaje detectado escalado de modo que el valor mínimo sea 0 y el valor máximo sea 1023. El método siempre se llama sin ningún argumento.
ADC.read_u16 : este método toma la lectura analógica y devuelve un valor de 0 a 65535. El valor devuelto es una representación proporcional del voltaje detectado escalado de modo que el valor mínimo sea 0 y el valor máximo sea 65535. El método siempre se llama sin ningún argumento.
La clase ADC de módulos de máquina también proporciona un método que devuelve directamente el voltaje detectado expresado en microvoltios. Este método es ADC.read_uv . Si el valor devuelto está calibrado o no depende del puerto específico.
La clase ADC también proporciona un método que le permite cambiar la resolución del ADC. Este método es ADC.width . La cantidad de bits se requiere de acuerdo con la resolución del ADC que se establecerá. La disponibilidad de este método depende del puerto específico. Solo se puede utilizar en puertos donde la resolución de los canales ADC es configurable.
Clase de bloque ADC en módulo de máquina
MicroPython proporciona una clase adicional para un control más preciso del periférico ADC. Esta clase es ADCBlock. Si esta clase está disponible o no depende del puerto específico. Solo está disponible para puertos donde varios canales ADC están asociados con el periférico ADC. Si el puerto seleccionado tiene un periférico ADC que tiene varios canales asociados, se debe crear una instancia de un objeto de la clase ADCBlock en lugar de la clase ADC. Esta clase se importa a un script MicroPython siguiendo las siguientes instrucciones.
importando la máquina ADCBlock
Se puede crear una instancia de un objeto ADCBlock llamando al método machine.ADCBlock. Este método tiene el siguiente prototipo.
máquina de clase.ADCBlock(id, *, bits)
El constructor toma dos parámetros: id y bits. La identificación es un número entero o una cadena que especifica el periférico ADC. Los bits de parámetro especifican la resolución del ADC en bits. La resolución anterior o predeterminada se establece para el periférico ADC si no se pasa el argumento de bits. Puede modificar el objeto ADCBlock más adelante llamando al método ADCBlock.init. El método tiene el siguiente prototipo.
ADCBlock.init(*,bits)
El método ADCBlock.init solo le permite reconfigurar la resolución del periférico ADC. Otro método importante de la clase ADCBlock es connect. Tiene el siguiente prototipo.
ADCBlock.connect (fuente)
ADCBlock.connect(canal)
ADCBlock.connect (canal, fuente)
El método ADCBlock.connect se conecta a un canal ADC del periférico ADC especificado. El método toma uno o dos argumentos. Si solo se especifica la fuente, el objeto ADC se conectará al canal predeterminado del periférico ADC especificado. El origen debe especificarse como un objeto Pin. Si solo se especifica un canal, el canal seleccionado se configurará para muestreo con un pin predeterminado. El canal debe especificarse como un número entero. Si se especifican el canal y la fuente, el objeto pin asignado se conectará al canal especificado del periférico ADC.
Una vez que se crea una instancia y se conecta el objeto ADCBlock, las lecturas de ADC se pueden obtener llamando a los métodos read, read_u16 o read_uv en el objeto. A continuación se muestra un ejemplo válido de lectura de voltaje analógico utilizando la clase ADCBlock.
#ADCBlock con ID de periférico y resolución de 12 bits
bloque = ADCBlock(id, bits=12)
# conecte el canal 4 al pin proporcionado
adc = bloque.conectar(4, pin)
# lee el voltaje analógico en microvoltios
valor = adc.read_uv
Conversión analógica a digital en ESP8266
ESP8266 tiene solo una entrada analógica. Está disponible en un pin dedicado llamado A0. El periférico ADC asociado tiene una resolución fija de 10 bits. Por lo tanto, las lecturas analógicas oscilan entre 0 y 1023. Aunque el pin ADC del ESP8266 puede tolerar voltajes de hasta 3,3 V, el voltaje de entrada aplicado para la medición debe estar entre 0 V y 1,0 V.
Para ESP8266, se puede crear una instancia de un objeto ADC en MicroPython usando la clase ADC. Como solo hay una entrada analógica, el objeto debe definirse mediante la siguiente instrucción.
adc = CAD(0)
Solo se permite una resolución de 10 bits, por lo que la lectura de ADC se puede lograr simplemente llamando al método ADC.read de la siguiente manera.
adc.ler
Conversión analógica a digital en ESP32
ESP32 tiene dos periféricos SAR ADC. Estos periféricos se denominan ADC1 y ADC2. Se identifican como bloque ADC 1 y bloque ADC 2. ADC1 tiene 8 canales ADC y ADC2 tiene 10 canales ADC. Los pines 32 ~ 39 están conectados a los canales ADC de ADC1 (bloque 1). Los pines 0, 2, 4, 12, 13, 14~15 y 25~27 están conectados a los canales ADC de ADC2 (bloque 2).
La resolución predeterminada de los periféricos ESP32 ADC es de 12 bits. Por lo tanto, las lecturas analógicas pueden oscilar entre 0 y 4095. Sin embargo, la resolución de ambos periféricos ADC es configurable y se puede configurar en una resolución más baja, como 10 bits, 9 bits u 8 bits. Los pines de entrada analógica y los canales ADC asociados en el ESP32 se enumeran en la siguiente tabla.
Tanto las clases ADC como ADCBlock se pueden usar para la conversión de analógico a digital en ESP32. Se debe crear una instancia del objeto ADC o ADCBlock para acceder al ADC en el ESP32. La resolución del canal ADC instanciado se puede configurar llamando a los métodos ADC.width o ADCBlock.init. Si se crea una instancia del objeto ADCBlock, se puede conectar a un canal o objeto pin. En ESP32, no se permiten conexiones arbitrarias entre canales ADC y GPIO. Por lo tanto, el método ADCBlock.connect no aceptará ambos parámetros. Si se pasan ambos argumentos, ADCBlock.connect generará un error si el canal ADC dado no está vinculado al pin especificado. La identificación en el método ADCBlock puede ser 1 o 2 y la resolución puede ser de 9 a 12. Los pines ADC del ESP32 pueden tolerar voltajes de hasta 3,3 V. Sin embargo, debido a que la referencia de voltaje interno está configurada en 1,1 V, solo pueden leer voltajes analógicos de hasta 1,1 V. El voltaje mínimo que ambos periféricos pueden detectar es 100 mV. Todos los voltajes por debajo de 100 mV se leen como 0. Es importante tener en cuenta que ADC2 se comparte con Wi-Fi, por lo que el voltaje analógico de los pines asociados con ADC2 no se puede leer si Wi-Fi está activo.
Se pueden obtener lecturas analógicas llamando a los métodos ADC.read o ADC.read_uv. Dado que los periféricos ADC del ESP32 leen voltajes analógicos por debajo de 100 mV como 0, las lecturas tienden a ser no lineales ya que están cerca del voltaje de referencia interno, es decir, 1,1 V, se recomienda ADC.read_uv para obtener lecturas de ADC. Si la resolución del ADC se establece en 11 o 12 bits, se debe utilizar el método ADC.read_u16.
Controlar la velocidad de parpadeo del LED con un potenciómetro
Ahora equipados con el conocimiento de las clases ADC y ADCBlock de MicroPython y su aplicación en las placas ESP8266 y ESP32, diseñaremos una aplicación simple que demuestre el uso de la conversión de analógico a digital. En esta aplicación, controlaremos la velocidad de parpadeo de un LED tomando el voltaje analógico como entrada a un potenciómetro.
Componentes necesarios
- ESP8266x1
- 1 LED de 5 mm.
- Resistencia de 330Ω x1
- Bote 1K x1
- Placa de pruebas x1
- Cables de conexión/cables de puente
Conexiones de circuito
Conecte el GPIO5 del ESP8266 al ánodo LED. Conecte el cátodo del LED con una resistencia en serie de 330 ohmios y conecte a tierra el otro terminal de la resistencia. Coge un potenciómetro y conecta los terminales fijos 1 y 3 a tierra y 3,3V respectivamente. Conecte el terminal variable 2 del potenciómetro a la entrada analógica A0 del ESP8266. El voltaje de suministro de CC y la tierra se pueden suministrar al circuito desde la salida 3V3 y uno de los pines de tierra del ESP8266 respectivamente.
Tenga en cuenta que el firmware MicroPython ya debe estar cargado en el ESP8266. Obtenga más información sobre cómo cargar firmware MicroPython en ESP8266 y ESP32.
Secuencia de comandos MicroPython
Importar máquina de pasadores, ADC
del tiempo importa dormir
olla = ADC(0)
led = Pin (5, Pin.OUT)
mientras que Verdadero:
pot_value=pot.leer
imprimir (valor_pot)
llevado en
dormir(valor_pot/256)
Llevar afuera
dormir(valor_pot/256)
Como funciona
El ESP8266 lee el voltaje analógico de un potenciómetro en su único pin de entrada analógica, A0. El voltaje de lectura está impreso en la consola IDE de uPyCraft. La misma lectura analógica se divide por 256 y se pasa como un intervalo de tiempo entre el encendido y apagado de la luz LED.
Código
El código comienza importando las clases Pin y ADC de la máquina y las clases de suspensión de los módulos de sincronización. El ADC se inicializa llamando al método ADC, creando un objeto ADC llamado 'pot'. El pin GPIO5 al que está conectado el LED se define como salida digital llamando al método Pin. En un bucle while infinito, la lectura del ADC del potenciómetro se lee llamando al método de lectura y se almacena en una variable 'pot_value'. El mismo valor se imprime en el registro de la consola llamando a la función de impresión. El LED se enciende llamando al método en el objeto pin del LED. Se invoca un retraso de pot_value/256 llamando al método de suspensión. Luego, el LED se apaga cancelando el método en el objeto pin del LED y se proporciona el mismo retraso. Esto se repite indefinidamente, por lo que la velocidad de parpadeo del LED está controlada por la entrada analógica en tiempo real del ESP8266.
Resultado