Dibuja Gráficos Personalizados en tu Osciloscopio con un DAC R-2R y Arduino
Componentes y materiales
- 50× Resistencias 1 kΩ (o 2 kΩ para 2R; mantener proporción R/2R)
- 1× Arduino UNO (o Nano, o STM32 Blue/Black Pill para 2×8 bits)
Aplicaciones y servicios online
- Arduino IDE
- Python 3 + tkinter (herramienta de dibujo)
Sobre el proyecto
El DAC R-2R
Convertidor digital-analógico sencillo que solo requiere resistencias. Dos valores: R y 2R (doble). Cada bit del puerto añade una rama 2R. Con 8 bits (PORTD) y 6 bits (PORTB) en Arduino UNO/Nano se obtienen ejes X (8 bits) e Y (6 bits). Si se usa STM32 (puertos completos de 8 bits), se pueden usar dos DAC de 8 bits.
Ejemplo: R = 1 kΩ → 2R = 2 kΩ (dos de 1 kΩ en serie). Número de bits = ramas 2R.
Manipulación de puertos
Se usa escritura paralela directa a registros PORTD (pines 0-7, 8 bits) y PORTB (pines 8-13, solo 6 bits usables). Configuración en setup():
DDRD = B11111111; // 8 bits salida
DDRB = B00111111; // 6 bits salida (bits 6-7 son cristal)
En setup() se remapean los valores Y de 8 bits (0-255) a 6 bits (0-63) con map().
Herramienta de dibujo (Python/tkinter)
- Instalar:
pip install tk - Ejecutar:
python drawlog.py > arduino_list.txt - Ventana 255×255 px; clic-arrastra para dibujar.
- Al cerrar, genera arrays
x_points[],y_points[]yNUM_POINTSlistos para pegar en el sketch. - Reduce puntos automáticamente (borra 1 de cada 2) para refresco rápido.
Modo X-Y del osciloscopio
Conectar salida DAC X (PORTD) → Canal 1, salida DAC Y (PORTB) → Canal 2. Poner osciloscopio en modo X-Y. Ajustar escalas/posición hasta ver la figura.
Optimización de memoria (importante)
- En UNO: usar
bytepara arrays; límite ~400 puntos por RAM. - Truco PROGMEM (Timster): mover arrays a memoria de programa → ~15 000 puntos.
const byte x_points[NUM_POINTS] PROGMEM = {...}; const byte y_points[NUM_POINTS] PROGMEM = {...}; void loop() { for (int t=0; t<NUM_POINTS; t++) { PORTD = pgm_read_byte_near(x_points + t); PORTB = pgm_read_byte_near(y_points + t) >> 2; // 8→6 bits delayMicroseconds(FIGURE_DELAY); } }
Código
Sketch Arduino (UNO/Nano)
const byte FIGURE_DELAY = 1;
const int NUM_POINTS = 87;
byte x_points[NUM_POINTS] = {106,106,105,...};
byte y_points[NUM_POINTS] = {78,80,81,...};
void setup() {
DDRD = B11111111; DDRB = B00111111;
for (byte t=0; t<NUM_POINTS; t++)
y_points[t] = map(y_points[t],0,255,0,63);
}
void loop() {
for (byte t=0; t<NUM_POINTS; t++) {
PORTD = x_points[t];
PORTB = y_points[t];
delayMicroseconds(FIGURE_DELAY);
}
}
Herramienta de dibujo (Python)
import tkinter as tk
X=[]; Y=[]; lastx=lasty=0
def xy(e): global lastx,lasty; lastx,lasty=e.x,e.y
def addLine(e): global lastx,lasty; canvas.create_line(lastx,lasty,e.x,e.y); lastx,lasty=e.x,e.y
def on_move_press(e):
X.append(str(e.x)); Y.append(str(255-e.y)) # invertir Y
root=tk.Tk(); root.geometry("255x255")
canvas=tk.Canvas(root); canvas.grid(sticky="nsew")
canvas.bind("",xy); canvas.bind("",addLine)
root.bind("",on_move_press); root.mainloop()
for i in range(1,len(X)//2): X.pop(i); Y.pop(i)
print(f"const int NUM_POINTS = {len(X)};")
print(f"const unsigned long x_points[NUM_POINTS] = {{{','.join(X)}}};")
print(f"const unsigned long y_points[NUM_POINTS] = {{{','.join(Y)}}};")
Esquemáticos
Cuatro imágenes: escalera R-2R de 8 bits (PORTD), de 6 bits (PORTB), versión con dos valores de resistencia (R y 2R), y versión todo con mismo valor (2R = dos R en serie). Incluyen conexiones a pines Arduino y masa común.
Proceso de manufactura
- Construya una Red de Sensores Inalámbrica Económica para su Hogar
- Monitoriza la temperatura de tu casa con un panel Raspberry Pi
- Los mejores accesorios para aprovechar al máximo tu Raspberry Pi
- Construye tu Propio Google Voice HAT para Raspberry Pi
- Test de Precisión de Tiempo de Reacción con Arduino UNO
- Guía definitiva para elegir la sierra de cinta adecuada
- Guía Paso a Paso para Reparar el Tirador de la Puerta de tu Coche
- Guía Rápida para Reparar el Óxido en la Carrocería: Protege tu Vehículo
- Osciloscopio PC: Construye un Analizador de Formas de Onda de Bajo Costo Usando tu Computadora
- Resistencias: Fundamentos, Tipos y Aplicaciones Prácticas
- Comprender el frenado dinámico en trenes pesados