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 n'importe quoi sur votre oscilloscope

Composants et fournitures

Résistance 1k ohm
Toute valeur de résistance est acceptable tant que vous gardez les ratios du DAC corrects. besoin de 50 si vous avez des résistances 2k. Ou deux fois la valeur de la résistance que vous avez choisie.
× 50
Arduino UNO
Ou STM32 "pilule bleue" ou "pilule noire".
× 1

Applications et services en ligne

Arduino IDE

À propos de ce projet

Le DAC R-2R

L'une des implémentations les plus simples d'un convertisseur numérique-analogique peut être réalisée en concevant un DAC en échelle R-2R. Ce type de DAC n'a besoin que de résistances pour fonctionner, ce qui en fait un DAC très convivial pour les débutants.

Le principe de base de ce type de DAC est qu'il suffit de deux valeurs pour les résistances. R et 2R. Ensuite, vous pouvez les configurer comme indiqué dans le schéma ci-dessous.

R peut être n'importe quoi tant que chaque occurrence de R dans le schéma a la même valeur.

Par exemple, si nous choisissons R =1k, alors 2R ne serait que deux fois le montant. Dans ce cas 2R =2k. Vous pouvez donc n'utiliser que des résistances de 1k et 2k.

Si vous avez utilisé R=3,3K alors 2R =6,6k et ainsi de suite. Si vous voulez juste utiliser la même valeur de résistances pour tout, alors pour obtenir 2R, il vous suffirait de les mettre deux résistances en série et cela augmenterait le nombre de composants.

Le nombre de bits est déterminé par le nombre de branches de 2R qui ressortent. Dans ce projet, nous utiliserons un R-2R 8 bits et un R-2R 6 bits pour l'Arduino Uno ou Nano. Si vous utilisez un autre microcontrôleur dont vous savez qu'il prend en charge une manipulation complète des ports d'au moins 8 bits, tels que la "pilule bleue" et la "pilule noire" STM32, vous pouvez simplement utiliser deux DAC 8 bits.

Remarque sur les circuits intégrés DAC :

Ce projet est axé sur l'utilisation d'un DAC R-2R, mais vous pouvez vous sentir libre d'utiliser un circuit intégré DAC pour obtenir quelque chose de similaire. Si vous envisagez d'utiliser un circuit intégré DAC, je vous recommande d'en utiliser un qui prend en charge un protocole de communication rapide tel que SPI, car I2C sera trop lent pour dessiner une image détaillée. Je ne parlerai pas de l'utilisation d'un circuit intégré DAC dans cet article, mais peut-être dans un futur. Le R-2R reste ma méthode préférée car il peut produire des images avec plus de détails.

Manipulation des ports

Nous utiliserons la manipulation du port parallèle de notre microcontrôleur. La raison en est que cela permet une vitesse de sortie plus rapide et maintient également le code simple. Vous pouvez lire plus de détails sur les registres de port pour Arduino dans ce lien.

Les Arduino Uno et Nano ont le microcontrôleur ATmega328p. Ce microcontrôleur partage le même mappage de broches avec l'Atmega168 :

Les broches et les bits du port sont indiqués par leur étiquette PXN où X est la lettre du port et N est le numéro de bit.

Exemple :PB1 est pour PORT B ​​bit 1. De même PC5 est pour PORT C bit 5.

Si nous inspectons les broches, nous voyons que le microcontrôleur a les ports B, C et D. En revenant à la référence Arduino, nous pouvons voir quels ports peuvent être écrits ou lus ou les deux. Dans notre application, nous ne nous soucions que de l'écriture.

La documentation indique que PORTD est en lecture/écriture et qu'il est mappé sur les broches numériques 0 à 7. Cela nous donne 8 bits complets des ports sur lesquels écrire.

Ensuite, nous avons PORTB qui, comme indiqué, est mappé sur les broches numériques 8-13. Une déclaration supplémentaire est faite indiquant que 6 et 7 qui compléteraient les 8 bits complets ne sont pas accessibles. Ce port ne peut être utilisé que pour écrire 6 bits.

Il en est de même pour PORTC. Il est mappé sur les broches analogiques 0-5, mais deux broches sont également réservées, ce qui ne nous donne que 6 bits à écrire.

En raison de ces restrictions, nous devrons utiliser une combinaison d'un DAC 8 bits pour PORTD et d'un DAC 6 bits pour PORTC ou PORTB.

Nous utiliserons PORTD et PORTB et nous pouvons maintenant commencer à câbler les DAC aux broches.

Si vous avez besoin d'une aide visuelle sur la façon d'assembler, voici comment j'ai assemblé les deux R-2R dans la maquette. Notez que j'ai utilisé deux R-2R puisque je le testais sur ma "pilule noire" STM32. J'ai mis deux fils de liaison qui dépassent pour pouvoir y connecter mes sondes d'oscilloscope ainsi qu'un fil de terre sur le côté. J'ai utilisé toutes les résistances de 10k donc pour mon 2R j'ai mis deux résistances de 10k en série.

Voici une configuration de maquette plus propre utilisant Tinkercad. J'ai marqué les sorties avec X et Y car ce seront celles auxquelles nos sondes d'oscilloscope seront connectées. Si vous avez besoin de plus de conseils sur la configuration, je fournirai des schémas montrant les échelles R-2R composées de toutes les mêmes valeurs de résistance et d'une autre avec deux valeurs.

Assurez-vous de vérifier votre terrain! Chaque fois que j'assemble cette configuration, j'ai tendance à l'oublier. Vérifiez également que vous n'avez laissé aucun espace sans connexion.

ArduinoCode

Il est maintenant temps pour le croquis Arduino.

Nous devons d'abord configurer nos ports pour qu'ils soient des sorties. De la référence Arduino sur la manipulation des ports. Nous pouvons voir comment paramétrer les ports :

Fondamentalement, une valeur de 1 au bit le définira comme sortie et une valeur de 0 le définira comme entrée. Pour PORTD nous pouvons écrire directement puisque tous les bits sont accessibles. Pour PORTB, rappelez-vous que les bits 6 et 7 ne sont pas utilisables car ils correspondent au cristal. Il est recommandé d'utiliser un OR au niveau du bit avec une valeur de 0 pour éviter de modifier des bits qui ne seront pas définis.

Dans notre boucle d'installation, ce sera le code :

Le code sera joint pour téléchargement, alors ne vous inquiétez pas de le taper à la main.

La boucle for sous les configurations remappe simplement les valeurs du port 6 bits. Ces valeurs proviendront d'une liste qui aura des valeurs d'une plage de 8 bits. Pour remapper sur 6 bits, notre valeur maximale sera de 2^6-1, soit 63. Nous mappons à partir d'une plage de 0 à 2^8-1, soit 255. La raison pour laquelle nous remappons dans le code Arduino est que notre L'outil traceur manuel affichera les points x et y en termes de 8 bits. Nous pouvons le changer dans l'un ou l'autre code, mais il vaut mieux le changer sur le microcontrôleur utilisé.

Fondamentalement, nous avons besoin d'un certain délai en fonction de l'oscilloscope. J'ai trouvé que pour le mien 1 est bien. En fait, omettre complètement le délai est également très bien. Pour les points, il sera automatiquement généré par notre outil de traçage manuel afin que vous puissiez simplement copier et coller le nombre, mais en gros, il s'agit du nombre de points à tracer pour que la variable d'itération puisse les parcourir. Quoi qu'il en soit, voici le code complet :

Les tableaux x_points et y_points seront différents pour vous à chaque fois que vous dessinez quelque chose et seront automatiquement générés avec notre outil.

Remarque sur le PWM rapide :

Si vous êtes un utilisateur avancé de microcontrôleurs, vous vous rendrez peut-être compte que si vous vous souciez de la vitesse, alors peut-être la même chose peut être obtenue par PWM rapide et modification des registres d'horloge. Ensuite, alimenter les sorties PWM à un filtre passe-bas pour obtenir une tension analogique qui réduirait le nombre de broches. J'ai essayé les deux méthodes, et cela se traduit toujours par une meilleure prise en charge des images avec plus de détails. Au moins dans l'Arduino Uno

Outil de dessin

J'ai créé cet outil en Python 3 en utilisant tkinter. Si vous n'avez pas installé tkinter, installez-le avec pip.

pip install tk 

Le code sera juste attaché, mais fondamentalement, il enregistre les coordonnées sur la fenêtre où votre curseur a été cliqué. N'essayez pas de redimensionner la fenêtre car cela changera la résolution. Si vous voulez être plus précis, utilisez l'outil loupe de Windows. La fenêtre est basée sur 255x255 car ce seront les valeurs maximales de nos plages de bits. Bien sûr, l'une des dimensions sera mappée sur 6 bits si vous utilisez un Arduino UNO.

Pour appeler l'outil, utilisez simplement ce format

python drawlog.py> arduino_list.txt 

Cela créera un fichier.txt nommé arduino_list.txt avec la liste Arduino pour x_points, y_points et NUM_POINTS générés pour vous, prêt à être copié et collé dans votre code.

À titre d'exemple, voici à quoi ressemble le fichier.txt lorsque vous l'ouvrez. Il vous suffit de remplacer ces lignes dans le code.

Voici à quoi cela ressemble une fois ouvert. De là, vous pouvez tout dessiner.

J'ai dessiné l'image suivante pour le tester. Le code est généré à la fermeture de la fenêtre.

Et après avoir téléchargé le code sur l'Arduino, voici à quoi cela ressemblait en mode X-Y.

IMPORTANT :

Si vous rencontrez une erreur de compilation en parlant de mémoire, cela est dû à la faible mémoire disponible dans l'Arduino UNO. Cela signifie que vous devriez dessiner une image moins détaillée. Je pense que le nombre maximum de points était d'environ 400, mais cela pourrait être plus. Si vous utilisez une "pilule bleue" ou une "pilule noire" STM32, ce nombre est supérieur à 4 000.

Mode Oscilloscope X-Y

L'oscilloscope doit être réglé sur le mode x-y. La sortie DAC R-2R 8 bits (PORTD) sera connectée au canal 1 et le DAC R-2R 6 bits (PORTB) sera connecté au canal 2. À partir de là, vous pouvez l'ajuster avec les boutons jusqu'à ce que vous voyiez une image.

C'est ça! Si vous avez des questions, n'hésitez pas à les poser. De plus, si vous voulez l'essayer sur une pilule bleue ou une pilule noire, voici le lien vers ma page GitHub avec un exemple de code

Maintenant, voici quelques images que j'ai tracées.

N'hésitez pas à partager les vôtres !!!

Modifier :

Détails importants pour la gestion de la mémoire

Comme Tim l'a mentionné dans les commentaires

  • Dans votre code Arduino, votre itérateur sur les points, t, est de type "octet", il ne prend donc en charge que jusqu'à 255 points. Pourquoi ne pas en faire un "int" ?
  • Votre code de traceur génère "const unsigned long" pour x_points et y_points - cela ne fonctionnera pas si vous modifiez ultérieurement les points y. Aussi, pourquoi ne pas simplement utiliser "byte" pour économiser de la mémoire ?

Soyez conscient des limitations matérielles que vous utilisez. Pour l'Arduino Uno, il est préférable d'utiliser des octets, cependant si vous utilisez un STM32 ou même un ESP32, vous aurez plus de points disponibles à tracer. Merci à tous pour vos commentaires.


Timster :

J'ai trouvé un moyen d'augmenter massivement le nombre de points pris en charge sur un UNO - les déplacer dans l'espace de stockage du programme. Vous pouvez le faire avec le PROGMEM modificateur. De cette façon, vous pouvez stocker environ 15 000 points !

Déclarez donc les tableaux comme ceci :

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

Ne modifiez pas les y_points dans la fonction de configuration (c'est-à-dire supprimez le for boucle là). Faites plutôt un décalage dans la fonction de boucle.

Vous avez également besoin d'une commande spéciale pour lire les données de la mémoire du programme (pgm_read_byte_near). Donc la boucle for dans la void loop() ressemble à :

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);
}

Ensuite, il est possible de stocker une image haute résolution ou plusieurs images plus petites et de les parcourir 😃

Code

  • Code Arduino
  • Outil de traçage
Code ArduinoArduino
Esquisse Arduino à utiliser dans une carte Arduino Uno ou Nano
 octet const FIGURE_DELAY =1 ; // tracer le retard aux états-unis. ajuster si nécessaireconst int NUM_POINTS =87 ; // nombre de points XY dans la figure // coordonnées x et y pour tracer l'octet 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 octet [de 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(){ // initialise les ports D et B pour écrire DDRD =B11111111; DDRB =B00111111; octet t; pour (t=0; t  
Outil de traçagePython
Outil de dessin pour exporter des points vers plot
import tkinter as tkX =[]Y =[]lastx, lasty =0, 0# xy et addLine sont uniquement à des fins graphiques# on_move_press est celui qui enregistre celui-ci dans la liste et corrige Ydef xy(event):# enregistre les coordonnées lorsque la souris est cliquée global lastx, lasty lastx, lasty =event.x, event.ydef addLine(event):# dessine une ligne de l'ancien point au nouveau point global lastx, lasty canvas.create_line ((lastx, lasty, event.x, event.y)) # cela fait le nouveau point de départ du dessin lastx, lasty =event.x, event.y# enregistre les coordonnées cliquées sur listdef on_move_press( event):curX, curY =(event.x, event.y) curY=255-curY # puisque tkinter utilise des coordonnées différentes X.append(str(curX)) Y.append(str(curY))# configuration nécessaire pour 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))# lier un clic gauche et faire glisser vers les fonctions et démarrer loopcanvas.bind("", xy)canvas.bind("", addLine)root.bind("",on_move_press)root.mainloop()# supprimer toutes les 2 entrées pour réduire les points et augmenter le rafraîchissement de la trace pour i dans la plage (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))#call python drawlog.py> arduino_list.txt

Schémas


Processus de fabrication

  1. Résistances
  2. Construire un réseau de capteurs sans fil dans votre maison
  3. Surveillez la température de votre maison à l'aide de votre Raspberry Pi
  4. Les meilleurs accessoires pour votre Raspberry Pi
  5. Créez votre propre chapeau Google Voice
  6. Mesurez votre temps de réaction
  7. Votre guide des résistances dynamiques
  8. Votre guide de sélection de scie à ruban
  9. Comment réparer votre poignée de porte de voiture