산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

오실로스코프에 무엇이든 그리기

구성품 및 소모품

저항 1k 옴
DAC 비율을 올바르게 유지하는 한 모든 저항 값을 사용할 수 있습니다. 2k 저항이 있으면 50이 필요합니다. 또는 선택한 저항 값의 2배입니다.
× 50
Arduino UNO
또는 STM32 "파란색 알약" 또는 "검은색 알약"
× 1

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

R-2R DAC

디지털-아날로그 변환기의 가장 간단한 구현 중 하나는 R-2R 사다리 DAC를 설계하여 달성할 수 있습니다. 이 유형의 DAC는 저항만 있으면 작동하므로 초보자에게 매우 친숙한 DAC입니다.

이 유형의 DAC의 기본 원리는 저항에 대해 두 개의 값만 필요하다는 것입니다. R 및 2R. 그런 다음 아래 회로도와 같이 설정할 수 있습니다.

R은 회로도에서 R의 각 항목이 동일한 값이면 무엇이든 될 수 있습니다.

예를 들어 R =1k를 선택하면 2R은 금액의 2배가 됩니다. 이 경우 2R =2k입니다. 따라서 1k 및 2k 저항만 사용할 수 있습니다.

R=3.3K를 사용한 경우 2R =6.6k 등입니다. 모든 것에 대해 동일한 값의 저항을 사용하고 싶다면 2R을 얻으려면 두 개의 저항을 직렬로 연결하기만 하면 됩니다. 그러면 구성 요소 수가 늘어납니다.

비트 수는 튀어나온 2R의 분기 수에 따라 결정됩니다. 이 프로젝트에서는 Arduino Uno 또는 Nano용으로 8비트 R-2R과 6비트 R-2R을 사용할 것입니다. STM32 "파란 알약" 및 "검은 알약"과 같이 최소 8비트의 전체 포트 조작을 지원하는 다른 마이크로컨트롤러를 사용하는 경우 8비트 DAC 2개만 사용할 수 있습니다.

DAC IC에 대한 부가 설명:

이 프로젝트는 R-2R DAC 사용에 중점을 두고 있지만 DAC IC를 사용하여 비슷한 것을 달성할 수 있습니다. DAC IC를 사용할 예정이라면 I2C가 너무 느려서 디테일한 이미지를 그리지 못하기 때문에 SPI와 같은 고속 통신 프로토콜을 지원하는 IC를 사용하는 것이 좋습니다. 이 게시물에서 DAC IC를 사용하는 방법에 대해서는 다루지 않겠지만 향후에는 가능할 것입니다. R-2R 더 자세한 이미지를 출력할 수 있기 때문에 여전히 선호하는 방법입니다.

포트 조작

우리는 마이크로컨트롤러의 병렬 포트 조작을 사용할 것입니다. 그렇게 하는 이유는 더 빠른 출력 속도를 허용하고 코드를 단순하게 유지하기 때문입니다. 이 링크에서 Arduino용 포트 레지스터에 대한 자세한 내용을 읽을 수 있습니다.

Arduino Uno 및 Nano에는 ATmega328p 마이크로 컨트롤러가 있습니다. 이 마이크로컨트롤러는 Atmega168과 동일한 핀 매핑을 공유합니다.

포트 핀과 비트는 레이블 PXN으로 표시되며, 여기서 X는 포트 문자이고 N은 비트 번호입니다.

예:PB1은 PORT B ​​비트 1용입니다. 마찬가지로 PC5는 PORT C 비트 5용입니다.

핀을 검사하면 마이크로 컨트롤러에 포트 B, C 및 D가 있음을 알 수 있습니다. Arduino 참조로 돌아가서 어떤 포트를 쓰거나 읽을 수 있는지 또는 둘 다에서 볼 수 있습니다. 우리 애플리케이션에서는 쓰기에만 관심이 있습니다.

문서에는 PORTD가 읽기/쓰기이며 디지털 핀 0~7에 매핑되어 있다고 나와 있습니다. 이렇게 하면 쓸 포트의 전체 8비트가 제공됩니다.

다음으로 명시된 대로 디지털 핀 8-13에 매핑된 PORTB가 있습니다. 전체 8비트를 완성하는 6&7은 액세스할 수 없다는 추가 설명이 있습니다. 이 포트는 6비트 쓰기에만 사용할 수 있습니다.

PORTC도 마찬가지입니다. 아날로그 핀 0-5에 매핑되지만 2개의 핀도 예약되어 쓰기에 6비트만 제공합니다.

이러한 제한 때문에 PORTD용 8비트 DAC와 PORTC 또는 PORTB용 6비트 DAC를 조합하여 사용해야 합니다.

PORTD와 PORTB를 사용할 것이며 이제 DAC를 핀에 연결할 수 있습니다.

조립 방법에 대한 시각적 도움이 필요한 경우 브레드보드에 R-2R 두 개를 모두 조립한 방법입니다. STM32 "검은 알약"에서 테스트했기 때문에 두 개의 R-2R을 사용했습니다. 오실로스코프 프로브와 측면의 접지선을 연결할 수 있도록 두 개의 점퍼 와이어를 튀어나오게 했습니다. 10k 저항을 모두 사용했기 때문에 2R에는 2개의 10k 저항을 직렬로 연결했습니다.

Tinkercad를 사용하여 더 깔끔한 브레드보드 설정은 다음과 같습니다. 오실로스코프 프로브가 연결될 출력이므로 X와 Y로 출력을 표시했습니다. 설정에 대한 추가 지침이 필요한 경우 동일한 저항 값으로 구성된 R-2R 래더와 두 값을 가진 다른 래더를 보여주는 개략도를 제공하겠습니다.

근거를 꼭 확인하세요! 이 설정을 조립할 때마다 잊어버리는 경향이 있습니다. 또한 연결되지 않은 틈이 없는지 다시 확인하십시오.

Arduino 코드

이제 Arduino 스케치를 할 시간입니다.

먼저 포트를 출력으로 설정해야 합니다. 포트 조작에 대한 Arduino 참조에서. 포트를 설정하는 방법을 볼 수 있습니다.

기본적으로 비트의 값이 1이면 출력으로 설정되고 값이 0이면 입력으로 설정됩니다. PORTD의 경우 모든 비트에 액세스할 수 있으므로 직접 쓸 수 있습니다. PORTB의 경우 비트 6과 7은 크리스탈에 매핑되기 때문에 사용할 수 없습니다. 설정되지 않을 비트를 수정하지 않으려면 값이 0인 비트 OR을 사용하는 것이 좋습니다.

우리의 설정 루프에서 이것은 코드가 될 것입니다:

코드는 다운로드용으로 첨부되어 있으므로 손으로 입력하는 것에 대해 걱정하지 마십시오.

구성 아래의 for 루프는 단순히 6비트 포트의 값을 다시 매핑합니다. 이 값은 8비트 범위의 값을 갖는 목록에서 가져옵니다. 6비트로 다시 매핑하려면 최대 값이 2^6-1인 63이 됩니다. 0에서 2^8-1 범위인 255까지 매핑합니다. Arduino 코드에서 다시 매핑하는 이유는 핸드 플로터 도구는 x 및 y 포인트를 8비트로 출력합니다. 어느 코드에서나 변경할 수 있지만 사용하는 마이크로컨트롤러에서 변경하는 것이 좋습니다.

기본적으로 오실로스코프에 따라 약간의 지연이 필요합니다. 나는 내 1이 괜찮다는 것을 알았습니다. 사실 딜레이를 완전히 생략해도 괜찮습니다. 포인트의 경우 핸드 플로터 도구에 의해 자동으로 생성되므로 숫자를 복사하여 붙여넣을 수 있지만 기본적으로 이것은 반복 변수가 통과할 수 있도록 플롯할 포인트의 수입니다. 어쨌든 전체 코드는 다음과 같습니다.

x_points 및 y_points 배열은 무언가를 그릴 때마다 다르며 도구를 사용하여 자동으로 생성됩니다.

빠른 PWM에 대한 부가 설명:

마이크로컨트롤러의 고급 사용자라면 속도가 걱정된다면 아마도빠른 PWM과 클럭 레지스터 수정을 통해 동일하게 달성할 수 있습니다. 그런 다음 PWM 출력을 저역 통과 필터에 공급하여 핀 수를 줄이는 아날로그 전압을 얻습니다. 나는 두 가지 방법을 모두 시도했지만 여전히 더 자세한 이미지를 더 잘 지원합니다. 적어도 Arduino Uno에서는

그리기 도구

tkinter를 사용하여 Python 3에서 이 도구를 만들었습니다. tkinter가 설치되어 있지 않다면 pip로 설치하세요.

pip install tk 

코드는 그냥 첨부되지만 기본적으로는 커서를 클릭한 창의 좌표를 기록합니다. 해상도가 변경될 수 있으므로 창 크기를 조정하지 마십시오. 좀 더 정확하게 하고 싶다면 Windows에서 돋보기 도구를 사용하세요. 이 창은 255x255를 기반으로 하며 이는 비트 범위의 최대값이 될 것이기 때문입니다. 물론 Arduino UNO를 사용하는 경우 치수 중 하나가 6비트로 매핑됩니다.

도구를 호출하려면 이 형식을 사용하기만 하면 됩니다.

python drawlog.py> arduino_list.txt 

그러면 x_points, y_points 및 NUM_POINTS에 대한 Arduino 목록이 포함된 arduino_list.txt라는 .txt 파일이 생성되며 복사하여 코드에 붙여넣을 준비가 됩니다.

예를 들어 .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 페이지 링크가 있습니다.

이제 제가 그린 몇 가지 이미지가 있습니다.

자유롭게 공유하세요!!!

수정:

메모리 관리를 위한 중요 세부정보

Tim이 댓글에서 언급했듯이

<울>
  • Arduino 코드에서 포인트에 대한 반복자 t는 "바이트" 유형이므로 최대 255개 포인트만 지원합니다. 왜 "int"로 만들지 않습니까?
  • 플로터 코드는 x_points 및 y_points에 대해 "const unsigned long"을 출력합니다. 이는 나중에 y-points를 수정할 때 작동하지 않습니다. 또한 "byte"를 사용하여 메모리를 절약하는 것이 어떻습니까?
  • 사용 중인 하드웨어 제한 사항에 유의하십시오. Arduino Uno의 경우 바이트를 사용하는 것이 더 좋지만 STM32 또는 ESP32를 사용하는 경우 더 많은 포인트를 사용할 수 있습니다. 피드백을 주신 모든 분들께 감사드립니다.


    팀스터 :

    UNO에서 지원되는 포인트 수를 크게 늘리는 방법을 찾았습니다. 이를 프로그램 저장 공간으로 옮기십시오. PROGMEM을(를) 사용하여 이 작업을 수행할 수 있습니다. 수정자. 이렇게 하면 약 15,000포인트를 저장할 수 있습니다!

    따라서 다음과 같이 배열을 선언합니다.

    const int NUM_POINTS =...
    const 바이트 x_points[NUM_POINTS] PROGMEM ={...
    const 바이트 y_points[NUM_POINTS] PROGMEM ={...

    설정 기능에서 y_points를 수정하지 마십시오(예:for 제거 루프). 대신 루프 기능에서 약간의 이동을 수행하십시오.

    또한 프로그램 메모리(pgm_read_byte_near)에서 데이터를 읽으려면 특수 명령이 필요합니다. 따라서 void loop()의 for 루프는 다음과 같이 보입니다:

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

    그런 다음 하나의 고해상도 이미지 또는 여러 개의 작은 이미지를 저장하고 순환할 수 있습니다 😃

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • Arduino 코드
  • 플로팅 도구
  • Arduino 코드Arduino
    Arduino Uno 또는 Nano 보드에서 사용할 Arduino 스케치
    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,99,946,93, , 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,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를 쓰기 위해 포트 D와 B를 초기화 =B11111111; DDRB =B00111111; 바이트 t; for (t=0; t  
    플로팅 도구Python
    plot
    import tkinter로 점을 내보내는 그리기 도구 tkX =[]Y =[]lastx, lasty =0, 0# xy 및 addLine은 그래픽 전용입니다# on_move_press는 하나를 목록에 기록하고 수정 Ydef xy(event):# 마우스 클릭 시 좌표 기록 global lastx, lastx lastx, lasty =event.x, event.ydef addLine(event):# 이전 지점에서 새 지점으로 선을 그립니다. global 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, 고정 =(tk.N, tk.W, tk.E, tk.S))# 왼쪽 클릭을 바인딩하고 함수로 드래그하고 loopcanvas.bind("", xy)canvas.bind("", addLine)root.bind("",on_move_press)root.mainloop()# 포인트를 줄이기 위해 모든 두 번째 항목을 삭제하고 범위(1,int(len(X)/2))에서 i에 대한 추적 새로 고침 증가: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

    회로도


    제조공정

    1. 저항기
    2. 가정에 무선 센서 네트워크 구축
    3. Raspberry Pi를 사용하여 집 온도 모니터링
    4. Raspberry Pi를 위한 최고의 액세서리
    5. 나만의 Google 보이스 HAT 만들기
    6. 반응 시간 측정
    7. 동적 저항기 가이드
    8. 밴드쏘 선택 가이드
    9. 자동차 문 손잡이를 고치는 방법
    10. 자동차의 녹을 수리하는 방법?