Dessinez sur votre oscilloscope avec un convertisseur R-2R et Arduino
Composants et fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Résistance 1 kΩ | 50 | Toute valeur convient si le ratio R/2R est respecté. Avec des 2 kΩ, n'en faut que 25. |
| Arduino UNO (ou Nano, ou STM32 Blue/Black Pill) | 1 | STM32 permet deux DAC 8 bits complets |
Applications
- Arduino IDE
Le DAC R-2R
Un convertisseur numérique-analogique simple à réaliser : une échelle de résistances R et 2R. Choisissez R (ex: 1 kΩ), alors 2R = 2 kΩ (deux R en série). Le nombre de bits = nombre de branches 2R. Ici : un DAC 8 bits (PORTD) et un DAC 6 bits (PORTB) sur Arduino Uno/Nano.

Manipulation de ports
On utilise l'écriture parallèle sur les registres de port pour la vitesse. Sur ATmega328P (Uno/Nano) :
- PORTD (broches 0-7) : 8 bits accessibles → DAC 8 bits (axe X)
- PORTB (broches 8-13) : seulement 6 bits (bits 6-7 = quartz) → DAC 6 bits (axe Y)
- PORTC (A0-A5) : aussi 6 bits seulement
Configuration dans setup() :
DDRD = B11111111; // PORTD tout en sortie
DDRB = B00111111; // PORTB bits 0-5 en sortie (bits 6-7 inchangés)
// Remappage valeurs 8 bits → 6 bits pour l'axe Y
for (byte t = 0; t < NUM_POINTS; t++) {
y_points[t] = map(y_points[t], 0, 255, 0, 63);
}
Outil de dessin (Python + Tkinter)
Un script Python permet de dessiner à la souris sur une fenêtre 255×255 et génère automatiquement les tableaux x_points[] et y_points[] pour l'Arduino.
# drawlog.py
import tkinter as tk
X, Y = [], []
lastx, lasty = 0, 0
def xy(event):
global lastx, lasty
lastx, lasty = event.x, event.y
def addLine(event):
global lastx, lasty
canvas.create_line((lastx, lasty, event.x, event.y))
lastx, lasty = event.x, event.y
def on_move_press(event):
curX, curY = event.x, 255 - event.y # Inversion Y (Tkinter origine en haut)
X.append(str(curX))
Y.append(str(curY))
root = tk.Tk()
root.geometry("255x255")
canvas = tk.Canvas(root)
canvas.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S))
canvas.bind("", xy)
canvas.bind("", addLine)
root.bind("", on_move_press)
root.mainloop()
# Réduction points (1 sur 2) pour fluidité
for i in range(1, int(len(X)/2)):
X.pop(i); Y.pop(i)
print(f"const int NUM_POINTS = {len(X)};")
print(f"const byte x_points[NUM_POINTS] = {{{','.join(X)}}};")
print(f"const byte y_points[NUM_POINTS] = {{{','.join(Y)}}};")
Lancement : python drawlog.py > arduino_list.txt
Code Arduino
const byte FIGURE_DELAY = 1; // Délai µs entre points (ajuster selon oscilloscope)
const int NUM_POINTS = 87; // Nombre de points XY
// Exemple : un cœur (généré par l'outil)
const 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};
const byte y_points[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,114,115,116,116,117,117,117,117,117,116,115,113,112,110,108,106,104,103,102,100,99,98,97,96,95,94,93,92,91,90,89,87,86,84,82,81,80,78};
void setup() {
DDRD = B11111111; // PORTD sortie (X)
DDRB = B00111111; // PORTB bits 0-5 sortie (Y)
for (byte t = 0; t < NUM_POINTS; t++) {
y_points[t] = map(y_points[t], 0, 255, 0, 63); // 8→6 bits
}
}
void loop() {
for (byte t = 0; t < NUM_POINTS; t++) {
PORTD = x_points[t];
PORTB = y_points[t];
delayMicroseconds(FIGURE_DELAY);
}
}
Optimisation mémoire (astuce PROGMEM)
Sur Uno, la RAM limite à ~400 points. Utilisez PROGMEM pour stocker en Flash (~15 000 points possibles) :
const int NUM_POINTS = ...;
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; // division par 4 = 8→6 bits
delayMicroseconds(FIGURE_DELAY);
}
}
Mode X-Y de l'oscilloscope
- DAC 8 bits (PORTD) → Canal 1
- DAC 6 bits (PORTB) → Canal 2
- Mettez l'oscilloscope en mode X-Y
- Ajustez échelles et position pour voir l'image
Exemples d'images tracées

Partagez vos créations !
Schémas de câblage
Deux versions : résistances toutes identiques (2R = 2×R en série) ou valeurs R et 2R distinctes.

Processus de fabrication
- Résistances : Fondamentaux, types et applications pratiques
- Construire un réseau de capteurs sans fil abordable pour votre maison
- Surveiller la température de votre maison avec un tableau de bord Raspberry Pi
- Les meilleurs accessoires pour exploiter pleinement le potentiel de votre Raspberry Pi
- Construire un Google Voice HAT DIY pour votre Raspberry Pi
- Test Précis de Temps de Réaction avec Arduino UNO
- Comprendre le freinage dynamique dans les trains lourds
- Guide ultime pour choisir la bonne scie à ruban
- Guide étape par étape pour réparer la poignée de porte de votre voiture