Daftar Isi:
- Perlengkapan
- Langkah 1: Konstruksi
- Langkah 2: Uji Roboclaw, Motor, dan Encoder
- Langkah 3: Menambahkan dan Memprogram Arduino
- Langkah 4: Menambahkan dan Memprogram Raspberry Pi (node.js)
- Langkah 5: Langkah Terakhir - Pemrograman / Menggunakan Klien Halaman Web
- Langkah 6: Opsional: Menggerakkan Robot Dengan Seret Mouse dan/atau Acara Sentuh
Video: Robot 4WD Didorong Melalui Gamepad USB Jarak Jauh: 6 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:55
Untuk proyek robotika saya berikutnya, saya terpaksa merancang/mendesain platform robot saya sendiri karena keadaan yang tidak terduga.
Tujuannya adalah untuk membuatnya menjadi otonom, tetapi pertama-tama, saya perlu menguji kemampuan mengemudi dasarnya, jadi saya pikir itu akan menjadi proyek sampingan yang menyenangkan untuk berperilaku dan dikendalikan seolah-olah itu adalah kendaraan RC (dikontrol radio)., tetapi gunakan Gamepad USB.
Hasilnya sama bagusnya atau lebih baik dari yang saya harapkan.
Keuntungan menggunakan rute USB Gamepad, dengan banyak pemrograman, adalah saya dapat menyesuaikannya dan menambahkan apa yang telah saya lakukan. Saya tidak memiliki pengalaman nyata dalam membangun kendaraan RC, tapi saya membayangkan bahwa seseorang cukup banyak terjebak dengan apa pun pemancar RC (joystick/tombol, dll) dan penerima RC datang dengan.
Misalnya, saya telah menambahkan beberapa pengakuan bahwa robot telah menabrak dinding, hanya dengan meminta perangkat lunak mendeteksi arus tinggi dan nilai kecepatan encoder rendah.
Opsional, seseorang dapat menambahkan beberapa webcam USB ke robot, tergantung pada berapa banyak dan penempatannya, seseorang dapat mengendarai robot di sekitar ruang tamu dan ke ruangan lain, sambil duduk di tempat lain di depan komputer yang memiliki USB Gamepad yang terhubung. dia.
Instruksi ini tidak akan menjadi cara yang benar, terperinci, menyeluruh, langkah demi langkah, tetapi saya akan mencoba memberikan detail sebanyak yang saya bisa.
Perlengkapan
Bagian yang Disarankan: Sebagian besar saya peroleh dari Servo City (Actobotics).
2 - 13,5 U-channel, untuk sisi rangka dasar. Motor dipasang pada ini. Saya menggunakan sesuatu yang lebih pendek dan motor saya dipasang di bagian paling pojok, dan membuatnya sulit untuk memasangnya.
Saluran U 2 - 12 untuk bagian depan dan belakang rangka dasar.
2 - 15 U-channel untuk bumper, depan dan belakang
2 - 7 (atau 7,5 ?) U-channel untuk kolom depan. Ini tidak terlalu kritis, panjangnya bisa bervariasi. Tergantung seberapa tinggi kolom belakang, dan pada ketinggian berapa Anda memilih untuk meletakkan sudut U-channel yang menghubungkan antara mereka.
2 - (panjang?) U-saluran untuk bagian miring, depan-ke-belakang, menghubungkan kolom tegak. Yang ini sangat penting, karena Servo City / Actobotics menjual panel atau braket bersudut 45 derajat untuk tujuan ini, tetapi Anda harus melakukan beberapa matematika / trigonometri untuk memastikan Anda mendapatkan panjang yang benar.
2 - (panjang?) U-channel untuk berfungsi sebagai bumper samping tingkat yang lebih tinggi, sekali lagi ini tergantung pada apa yang Anda lakukan dengan alasnya
2 - (panjang?) U-channel untuk berfungsi sebagai bumper depan dan belakang yang lebih tinggi, sama seperti di atas.
1 - (panjang?) U-channel berfungsi sebagai anggota paling atas, membentang di kolom belakang. Yang ini mungkin tidak terlalu kritis, karena Anda bisa memasangnya di atas, atau di depan / di belakang tiang tegak.
12 (perkiraan) saluran-L atau kurung. Ini melayani berbagai tujuan tetapi pada dasarnya memberikan integritas/kekuatan struktural ke sudut rangka dasar DAN kolom tegak.
4 (+) saluran datar 3-lubang hingga 5-lubang. Ini juga memberikan kekuatan struktural pada robot.
ServoCity menjual dua jenis utama panel datar area besar, berguna untuk digunakan sebagai alas selip bawah, atau atas tempat baterai dan atau pengontrol Anda akan pergi, atau bahkan untuk permukaan yang lebih tinggi untuk sensor.
Ada panel 4(4.5?)" X 12", dan saya pikir yang lainnya adalah panel 9(9.5?)" X 12.
Sekarang di sinilah segalanya menjadi menarik, dan mungkin membingungkan dan mahal (bagian-bagian kecil bertambah). Semua saluran, dll, dapat dilampirkan satu sama lain melalui bagian penghubung ini, yang ada BEBERAPA. Di sinilah saya minta maaf karena saya tidak memiliki daftar suku cadang yang komprehensif, terperinci, dan spesifik.
Dan masalahnya adalah.. Anda tidak benar-benar tahu mana yang mungkin Anda butuhkan, atau berapa banyak.. karena ada begitu banyak cara Anda dapat menyatukan potongan-potongan ini.
Saya dapat membuat daftar apa yang telah saya gunakan:
www.servocity.com/90-quad-hub-mount-c
www.servocity.com/side-tapped-pattern-moun…
www.servocity.com/90-quad-hub-mount-d
Dua berikut ini sangat berguna, dan saya hanya akan menyimpan ini:
www.servocity.com/single-screw-plate
www.servocity.com/dual-screw-plate
Berikutnya adalah semua sekrup (baut). Saya mulai dengan paket ukuran SETIAP, dan saya telah melalui sebagian besar dari mereka. Saya menggunakan sekrup yang lebih panjang di mana ukurannya tidak masalah, dan memesan yang lebih pendek untuk tempat yang DIBUTUHKAN karena tidak ada panjang lain yang akan berfungsi.
Terakhir, Anda harus mendapatkan 1 tas ini:
www.servocity.com/6-32-nylock-nuts-pack
Saya tidak menggunakan sebanyak itu, tetapi mereka (saya pikir) sangat penting untuk memastikan motor Anda tidak bergetar lepas dari rangka seiring waktu. Hanya dua yang akan bekerja per motor, karena saluran-U
Anda memerlukan setidaknya 4 dari ini, Anda mungkin mendapatkan tambahan satu atau lebih jika Anda menyebabkan kerusakan pada satu (percayalah, Anda mungkin memasang / melepas motor beberapa kali):
www.servocity.com/heavy-duty-clamping-shaf…
Biasanya, poros motor berukuran 6 mm, dan gandar berukuran 1/4 (0,25 inci).
Saya akan mendapatkan beberapa sekrup hitam, yang seharusnya lebih kuat, dan menggunakannya untuk klem di atas, dan TIDAK menggunakan sekrup yang disertakan dengan klem:
(Saya pikir ini dia):
4 - 1/4" (0,25") diameter bantalan
1 - kantong spacer 1/4 hitam
4 - Menjepit D-Hub
www.servocity.com/0-770-clamping-d-hubs
4 - D-Shaft (#6340621.375" (1-3/8")
Roda tugas berat 4 - 6"
www.servocity.com/6-heavy-duty-wheel
Perhatikan bahwa saya menyukai roda ini tetapi memiliki tepi karet yang keras. Mereka tampaknya melakukannya dengan baik di lantai yang keras, dan karpet, dan mungkin jalan beton yang keras. Tidak akan bekerja dengan baik di rumput, pasir, dll.
JUGA, mereka akan cenderung mengotori karpet Anda!!!
4 - motor:
www.servocity.com/motors-actuators/gear-mo…
Saya menggunakan 223 RPM, kecepatan dalam ruangan atas yang bagus, juga dapat menggerakkan robot saya (berat dengan 2 baterai SLA 12V) dengan cukup mudah dalam gerakan lambat.
2 - encoder motor untuk motor. (Roboclaw Kota Servo hanya menangani 2 pembuat enkode)
1 - Pengontrol motor Roboclaw 2X45A, pastikan Anda mendapatkan yang memiliki blok terminal hijau di atasnya, bukan pinnya…. wah… masing-masing punya kelebihan. Melihat ke belakang.. Saya mungkin mendapatkan pin.
Saya pikir itu dari Servo City.
SparkFun menjual Arduino Uno (itulah yang saya gunakan), dan juga Redboard Artemis sebagai pengelola drive Anda.
Anda akan menginginkan Raspberry Pi 3 (atau 4?) Sebagai "otak" tingkat tinggi dan antarmuka untuk Anda.
Anda memerlukan kabel, sakelar, sekering, dan dioda "flyback" yang sangat kuat.
Saya menggunakan baterai SLA siklus dalam Duracell 12V 14AH, tetapi Anda dapat menggunakan apa pun.
PERINGATAN! Desain robot ini (TINGGI, dan LEBAR, tapi PENDEK), mengasumsikan semacam pusat gravitasi yang berat, seperti yang akan disediakan oleh baterai SLA. Ini mungkin tidak cocok dengan jenis paket baterai teknologi baru lainnya. LiPo, Lion, dll. Itu bisa dengan mudah terbalik.
Dari Pololu saya mendapatkan beberapa adaptor colokan barel, sehingga saya dapat secara mandiri menyalakan Arduino dan/atau Redboard, meskipun mereka akan terhubung ke Raspberry melalui USB, karena saya tidak ingin harus bergantung pada kekuatan Raspberry. (Terutama memasang kamera, sensor, dll.)
Anda memerlukan regulator tegangan turun 12-ke-5V, minimum 5A (?) untuk Raspberry. Yang lain dapat menangani apa pun antara 7 hingga 15V sehingga langsung ke baterai SLA.
Itu saja untuk bagian.
Apa yang TIDAK akan saya lakukan - roda gigi miring 90 derajat.
Sekali lagi, ada banyak video di daftar putar youtube Robotics saya yang merinci sebagian besar hal di atas.
Langkah 1: Konstruksi
Terus terang, semua langkah konstruksi saya sudah dalam bentuk youtube. Anda dapat melihatnya di daftar putar Robotika saya, mulai dari "Wallace Robot 4". Yang sebelumnya (Wallace II, Wallace III) juga memiliki bahan yang bagus
www.youtube.com/playlist?list=PLNKa8O7lX-w…
Langkah 2: Uji Roboclaw, Motor, dan Encoder
Pembuat Roboclaw (BasicMicro) memiliki aplikasi Windows yang dapat Anda gunakan untuk memastikan Anda menghubungkan motor dan encoder dengan benar ke Roboclaw. Anda akan menghubungkan motor sisi yang sama secara paralel ke Roboclaw. Anda dapat memilih untuk menggunakan kabel encoder, hanya pada motor belakang, atau motor depan, atau bahkan mungkin lebih baik -- DIAGONAL.
Alasan saran saya berkaitan dengan (nanti) memeriksa robot yang macet. Memiliki status diagonal jika roda depan/belakang sedang/tidak berputar mungkin lebih baik daripada hanya bagian depan, atau hanya bagian belakang.
CATATAN: apa yang TIDAK saya lakukan adalah menggunakan Arduino untuk juga menghubungkan (melalui pin GPIO) ke encoder - jika Anda melakukannya, Anda dapat meminta Roboclaw menangani 2 encoder, dan kemudian Arduino menangani dua enkoder lainnya, dan hanya kueri Roboclaw untuk dua nilai encoder (dan kecepatannya).
CATATAN: Saya menggunakan aplikasi BasicMicro untuk melakukan pra-konfigurasi Roboclaw untuk Ramping Up / Ramping Down. Ini bagus untuk melindungi perangkat keras dan elektronik. Ada video tentang itu di daftar putar Robotika saya.
Saya hampir lupa: Saya juga membeli beberapa kabel konektor peluru yang menghubungkan antara kabel motor, dan Roboclaw. CATATAN: jika Anda melakukan ini, Anda akan melihat bahwa total panjang kabel SANGAT PANJANG. Tapi saya tidak ingin harus memotong apapun jika saya tidak perlu. Saya (untuk langkah selanjutnya) menemukan masalah komunikasi dengan USB antara Raspberry dan Arduino, mungkin karena kebisingan EMI.. tapi saya telah mengatasinya dengan perangkat lunak.
Jika menjadi masalah, Anda dapat memotong pendek kabel - Anda juga dapat membeli pelindung logam (dari Amazon, diameter 1 ).
Hal terakhir: Ini yang belum saya lakukan --- memiliki Roboclaw auto-configure atau auto-tune (menggunakan encoder) sehingga kedua motor sisi kiri dan kanan bergerak pada kecepatan yang sama dan robot berjalan lurus.
Milik saya sedikit melengkung di atas sekitar 12 kaki tetapi tidak cukup sehingga saya merasa perlu melakukan sesuatu untuk itu.
Langkah 3: Menambahkan dan Memprogram Arduino
Anda memerlukan steker barel dan beberapa kabel, juga kabel USB. Pastikan Anda mendapatkan yang benar untuk konektor Arduino.
Anda harus mengunduh Arduino IDE.
Di sini, di Github adalah sketsa terbaru yang menangani mengemudi robot:
github.com/elicorrales/wallace.robot.ardui…
Anda akan menghubungkan Arduino ke komputer Anda yang menjalankan IDE, dan berdasarkan bagaimana sketsa ditulis, Anda akan menggunakan pin 10 dan 11 pada Arduino untuk komunikasi serial (Software Serial) dengan Roboclaw.
Saya mengembangkan protokol komunikasi sederhana antara Raspberry Pi dan Arduino.
Ini berbasis karakter ASCII, yang membuatnya lebih mudah untuk di-debug dan diuji hanya dengan menggunakan jendela "monitor serial" Arduino IDE.
Perintah dimulai dari angka "0" (nol) dan naik sesuai kebutuhan
Perintah yang dimulai dengan "20" adalah perintah Roboclaw langsung, dan perintah di bawah angka itu adalah perintah yang terkait dengan Arduino.
Karena kebisingan EMI, saya meningkatkan string perintah untuk menyertakan checksum.
Jadi, string apa pun akan menyertakan:
# jumlah token dalam string termasuk yang ini
checksum
Contoh, katakan Anda ingin Arduino merespons dengan menu perintahnya:
4 0 12 16
"4" adalah empat token dalam string.
"0" adalah perintah MENU.
"12" adalah nomor acak yang saya pilih.
"16" adalah jumlah dari 4 + 0 + 12.
Perintah MENU yang sama itu bisa berbeda:
4 0 20 24
Karena saya memilih nomor acak yang berbeda, checksumnya juga berbeda.
Contoh, katakan Anda ingin bergerak maju dengan kecepatan 100%:
5 29 0 134 100
"5" lima token
"29" perintah MAJU
"0" nomor acak
"134" checksumnya
"100" parameter 1 (kecepatan dalam hal ini)
Jika Arduino tidak dapat memverifikasi string yang masuk, itu hanya menjatuhkannya / mengabaikannya, tidak ada respons.
Jika Arduino tidak menerima perintah gerakan berikutnya dengan X milidetik, Arduino mengirimkan motor STOP ke Roboclaw.
Arduino mulai dan mulai mengirim status otomatis ke port USB… kecuali jika disuruh berhenti melakukan itu.
Pada titik ini Anda harus siap untuk mencoba mengendalikan Roboclaw dan melihat motor berputar, hanya dengan menggunakan "Serial Monitor" pada IDE.
Langkah 4: Menambahkan dan Memprogram Raspberry Pi (node.js)
Sekali lagi, jika Anda melihat daftar putar Robotika saya, bahkan sejak awal, saya melakukan setiap langkah untuk mengaktifkan dan menjalankan Raspberry.
Satu hal yang mungkin saya abaikan adalah bahwa Anda memerlukan regulator 5V, dan entah bagaimana membuat, memotong/memodifikasi kabel USB untuk itu, atau menyalakan Raspberry dengan cara lain.
Di sini, di Github adalah semua yang Anda butuhkan di Raspberry untuk berkomunikasi dengan Arduino melalui USB.
github.com/elicorrales/wallace.robot.raspb…
Bahkan ada skrip tes.
Anda dapat melihat kode server node.js dan Anda akan melihat bagaimana Raspberry mengubah instruksi numerik singkat, menjadi string url tipe REST. Anda dapat menggunakan "curl" untuk mengirim perintah pengujian.
Contoh:
alamat IP RP3 Anda:8084/arduino/api/forward/50
akan menyebabkan motor untuk sesaat memutar roda ke depan.
Jika Anda memasukkannya ke dalam loop skrip shell, Anda akan melihat roda terus berputar.
Kode node.js (server.js) menyertakan fitur koneksi ulang jika komunikasi serial hilang ke Arduino. Anda dapat menguji ini hanya dengan mencabut Arduino dari Raspberry, dan mencolokkannya kembali.
Pastikan Anda mencocokkan baud rate serial di antara keduanya.
Karena Arduino menjatuhkan paket data yang buruk, dan karena pada level node.js, dan pada level javascript browser, semuanya dikodekan untuk mengirim banyak perintah "drive", saya telah dapat menjalankan hingga 2.000 000 baud (2Mbps).
Jika Anda menjalankan skrip pengujian dan Anda melihat roda berputar, maka Anda siap untuk langkah berikutnya.
Langkah 5: Langkah Terakhir - Pemrograman / Menggunakan Klien Halaman Web
Termasuk dalam tautan Github ke bagian Raspberry dari semua ini, adalah file klien.
indeks.html. indeks.js. p5.min.js.
Mereka menangani Gamepad USB melalui API Gamepad (berbasis browser) dan Anda akan melihat berbagai tombol dan penggeser juga tersedia di halaman web.
Kode javascript menanyakan (melakukan polling) nilai sumbu X dan Y untuk salah satu joystick.. (tergantung pada joystick/gamepad yang Anda miliki, Anda mungkin harus mengubah kodenya). Ini melakukan polling dengan sangat cepat, dan menjalankan semua nilai tersebut ke server node.js yang mendengarkan pada 8084.
Nilai sumbu X dan Y mentah dari joystick adalah antara 0 dan 1.
Tetapi fungsi perpustakaan pengontrol motor Roboclaw yang digunakan di Arduino untuk menggerakkan motor, mengharapkan nilai antara -100 hingga 0 (mundur) atau (0 hingga 100) maju.
Su…. itulah tujuan memasukkan p5.min.js. Kebetulan memiliki fungsi map() yang sangat bagus dan nyaman ini di mana Anda memberinya nilai mentah, rentang mentah (saat ini), dan rentang baru yang diinginkan. Dan itu mengubah nilai mentah menjadi nilai pada rentang baru yang dipetakan.
Poin lain: Pada kecepatan 100, robot bisa sangat rumit. Saya terus-menerus mengalami sesuatu. Tetapi bahkan ketika Anda menjadi lebih baik dalam hal itu, itu masih sensitif ketika berputar ke kiri atau ke kanan.
Sesuatu untuk Anda tambahkan akan mirip dengan penggeser Kecepatan Maks saat ini di halaman web. Penggeser itu menentukan nilai tertinggi atau maksimum yang akan Anda petakan ke joystick Xs dan Ys.
Contoh:
Katakanlah Anda memetakan 0 -> 1 ke 0 -> 100. Saat Anda menekan joystick berhenti, Anda berada di 100. Menyentuh. Mungkin terlalu cepat.
Tapi, jika Anda menggeser slider Max Speed itu sedikit ke belakang, sekarang Anda memetakan 0 -> 1 ke 0 -> 80 atau 70.
Itu berarti Anda memiliki lebih banyak kelonggaran untuk menggerakkan joystick Anda tanpa perubahan besar dalam kecepatan yang dikirim ke node.js (dan ke Arduino).
Dan tambahan yang dapat Anda buat adalah memisahkan X (putar ke kiri atau kanan) dari Y (maju atau mundur) ke dalam kecepatan maksimum yang tersedia.
Dengan demikian, Anda dapat membiarkan Ys pada 0 hingga 100, 0 hingga -100 untuk gerakan linier cepat, tetapi turunkan kecepatan maks Xs untuk gerakan rotasi yang lebih terkontrol. Terbaik dari kedua dunia.
Langkah 6: Opsional: Menggerakkan Robot Dengan Seret Mouse dan/atau Acara Sentuh
Jika Anda sampai sejauh ini, Anda tahu bahwa lapisan perangkat lunak mulai dari browser dan menelusuri Javascript dan ke server Raspberry node.js, akhirnya ke arduino, mengubah koordinat X- dan Y-joystick Gamepad menjadi " perintah maju" (atau "mundur", dll) (dan nilai kecepatannya).
Selanjutnya, Anda tahu bahwa sementara Xs dan Ys joystick adalah negatif 1, melalui nol, ke plus 1, itu harus dikonversi antara nol dan 100. Maksnya tergantung pada pengaturan kecepatan maksimum di halaman web.
So… satu-satunya hal yang harus dilakukan untuk menggunakan mouse, atau peristiwa sentuh (seperti pada ponsel cerdas), adalah menangkap peristiwa itu, mengambil Xs dan Ys.
TAPI ---- Xs dan Ys tersebut BUKAN antara negatif 1 dan 1. Mereka mulai 0 dan meningkat secara positif, karena pada dasarnya adalah piksel atau koordinat layar relatif dari beberapa elemen HTML (seperti panel bootstrap) atau kanvas.
Jadi sekali lagi, fungsi "map()" perpustakaan Js P5 sangat berguna untuk memetakan ulang ke apa yang kita butuhkan.
Saya memfaktorkan ulang kode untuk memiliki dua halaman web yang berbeda, satu untuk desktop menggunakan Gamepad, satu lagi untuk seluler, menggunakan acara sentuh.
Juga, setelah Xs dan Ys dipetakan ulang, mereka dimasukkan ke dalam rantai kode yang sama, dll, seperti Xs dan Ys dari Gamepad.
Direkomendasikan:
Pengendali Jarak Jauh Berbasis LoRa - Kontrol Peralatan Dari Jarak Jauh: 8 Langkah
Pengendali Jarak Jauh Berbasis LoRa | Mengontrol Peralatan Dari Jarak Jauh: Hai, apa kabar, Guys! Akarsh di sini dari CETech. Dalam proyek ini, kita akan membuat remote control yang dapat digunakan untuk mengontrol berbagai instrumen seperti LED, motor atau jika kita berbicara tentang kehidupan kita sehari-hari, kita dapat mengontrol aplikasi rumah kita
Sensor Jarak IR Jarak Jauh: 3 Langkah
Sensor Jarak IR Jarak Jauh: Sensor inframerah adalah Modul terbaik untuk deteksi objek tetapi masalahnya adalah ia bekerja untuk jarak yang sangat pendek. dalam artikel ini, kami akan membagikan bagaimana Anda dapat meningkatkan jangkauan dan faktor-faktor apa yang mempengaruhi jangkauan
Kontrol Peralatan Rumah Tangga Melalui LoRa - LoRa dalam Otomasi Rumah - Kontrol Jarak Jauh LoRa: 8 Langkah
Kontrol Peralatan Rumah Tangga Melalui LoRa | LoRa dalam Otomasi Rumah | LoRa Remote Control: Mengontrol dan mengotomatiskan peralatan listrik Anda dari jarak jauh (Kilometer) tanpa kehadiran internet. Ini dimungkinkan melalui LoRa! Hei, apa kabar, teman-teman? Akarsh di sini dari CETech. PCB ini juga memiliki layar OLED dan 3 relai yang
Tingkatkan Jarak Efektif pada Pemancar Pemicu Jarak Jauh Flash 'ebay' Dengan Antena: 6 Langkah
Tingkatkan Jarak Efektif pada Pemancar Pemicu Jarak Jauh Flash 'ebay' Dengan Antena: Penggemar kamera dapat membeli pemicu jarak jauh versi murah untuk unit lampu kilat eksternal, mengendalikan unit lampu kilat tipe hot-shoe atau 'studio'. Pemicu ini menderita karena daya pemancar yang rendah dan dengan demikian jarak kontrol efektif yang kecil. ini bulan
Pelepasan Kabel Jarak Jauh Olympus Evolt E510 (Versi 2 Dengan Fokus Otomatis pada Jarak Jauh): 6 Langkah (dengan Gambar)
Olympus Evolt E510 Remote Cable Release (Versi 2 Dengan Fokus Otomatis pada Remote): Kemarin saya membuat remote satu tombol sederhana untuk Olympus E510 saya. Sebagian besar kamera memiliki tombol pelepas rana (tombol yang Anda tekan untuk mengambil gambar) yang memiliki dua mode. Jika tombol ditekan perlahan, kamera akan fokus otomatis dan mengukur cahaya