Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Dibuje cualquier cosa en su osciloscopio

Componentes y suministros

Resistencia 1k ohm
Cualquier valor de resistencia es aceptable siempre que mantenga las proporciones del DAC correctas. necesita 50 si tiene resistencias de 2k. O dos veces el valor de su resistencia elegida.
× 50
Arduino UNO
O STM32 "pastilla azul" o "pastilla negra".
× 1

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

El R-2R DAC

Una de las implementaciones más simples de un convertidor de digital a analógico se puede lograr diseñando un DAC de escalera R-2R. Este tipo de DAC solo necesita resistencias para funcionar, lo que lo convierte en un DAC muy adecuado para principiantes.

El principio básico de este tipo de DAC es que solo necesita dos valores para las resistencias. R y 2R. Luego, puede configurarlos como se muestra en el esquema a continuación.

R puede ser cualquier cosa siempre que cada aparición de R en el esquema tenga el mismo valor.

Por ejemplo, si elegimos R =1k, entonces 2R sería solo dos veces la cantidad. En este caso 2R =2k. Por lo tanto, podría usar solo resistencias de 1k y 2k.

Si usó R =3.3K entonces 2R =6.6k y así sucesivamente. Si solo desea usar el mismo valor de resistencias para todo, para obtener 2R, solo necesitaría ponerlas dos resistencias en serie y eso aumentaría el recuento de componentes.

El número de bits está determinado por la cantidad de ramas de 2R que sobresalen. En este proyecto usaremos un R-2R de 8 bits y un R-2R de 6 bits para Arduino Uno o Nano. Si está utilizando otro microcontrolador que sabe que admite una manipulación de puerto completo de al menos 8 bits, como la "píldora azul" y la "píldora negra" STM32, entonces puede usar dos DAC de 8 bits.

Observación complementaria sobre los circuitos integrados de DAC:

Este proyecto se centra en el uso de un R-2R DAC, pero puede usar un DAC IC para lograr algo similar. Si va a utilizar un DAC IC, le recomiendo que utilice uno que admita un protocolo de comunicación rápido como SPI, ya que I2C será demasiado lento para dibujar una imagen detallada. No cubriré cómo usar un DAC IC en esta publicación, pero tal vez en una futura. El R-2R sigue siendo mi método preferido, ya que puede generar imágenes con más detalles.

Manipulación de puertos

Usaremos la manipulación de puerto paralelo de nuestro microcontrolador. La razón para hacerlo es porque permite una velocidad de salida más rápida y también mantiene el código simple. Puede leer más detalles sobre los registros de puertos para Arduino en este enlace.

Arduino Uno y Nano tienen el microcontrolador ATmega328p. Este microcontrolador comparte el mismo mapeo de pines con el Atmega168:

Los pines y bits del puerto se indican con su etiqueta PXN, donde X es la letra del puerto y N es el número de bit.

Ejemplo:PB1 es para PORT B ​​bit 1. De manera similar, PC5 es para PORT C bit 5.

Si inspeccionamos los pines, vemos que el microcontrolador tiene los puertos B, C y D. Volviendo a la referencia de Arduino podemos ver qué puertos se pueden escribir o leer o ambos. En nuestra aplicación, solo nos preocupamos por escribir.

La documentación indica que PORTD es de lectura / escritura y está mapeado a los pines digitales 0 a 7. Esto nos da 8 bits completos de los puertos para escribir.

A continuación, tenemos PORTB que, como se indicó, se asignan a los pines digitales 8-13. Se hace una declaración adicional diciendo que 6 y 7 que completarían los 8 bits completos no son accesibles. Este puerto solo se puede usar para escribir 6 bits.

Lo mismo ocurre con PORTC. Se asigna a los pines analógicos 0-5, pero también se reservan dos pines, lo que nos da solo 6 bits para escribir.

Debido a estas restricciones, tendremos que usar una combinación de un DAC de 8 bits para PORTD y un DAC de 6 bits para PORTC o PORTB.

Usaremos PORTD y PORTB y ahora podemos comenzar a conectar los DAC a los pines.

Si necesita ayuda visual sobre cómo ensamblar, así es como ensamblé ambos R-2R en la placa de pruebas. Tenga en cuenta que utilicé dos R-2R desde que lo estaba probando en mi "píldora negra" STM32. Puse dos cables de puente que sobresalían para poder conectar las sondas de mi osciloscopio y también un cable de tierra en el costado. Usé todas las resistencias de 10k, así que para mi 2R puse dos resistencias de 10k en serie.

Aquí hay una configuración de tablero más limpia usando Tinkercad. Marqué las salidas con X e Y, ya que serán a las que se conectarán nuestras sondas de osciloscopio. Si necesita más orientación sobre la configuración, proporcionaré esquemas que muestren las escaleras R-2R compuestas por todas con los mismos valores de resistencia y otra con dos valores.

¡Asegúrate de revisar tu terreno! Cada vez que ensamblo esta configuración tiendo a olvidarlo. También verifique dos veces que no dejó ningún espacio sin conexiones.

ArduinoCode

Ahora es el momento del boceto de Arduino.

Primero necesitamos configurar nuestros puertos para que sean salidas. De la referencia de Arduino sobre manipulación de puertos. Podemos ver cómo configurar los puertos:

Básicamente, un valor de 1 en el bit lo establecerá como salida y un valor de 0 lo establecerá como entrada. Para PORTD podemos escribir directamente ya que todos los bits son accesibles. Para PORTB, recuerde que los bits 6 y 7 no se pueden utilizar ya que se asignan al cristal. Es una buena práctica usar OR bit a bit con un valor de 0 para evitar modificar bits que no se establecerán.

En nuestro ciclo de configuración, este será el código:

El código se adjuntará para su descarga, así que no se preocupe por escribirlo a mano.

El bucle for debajo de las configuraciones simplemente reasigna los valores para el puerto de 6 bits. Estos valores serán de una lista que tendrá valores de rango de 8 bits. Para reasignar a 6 bits, nuestro valor máximo será 2 ^ 6-1 que es 63. Estamos mapeando desde un rango de 0 a 2 ^ 8-1 que es 255. La razón por la que reasignamos en el código Arduino es porque nuestro La herramienta de trazador manual generará los puntos xey en términos de 8 bits. Podemos cambiarlo en cualquier código, pero es mejor cambiarlo en el microcontrolador utilizado.

Básicamente necesitamos algo de retraso dependiendo del osciloscopio. Descubrí que para el mío 1 está bien. De hecho, omitir completamente el retraso también está bien. Para los puntos, nuestra herramienta de trazado manual lo generará automáticamente, por lo que puede copiar y pegar el número, pero básicamente esta es la cantidad de puntos que hay que trazar para que la variable iterativa pueda atravesarlos. De todos modos, aquí está el código completo:

Los arreglos x_points y y_points serán diferentes para usted cada vez que dibuje algo y se generarán automáticamente con nuestra herramienta.

Comentario adicional sobre PWM rápido:

Si es un usuario avanzado de microcontroladores, es posible que se dé cuenta de que si le preocupa la velocidad, quizás se pueda lograr lo mismo mediante PWM rápido y modificando los registros de reloj. Luego, alimenta las salidas PWM a un filtro de paso bajo para obtener un voltaje analógico que reduciría el número de pines. He probado ambos métodos, y esto todavía da como resultado un mejor soporte para imágenes con más detalles. Al menos en el Arduino Uno

Herramienta de dibujo

Hice esta herramienta en Python 3 usando tkinter. Si no tiene tkinter instalado, instálelo con pip.

  pip install tk  

El código simplemente se adjuntará, pero básicamente registra la coordenada en la ventana donde se hizo clic en el cursor. No intente cambiar el tamaño de la ventana, ya que cambiará la resolución. Si desea ser más preciso, use la herramienta de lupa en Windows. La ventana se basa en 255x255 ya que esos serán los valores máximos de nuestros rangos de bits. Por supuesto, una de las dimensiones se asignará a 6 bits si está utilizando un Arduino UNO.

Para llamar a la herramienta, simplemente use este formato

  python drawlog.py> arduino_list.txt  

Esto creará un archivo.txt llamado arduino_list.txt con la lista de Arduino para x_points, y_points y NUM_POINTS generada para usted, lista para copiar y pegar en su código.

Como ejemplo, así es como se ve el archivo.txt cuando lo abre. Solo necesita reemplazar esas líneas en el código.

Aquí está cómo se ve una vez que se abre. Desde allí puedes dibujar cualquier cosa.

Dibujé la siguiente imagen para probarlo. El código se genera al cerrar la ventana.

Y después de cargar el código en Arduino, así es como se veía en el modo X-Y.

IMPORTANTE:

Si se encuentra con un error de compilación que habla de memoria, esto se debe a la poca memoria disponible en Arduino UNO. Eso significa que debes dibujar una imagen menos detallada. Creo que la cantidad máxima de puntos fue de unos 400, pero podría ser más. Si usa una "píldora azul" o una "píldora negra" STM32, este número es superior a 4000.

Modo osciloscopio X-Y

El osciloscopio debe configurarse en modo x-y. La salida R-2R DAC (PORTD) de 8 bits se conectará al canal 1 y la salida R-2R DAC (PORTB) de 6 bits se conectará al canal 2. Desde allí puede ajustarla con las perillas hasta que vea una imagen.

¡Eso es! Si usted tiene alguna pregunta no dude en preguntar. Además, si desea probarlo en una pastilla azul o una pastilla negra, aquí está el enlace a mi página de GitHub con un código de muestra

Ahora, aquí hay algunas imágenes que he trazado.

¡¡¡No dudes en compartir el tuyo !!!

Editar:

Detalles importantes para la gestión de la memoria

Como Tim mencionó en los comentarios

  • En su código Arduino, su iterador sobre los puntos, t, es del tipo "byte", por lo que solo admite hasta 255 puntos. ¿Por qué no convertirlo en un "int"?
  • El código de su trazador genera "const unsigned long" para x_points y y_points, que no funcionará si modifica posteriormente los puntos y. Además, ¿por qué no usar "byte" para ahorrar memoria?

Tenga en cuenta las limitaciones de hardware que está utilizando. Para Arduino Uno, es mejor usar byte, sin embargo, si está usando un STM32 o incluso un ESP32, tendrá más puntos disponibles para trazar. Gracias a todos por sus comentarios.


Timster :

Encontré una manera de aumentar enormemente la cantidad de puntos admitidos en un UNO:moverlos al espacio de almacenamiento del programa. Puede hacer esto con el PROGMEM modificador. ¡De esta manera puede almacenar alrededor de 15,000 puntos!

Así que declare las matrices así:

  const int NUM_POINTS =... 
const byte x_points [NUM_POINTS] PROGMEM ={...
const byte y_points [NUM_POINTS] PROGMEM ={...

No modifique los puntos_y en la función de configuración (es decir, elimine el para bucle allí). En su lugar, haga un pequeño cambio en la función de bucle.

También necesita un comando especial para leer datos de la memoria del programa (pgm_read_byte_near). Entonces, el bucle for en el void loop () se parece a:

  for (int t =0; t  {
PORTD =pgm_read_byte_near (x_points + t);
PORTB =pgm_read_byte_near ( y_points + t)>> 2;
delayMicroseconds (FIGURE_DELAY);
}

Entonces es posible almacenar una imagen de alta resolución o varias imágenes más pequeñas y alternar entre ellas 😃

Código

  • código Arduino
  • Herramienta de trazado
Código Arduino Arduino
Boceto de Arduino para usar en una placa Arduino Uno o Nano
 const byte FIGURE_DELAY =1; // Traza el retraso en EE. UU. ajustar si es necesarioconst int NUM_POINTS =87; // número de puntos XY en la figura // coordenadas xey para trazar el byte x_points [NUM_POINTS] ={106,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91 , 90,90,89,88,87,87,87,86,86,86,86,87,89,90,91,93,95,97,99,101,102,102,104,104,105,105,106,106,106,106,106,106,108,109,110,112,113,115,117,119,121,122,123,123,124,124,124,124,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,110,109,109,109,108,107,107}; y_points byte [NUM_POINTS] ={78,80 81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,98,99,100,101,103,105,106,108,110,112,113,113,114,115,115,115,115,115,115,114,112,112,110,109,107,106,106,108,110,112,114,116,114,18,115,117,99 , 92,91,90,89,87,86,84,82,81,80,78}; void setup () {// inicializar los puertos D y B para escribir DDRD =B11111111; DDRB =B00111111; byte t; for (t =0; t  
Herramienta de trazado Python
Herramienta de dibujo para exportar puntos para trazar
 import tkinter as tkX =[] Y =[] lastx, lasty =0, 0 # xy y addLine son solo para fines gráficos # on_move_press es el que registra el uno en la lista y corrige Ydef xy (evento):# registra las coordenadas cuando se hace clic en el mouse global lastx, lasty lastx, lasty =event.x, event.ydef addLine (event):# dibuja una línea desde el punto anterior al nuevo punto global lastx, lasty canvas.create_line ((lastx, lasty, event.x, event.y)) # esto hace que el nuevo punto de inicio del dibujo sea lastx, lasty =event.x, event.y # registra la coordenada pulsada en listdef on_move_press (event):curX, curY =(event.x, event.y) curY =255-curY # ya que tkinter usa diferentes coordenadas X.append (str (curX)) Y.append (str (curY)) # configuración necesaria para windowroot =tk.Tk ( ) root.geometry ("255x255") root.columnconfigure (0, weight =1) root.rowconfigure (0, weight =1) canvas =tk.Canvas (root) canvas.grid (column =0, row =0, sticky =(tk.N, tk.W, tk.E, tk.S)) # enlazar clic izquierdo y arrastrar a funciones e iniciar loopcanvas.bind (" ", xy) canvas.bind ("  ", addLine) root.bind ("  ", on_move_press) root.mainloop () # eliminar cada 2da entrada para reducir puntos y aumentar la actualización de la traza para i en el rango (1, int (len (X) / 2)):X.pop (i) Y.pop (i) print ("const int NUM_POINTS =% s;"% str (len (X) )) print ("const unsigned long x_points [NUM_POINTS] ={% s};"% ','. join (X)) print ("const unsigned long y_points [NUM_POINTS] ={% s};"% ',' .join (Y)) # llamar a python drawlog.py> arduino_list.txt 

Esquemas


Proceso de manufactura

  1. Osciloscopio para PC
  2. Resistencias
  3. Creación de una red de sensores inalámbricos en su hogar
  4. Controle la temperatura de su hogar usando su Raspberry Pi
  5. Los mejores accesorios para tu Raspberry Pi
  6. Crea tu propio SOMBRERO de Google Voice
  7. Mide tu tiempo de reacción
  8. Tu guía de resistencias dinámicas
  9. Su guía de selección de sierras de cinta
  10. Cómo arreglar la manija de la puerta de tu auto
  11. ¿Cómo reparar el óxido de tu coche?