Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Gambar Apa Pun di Osiloskop Anda

Komponen dan persediaan

Resistor 1k ohm
Setiap nilai resistor dapat diterima selama Anda menjaga rasio DAC dengan benar. Anda tidak perlu 50 jika Anda memiliki resistor 2k. Atau dua kali nilai resistor pilihan Anda.
× 50
Arduino UNO
Atau "pil biru" atau "pil hitam" STM32.
× 1

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

R-2R DAC

Salah satu implementasi paling sederhana dari konverter digital ke analog dapat dicapai dengan merancang DAC tangga R-2R. Jenis DAC ini hanya membutuhkan resistor untuk bekerja menjadikannya DAC yang sangat ramah pemula.

Prinsip dasar DAC jenis ini adalah Anda hanya membutuhkan dua nilai untuk resistor. R dan 2R. Kemudian Anda dapat mengaturnya seperti yang ditunjukkan pada skema di bawah ini.

R bisa apa saja asalkan setiap kemunculan R dalam skema memiliki nilai yang sama.

Misalnya, jika kita memilih R =1k, maka 2R hanya akan menjadi dua kali lipat jumlahnya. Dalam hal ini 2R =2k. Jadi Anda bisa menggunakan resistor 1k dan 2k saja.

Jika Anda menggunakan R=3.3K maka 2R =6.6k dan seterusnya. Jika Anda hanya ingin menggunakan nilai resistor yang sama untuk semuanya, maka untuk mendapatkan 2R, Anda hanya perlu memasangkan dua resistor secara seri dan itu akan meningkatkan jumlah komponen Anda.

Jumlah bit ditentukan oleh berapa banyak cabang 2R yang Anda miliki. Dalam proyek ini kita akan menggunakan R-2R 8-bit dan R-2R 6-bit untuk Arduino Uno atau Nano. Jika Anda menggunakan mikrokontroler lain yang Anda tahu mendukung manipulasi port penuh setidaknya 8-bit seperti "pil biru" dan "pil hitam" STM32, Anda cukup menggunakan dua DAC 8-bit.

Komentar tambahan tentang IC DAC:

Proyek ini difokuskan pada penggunaan DAC R-2R, tetapi Anda dapat merasa bebas menggunakan IC DAC untuk mencapai hal serupa. Jika Anda akan menggunakan IC DAC, saya sarankan menggunakan yang mendukung protokol komunikasi cepat seperti SPI karena I2C akan terlalu lambat untuk menggambar gambar yang detail. Saya tidak akan membahas cara menggunakan IC DAC di posting ini tetapi mungkin di masa mendatang. R-2R masih merupakan metode pilihan saya karena dapat menampilkan gambar dengan lebih detail.

Manipulasi port

Kami akan menggunakan manipulasi port paralel mikrokontroler kami. Alasan untuk melakukannya adalah karena memungkinkan kecepatan output yang lebih cepat dan juga membuat kode tetap sederhana. Anda dapat membaca detail lebih lanjut tentang register port untuk Arduino di tautan ini.

Arduino Uno dan Nano memiliki mikrokontroler ATmega328p. Mikrokontroler ini berbagi pemetaan pin yang sama dengan Atmega168:

Pin dan bit port dilambangkan dengan label PXN di mana X adalah huruf port dan N adalah nomor bit.

Contoh:PB1 untuk PORT B ​​bit 1. Demikian pula PC5 untuk PORT C bit 5.

Jika kita memeriksa pin, kita melihat bahwa mikrokontroler memiliki port B, C, dan D. Dengan kembali ke referensi Arduino kita dapat melihat port mana yang dapat ditulis atau dibaca atau keduanya. Dalam aplikasi kami, kami hanya peduli tentang menulis.

Dokumentasi menyatakan bahwa PORTD membaca/menulis dan dipetakan ke pin digital 0 hingga 7. Ini memberi kita 8-bit penuh port untuk menulis.

Selanjutnya kita memiliki PORTB yang sebagaimana dinyatakan dipetakan ke pin digital 8-13. Pernyataan tambahan dibuat mengatakan bahwa 6&7 yang akan melengkapi 8-bit penuh tidak dapat diakses. Port ini hanya dapat digunakan untuk menulis 6-bit.

Hal yang sama berlaku untuk PORTC. Ini dipetakan ke pin analog 0-5 tetapi dua pin juga dicadangkan sehingga kita hanya dapat menulis 6-bit.

Karena batasan ini, kita harus menggunakan kombinasi DAC 8-bit untuk PORTD dan DAC 6-bit untuk PORTC atau PORTB.

Kami akan menggunakan PORTD dan PORTB dan sekarang kami dapat mulai memasang kabel DAC ke pin.

Jika Anda memerlukan bantuan visual tentang cara merakit, inilah cara saya merakit kedua R-2R di papan tempat memotong roti. Perhatikan bahwa saya menggunakan dua R-2R sejak saya mengujinya pada "pil hitam" STM32 saya. Saya memasang dua kabel jumper sehingga saya bisa menghubungkan probe osiloskop saya ke sana dan juga kabel ground di sampingnya. Saya menggunakan semua resistor 10k jadi untuk 2R saya, saya memasang dua resistor 10k secara seri.

Berikut adalah pengaturan papan tempat memotong roti yang lebih bersih menggunakan Tinkercad. Saya menandai output dengan X dan Y karena itulah yang akan dihubungkan dengan probe osiloskop kita. Jika Anda memerlukan panduan lebih lanjut tentang pengaturan, saya akan memberikan skema yang menunjukkan tangga R-2R yang terdiri dari semua dengan nilai resistor yang sama dan satu lagi dengan dua nilai.

Pastikan untuk memeriksa alasan Anda! Setiap kali saya merakit setup ini saya cenderung lupa. Pastikan juga Anda tidak meninggalkan celah tanpa koneksi.

ArduinoCode

Sekarang saatnya membuat sketsa Arduino.

Pertama kita perlu mengatur port kita menjadi output. Dari referensi Arduino tentang manipulasi port. Kita dapat melihat cara mengatur port:

Pada dasarnya nilai 1 untuk bit akan ditetapkan sebagai output dan nilai 0 akan ditetapkan sebagai input. Untuk PORTD kita dapat menulis secara langsung karena semua bit dapat diakses. Untuk PORTB, ingatlah bahwa bit 6 dan 7 tidak dapat digunakan karena mereka memetakan ke kristal. Sebaiknya gunakan bitwise OR dengan nilai 0 untuk menghindari modifikasi bit yang tidak akan disetel.

Dalam loop pengaturan kami, ini akan menjadi kode:

Kode akan dilampirkan untuk diunduh, jadi jangan khawatir mengetiknya dengan tangan.

Perulangan for di bawah konfigurasi hanya memetakan ulang nilai untuk port 6-bit. Nilai-nilai ini akan berasal dari daftar yang akan memiliki nilai kisaran 8-bit. Untuk memetakan ulang ke 6-bit, nilai maksimal kami adalah 2^6-1 yaitu 63. Kami memetakan dari rentang 0 hingga 2^8-1 yaitu 255. Alasan kami memetakan ulang dalam kode Arduino adalah karena alat plotter tangan akan menampilkan titik x dan y dalam bentuk 8-bit. Kita dapat mengubahnya dalam salah satu kode, tetapi lebih baik mengubahnya pada mikrokontroler yang digunakan.

Pada dasarnya kita membutuhkan beberapa penundaan tergantung pada osiloskop. Saya menemukan bahwa untuk saya 1 baik-baik saja. Sebenarnya, menghilangkan penundaan sepenuhnya juga baik-baik saja. Untuk poin, itu akan secara otomatis dihasilkan oleh alat plotter tangan kami sehingga Anda cukup menyalin dan menempelkan nomornya tetapi pada dasarnya ini adalah berapa banyak poin yang ada untuk diplot sehingga variabel iterasi dapat melewatinya. Berikut kode lengkapnya:

Array x_points dan y_points akan berbeda untuk Anda setiap kali Anda menggambar sesuatu dan akan dibuat secara otomatis dengan alat kami.

Komentar sampingan pada PWM cepat:

Jika Anda adalah pengguna mikrokontroler tingkat lanjut, Anda mungkin menyadari bahwa jika memperhatikan kecepatan, maka mungkin hal yang sama dapat dicapai dengan PWM cepat dan memodifikasi register jam. Kemudian mengumpankan output PWM ke filter low-pass untuk mendapatkan tegangan analog yang akan mengurangi jumlah pin. Saya telah mencoba kedua metode, dan ini masih menghasilkan dukungan yang lebih baik untuk gambar dengan lebih detail. Setidaknya di Arduino Uno

Alat Menggambar

Saya membuat alat ini di Python 3 menggunakan tkinter. Jika Anda belum menginstal tkinter, instal dengan pip.

pip install tk 

Kode hanya akan dilampirkan, tetapi pada dasarnya ia mencatat koordinat pada jendela tempat kursor Anda diklik. Jangan mencoba mengubah ukuran jendela karena akan mengubah resolusi. Jika Anda ingin lebih tepatnya, gunakan alat kaca pembesar di Windows. Jendela didasarkan pada 255x255 karena itu akan menjadi nilai maksimum rentang bit kami. Tentu saja salah satu dimensi akan dipetakan ke 6-bit jika Anda menggunakan Arduino UNO.

Untuk memanggil alat cukup gunakan format ini

python drawlog.py> arduino_list.txt 

Ini akan membuat file a.txt bernama arduino_list.txt dengan daftar Arduino untuk x_points, y_points, dan NUM_POINTS yang dihasilkan untuk Anda, siap untuk disalin dan ditempelkan ke kode Anda.

Sebagai contoh, ini adalah tampilan file the.txt saat Anda membukanya. Anda hanya perlu mengganti baris-baris tersebut dalam kode.

Ini dia penampakannya setelah dibuka. Dari sana Anda dapat menggambar apa saja.

Saya menggambar gambar berikut untuk mengujinya. Kode dibuat saat jendela ditutup.

Dan setelah mengupload kode di Arduino, beginilah tampilannya dalam mode XY.

PENTING:

Jika Anda mengalami kesalahan kompilasi berbicara tentang memori, ini disebabkan oleh rendahnya memori yang tersedia di Arduino UNO. Itu berarti Anda harus menggambar gambar yang kurang detail. Saya pikir jumlah poin maksimum adalah sekitar 400, tetapi mungkin lebih. Jika Anda menggunakan "Pil Biru" atau "pil hitam" STM32, jumlah ini lebih dari 4.000.

Mode XY osiloskop

Osiloskop harus diatur ke mode xy. Output 8-bit R-2R DAC (PORTD) akan terhubung ke Channel 1 dan 6-bit R-2R DAC (PORTB) akan terhubung ke Channel 2. Dari sana Anda dapat menyesuaikannya dengan kenop hingga Anda melihat gambar.

Itu dia! Jika Anda memiliki pertanyaan jangan ragu untuk bertanya. Selain itu, jika Anda ingin mencobanya dengan pil biru atau pil hitam, inilah tautan ke halaman GitHub saya dengan beberapa kode contoh

Sekarang inilah beberapa gambar yang telah saya plot.

Jangan ragu untuk membagikan milik Anda!!!

Sunting:

Detail Penting untuk manajemen memori

Seperti yang disebutkan Tim di komentar

  • Dalam kode Arduino Anda, iterator Anda di atas titik, t, adalah tipe "byte", jadi hanya mendukung hingga 255 poin. Mengapa tidak menjadikannya sebagai "int"?
  • Kode plotter Anda menghasilkan "const unsigned long" untuk x_points dan y_points - yang tidak akan berfungsi saat Anda memodifikasi y-points nanti. Juga, mengapa tidak menggunakan "byte" saja untuk menghemat memori?

Waspadai keterbatasan perangkat keras yang Anda gunakan. Untuk Arduino Uno lebih baik menggunakan byte, namun jika Anda menggunakan STM32 atau bahkan ESP32, Anda akan memiliki lebih banyak poin yang tersedia untuk diplot. Terima kasih atas masukan Anda.


Timster :

Saya telah menemukan cara untuk secara besar-besaran meningkatkan jumlah poin yang didukung pada UNO - pindahkan mereka ke ruang penyimpanan program. Anda dapat melakukannya dengan PROGMEM pengubah. Dengan cara ini Anda dapat menyimpan sekitar 15.000 poin!

Jadi deklarasikan array seperti ini:

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

Jangan lakukan modifikasi pada y_points dalam fungsi setup (yaitu menghapus for lingkaran di sana). Alih-alih lakukan sedikit pergeseran dalam fungsi loop.

Anda juga memerlukan perintah khusus untuk membaca data dari memori program (pgm_read_byte_near). Jadi perulangan for dalam void loop() terlihat seperti:

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

Maka dimungkinkan untuk menyimpan satu gambar beresolusi tinggi atau beberapa gambar yang lebih kecil dan beralih di antara gambar tersebut 😃

Kode

  • Kode Arduino
  • Alat Pembuatan Peta
Kode ArduinoArduino
Sketsa Arduino untuk digunakan di papan Arduino Uno atau Nano
const byte FIGURE_DELAY =1; // lacak penundaan di AS. sesuaikan jika perluconst int NUM_POINTS =87;// jumlah titik XY pada gambar// koordinat x dan y untuk plot 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}; 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(){ // menginisialisasi port D dan B untuk menulis DDRD =B11111111; DDRB =B00111111; byte t; for (t=0; t  
Alat Pembuatan PetaPython
Alat menggambar untuk mengekspor poin ke plot
import tkinter as tkX =[]Y =[]lastx, lasty =0, 0# xy dan addLine hanya untuk tujuan grafis# on_move_press adalah yang mencatat satu ke daftar dan memperbaiki Ydef xy(event):# mencatat koordinat saat mouse diklik global lastx, lasty lastx, lasty =event.x, event.ydef addLine(event):# menarik garis dari titik lama ke titik baru global lastx, lasty canvas.create_line ((lastx, lasty, event.x, event.y)) # ini membuat titik awal baru menggambar lastx, lasty =event.x, event.y# log klik koordinat pada listdef on_move_press( event):curX, curY =(event.x, event.y) curY=255-curY # karena tkinter menggunakan koordinat yang berbeda X.append(str(curX)) Y.append(str(curY))# set up diperlukan untuk windowroot =tk.Tk( )root.geometry("255x255")root.columnconfigure(0, weight=1)root.rowconfigure(0, weight=1)canvas =tk.Canvas(root)canvas.grid(column=0, baris=0, sticky =(tk.N, tk.W, tk.E, tk.S))# ikat klik kiri dan seret ke fungsi dan mulai loopcanvas.bind("", xy)canvas.bind("", addLine)root.bind("",on_move_press)root.mainloop()# hapus setiap entri ke-2 untuk mengurangi poin dan tingkatkan penyegaran jejak untuk i dalam rentang(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

Skema


Proses manufaktur

  1. Resistor
  2. Membangun Jaringan Sensor Nirkabel di Rumah Anda
  3. Pantau suhu rumah Anda menggunakan Raspberry Pi
  4. Aksesori terbaik untuk Raspberry Pi Anda
  5. Buat Google Voice HAT Anda
  6. Ukur waktu reaksi Anda
  7. Panduan Anda Untuk Resistor Dinamis
  8. Panduan Pemilihan Band Saw Anda
  9. Cara memperbaiki pegangan pintu mobil Anda
  10. Bagaimana cara memperbaiki karat pada mobil Anda?