Rover Kecil Berbasis Arduino: Buat Robot Otonom Sendiri
Komponen dan Perlengkapan
- Arduino Nano R3 — 1 unit
- Papan Roti (generik) — 1 unit
- Kabel Jumper (generik) — 1 set
- Sensor Ultrasonik HC-SR04 (Generik) — 1 unit
- Roda Adafruit untuk Servo Rotasi Kontinyu Mikro FS90R — 2 unit
- Servo Rotasi Kontinyu Mikro Adafruit FS90R — 2 unit
- LED (generik) — 2 unit
- Penampung Baterai 4xAA — 1 unit
- Ball Caster Logam SparkFun 3/8" — 1 unit
- Wadah Plastik — 1 unit
- Stiker — 1 set
Alat dan Mesin yang Diperlukan
- Pistol Lem Panas (generik)
- Penis carpet
Aplikasi dan Layanan Online
Tentang Proyek Ini
Latar Belakang
Keponakan saya (9 tahun) dan keponakannya (7 tahun) sangat antusias ketika melihat video robot penghindar rintangan yang pernah saya buat beberapa waktu lalu.
Tutorial untuk robot itu sayangnya tidak akan hadir karena berasal dari sebelum hard drive saya rusak dan saya menemukan manfaatnya backup serta DropBox, GitHub, dll. :)
Jadi, saya memutuskan untuk mencoba menciptakan sesuatu yang sedikit edukatif dan menyenangkan. Saya menyederhanakan mainan saya sebanyak mungkin dan muncul dengan rover kecil ini.
Bodi adalah kotak yang semula berisi stik kepiting. Ternyata ukurannya sangat sempurna. (Terima kasih Ayah telah memakan itu dengan kardusnya :D ) Wadah margarine juga mungkin ukurannya pas.
Sebagai penafian, saya akan menjelaskan di sini bagaimana kami membangun robot-robot ini dan kami biarkan anak-anak melakukan hampir semua pekerjaan sendiri. Saya dengan cara apapun tidak merekomendasikan melakukan hal ini. Ini terserah Anda sebagai orang tua / wali / bibi / paman / biara... yang bertanggung jawab untuk menentukan apakah setiap anak dapat dipercaya dengan berbagai tugas. Meskipun tidak benar-benar diperlukan, anak-anak diberi kacamata pelindung saat bekerja pada robot. Kotak yang kami gunakan terbuat dari plastik yang sangat lunak jadi saya biarkan keponakan dan keponakannya memotongnya sendiri setelah briefing tentang bahaya mengarahkan penis carpet ke diri sendiri atau anggota tubuh mereka.Unsur untuk lubang LED, kami menggunakan obor bor listrik nirkabel kecil untuk membatasi potensi cedera.
Saya senang melaporkan bahwa kotak pertolongan pertama yang saya siapkan masih tidak terpakai. :)
Tapi untuk mengulangi, ANDA adalah orang dewasa!
Rangkaian
Saya membuat rangkaian sedikit lebih rumit dari yang mungkin dengan menghubungkan kedua servo seperti yang saya lakukan.
Untuk anak-anak... Saya selalu mengatakan itu tapi 'anak-anak' termasuk kakak saya (35 tahun) dan Ibu saya (65 tahun), keduanya menikmati sore Robot-dan-Kraft sepertinya anak-anak sebenarnya. :)
Untuk penonton saya, saya mencetak gambar pada halaman A4 mencoba menjaga skala papan roti 1:1 dengan dunia nyata dan memberikan semua kabel jumper dengan warna dan panjang yang benar.
Setelah rangkaian dirakit, cukup muat program ke Arduino. Saya menyertakan komentar dalam kode untuk membantu Anda menyesuaikan kode sedikit, jika perlu. Jika semuanya terhubung dengan benar, servo harus mulai berputar dan LED akan berkedip. Dan jika Anda menaruh tangan di depan sensor, satu servo akan berhenti dan yang lain akan berputar ke arah lain sejenak.
Semua siap!
Pengaturan
Saatnya untuk mengambil 'bodi' Anda dan membuat lubang di dalamnya.
Di depan, tandai posisi sensor Anda dan potong lubang 'mata'.
Di sisi, ukur dengan baik di mana Anda ingin roda berada dan potong lubang di sisi, di tepi bawah kotak, cukup besar untuk servo muat tetapi cukup kecil sehingga bracket pemasangan tidak lolos.
Gunakan bor kecil, bor 2 lubang kecil untuk LED.
Di bawah kotak, ke arah belakang, pasang roda castor (atau leempelkan dengan lem panas).
Sekarang Anda siap untuk menempatkan semua hal di dalam kotak, dan leempelkan semuanya di tempat.
Pasang roda pada servo setelah lem mengeras.
Masukkan baterai dan lihat rover kecil bergerak di sekitar kamar secara acak sampai baterai habis. Atau Anda bosan dengan kebisingan. Atau anjing mendapatkannya! :D
Kode
LittleRoverArduino
#include <Servo.h> /* Jika Anda memiliki sensor dengan hanya 3 pin, Komentari baris 6 dan komentari baris 7 */ //int distanceR = A0; //Trigger pin int distance = 6; //Trigger pin int pingDelay = 10; //panjang pulsa sensor ultrasonik int distanceR = A0; //Echo pin int led1 = 8, led2 = 9; //LEDs Servo leftPower; Servo rightPower; unsigned long flashTime; unsigned long nextSensorTime; float obstacleDist = 0.0f; void setup() { //Serial.begin(115200); leftPower.attach(3); rightPower.attach(5); leftPower.write(90); rightPower.write(90); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); delay(1000); } void loop() { LEDs(); /* Ini mencegah sensor mengeboros baterai terlalu cepat dengan membatasi pemeriksaan 5 kali per detik Anda dapat meningkatkan angka ini untuk pemeriksaan lebih jarang tetapi kemudian mungkin menabrak dinding... */ if(millis() - nextSensorTime > 200){ nextSensorTime = millis(); /* Saya melakukan 2 pembacaan di sini karena kadang-kadang sensor bingung dan tidak mengembalikan apa-apa... */ float reading1 = TakeReading(); delay(100); float reading2 = TakeReading(); Serial.println(reading1); Serial.println(reading2); //Kemudian kita mengambil jarak terbesar untuk obstacleDist obstacleDist = reading1 >= reading2 ? reading1 : reading2; //Jika jarak kurang dari 10cm, belok, jika tidak, lurus. if(obstacleDist < 10.0f){ //Serial.println("turn"); turn(); }else{ //Serial.println("forward"); forward(); } } } void LEDs(){ if(millis() - flashTime > 1000) flashTime = millis(); if(millis() - flashTime < 500){ digitalWrite(led1, LOW); digitalWrite(led2, HIGH); }else if(millis() - flashTime > 500){ digitalWrite(led1, HIGH); digitalWrite(led2, LOW); } } void forward(){ /* Jika Anda menemukan robot Anda bergerak mundur, tukarkan 135 dan 45. */ leftPower.write(135); rightPower.write(45); } void turn(){ /* Jika Anda ingin robot Anda belok ke arah lain, Komentari baris 92-93 di bawah ini dan komentari 95-96 */ //leftPower.write(90); //rightPower.write(135); leftPower.write(45); rightPower.write(90); delay(350); } float TakeReading(){ unsigned long echo = 0; float result = 0.0f; pinMode(distance, OUTPUT); digitalWrite(distance, LOW); delayMicroseconds(2); digitalWrite(distance, HIGH); delayMicroseconds(pingDelay); digitalWrite(distance, LOW); pinMode(distanceR, INPUT); digitalWrite(distanceR, HIGH); echo = pulseIn(distanceR,HIGH,38000); result = echo/58.138; return result; }
Skematik
littlerover_87IypZOgwm.fzz