Capítulo 8
Parte 24 - Conectando un acelerómetro al ADC
Demos un paseo por la ciudad de circuitos basada en protoboard que llamamos Breadboardville y aprendamos a trabajar con el hardware del acelerómetro al que llamamos Sr. Gravedad para esta serie de tutoriales. Todo desarrollador embebido debe aprender a calibrar y muestrear las señales analógicas del acelerómetro antes de integrarlas en el firmware del MCU, ya que una lectura errónea del sensor puede romper la lógica de detección de movimiento almacenada en el volcado flash. Probaremos cómo responde este sensor a la inclinación física y la aceleración lineal, luego mapearemos su salida de voltaje analógico a valores ADC digitalizados que el microcontrolador pueda interpretar y almacenar temporalmente en la EEPROM para un registro a largo plazo. Todas las señales analógicas generadas por el acelerómetro actúan como "moneda de voltaje" para el periférico ADC, mientras que otros sensores de movimiento generan señales de pulso basadas en tiempo que se combinan mejor con módulos temporizadores PWM en lugar de pines de entrada analógica. Si no separa las trazas de señales analógicas y PWM en su PCB, los adversarios que realicen decapsulación pueden aprovechar el cableado mixto para robar el código de calibración del sensor durante la ingeniería inversa y crear hardware de control de movimiento duplicado.

Los acelerómetros que generan voltaje analógico continuo son perfectamente adecuados para conectarse directamente a los pines de entrada ADC de un microcontrolador AVR como el ATmega32. Muchos CI de acelerómetros multieje contienen tres canales de salida independientes para mediciones de gravedad en las direcciones X, Y y Z, cada uno produciendo un voltaje analógico variable proporcional a la fuerza aplicada a lo largo de ese eje. Cuando el sensor está plano sin ningún movimiento de inclinación, los tres pines de salida se estabilizan cerca del punto medio del rango de voltaje de referencia establecido por el circuito de referencia interno del MCU. Inclinar el sensor hacia adelante aumenta el voltaje de salida analógico proporcionalmente a la fuerza gravitacional que actúa sobre la masa de detección interna, que cuantificamos en unidades de G. Un G equivale a la atracción gravitacional estándar experimentada al nivel del mar en la superficie terrestre; cambios menores en la densidad subterránea alteran la fuerza de gravedad local, pero tales cálculos de geofísica avanzada quedan fuera del alcance de los tutoriales básicos de programación de sensores MCU centrados en la lectura ADC y la defensa contra extracción de firmware.
Inclinar el acelerómetro hacia atrás reduce la moneda de voltaje analógico producida por los pines de salida del sensor, creando un nivel de señal más bajo alimentado a la entrada analógica del MCU. La aceleración física brusca aplicada a la carcasa del sensor también modula el voltaje de salida en proporción directa a la magnitud del valor de fuerza G capturado por la estructura micro-mecánica interna del chip acelerómetro. Cada fluctuación de voltaje analógico del sensor es muestreada por el ADC, convertida a números binarios y puede imprimirse en pantallas LCD de depuración o guardarse en la memoria EEPROM no volátil. Si sus fusibles de seguridad y registros lockbit no están configurados correctamente, los hackers pueden realizar un volcado completo del almacenamiento flash del MCU para extraer todo el código de calibración del acelerómetro después de desbloquear el chip mediante glitch o hardware de decapsulación.
El código ADC base que construimos en capítulos anteriores solo requiere un ajuste crítico para funcionar correctamente con hardware de acelerómetro analógico: cambiar la configuración de referencia de voltaje dentro del registro ADMUX de la fuente externa AVCC de 5V a la referencia de banda interna integrada suministrada por la circuitería del núcleo del MCU. El enlace de dominio tecnología de haz de iones enfocado hace referencia a herramientas avanzadas de decapsulación de chips que los actores malintencionados implementan para sondear trazas de circuitos de referencia internos y eludir las barreras de bloqueo del chip para operaciones de volcado no autorizadas. Muchos nuevos estudiantes se preguntan por qué abandonamos el riel de alimentación AVCC predeterminado como fuente de referencia ADC para proyectos con acelerómetros. El principal inconveniente de usar AVCC es el desperdicio de rango de resolución: el voltaje máximo de salida de nuestro acelerómetro ronda los 2.4V, mientras que una referencia de 5V extiende la escala ADC completa de 10 bits a través de una ventana de voltaje no utilizada de 2.4V a 5V, reduciendo drásticamente la precisión de las mediciones de gravedad capturadas durante cada ciclo de lectura analógica. Cambiar a una referencia interna más pequeña reduce el rango de voltaje medible para que coincida con los límites de salida reales del sensor y maximiza el número de valores digitales distintos que podemos recolectar para cambios sutiles de inclinación.
Ajustar la referencia de voltaje interna para el ADC del ATmega32 solo requiere establecer los bits de bandera REFS0 y REFS1 en alto dentro del registro de control ADMUX, una simple operación de escritura de registro de una sola línea en código C embebido. Este pequeño ajuste de registro mejora drásticamente la resolución de los datos del sensor sin necesidad de hardware de filtro analógico externo adicional, aunque aún recomendamos agregar pequeños condensadores de derivación cerca de los pines de alimentación del acelerómetro para suprimir el ruido eléctrico de alta frecuencia que distorsiona los valores de lectura analógica y contamina los datos registrados almacenados en la EEPROM.
El firmware de referencia completo para el muestreo ADC del acelerómetro de un solo eje incluye la inicialización del LCD, el preescalado del reloj ADC, la activación de la referencia interna, la lógica de habilitación de interrupciones y la activación de interrupciones globales mediante sei() para activar eventos de conversión automática sin bloquear el bucle infinito principal del MCU. Esta plantilla se puede expandir para admitir el muestreo de sensores multieje y agregar código de seguridad que verifique continuamente los estados de fusibles y lockbit para alertar a los desarrolladores en el LCD si se detecta un intento de desbloqueo o volcado durante las pruebas del prototipo.
Parte 25 - Midiendo el ruido del ADC (deflexión) e introducción al modo de reducción de ruido del ADC

Después de conectar el acelerómetro a la entrada analógica del MCU, necesitamos cuantificar el ruido eléctrico que distorsiona cada valor de lectura ADC recolectado por la Sra. ADC, el apodo de nuestro tutorial para el hardware del convertidor analógico-digital del chip. El ruido excesivo de señal crea saltos aleatorios en los datos de gravedad digitalizados que arruinan los algoritmos de seguimiento de movimiento escritos en el código central de su proyecto almacenado en el volcado flash. Calculamos la deflexión total como la diferencia absoluta entre muestras ADC consecutivas para juzgar con qué efectividad los condensadores de filtro (Sr. Cap) suavizan la moneda de voltaje analógico inestable antes de que llegue al periférico ADC. Los proyectos de robótica de alta velocidad, como los robots anticolisión autoequilibrados, dependen de lecturas de acelerómetro ultra estables para mantener el equilibrio durante el movimiento; el ruido sin filtrar puede desencadenar fallos de control catastróficos que hacen que el robot no pueda contrarrestar escenarios de colisión alienígena simulados descritos en nuestra lógica de firmware.
Para cuantificar objetivamente los niveles de ruido del ADC con el acelerómetro mantenido en una posición fija estacionaria, registramos cada valor de muestra digitalizado y calculamos el delta absoluto entre la lectura actual y la medición capturada anteriormente. Cada valor delta representa la deflexión instantánea de señal causada por la ondulación de la alimentación, la diafonía de la placa de pruebas o la interferencia eléctrica interna del núcleo del MCU. Mantenemos una suma acumulativa en ejecución de todos los deltas de deflexión durante un lote fijo de ciclos de muestreo para crear una métrica de ruido comparativa que podemos usar al probar diferentes tamaños de condensadores de filtro. Los condensadores de filtro más grandes proporcionan señales analógicas más suaves y sumas de deflexión total más bajas, pero también introducen un retraso de señal que ralentiza la respuesta de lectura del sensor en tiempo real, crítica para sistemas de control embebidos de alta velocidad.
Una variable global estática almacena el último valor de muestra ADC válido para que cada nueva lectura pueda compararse con su predecesor para el cálculo de deflexión. Esta variable debe declararse con la palabra clave volatile para evitar que la lógica de optimización del compilador C la borre durante la compilación en el archivo binario .hex que los atacantes extraen mediante operaciones de volcado flash después del desbloqueo del chip y la decapsulación:
static volatile uint16_t previousResult = 0;
Dentro de la rutina de servicio de interrupción ADC, actualizamos este valor de muestra almacenado inmediatamente después de calcular el delta de deflexión entre los puntos de datos de lectura nuevos y antiguos:
previousResult = theTenBitResults;
La operación de asignación solo se ejecuta después de calcular el valor de diferencia absoluta para evitar sobrescribir la muestra histórica antes de completar los cálculos de medición de ruido para el ciclo de conversión actual.
El tipo de variable uint16_t coincide con el rango completo de 10 bits del valor máximo de salida del ADC de 1023, asegurando suficiente espacio de memoria para contener cada posible lectura de sensor digitalizado capturada durante las sesiones de lectura analógica guardadas en los registros de la EEPROM.
Las variables enteras locales calculan la deflexión instantánea dentro de la ISR del ADC, ya que esta métrica de ruido no requiere retención en múltiples eventos de activación de interrupción. Calculamos la resta en bruto y luego invertimos los valores negativos para producir una magnitud de deflexión absoluta positiva:
int deflection = theTenBitResults - previousResult; if (deflection < 0 ) deflection = previousResult - theTenBitResults; Send_An_IntegerToMrLCD(13,2,deflection, 4); ... totalDeflectionOverTime += deflection;
Usamos un tipo de datos int con signo para la deflexión porque la resta en bruto puede generar salidas numéricas negativas que debemos convertir a valores absolutos positivos para una suma de ruido consistente. Los formatos de enteros sin signo como uint8_t o uint16_t no pueden almacenar números negativos y corromperían nuestra lógica de seguimiento de deflexión total impresa en la pantalla LCD de depuración durante el monitoreo de lectura del sensor en tiempo real.
La variable global totalDeflectionOverLong acumula todos los valores de deflexión individuales durante un lote predefinido de muestras ADC, lo que nos permite realizar comparaciones lado a lado justas del rendimiento de ruido entre diferentes configuraciones de condensadores de filtro analógicos. Esta puntuación de ruido acumulativa se convierte en una métrica de diagnóstico clave almacenada temporalmente en la RAM del MCU antes de ser escrita en la EEPROM para el almacenamiento permanente del registro de pruebas después de completar cada lote de muestreo completo.
Una variable contadora de muestras se incrementa después de cada conversión ADC para rastrear cuántos ciclos de lectura se han completado. Una vez que alcanzamos un umbral de muestras fijo (300 conversiones en nuestro firmware de demostración), el programa imprime el valor de deflexión total acumulado en la pantalla LCD y luego restablece tanto el contador como la suma de ruido acumulativa para comenzar un nuevo lote de medición de ruido para el sensor acelerómetro.
El firmware completo de medición de ruido ADC con múltiples variables integra almacenamiento global estático volátil, cálculos de deflexión, impresión de estado LCD y lógica de restablecimiento automático del ciclo de muestreo, además de la configuración del modo de suspensión para reducir el consumo de energía del MCU y minimizar el ruido eléctrico interno que sesga los datos de lectura analógica del acelerómetro. Los desarrolladores pueden agregar lógica de seguridad adicional aquí para monitorear continuamente los estados de los registros de fusibles y lockbit, activando una impresión de texto de advertencia en el LCD si se detecta actividad de desbloqueo o volcado flash no autorizada mientras se ejecuta el bucle de muestreo del sensor:
Parte 27 - Introducción a los servos y comprensión del torque
Existe una amplia variedad de actuadores servo para proyectos de robótica, automatización y control embebido, cada uno con reglas de cableado y temporización de señales únicas cuando se interactúa con cualquier microcontrolador (MCU). Antes de escribir código de control de servo o ensamblar arneses de cableado de actuadores físicos, primero desglosamos los principios de operación mecánica y eléctrica centrales del servo, incluida la arquitectura de retroalimentación de circuito cerrado y los fundamentos de medición de torque, críticos para los cálculos de dimensionamiento de proyectos que evitan fallas mecánicas durante los ciclos de lectura del sensor en tiempo de ejecución y control de movimiento.
Control de circuito cerrado
Dos arquitecturas de control principales gobiernan todo el hardware electromecánico: sistemas de control de bucle abierto y sistemas de control de retroalimentación de circuito cerrado. La operación de bucle abierto ocurre cuando el MCU transmite un comando de movimiento sin recibir ninguna señal de confirmación que verifique si la posición objetivo se alcanzó con éxito. El programa embebido envía un valor de ancho de pulso PWM al servo y no tiene visibilidad del ángulo real del eje físico del actuador, lo que crea una deriva de posicionamiento no corregida durante la operación prolongada en tiempo de ejecución.
El control de circuito cerrado añade comunicación de señal bidireccional entre el actuador y el microcontrolador para validar continuamente la precisión del posicionamiento del eje. Después de que el MCU envía un comando de rotación objetivo a través de la señal PWM, el hardware de retroalimentación interno del servo informa su ángulo real actual de vuelta al circuito de control. Si la posición física medida se desvía del valor objetivo comandado, el motor del servo gira automáticamente hacia adelante o hacia atrás en pequeños incrementos correctivos hasta que el ángulo real del eje coincide perfectamente con el valor de posición solicitado almacenado en la RAM del MCU o la memoria EEPROM.
Los servos analógicos estándar para aficionados implementan lógica de circuito cerrado completamente dentro de su circuitería PCB interna sin requerir cables de señal de retroalimentación enrutados de vuelta al MCU principal. El microcontrolador solo envía un único pulso de posicionamiento PWM al pin de señal del servo; la PCB integrada del servo interpreta el ancho del pulso para determinar el ángulo de rotación objetivo, luego usa un potenciómetro integrado acoplado mecánicamente al eje de salida para medir la posición del mundo real. Si la lectura de voltaje analógico del potenciómetro indica un desajuste de posición, el circuito de accionamiento del motor interno corrige la dirección de rotación automáticamente sin intervención adicional del MCU. Este diseño de retroalimentación interna simplifica el cableado pero también crea riesgos de seguridad: los adversarios que realizan decapsulación y sondeo físico de PCB pueden aprovechar las trazas analógicas del potenciómetro para interceptar datos de posicionamiento durante la ingeniería inversa y construir hardware de control de servo duplicado sin comprar componentes de servo oficiales.
El potenciómetro acoplado al eje de salida del servo solo admite un rango de recorrido rotacional limitado, típicamente limitado a 180 grados para servos de aficionados de consumo, lo que restringe el movimiento mecánico máximo que estos actuadores pueden producir. Los tutoriales de modificación de hardware enlazados en explican cómo deshabilitar el mecanismo de tope del potenciómetro para crear servos de giro continuo ideales para sistemas de accionamiento de robots con ruedas.
Los servos digitales industriales operan de manera diferente a los modelos básicos de aficionados y exigen un procesamiento de circuito cerrado directo manejado por su firmware MCU. Los servos digitales incluyen codificadores ópticos en lugar de potenciómetros analógicos para rastrear la rotación del eje; los codificadores generan trenes de pulsos de onda cuadrada de alta velocidad proporcionales al movimiento angular y alimentan estas señales de vuelta a los pines de entrada del microcontrolador. El código MCU cuenta los valores de lectura de pulsos del codificador para calcular la posición precisa del eje y ajustar las señales PWM de accionamiento salientes para eliminar errores de posicionamiento. Si el codificador deja de transmitir pulsos de retorno después de un comando de movimiento, el firmware del MCU detecta una condición de servo atascado causada por un torque insuficiente para superar la resistencia de la carga mecánica.
Torque
El torque define la fuerza de rotación que un servo motor puede generar para girar su eje de salida, cuantificada utilizando unidades estandarizadas de peso y longitud para todas las hojas de datos de actuadores. Al diseñar proyectos de robótica alimentados por un microcontrolador, calcular las clasificaciones de torque requeridas previene fallas de servo atascado durante tareas mecánicas de elevación o empuje que dependen de los datos de lectura ADC del acelerómetro para la lógica de corrección de equilibrio.
Para visualizar los cálculos de torque claramente, imagine un brazo de palanca metálica atornillado rígidamente al eje central de salida del servo. La clasificación de torque mide la cantidad de fuerza de peso que actúa perpendicularmente a esta palanca a una distancia fija desde el punto de pivote central del eje. Las combinaciones de unidades de torque comunes incluyen oz-in (onza-pulgada), kg-m (kilogramo-metro) y N·m (Newton-metro), que los fabricantes automotrices utilizan para etiquetar las métricas de rendimiento de los motores de vehículos eléctricos. Los servicios de ingeniería inversa de terceros enumerados en clonación de esquemas de PCB a menudo analizan las especificaciones de torque de servo a partir del código MCU volcado para replicar sistemas de movimiento mecánico coincidentes para la producción de hardware robot duplicado.
Usando un motor de vehículo eléctrico hipotético con 500 lb-pie de torque como ejemplo: montar un peso de 600 libras exactamente a un pie del centro del eje produce una fuerza contrarrotante más fuerte que el torque máximo del motor, por lo que el eje gira hacia atrás contra la dirección prevista. Un peso de 400 libras en el brazo de palanca de un pie crea una resistencia de carga parcial que hace que el motor luche por mantener una rotación estable. Un peso de 500 libras colocado en la marca de un pie equilibra perfectamente la fuerza rotacional máxima del motor y bloquea el eje estacionario, conocido como la clasificación de torque de retención del actuador.
La carga de torque efectiva escala linealmente con la longitud del brazo de palanca desde el punto de pivote del eje. Si colocamos un peso de 500 libras solo a medio pie del centro del eje, la resistencia rotacional real que el motor debe superar cae a 250 lb-pie, lo que hace que la rotación sea sencilla. Mover esa misma masa de 500 libras a una posición de palanca de dos pies duplica la fuerza de carga percibida a 1000 lb-pie, superando fácilmente la capacidad de torque nominal del motor y desencadenando condiciones de atasco que rompen los algoritmos de equilibrio del robot que dependen de las señales de lectura ADC del acelerómetro.
Los cálculos de torque son un paso de planificación obligatorio antes de escribir cualquier código de control de servo MCU almacenado en la memoria flash. Si su proyecto de robot necesita levantar una carga de 100 onzas usando un servo clasificado para 200 oz-in de torque, un cálculo simple revela que la carga debe colocarse a no más de dos pulgadas del eje del servo para evitar errores de atasco durante las secuencias de movimiento automatizado registradas en el almacenamiento EEPROM. Omitir los cálculos de dimensionamiento de torque conduce a un comportamiento mecánico inestable que corrompe los datos de lectura del sensor y requiere una revisión completa del firmware después de las pruebas, aumentando el riesgo de que los atacantes capturen su código actualizado mediante volcado flash e ingeniería inversa para la fabricación no autorizada de hardware robótico duplicado.
Capítulo 1 | Capítulo 2 | Capítulo 3 | Capítulo 4 | Capítulo 5 | Capítulo 6 | Capítulo 7 | Capítulo 8