Analog to Digital Converter Berbasis Linux

Tujuan artikel

Melakukan pembacaan sinyal analog menggunakan komputer, sebagai contoh pembacaan suhu atau level cahaya, bisa sedikit mahal. Pada artikel ini, kita akan menunjukkan :
1. bagaimana Linux bisa memanfaatkan port paralel pada komputer dan IC seharga $10 untuk membaca 8 saluran analog dengan akurasi 12 bit, dan
2. bagaimana kita menggunakannya untuk membangun Extreme Comfort System (ECS).

Konverter analog ke digital (ADC) mampu mengukur :
-Suhu, menggunakan thermistor
-Intensitas cahaya, menggunakan Light Dependent Resistors (LDR)
-Tekanan

Data yang diperoleh dapat diterapkan untuk aplikasi :
-Akuisisi data
-Data logging
-Kendali proses dengan akurasi tinggi

Proyek ECS merupakan salah satu contoh dari aplikasi di atas.
Antarmuka Komputer dengan ADC Melalui Port Paralel

Antarmuka ADC dengan Linux mudah dilakukan. Terdapat dua bagian utama yang harus diperhatikan, yaitu hardware dan software. Bagian hardware terdiri dari port paralel, sebuah ADC, dan sebuah sumber sinyal analog. Bagian software diprogram dengan bahasa C.

Di bawah ini saya jabarkan tiga langkah yang menjelaskan bagaimana membangun dan mengintegrasikan kedua komponen tersebut.
1. Membangun rangkaian dasar ADC

Langkah pertama adalah membangun hardware. Seperti yang telah disebutkan sebelumnya, hardware yang akan kita bangun terdiri dari port paralel, sebuah ADC, dan sumber analog. Pada proyek ini kita menggunakan sebuah IC MAX186 sebagai ADC dan thermistor NTC sebagai sumber analog. MAX186 adalah sebuah sistem akuisisi data yang menggabungkan multiplexer 8 saluran dan ADC 12 bit. Untuk informasi lebih lanjut, silakan lihat datasheet MAX186. Thermistor NTC (5MMDIA 47KR) tersedia di Jaycar.

[Catatan Editor: Terdapat pula thermistor BC1487-ND dari Digi-Key, dengan koefisien suhu yang sedikit berbeda - Dave]

Gambar 1 di bawah ini merupakan sebuah rangkaian sederhana yang akan mengubah sinyal analog yang dihasilkan oleh thermistor menjadi sebuah sinyal BCD, yang akan dibaca oleh komputer melalui port paralel. Gambar 2 merupakan contoh rangkaian yang dibangun dari Gambar 1.

Gambar 1: Rangkaian ADC ke Port Paralel sederhana :

Gambar 2: Contoh hardware ADC :


Program untuk mengendalikan rangkaian ini adalah ADC_driver.c yang terdapat pada bagian Contoh Kode.
2. Pembacaan dan penulisan data melalui port paralel.

Setelah hardware selesai dibangun, kita akan mulai membangun software. Namun sebelum itu, kita harus memiliki akses ke port paralel. Tanpa hak akses ini, kita tidak mungkin bisa membaca atau menulis ke ADC. Informasi mengenai port paralel dan bagaimana cara berkomunikasi dengan ADC terdapat pada “Informasi mengenai port paralel dan SPI” di bagian Appendix.

Untuk mendapatkan akses ke port paralel di Linux, kita harus mengkonfigurasi BIOS agar mendukung mode Simple Parallel Port, yang merupakan standar Centronics yang sudah lama ada. Pilihlah mode SPP atau Bidirectional pada BIOS. Setelah BIOS dikonfigurasi, kita aktifkan I/O menggunakan program lp_tty_start. Lihat artikel Linux: A Clear Winner for Hardware I/O yang ditulis oleh Peter Radcliffe.

Kita juga membutuhkan potongan kode di bawah ini. Kedua potongan kode ini digunakan di dalam ADC_driver.c.
-------- lp_init() --------------------------------------------
PURPOSE - given lp number 0-2, get lp base address,
save registers, disable interrupts.
void lp_init(short lp_num)
{ switch ( lp_num)
{ case 2 : lp_base_addr = 0x3BC ; break ;
case 1 : lp_base_addr = 0x278 ; break ;
default: lp_base_addr = 0x378 ; break ;
}
image_data = save_data = inb( lp_base_addr) ;
image_control = save_control = inb( lp_base_addr+2) ;
outb( (image_control &= 0xEF), lp_base_addr + control_offset) ;
}
---------------------------------------------------------------
--------- lp_restore() ----------------------------------------
PURPOSE - restore lp port to previous state.
void lp_restore()
{ outb( save_data, lp_base_addr) ;
outb( save_control, lp_base_addr + control_offset) ;
}
---------------------------------------------------------------
sumber: Linux: A Clear Winner for Hardware I/O; Peter Radcliffe

Fungsi lp_init() akan menyimpan keadaan port paralel, termasuk nilai-nilai register. lp_restore() akan mengembalikan port paralel ke keadaan sebelumnya yang disimpan oleh lp_init(). Fungsi lp_init() dijalankan pada permulaan main() dan digunakan di akhir. Untuk membaca dan menulis melalui port paralel, gunakan fungsi pustaka inb() dan outb() dari #include asm/io.h.

Untuk menguji apakah I/O sudah bekerja dengan baik, buatlah sebuah program sederhana yang akan mengubah keluaran pada sebuah pin di port paralel, dan gunakan sebuah multimeter atau CRO untuk membaca keluaran tersebut. Jika keluaran tersebut berubah dengan benar, maka I/O bekerja dengan baik.
3. Menghubungkan ADC dan port paralel

Jika rangkaian pada Gambar 1 telah selesai dibangun dan mampu berkomunikasi dengan port paralel, maka kita bisa mulai membuat program konversi sederhana. File ADC_driver.c berisi kode bahasa C untuk melakukan konversi. Jika Anda ingin membangun software sendiri, paragraf berikut menjelaskan bagaimana untuk menginisiasi dan melakukan pembacaan sebuah konversi.

Gambar 3: Pewaktuan Mode Clock Internal :

Tabel 2: Konfigurasi Byte Kontrol :

Seperti ditunjukkan pada Gambar 3, sebuah pengkonversian diinisiasi dengan memberikan clock pada sebuah byte kontrol pada DIN. Format dari Byte Kontrol terdapat pada datasheet MAX186. Kita akan menggunakan konfigurasi Byte Kontrol pada Tabel 2.

Sekali byte kontrol di-clock, SSTRB akan bernilai rendah yang berarti awal dari konversi, dan kemudian akan bernilai tinggi saat konversi selesai dilakukan. Setelah SSTRB bernilai tinggi, clock berikutnya akan menghasilkan MSB dari konversi pada DOUT, diikuti dengan bit-bit berikutnya dengan format yang diawali dengan MSB (lihat Gambar 3). Jika semuanya bekerja dengan baik, DOUT akan mengeluarkan data BCD 12 bit yang berisi hasil pembacaan tegangan pada sensor suhu. Untuk mengubah data BCD menjadi desimal, saya menggunakan potongan kode berikut ini:
---------------------------------------------------------------
int dec = 0;
for(count=0; count<=11; count++) { dec = ((tempOut[11-count])*(twopowerof(count)))+dec; } --------------------------------------------------------------- *tempOut[] adalah sebuah array 12 integer yang berisi data BCD 12 bit (dimana tempOut[0] = MSB dan tempOut[11] = LSB).Jika DOUT mengeluarkan hasil yang aneh, misalnya nol semua atau pembacaan yang salah, periksalaha pengkabelan pada rangkaian dan pastikan rangkaian yang Anda buat sama dengan Gambar 1. Jika Anda masih mengalami permasalahan, Anda bisa menggunakan CRO untuk memeriksa keluaran port paralel untuk memastikan bahwa keluaran tersebut sesuai dengan pewaktuan pada Gambar 3. Extreme Comfort System Pertemuan pertama saya dengan Linux, port paralel dan ADC terjadi selama tahun keempat saya di universitas. Tujuan dari proyek ini adalah untuk mengantarmukakan beberapa perangkat keras melalui port paralel. Saya membangun sebuah Extreme Comfort System atau ECS untuk proyek ini. Dikembangkan tiga fungsi utama yaitu : 1. Thermostat - Tiga sensor suhu memonitor keadaan suhu di dekat keyboard dan akan mengaktifkan kipas atau pemanas sesuai dengan pengaturan user. Sebuah antarmuka GUI menampilkan dan mengontrol fungsi thermostat. 2. Pengendali Lampu Otomatis - Sebuah sensor cahaya memonitor level cahaya di dekat keyboard dan monitor komputer, dan akan mengubah intensitas sebuah sumber cahaya variabel sesuai dengan pengaturan user. Sebuah antarmuka GUI menampilkan dan mengontrol fungsi-fungsi pada sumber cahaya otomatis. 3. Data Logger - Semua pembacaan data dari sensor suhu dan sensor cahaya disimpan pada file yang terpisah dengan analisa statistik. File tersebut dapat ditampilkan melalui antarmuka GUI. Untuk mengembangkan proyek ini, kami menggunakan QT designer untuk pengembangan GUI dan MAX186 untuk ADC. Kami hanya mebutuhkan satu ADC, yang akan mengubah sinyal tegangan analog dari resistor variabel pada pengukur suhu dan cahaya menjadi sinyal digital. Rangkaian yang digunakan sangat mirip dengan rangkaian ADC pada Gambar 1, namun sedikit lebih kompleks. Gambar hardware dan GUI ECS :
Untuk informasi lebih lanjut mengenai ECS, kunjungi website ECS.
Contoh Program

Berikut ini beberapa contoh kode program.
lp_tty_start.c: file ini ditulis oleh Peter Radcliffe dan dapat ditemukan pada artikel Linux: A Clear Winner for Hardware I/O. Program ini akan mengijinkan akses ke tiga port printer standar dan empat port serial. Pastikan file ini dimiliki oleh root dengan bit SUID diset (lihat pada artikel Peter Radcliffe). Untuk melakukan kompilasi, ketik gcc -o lp_tty_start.c. Untuk menjalankannya, ketik ./lp_tty_start ./program_anda.
ADC_driver.c: dijalankan bersama dengan rangkaian sederhana ADC ke Port Paralel pada Gambar 1. Sekali dijalankan, program ini akan memberikan keluaran tegangan Thermistor NTC setiap satu detik. Untuk melakukan kompilasi, ketik gcc -o ADC_driver ADC_driver.c. Untuk menjalankan, ketik ./lp_tty_start ./ADC_driver.

Program ECS (tarball lengkap dapat didownload disini) akan menjalankan tugas seperti yang dijelaskan pada bagian Extreme Comfort System. Termasuk thermostat, kontrol lampu otomatis, data logger dan GUI. Untuk melakukan kompilasi, ketik qmake -o makefile ecs.pro -> make. Untuk menjalankannya, ketik ./lp_tty_start ./ecs.
Appendix
Informasi mengenai Port Paralel dan SPI

Port Printer Paralel pada IBM-PC memiliki 12 output digital dan 5 input digital yang diakses melalui tiga port 8 bit pada ruang I/O prosesor.

25-pin Female D-Type Connector :



* Pin 9-2 (D7-0) adalah pin output yang diakses melalui port DATA.
* Pin 17, 16, 14, 1 (C3-0) adalah pin output, three-inverted, diakses melalui port CONTROL.
* Pin 10-13, 15 (S7-0) adalah pin input yang diakses melalui port STATUS.
* Pin yang lain (25-18) adalah ground.

ADC berkomunikasi dengan port paralel menggunakan protokol SPI (Serial Peripheral Interface). SPI dapat digunakan untuk berkomunikasi dengan berbagai IC seperti EEPROM dan mikroprosesor. Pada rangkaian ADC ke Port Paralel pada Gambar 1, terdapat lima kabel yang menghubungkan ADC dengan port paralel. Kabel tersebut termasuk DIN, SCLK, DOUT, SSTRB, dan CS. Bersama-sama, mereka digunakan untuk membangun komunikasi yang cepat dan fleksibel. Informasi lebih lanjut mengenai SPI, silakan lihat di datasheet MAX186.




Copyright © 2005, David Chong and Philip Chong. Released under the Open Publication license unless otherwise noted in the body of the article. Linux Gazette is not produced, sponsored, or endorsed by its prior host, SSC, Inc.

Published in Issue 118 of Linux Gazette, September 2005

Diterjemahkan oleh Triyan W. Nugroho, http://triyan.web.id.

Tidak ada komentar: