Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

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

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.

Dessinez sur votre oscilloscope avec un convertisseur R-2R et Arduino

Manipulation de ports

On utilise l'écriture parallèle sur les registres de port pour la vitesse. Sur ATmega328P (Uno/Nano) :

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

  1. DAC 8 bits (PORTD) → Canal 1
  2. DAC 6 bits (PORTB) → Canal 2
  3. Mettez l'oscilloscope en mode X-Y
  4. Ajustez échelles et position pour voir l'image

Exemples d'images tracées

Dessinez sur votre oscilloscope avec un convertisseur R-2R et Arduino Dessinez sur votre oscilloscope avec un convertisseur R-2R et Arduino Dessinez sur votre oscilloscope avec un convertisseur R-2R et Arduino Dessinez sur votre oscilloscope avec un convertisseur R-2R et Arduino

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.

Dessinez sur votre oscilloscope avec un convertisseur R-2R et Arduino Dessinez sur votre oscilloscope avec un convertisseur R-2R et Arduino Dessinez sur votre oscilloscope avec un convertisseur R-2R et Arduino Dessinez sur votre oscilloscope avec un convertisseur R-2R et Arduino

Processus de fabrication

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