ATmega16 + DS18B20 + LED + Matlab / Simulink = AR

Saya berpikir entah bagaimana bermain-main dengan sensor DS18B20 . Ya, tidak hanya untuk mendapatkan nilai suhu (apa yang dapat dilakukan semua orang), tetapi juga memvisualisasikannya. Ada ide sederhana. Kami menempatkan webcam. Kami menyalakan lampu pada frame genap, pada yang aneh kami memadamkannya. Kurangi gambar - hanya flash yang tersisa. Di atasnya, kami mencari lokasi sensor, yang secara fisik melekat pada LED di ruang angkasa. Dan kemudian pemrosesan matematis. Nah, semua ini dalam simulinka. Di bawah katom dijelaskan cara menerima gambar yang indah. Dan bagi yang tidak mau mengerti, saya sarankan melihat eksperimen di akhir artikel.


Sirkuit


Sirkuit sangat sederhana. Jantung adalah ATmega16. Semua sensor DS18B20 tergantung pada satu pin (dalam kasus saya, pada PB0 port PORTB). Pin itu sendiri ditarik ke tegangan suplai melalui resistor 4,7 kฮฉ. Skema ini scalable. Gambar bisa diklik.



Semua LED terhubung ke port PORTA melalui terminating resistor. Poligon abu-abu berarti bahwa LED ini terhubung secara fisik ke DS18B20. Pin reset ditarik tinggi melalui resistor 10 kฮฉ untuk menghindari reset yang tidak disengaja karena gangguan. Mikrokontroler clock pada kuarsa 16 MHz. Letakkan sedekat mungkin dengan kesimpulan. Tangki muat digunakan secara internal. Dikonfigurasi melalui sekering. Keluarkan konektor ICP secara terpisah (untuk mengunggah firmware) dan UART untuk "komunikasi". Kapasitas C1 (elektrolit 10 ฮผF) dan C2 (keramik 100 nF). Letakkan sedekat mungkin ke pin daya mikrokontroler. Digunakan untuk menghindari pembuangan yang tidak disengaja selama transfer beban.

Perakitan sirkuit

Apa itu poligon abu-abu?

Algoritma Firmware + kerja


Firmware ditulis dalam C di Atmel Studio 7 IDE. Sumber diposting di GitHub . Kode didokumentasikan secara maksimal.
Proyek ini dibagi menjadi beberapa tingkatan abstraksi:
  • Perangkat Keras - tingkat terendah, pengikatan maksimal pada perangkat keras. Bekerja dengan pinggiran mikrokontroler.
  • Middleware adalah jalan tengah antara Hardware dan Drivers. Misalnya, implementasi protokol 1-kawat.
  • Driver - tingkat driver. Misalnya, bekerja dengan chip DS18B20.
  • Aplikasi - tingkat abstraksi tertinggi. Misalnya, menerima dan mentransmisikan suhu melalui UART.

Sekilas melalui fungsi utama. Pertama adalah tabel alamat ROM. Adalah perlu bahwa alamat sensor yang terhubung secara fisik ke LED nol (tergantung pada PA0 port PORTA) berada di posisi nol, dll. Untuk mendapatkan ROM, ada fungsi sendROMToUART . Anda hanya perlu mengingat bahwa sensor harus berada di bus saja, jika tidak akan ada konflik alamat.
utama
int main(void)
{	
	const uint8_t ROM[][sizeof(ROM_T)] = /* ROM array */
	{
		{0x26, 0x00, 0x00, 0x04, 0x4B, 0x15, 0x89, 0x28}, // 0
		{0x71, 0x00, 0x00, 0x04, 0x4A, 0xC0, 0x65, 0x28}, // 1
		{0xA5, 0x00, 0x00, 0x04, 0x4A, 0xCB, 0xCE, 0x28}, // 2
		{0x41, 0x00, 0x00, 0x04, 0x4A, 0xAC, 0x65, 0x28}, // 3
		{0x22, 0x00, 0x00, 0x04, 0x4B, 0x06, 0x0D, 0x28}, // 4
		{0x86, 0x00, 0x00, 0x04, 0x4A, 0xF6, 0x46, 0x28}  // 5
	};
	
	uint8_t nDevices = sizeof(ROM) / sizeof(ROM_T); /* Number of DS18B20 devices */
	
	initUART(MYUBRR); /* Initialization of UART with appropriate baudrate */
	initTimer0(); /* Initialization of Timer/counter0 */
	initLED(nDevices); /* Initialization of LEDs */
	
	{ /* DS18B20s initialization */
		uint8_t nDevices = sizeof(ROM) / sizeof(ROM_T); /* Number of DS18B20 devices */
		ROM_T *pROM = (ROM_T *)&ROM; /* Pointer to ROM array */
		
		initDQ(); /* Initialization of DQ pin */
		
		while (nDevices--) /* For all DS18B20 */
			initDS18B20(pROM++, RESOLUTION_11BIT); /* Initialization of DS18B20 with appropriate resolution */
	}
	
	sei(); /* Global enable interrupts */
	
	while (1) /* Infinite loop */
	{
		sendTemperatureToUART((ROM_T *)&ROM, nDevices); /* Execute function routine */
	}
}

Berikutnya adalah inisialisasi periferal dan DS-ok sendiri dengan resolusi yang sesuai. Periode pengambilan sampel suhu tergantung padanya. Untuk 11 bit, ini adalah 375 ms. Dalam loop tak terbatas, program terus membaca suhu dari setiap sensor dan mengirimkannya melalui UART.

Bekerja dengan LED didasarkan pada interupsi. Dengan UART, ID LED muncul 2 kali berturut-turut pada frame genap dan ganjil. Pada awalnya, LED menyala. Timer padam setelah waktu tertentu (dalam kasus saya, 15 ms). Kali kedua diabaikan begitu saja. Timer dikonfigurasikan dalam mode CTC sehingga interupsi terjadi setiap 1 ms.
kode
volatile uint8_t ledID = 0; /* Current ledID value */
volatile uint8_t ledID_prev = 255;  /* Previous ledID value */
volatile uint8_t duration = FLASH_DURATION; /* Flash duration value */

ISR(USART_RXC_vect) /* UART interrupt handler */
{
	ledID = UDR; /* Assign ledID to receive via UART value */
	if (ledID != ledID_prev) /* If current ledID equal to previous value */
	{
		turnOnLED(ledID); /* Turn on the ledID LED */
		timer0Start(); /* Start Timer0 */
		ledID_prev = ledID; /* Previous ledID assign to current */
		duration = FLASH_DURATION; /* Update LED flash duration */
	}
}

ISR(TIMER0_COMP_vect) /* Timer0 compare interrupt handler */
{
	if (--duration == 0) /* Decrement Duration value each 1ms and if it reach to 0 */
	{
		timer0Stop(); /* Stop Timer0 */
		turnOffAllLED(); /* Turn off all LEDs */
		timer0Clear(); /* Clear Timer0 counter register */
	}
}

Bagian kode yang peka terhadap waktu, yang merupakan sinyal 1-Kawat, dibungkus dengan konstruksi ATOMIC_BLOCK . Semua pengaturan dasar dibuat di global.h . UART beroperasi pada kecepatan 250.000. Cepat dan bebas kesalahan untuk kuarsa 16 MHz. Driver DS18B20 memiliki fungsi minimum yang diperlukan untuk proyek ini. Sisanya - lihat kodenya. Akan ada pertanyaan - tanyakan, jangan malu-malu. Saya juga ingin mengingatkan Anda tentang pengaturan sekering. Mereka perlu mengatur kemampuan clocking dari kuarsa eksternal, jika tidak maka akan dari generator internal (dan itu adalah maksimum 8 MHz dan tidak sangat stabil). Nah, programkan bit CKOPT, kalau tidak kuarsa di atas 8 MHz tidak akan mulai. Saya memiliki Fuse Tinggi = 0xD9 , Fuse Rendah = 0xFF .

Algoritma operasi model Simulink +


Versi Matlab R2015b . Dalam Simulink , selain built-in perpustakaan, terutama digunakan Computer Vision System Toolbox dan Gambar Akuisisi Toolbox . Seluruh model dan file terkait diunggah ke GitHub . Di bawah ini adalah deskripsi rinci dengan contoh ilustrasi. Semua gambar dapat diklik.

Modul WebCamTemp


Blok kuning menunjukkan blok port COM. Pemancar, penerima, dan konfigurator secara terpisah. Pengaturan port harus sama persis dengan yang mikrokontroler (kecepatan, paritas, jumlah bit, dll.). Penerima mengambil suhu dengan mengelompokkannya ke dalam array satu dimensi ukuran [n 1] tipe int16 , di mana n adalah jumlah DS18B20 (Saya punya 6). Setiap elemen dari array ini dibagi lagi dengan 16 . Ini dari lembar data di halaman 6. Pemancar mengirimkan nilai penghitung saat ini ke Penghitung . Itu hanya menyalakan LED tertentu. Berdetak dari 0 hingga n. Sampel periode 2. Blok yang bertanggung jawab untuk menampilkan / menyimpan aliran video dikelompokkan dalam warna biru. Hijau - blokir untuk menerima informasi video. Sebenarnya webcam itu sendiri. Ada banyak pengaturan, berbeda, tergantung pada pabriknya. Gambar ditampilkan dalam nada abu-abu. Sangat menarik. Blok Diff membuat perbedaan antara frame sebelumnya dan saat ini. Blok aneh Downsample hanya menyoroti perbedaan yang menyala - bukan LED yang menyala, tetapi tidak sebaliknya. Downsample even blok hanya melompati frame di mana LED mati.

Img diff
, โ€” . ( ). , . 0.25.



Gambar abu-abu
, โ€” , . , . .



Frame Rate Display menampilkan FPS saat ini. Semua pemrosesan ada di blok LED . Kami akan mempertimbangkannya sebagai berikut.

Modul LED


Violet mengelompokkan blok-blok untuk memperoleh Gaussians 2D . Kami membutuhkan dua: Interferensi dan Opacity . Mereka berbeda dalam sigma. Pusat mereka berada pada titik maksimum (di mana LED menyala). Koordinat terletak di blok Maksimum . Alih-alih terus-menerus menghasilkan Gaussians (dan eksponen adalah operasi matematika yang sangat memakan waktu), ia memutuskan untuk memotongnya. Untuk melakukan ini, dalam file-m, dua Int dan Op dihasilkan yang 2 kali lebih besar dengan pusat di tengah, di mana, lebih lanjut, yang diperlukan hanya dipotong dengan gangguan tanaman dan blok tanaman opacity .

Contoh kerja
โ€” . โ€” . โ€” . โ€” . 0.25.



Blok memori dilingkari hijau. Tujuan mereka adalah untuk menyimpan koordinat dan Gaussians untuk setiap LED. Kami mempertimbangkan lebih detail di bawah ini. Blok To color dimaksudkan untuk membangun distribusi suhu dan peta warna. Juga akan dibahas di bawah ini. Signal Unit komposisi Pengomposisian campuran dua gambar Image1 dan Image2 dengan cara sebagai berikut:


Blok Sisipkan Teks memaksakan teks yang diformat (dalam hal ini, suhu) pada gambar. Menerima n variabel dan koordinat dalam format [XY] . Anda dapat memilih font dan ukurannya. Blok di dalam kotak merah menerapkan algoritma moving average . Transisi menjadi tidak terlalu gugup, yang menjaga saraf dan menyenangkan mata.

Contoh
, โ€” 8- . ( ) .



Modul memori


Gangguan memori dan penyimpanan opacity Memori. Kumpulan Gaussian 2D, Poin Memori - koordinat untuk setiap LED.

Gangguan memori dan opacity memori
. Address . . . Delay LEDs ( , ). . Enable . , ( Maximum Threshold LEDs). โ€” . . [H W n], HxW โ€” -, n โ€” /.

Poin memori
. . Permute Matrix , [Y X], [X Y].

Untuk modul warna


Hijau - Pemrosesan opacity . Ringkas array input dalam dimensi ketiga. Kami menormalkannya secara maksimal. Lipat gandakan dengan nilai gain (dari 0 ke 1) (1) . Secara total, kami memiliki array dengan Gaussians yang saling bertumpukan dan mendapatkan keuntungan maksimum . Digunakan sebagai faktor untuk mencampur gambar. Merah - menerima peta warna suhu. Di sini sedikit berbeda matematika, semua Gaussians yang sama. Ini dijelaskan dengan rumus (2) . Secara kasar, suhu pada titik arbitrer adalah rata-rata tertimbang dari semua sensor. Tetapi pengaruh masing-masing sensor dalam rasio persentase sebanding dengan nilai Gaussian di dalamnya. Jumlah semua diambil sebagai 100%.


Tetap mempertimbangkan bagaimana distribusi suhu berubah menjadi peta warna. Apa yang dilingkari dengan warna biru mengubah suhu spesifik menjadi nilai antara 0 dan 1. Di zona merah, blok Prelookup menghitung indeks di mana nilai merah, hijau dan biru dicari. Array warna berisi 64 nilai. Intermediate dihitung dengan interpolasi. Dari fitur-fiturnya, ada dua mode: relatif dan absolut. Di tempat yang paling dingin dan terpanas, nilai minimum dan maksimum dari array input sesuai. Secara absolut, ada beberapa nilai konstan. Yang pertama, lebih mudah untuk melihat profil distribusi suhu. Di sisi lain, perubahan absolutnya.

file m


Itu dieksekusi di awal, sebelum simulasi, memperkenalkan variabel ke dalam Workspace.
kode
H = 480; % Height of image
W = 640; % Width of image
minT = 20; % Min temperature
maxT = 25; % Max temperature
sigmaInt = 40; % Sigma interference
sigmaOp = 80; % Sigma opacity
gain = 1.0; % Gain value
T = 0.3; % Threshold value
nAvr = 8; % number of means
% ------------------------------------------------------
[M,N] = meshgrid(-W:W, -H:H); % Meshgrid function

R = sqrt(M.^2 + N.^2); % Distance from the center

Int = normpdf(R, 0, sigmaInt); % 2D gaussian for interference
Op = normpdf(R, 0, sigmaOp); % 2D gaussian for opacity

Int = Int/max(max(Int)); % Normalization of interference gaussian
Op = Op/max(max(Op)); % Normalization of opacity gaussian

clear M N R sigmaInt sigmaOp % Delete unused variables from memory

load('MyColormaps','mycmap'); % Load colormap


Berisi variabel kontrol utama di antaranya:
  • H โ€” .
  • W โ€” .
  • minT โ€” .
  • maxT โ€” .
  • sigmaInt โ€” Interference.
  • sigmaOp โ€” Opacity.
  • gain โ€” Factor.
  • T โ€” .
  • nAvr โ€” .

H dan W harus cocok dengan arus di blok WebCamera. minT dan maxT memengaruhi peta warna dalam mode suhu absolut. T diatur dari 0 ke 1. Terkadang port COM dan webcam tidak sinkron. Fase gambar diferensial dapat berubah 180 ยฐ. Dan di mana harus ada maksimum - ada minimum. Dan sistem dapat memilih koordinat sewenang-wenang yang tidak sesuai dengan kenyataan. Untuk ini, ada sistem ambang batas. nAvr adalah jumlah rata-rata dalam moving average. Semakin besar, semakin halus transisi, tetapi relevansinya hilang (pergeseran waktu muncul). Untuk memahami efek dari variabel yang tersisa, kita tidak bisa menemukannya tanpa contoh ilustrasi.

Efek SigmaInt
. , , . โ€” .



Efek SigmaOp
.



Dapatkan efek
- . ยซยป ยซ ยป .



Eksperimen


Di bawah ini adalah beberapa percobaan.

Buka jendela


Sensor tersebar di tempat tidur dekat jendela. Jendela membuka dan menutup setelah beberapa saat. Contoh yang baik tentang perbedaan antara mode relatif (kiri) dan absolut (kanan). Menggunakan yang pertama, nyaman untuk mempertimbangkan distribusi, dan yang kedua, bagaimana dingin didistribusikan atau panas dipulihkan.



Windowsill


Sensor terletak di sepanjang jendela. Jendela terbuka - profil berubah. Zona terdingin dan terhangat jelas terlihat.



Apakah lebih hangat di atas?


Mereka mengatakan bahwa bagian atas lebih hangat. Eksperimen ini adalah konfirmasi lengkap untuk ini. Pada detik ke-10, jendela terbuka, pada tanggal 30 - jendela ditutup.



Kesimpulan


Skema semacam itu tidak akan menggantikan imager termal yang lengkap. Tapi dia tidak bisa melihat penyebaran massa udara. Dan dengan harga desain ini jauh lebih rendah. Anda dapat menggunakan peta warna berbeda di dalamnya. Anda dapat mengambil fungsi lain, bukan Gaussians. Anda bahkan dapat mengubah hukum konstruksi. Atau tulis ulang ke OpenCV + QT untuk kecepatan dan kenyamanan. Tapi itulah yang saya bayangkan - saya telah capai. Just Just For Fun .

Source: https://habr.com/ru/post/id390985/


All Articles