Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Нарисуйте что угодно на осциллографе

Компоненты и расходные материалы

Резистор 1 кОм
Допускается любое значение резистора, если вы сохраняете правильные соотношения ЦАП. нужно 50, если у вас есть резисторы 2к. Или в два раза больше номинала выбранного вами резистора.
× 50
Arduino UNO
Или STM32 "синяя таблетка" или "черная таблетка".
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

ЦАП R-2R

Одна из простейших реализаций цифроаналогового преобразователя может быть достигнута путем разработки лестничного ЦАП R-2R. Для работы этого типа ЦАП требуются только резисторы, что делает его очень удобным для новичков.

Основной принцип этого типа ЦАП заключается в том, что вам нужно всего лишь два номинала резисторов. R и 2R. Затем вы можете настроить их, как показано на схеме ниже.

R может быть любым, если каждое вхождение R в схеме имеет одно и то же значение.

Например, если мы выберем R =1k, то 2R будет вдвое больше. В этом случае 2R =2k. Таким образом, вы можете использовать только резисторы 1 кОм и 2 кОм.

Если вы использовали R =3.3K, тогда 2R =6.6k и так далее. Если вы просто хотите использовать резисторы одного и того же номинала для всего, то для получения 2R вам просто нужно соединить два резистора последовательно, и это увеличит количество компонентов.

Количество битов определяется количеством выступающих ветвей 2R. В этом проекте мы будем использовать 8-битный R-2R и 6-битный R-2R для Arduino Uno или Nano. Если вы используете другой микроконтроллер, который, как вы знаете, поддерживает полное манипулирование портами не менее 8-битного типа, например «синяя таблетка» и «черная таблетка» STM32, то вы можете просто использовать два 8-битных ЦАП.

Дополнительное замечание по ИС ЦАП:

Этот проект ориентирован на использование ЦАП R-2R, но вы можете свободно использовать ИС ЦАП для достижения чего-то подобного. Если вы собираетесь использовать ИС ЦАП, я рекомендую использовать тот, который поддерживает протокол быстрой связи, такой как SPI, поскольку I2C будет слишком медленным для рисования подробного изображения. Я не буду рассказывать, как использовать ИС ЦАП в этом посте, но, возможно, в будущем. R-2R по-прежнему мой предпочтительный метод, поскольку он может выводить изображения с более подробной информацией.

Манипуляции с портами

Мы будем использовать параллельный порт нашего микроконтроллера. Причина в том, что это обеспечивает более высокую скорость вывода, а также упрощает код. Вы можете прочитать более подробную информацию о регистрах портов для Arduino по этой ссылке.

Arduino Uno и Nano имеют микроконтроллер ATmega328p. Этот микроконтроллер имеет такое же расположение контактов, что и Atmega168:

Контакты порта и биты обозначаются их меткой PXN, где X - буква порта, а N - номер бита.

Пример:PB1 предназначен для ПОРТА B, бит 1. Точно так же PC5 предназначен для ПОРТА C, бит 5.

Если мы проверим контакты, мы увидим, что у микроконтроллера есть порты B, C и D. Вернувшись к справочнику Arduino, мы можем увидеть, какие порты могут быть записаны или прочитаны, или оба. В нашем приложении мы заботимся только о записи.

В документации указано, что PORTD предназначен для чтения / записи и сопоставлен с цифровыми выводами от 0 до 7. Это дает нам полные 8 бит портов для записи.

Затем у нас есть PORTB, который, как указано, сопоставлен с цифровыми контактами 8-13. В дополнительном заявлении говорится, что 6 и 7, которые завершили бы полные 8 бит, недоступны. Этот порт можно использовать только для 6-битной записи.

То же самое и с PORTC. Он сопоставлен с аналоговыми контактами 0-5, но два контакта также зарезервированы, что дает нам только 6 бит для записи.

Из-за этих ограничений нам придется использовать комбинацию 8-битного ЦАП для PORTD и 6-битного ЦАП для PORTC или PORTB.

Мы будем использовать PORTD и PORTB, и теперь мы можем начать подключать ЦАП к контактам.

Если вам нужно наглядное пособие по сборке, вот как я собрал оба R-2R на макетной плате. Обратите внимание, что я использовал два R-2R, так как тестировал их на своей «черной таблетке» STM32. Я вставил две торчащие перемычки, чтобы я мог подключить к ним щупы осциллографа, а также заземляющий провод сбоку. Я использовал все резисторы 10 кОм, поэтому для моего 2R я поставил два резистора 10 кОм последовательно.

Вот более чистая установка макета с помощью Tinkercad. Я пометил выходы буквами X и Y, так как именно к ним будут подключаться пробники нашего осциллографа. Если вам нужны дополнительные указания по настройке, я предоставлю схемы, показывающие лестницы R-2R, состоящие из всех с одинаковыми номиналами резисторов и еще одной с двумя значениями.

Обязательно проверьте свои основания! Каждый раз, когда я собираю эту установку, я забываю. Также дважды проверьте, не осталось ли пробелов и соединений.

ArduinoCode

Пришло время скетча Arduino.

Сначала нам нужно настроить наши порты как выходы. Из справочника Arduino по манипулированию портами. Мы можем увидеть, как установить порты:

Обычно значение 1 для бита устанавливает его как выход, а значение 0 устанавливает его как вход. Для PORTD мы можем писать напрямую, поскольку доступны все биты. Для PORTB помните, что биты 6 и 7 не могут использоваться, поскольку они отображаются на кристалл. Рекомендуется использовать побитовое ИЛИ со значением 0, чтобы избежать изменения битов, которые не будут установлены.

В нашем цикле настройки это будет код:

Код будет прикреплен для загрузки, так что не беспокойтесь о том, чтобы набирать его вручную.

Цикл for под конфигурациями просто переназначает значения для 6-битного порта. Эти значения будут из списка, который будет иметь значения в 8-битном диапазоне. Чтобы переназначить на 6 бит, наше максимальное значение будет 2 ^ 6-1, что составляет 63. Мы отображаем диапазон от 0 до 2 ^ 8-1, который равен 255. Причина, по которой мы переназначаем в код Arduino, заключается в том, что наш Инструмент ручной плоттер будет выводить точки x и y в 8-битном формате. Мы можем изменить его в любом коде, но лучше изменить его на используемом микроконтроллере.

В основном нам нужна некоторая задержка в зависимости от осциллографа. Я обнаружил, что для моего 1 это нормально. Фактически, полное исключение задержки тоже нормально. Для точек он будет автоматически сгенерирован нашим инструментом ручного плоттера, поэтому вы можете просто скопировать и вставить число, но в основном это количество точек для построения, чтобы итерационная переменная могла проходить через них. В любом случае, вот полный код:

Массивы x_points и y_points будут разными для вас каждый раз, когда вы что-то рисуете, и будут автоматически генерироваться с помощью нашего инструмента.

Дополнительное замечание о быстрой ШИМ:

Если вы являетесь разработчиком микроконтроллеров, вы можете понять, что если вы беспокоитесь о скорости, то возможно того же можно добиться с помощью быстрой ШИМ и изменения регистров часов. Затем подайте выходы ШИМ на фильтр нижних частот, чтобы получить аналоговое напряжение, которое уменьшит количество выводов. Я пробовал оба метода, и это по-прежнему улучшает поддержку изображений с большей детализацией. По крайней мере, в Arduino Uno

Инструмент для рисования

Я сделал этот инструмент на Python 3 с помощью tkinter. Если у вас не установлен tkinter, установите его с помощью pip.

  pip install tk  

Код будет просто прикреплен, но в основном он записывает координату в окне, в котором был нажат курсор. Не пытайтесь изменить размер окна, так как это изменит разрешение. Если вы хотите быть более точными, используйте инструмент увеличительного стекла в Windows. Окно основано на 255x255, так как это будут максимальные значения наших битовых диапазонов. Конечно, если вы используете Arduino UNO, одно из измерений будет отображено на 6 бит.

Чтобы вызвать инструмент, просто используйте этот формат

  python drawlog.py> arduino_list.txt  

Это создаст файл .txt с именем arduino_list.txt со списком Arduino для x_points, y_points и NUM_POINTS, сгенерированным для вас, готовым для копирования и вставки в ваш код.

Например, вот как выглядит файл .txt, когда вы его открываете. Вам просто нужно заменить эти строки в коде.

Вот как это выглядит после открытия. Оттуда вы можете рисовать что угодно.

Чтобы проверить это, я нарисовал следующую картинку. Код генерируется при закрытии окна.

А после загрузки кода на Arduino вот как это выглядело в режиме X-Y.

ВАЖНО:

Если вы столкнетесь с ошибкой компиляции, связанной с памятью, это связано с нехваткой памяти, доступной в Arduino UNO. Это означает, что вам следует рисовать менее детализированное изображение. Думаю, максимальное количество баллов было около 400, но может быть и больше. Если вы используете «синюю таблетку» или «черную таблетку» STM32, это число превышает 4 000.

Осциллограф, режим X-Y

Осциллограф должен быть установлен в режим x-y. 8-битный выход R-2R DAC (PORTD) будет подключен к каналу 1, а 6-битный R-2R DAC (PORTB) будет подключен к каналу 2. Оттуда вы можете регулировать его с помощью регуляторов, пока не увидите изображение.

Вот и все! Если у вас есть вопросы, не стесняйтесь спросить. Кроме того, если вы хотите попробовать его на синей или черной таблетке, вот ссылка на мою страницу GitHub с образцом кода

А теперь вот несколько изображений, которые я нарисовал.

Не стесняйтесь поделиться своим !!!

Изменить:

Важные сведения об управлении памятью

Как сказал Тим в комментариях

  • В коде Arduino итератор по точкам t является «байтовым» типом, поэтому поддерживает только до 255 точек. Почему бы не сделать его int?
  • Ваш код плоттера выводит "const unsigned long" для x_points и y_points - это не сработает, поскольку вы позже измените y-точки. Кроме того, почему бы просто не использовать «байт» для экономии памяти?

Помните об аппаратных ограничениях, которые вы используете. Для Arduino Uno лучше использовать байт, однако, если вы используете STM32 или даже ESP32, у вас будет больше точек для построения. Спасибо всем за отзывы.


Тимстер :

Я нашел способ значительно увеличить количество точек, поддерживаемых в UNO, - переместить их в пространство для хранения программ. Вы можете сделать это с помощью PROGMEM модификатор. Таким образом можно сохранить около 15 000 баллов!

Итак, объявляйте массивы следующим образом:

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

Не изменяйте y_points в функции настройки (т.е. удаляйте for петля там). Вместо этого сделайте небольшой сдвиг в функции цикла.

Также вам понадобится специальная команда для чтения данных из памяти программы (pgm_read_byte_near). Итак, цикл for в void loop () выглядит так:

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

Затем можно сохранить одно изображение с высоким разрешением или несколько изображений меньшего размера и переключаться между ними 😃

Код

  • Код Arduino
  • Инструмент для рисования
Код Arduino Arduino
Скетч Arduino для использования на плате Arduino Uno или Nano
 const byte FIGURE_DELAY =1; // отслеживаем задержку в США. при необходимости отрегулируйте const int NUM_POINTS =87; // количество точек XY на рисунке // координаты x и y для построения байта 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 [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,112,110,109,107,106,106,108,110,112,117,116,117,114,114,114,114,114,114,115,110,110,112,117,114,114,114,114,114,114 , 92,91,90,89,87,86,84,82,81,80,78}; void setup () {// инициализируем порты D и B для записи DDRD =B11111111; DDRB =B00111111; байт t; для (t =0; t  
Инструмент для рисования Python
Инструмент рисования для экспорта точек в график
 import tkinter as tkX =[] Y =[] lastx, lasty =0, 0 # xy и addLine предназначены только для графических целей # on_move_press - это тот, который записывает его в список и исправляет Ydef xy (событие):# регистрирует координаты при нажатии мыши global lastx, lasty lastx, lasty =event.x, event.ydef addLine (event):# рисует линию от старой точки к новой глобальной lastx, lasty canvas.create_line ((lastx, lasty, event.x, event.y)) # это делает новую начальную точку рисования lastx, lasty =event.x, event.y # регистрирует координату нажатий в listdef on_move_press (event):curX, curY =(event.x, event.y) curY =255-curY # поскольку tkinter использует другие координаты X.append (str (curX)) Y.append (str (curY)) # необходимо настроить 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)) # привязать левый щелчок и перетащить к функциям и запустить loopcanvas.bind (" ", xy) canvas.bind ("  ", addLine) root.bind ("  ", on_move_press) root.mainloop () # удалить каждую вторую запись, чтобы уменьшить количество очков и увеличить обновление трассировки для i в диапазоне (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)) # вызов python drawlog.py> arduino_list.txt 

Схема


Производственный процесс

  1. Резисторы
  2. Создание сети беспроводных датчиков в вашем доме
  3. Следите за температурой в доме с помощью Raspberry Pi
  4. Лучшие аксессуары для Raspberry Pi
  5. Создайте свой собственный Google Voice HAT
  6. Измерьте время реакции
  7. Ваше руководство по динамическим резисторам
  8. Руководство по выбору ленточной пилы
  9. Как починить дверную ручку автомобиля
  10. Как отремонтировать ржавчину на машине?