Membuat kamera termal DIY berdasarkan Raspberry Pi

gambar

Hai semuanya!

Musim dingin telah tiba, jadi saya harus memeriksa isolasi termal dacha tempat tinggal saya di luar kota . Dan ternyata pasar China yang terkenal mulai menjual modul kamera termal murah. Jadi saya memutuskan untuk membuat DIY dan membangun hal yang agak eksotis dan berguna - pelindung panas untuk rumah. Kenapa tidak Terutama karena aku punya Raspberry Pi yang berbaring di sekitar ... Hasilnya di bawah.

MLX90640. Apa itu


Ini adalah matriks kamera termal dengan mikrokontroler onboard, dibuat oleh perusahaan yang tidak dikenal (untuk saya) bernama Melexis. Matriksnya berukuran 32x24 piksel, yang tidak banyak, tetapi setelah interpolasi cukup untuk melihat tren umum.

gambar

Sensor ini hadir dalam dua versi, satu-satunya perbedaan adalah casing dan FoV kamera. Model A yang lebih membumi mengamati dunia dengan 110 derajat horizontal dan 75 vertikal. Model B masing-masing memiliki 55 dan 37,5 derajat. Kasing ini memiliki empat keluaran - dua untuk daya dan dua untuk berbicara ke perangkat pengontrol melalui I2C. Lembar data dapat ditemukan di sini .

Apa GY-MCU90640, kalau begitu?


Rekan Cina kami juga mengirimkan chip MLX90640 dengan mikrokontroler lain di papan (STM32F103), mungkin untuk kontrol matriks yang lebih mudah. Seluruh unit disebut GY-MCU90640, dan biayanya sekitar 5.000 RUB (sekitar $ 80) pada Desember 2018. Sepertinya ini:

gambar

Seperti yang bisa kita lihat, ada juga dua versi model ini, dengan sensor yang berbeda

Mana yang terbaik? Sayangnya, saya hanya bertanya pada diri sendiri pertanyaan ini setelah modul telah dipesan, dikirim dan diterima. Saya belum memikirkannya saat memilih.

Versi sudut yang lebih luas paling cocok untuk robot yang bisa mengemudi sendiri atau sistem CCTV (karena bidang pandangnya lebih baik). Lembar data mengatakan itu juga kurang berisik dan lebih akurat.

gambar

Tetapi untuk visualisasi saya akan merekomendasikan model B yang lebih "eagle-eyed", untuk satu alasan yang sangat penting. Dapat diputar di tempat (secara manual atau melalui drive) untuk membuat gambar gabungan jauh lebih rinci daripada resolusi 32x24. Tapi saya tidak punya, jadi nanti saya akan berbicara tentang model A bersudut lebih luas.

Menghubungkan ke Raspberry Pi


Kami dapat mengontrol kamera termal dengan dua cara:

  • Ringkas pin "SET" di papan tulis dan gunakan protokol I2C untuk mengontrol mikrokontroler MLX90640 secara langsung
  • Biarkan pin dan gunakan controller STM32F103 melalui RS-232 atau antarmuka serupa.

Jika Anda kode dalam C ++, Anda mungkin lebih baik mengabaikan pengontrol tambahan, pin pendek dan gunakan API pabrikan, ditemukan di sini .

Pythonists yang rendah hati juga bisa menggunakan opsi pertama. Tampaknya ada beberapa perpustakaan Python (di sini dan di sini ), tetapi tidak ada yang bekerja di luar kotak untuk saya.

Pythonists yang maju secara teoritis dapat menulis driver controller mereka sendiri. Lembar data menjelaskan cara mengekstrak bingkai darinya. Tetapi Anda harus menggambarkan semua prosedur kalibrasi secara manual, yang menurut saya terlalu sulit. Jadi saya menggunakan opsi 2. Ternyata agak berbelit-belit, tetapi masih bisa dikelola.

Berkat kecerdikan Cina (atau keberuntungan), konfigurasi output di papan tulis ternyata sangat nyaman:

gambar

Yang perlu saya lakukan adalah memasukkan papan ke port Raspberry. Papan memiliki konverter 5V-3V bawaan, sehingga output Rx dan Tx yang halus dari Pi tidak dalam bahaya.

Saya juga menambahkan bahwa Anda dapat menghubungkannya dengan cara yang sama saat menggunakan opsi 1, tetapi Anda harus sangat berhati-hati dan mahir dalam menyolder. Papan harus dipasang di sisi lain Pi (contohnya ada di foto header).

Perangkat lunak


Pasar Cina yang terkenal menawarkan perangkat lunak yang luar biasa ini untuk mengakses GY-MCU90640:

gambar

Rupanya juga harus ada beberapa deskripsi protokol komunikasi yang digunakan untuk mengakses mikrokontroler, dan setelah obrolan singkat dengan penjual (sangat menghormati dia), saya telah mengatakan protokol di tangan saya. Dalam PDF dan dalam bahasa Cina murni, murni.

Berkat Google Translate dan dosis copy-paste yang sehat, sekitar 90 menit kemudian protokolnya telah diterjemahkan. Saya mengunggahnya di gambar Github Ternyata papan memahami 6 perintah dasar, termasuk satu untuk meminta bingkai saat ini melalui port COM.

Setiap piksel dari matriks pada dasarnya adalah pembacaan suhu objek. Nilai suhu dalam derajat Celsius dikalikan dengan 100 (angka 2-byte). Bahkan ada mode khusus ketika papan mengirim frame ke Pi secara otomatis 4 kali per detik.

Skrip lengkap untuk menerima gambar termal:
"""MIT License Copyright (c) 2019 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.""" import serial, time import datetime as dt import numpy as np import cv2 # function to get Emissivity from MCU def get_emissivity(): ser.write(serial.to_bytes([0xA5,0x55,0x01,0xFB])) read = ser.read(4) return read[2]/100 # function to get temperatures from MCU (Celsius degrees x 100) def get_temp_array(d): # getting ambient temperature T_a = (int(d[1540]) + int(d[1541])*256)/100 # getting raw array of pixels temperature raw_data = d[4:1540] T_array = np.frombuffer(raw_data, dtype=np.int16) return T_a, T_array # function to convert temperatures to pixels on image def td_to_image(f): norm = np.uint8((f/100 - Tmin)*255/(Tmax-Tmin)) norm.shape = (24,32) return norm ########################### Main cycle ################################# # Color map range Tmax = 40 Tmin = 20 print ('Configuring Serial port') ser = serial.Serial ('/dev/serial0') ser.baudrate = 115200 # set frequency of module to 4 Hz ser.write(serial.to_bytes([0xA5,0x25,0x01,0xCB])) time.sleep(0.1) # Starting automatic data colection ser.write(serial.to_bytes([0xA5,0x35,0x02,0xDC])) t0 = time.time() try: while True: # waiting for data frame data = ser.read(1544) # The data is ready, let's handle it! Ta, temp_array = get_temp_array(data) ta_img = td_to_image(temp_array) # Image processing img = cv2.applyColorMap(ta_img, cv2.COLORMAP_JET) img = cv2.resize(img, (320,240), interpolation = cv2.INTER_CUBIC) img = cv2.flip(img, 1) text = 'Tmin = {:+.1f} Tmax = {:+.1f} FPS = {:.2f}'.format(temp_array.min()/100, temp_array.max()/100, 1/(time.time() - t0)) cv2.putText(img, text, (5, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 0), 1) cv2.imshow('Output', img) # if 's' is pressed - saving of picture key = cv2.waitKey(1) & 0xFF if key == ord("s"): fname = 'pic_' + dt.datetime.now().strftime('%Y-%m-%d_%H-%M-%S') + '.jpg' cv2.imwrite(fname, img) print('Saving image ', fname) t0 = time.time() except KeyboardInterrupt: # to terminate the cycle ser.write(serial.to_bytes([0xA5,0x35,0x01,0xDB])) ser.close() cv2.destroyAllWindows() print(' Stopped') # just in case ser.close() cv2.destroyAllWindows() 


Hasil


Skrip melakukan polling pada matriks termal dan menghasilkan frame ke konsol monitor yang terhubung, 4 kali per detik, yang cukup untuk tidak mengalami terlalu banyak ketidaknyamanan. Untuk visualisasi, ia menggunakan paket OpenCV. Saat Anda menekan S, "peta panas" dari kamera diunggah sebagai JPG ke folder skrip.

gambar

Untuk visibilitas yang lebih baik, saya juga membuat tampilan aplikasi suhu minimum dan maksimum dalam bingkai. Jadi, dengan melihat peta panas kita dapat memperkirakan suhu benda yang paling dingin dan terpanas (dalam derajat, biasanya di sisi yang lebih tinggi), dalam kisaran 20-40 derajat. Ctrl + C keluar dari skrip.

gambar

Script bekerja sama pada Raspberry Pi Zero W dan Pi 3 B +. Saya memasang server VNC pada ponsel cerdas saya, jadi, dengan membawa Pi yang terhubung ke bank daya dengan ponsel cerdas yang berkemampuan VNC kita bisa mendapatkan kamera termal saku yang menyimpan gambar. Mungkin tidak terlalu nyaman, tetapi berhasil.

Setelah boot pertama mungkin menampilkan suhu maksimum tidak benar, dalam hal ini hanya me-reboot skrip yang harus melakukan pekerjaan.

Itu saja untuk hari ini. Eksperimen dapat dianggap sukses. Anda pasti dapat melakukan pemindaian termal rumah menggunakan perangkat ini. Jika seseorang dapat menemukan kegunaan lain untuk ini, silakan tulis di komentar.

Selamat bekerja minggu dan sampai jumpa lagi!

UPD: Saya diminta komentar untuk mengambil gambar rumah dari luar. Ini dia. Foto-foto itu berakhir tidak terlalu informatif karena suhu yang lebih rendah. Dua foto atas adalah seluruh rumah dari dua sudut. Dua foto yang lebih rendah adalah jendela yang berbeda.

gambar

Satu-satunya perubahan yang saya lakukan pada kode adalah kisaran suhu: dari +20 ... + 40 hingga -10 ... + 5.

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


All Articles