Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

LEGO Wall-E dengan Arduino

Komponen dan persediaan

LEGO Wall-E
Harus mendapatkan satu tangan kedua karena mereka tidak membuatnya lagi
× 1
Arduino Nano R3
× 1
Motor DC (generik)
× 2
Pengontrol Motor Ganda L298N
× 1
LED dua warna
dengan 3 pin
× 1
Sensor inframerah
× 1
Buzzer
Yang bisa memainkan nada berbeda
× 1
Baterai 9V
× 1
Resistor 330 ohm
× 3
Kabel jumper (generik)
× 20

Alat dan mesin yang diperlukan

Besi solder (generik)

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Semua orang tahu film Wall-E (dan jika tidak, pergi dan tonton sekarang!) dan pahlawan kuning yang mencoba membersihkan bumi. Dalam proyek ini, saya menggunakan versi Lego dari teman kecil kami dan mengajarinya cara menghindari rintangan. Ini adalah proyek pertama saya dan pengalaman belajar yang luar biasa untuk memahami dasar-dasar elektronik.

Langkah 1 - Kode

Sebagai pengembang perangkat lunak, saya memikirkan apa yang saya ingin dia lakukan dan mulai dengan kodenya.

 // Program ini untuk mengontrol robot Wall-E Lego.// Wall-E sedang mengemudi. Ketika dia melihat rintangan, dia berhenti untuk melihat-lihat dan memilih jalan lain.// Arduino Nano memiliki 21 pin yang dapat digunakan untuk digitalRead dan digitalWrite// Pin PWM 3, 5, 6, 9, 10, 11 dapat digunakan untuk analogWrite// pin 0 dan 1 dapat digunakan untuk TTL// pin 2 dan 3 dapat digunakan untuk interupsi eksternal// pin 10, 11, 12, 13 mendukung komunikasi SPI// pin 13 dapat berupa LED internal// pin 14 hingga 21 juga merupakan pin analog A0 hingga A7 dan dapat digunakan untuk analogRead#define INFRA_RED 9 // dapat berupa pin apa saja#define GREEN_LED 7 // dapat berupa pin apa saja tetapi membutuhkan resistor, mungkin 220 Ohm - atau pin ground mendapat 1 kOhm# define RED_LED 8 // dapat berupa pin apa saja tetapi membutuhkan resistor, mungkin 220 Ohm - atau pin ground mendapat 1 kOhm#define BUZZER 10 // perlu pin PWM untuk mengatur frekuensi, membutuhkan resistor, mungkin 1 kOhm// MR adalah motor kanan, ML adalah motor kiri#define MR_1 A1 // bisa berupa pin apa saja, jadi mari kita buat sesuai dengan nomor pin pada perisai L289N#define MR_2 A2 // bisa berupa pin apa saja, jadi mari kita buat sesuai dengan P dalam angka pada perisai L289N#define MR_ENABLE 5 // perlu pin PWM untuk kontrol kecepatan#define ML_1 A3 // dapat berupa pin apa saja, jadi mari kita buat agar sesuai dengan nomor pin pada perisai L289N#define ML_2 A4 // bisa berupa pin apa saja, jadi mari kita buat sesuai dengan nomor pin pada shield L289N#define ML_ENABLE 6 // perlu pin PWM untuk kontrol kecepatan// atur kecepatan normalnya ke maximumconst int NORMAL_SPEED =255;void setup() { // setelah menekan tombol reset, tunggu sebentar agar kita bisa mematikannya tanpa merusak komponen apapun melalui voltage spike delay(2000); // inisialisasi LED dan buzzer pinMode(GREEN_LED, OUTPUT); pinMode(RED_LED, OUTPUT);// pinMode(BUZZER, OUTPUT); // tidak perlu // reset LED ke green digitalWrite(RED_LED, LOW); digitalWrite(HIJAU_LED, TINGGI); // mengatur pin motor DC pinMode(MR_ENABLE, OUTPUT); //Mode pin kanan motor(MR_1, OUTPUT); pinMode(MR_2, OUTPUT); pinMode(ML_ENABLE, OUTPUT); // motor kiri pinMode(ML_1, OUTPUT); pinMode(ML_2, OUTPUT); // inisialisasi pinMode infra merah(INFRA_RED, INPUT); // inisialisasi generator angka acak untuk putaran acak randomSeed(analogRead(0)); // say hello playHello();}void loop() { // operasi normal driveForwards(NORMAL_SPEED); // setel LED ke digitalWrite(RED_LED, LOW); digitalWrite(HIJAU_LED, TINGGI); // periksa hambatan jika (digitalRead(INFRA_RED) ==LOW) { //LOW berarti hambatan terdeteksi // ubah LED menjadi merah digitalWrite(GREEN_LED, LOW); digitalWrite(RED_LED, TINGGI); // hentikan motor stop Driving(); // mainkan suara uh-oh playUhOh(); // centang belok kiri(500); rintangan booleanKiri =salah; if (digitalRead(INFRA_RED) ==RENDAH) { obstacleLeft =true; } // putar kembali ke tengah delay(100); belok Kanan(500); // tunggu sebentar, kita tidak ingin terlihat terburu-buru delay(500); // centang belok kanan Kanan(500); hambatan boolean Kanan =salah; if (digitalRead(INFRA_RED) ==RENDAH) { rintanganKanan =benar; } // putar kembali ke tengah delay(100); belok Kiri(500); // sekarang periksa cara keluar dari sini if ​​(obstacleLeft &&obstacleRight) { driveBackwards(NORMAL_SPEED / 3); // bip sambil mundur selama 5 detik untuk (int i =0; i <5; i++) { tone(BUZZER, 1000, 500); penundaan (1000); } // untuk menghindari macet di suatu tempat, belok secara acak ke arah sebelum melanjutkan perjalanan randomTurn(800, 1600); } else if (halangan Kiri) { turnRight(1000); } else if (obstacleRight) { turnLeft(1000); } else { randomTurn(1000, 1800); } } // lakukan hal-hal acak untuk interaksi lebih banyak int number =random(100); // membuat angka acak antara 0 dan 99 if (angka ==0) { randomTurn(200,2000); }}void driveForwards(int speed) { // setel motor ke arah yang sama digitalWrite(MR_1, LOW); digitalWrite(MR_2, TINGGI); digitalWrite(ML_1, TINGGI); digitalWrite(ML_2, RENDAH); setSpeed(speed);}void driveBackwards(int speed) { // setel motor ke arah yang berlawanan digitalWrite(MR_1, HIGH); digitalWrite(MR_2, RENDAH); digitalWrite(ML_1, RENDAH); digitalWrite(ML_2, TINGGI); setSpeed(speed);}void turnLeft(int durasi) { // belok kiri dengan maju dengan roda kanan dan mundur dengan roda kiri digitalWrite(MR_1, HIGH); digitalWrite(MR_2, RENDAH); digitalWrite(ML_1, TINGGI); digitalWrite(ML_2, RENDAH); // memperlambat untuk mengubah setSpeed(NORMAL_SPEED / 2); penundaan (durasi); stopDriving();}void turnRight(int durasi) { // belok kanan dengan mundur dengan roda kanan dan maju dengan roda kiri digitalWrite(MR_1, LOW); digitalWrite(MR_2, TINGGI); digitalWrite(ML_1, RENDAH); digitalWrite(ML_2, TINGGI); // memperlambat untuk mengubah setSpeed(NORMAL_SPEED / 2); penundaan (durasi); stopDriving();}void stopDriving() { // matikan semua pin motor digitalWrite(MR_1, LOW); digitalWrite(MR_2, RENDAH); digitalWrite(ML_1, RENDAH); digitalWrite(ML_2, RENDAH); // tidak yakin apa yang harus dilakukan dengan pin ENABLE, tetapi tidak ada salahnya untuk mematikannya juga kurasa digitalWrite(MR_ENABLE, LOW); digitalWrite(ML_ENABLE, LOW);}void setSpeed(int speed) { // speed harus antara 0 dan 255 speed =constrain(speed, 0, 255); // mengatur kecepatan untuk menghidupkan motor analogWrite(MR_ENABLE, speed); analogWrite(ML_ENABLE, speed);}void randomTurn(int minimum, int maximum) { unsigned long time =millis(); int durasi =acak(minimum, maksimum); if (waktu % 2) { belok Kanan(durasi); } else { belok Kiri(durasi); }}void playHalo() { nada(BUZZER, 262, 250); // memainkan penundaan C4(300); nada (BUZZER, 330, 250); // memainkan penundaan E4(300); nada (BUZZER, 392, 250); // memainkan penundaan G4(300); nada (BUZZER, 523, 500); // memainkan C5 delay(550);}void playUhOh() { tone(BUZZER, 523, 250); // memainkan penundaan C5(300); nada (BUZZER, 415, 500); // memainkan penundaan Gis4(600);} 

Saat Anda melepaskan motor yang sedang berjalan, lonjakan tegangan dapat terjadi dan merusak elektronik Anda. Karena itu, saya membuat Wall-E menunggu selama dua detik sebelum dia melakukan apa pun. Itu berarti saya cukup menekan tombol Reset di Arduino dan dengan cepat melepaskan baterai tanpa merusak apa pun.

Dia memainkan sedikit melodi ketika dia bangun dan kemudian mulai mengemudi. Ketika dia melihat rintangan, dia berhenti, memainkan suara "Uh-oh", dan melihat sekeliling untuk menentukan cara terbaik. Jenis sensor infra-merah yang saya gunakan memiliki sekrup kecil di bagian belakang yang memungkinkan Anda menentukan jarak di mana ia menciptakan sinyal. Itu sebabnya tidak ada perhitungan jarak dalam kode. (Saya ingin menggunakan sensor ultrasonik terlebih dahulu, tetapi tidak cocok dengan matanya.)

Wall-E pertama-tama memeriksa apakah sisi kirinya bersih, dan kemudian apakah sisi kanannya kosong. Jika kedua sisi terhalang, dia akan mundur sambil membunyikan klakson seperti mesin berat di lokasi konstruksi, lalu berbelok ke arah acak dan melanjutkan. Jika hanya satu sisi yang terhalang, dia melanjutkan ke sisi lain. Jika kedua belah pihak bebas, dia memilih satu secara acak dan melanjutkan jalannya.

Saya mencoba membuatnya melakukan putaran acak, tetapi bagian itu belum selesai. Saya mencoba menggunakan timer Arduino bawaan. Beri tahu saya di komentar jika Anda memiliki ide untuk mengoptimalkannya!

Langkah 2 - Menghubungkannya

Hal pertama adalah memasang sensor infra-merah pada mata sehingga tidak terlihat terlalu jelas. Saya membongkarnya, menempelkan pin Lego ke sensor (sehingga matanya dapat bergerak ke atas dan ke bawah) dan kemudian menggunakan paku payung untuk meletakkan kembali potongan Lego di sekitar sensor:

Hal terpenting tentang motor adalah mereka memiliki torsi yang cukup, karena pengaturan roda Wall-E membutuhkan sedikit tenaga untuk bergerak. Saya harus menyolder kabel ke motor dan memasangnya sedemikian rupa sehingga terhubung dengan aman ke Lego. Jadi saya membongkar rodanya, memesan satu tas penuh pin Lego Technic, membungkus plester (begitukah Anda menyebutnya? Ini seperti pita lunak yang bisa menempel di kulit Anda) di sekitar poros motor, dan menempelkannya menjadi dua pin yang menjadi poros utama setiap roda. Ini berhasil selama beberapa menit, tetapi kemudian gesekannya terlalu tinggi untuk menahan lem di selotip. Untungnya, pin Technic memiliki sedikit lekukan di sampingnya, jadi pita perekat memiliki tempat untuk menahannya, yang dengan senang hati mereka lakukan setelah direndam dalam lem super.

Saya juga mengambil sedikit dadanya untuk menempelkan LED. Kemudian saya menghubungkan semua bagian dan Arduino.

Pelindung motor hanya pas di perutnya:

Diagramnya juga tidak terlalu jelas, tetapi saya mencoba memberi kode warna pada kabel untuk gambaran yang lebih baik:

Sesuai konvensi, semua kabel merah adalah positif ("menghantarkan") listrik dan semua kabel hitam adalah negatif ("menerima" listrik). Kabel kuning di kanan atas membawa sinyal untuk sensor infra-merah; kabel oranye dan hijau untuk LED tiga pin dua warna, kabel ungu untuk memberi tahu pelindung motor ke arah mana untuk memutar motor, dan kabel biru memberi tahu pelindung motor seberapa cepat untuk memutarnya.

Pelindung motor memiliki tutorial yang sangat bagus yang membuatnya mudah untuk dihubungkan dan digunakan. Sayangnya, bagian Fritzing tidak memiliki dua pin untuk mengatur kecepatan, sehingga kabel biru secara acak berakhir di pelindung motor pada diagram.

Satu lagi masalah yang saya hadapi saat menyatukan semuanya adalah kurangnya pin Voltage dan Ground. Saya ingin memberi makan motor langsung melalui pelindung motor sehingga mereka bisa mendapatkan daya sebanyak mungkin, tapi entah bagaimana saya harus memberi makan 5V ke Arduino dan sensor infra-merah juga. Jadi saya melakukan apa yang hampir semua orang di web katakan tidak boleh saya lakukan:Saya menghubungkan output 5V dari pelindung motor ke pin 5V Arduino sebagai input. Sekarang dengan perisai yang saya gunakan, saya dapat benar-benar yakin bahwa itu menghasilkan 5V yang diatur tanpa paku jahat yang dapat merusak Arduino saya. Jika Anda memasang sumber daya yang tidak diatur ke pin itu, Anda mungkin akan menggoreng sesuatu. Saya ingin menggunakan pin Vin pada awalnya, tetapi pin itu memiliki mekanisme bawaan yang mengatur semuanya, jadi 5V saya akan berubah menjadi 3,8V atau lebih, yang tidak cukup bagi Arduino untuk berfungsi dengan baik. Sebagai gantinya, saya menggunakan Vin gratis untuk menyalakan (!) sensor infra-merah dengan 5V, karena saya tidak memiliki pemisah kabel, dan saya tahu akan ada 5V yang keluar dari sana juga. Ya, itu mulai terasa seperti Frankenstein saat ini. Tapi itu berhasil!

Langkah 3 - Aksi Wall-E

Berikut adalah beberapa video yang menunjukkan dia beraksi:

Dan di sini saya menguji apa yang akan dia lakukan jika dia terjebak di sudut:

Jadi ini adalah proyek kecil pertama saya. Saya sekarang berencana untuk mengoptimalkan koneksi kabel dan mungkin menambahkan motor Servo sehingga dia dapat memutar kepalanya. Saya bahkan mungkin membeli splitter dan pelindung dan papan motor yang lebih kecil sehingga saya bisa memasukkan semuanya ke dalam perutnya.

Dan begitu Dinding-E hidup dengan senang hati selalu setelah. Yang berakhir.

Kode

  • Wall_e_control
Wall_e_controlArduino
Ini adalah file kontrol pusat untuk Wall-E. Itu dasar, tapi yang dia butuhkan saat ini.
// Program ini untuk mengontrol robot Wall-E Lego.// Wall-E sedang mengemudi. Ketika dia melihat rintangan, dia berhenti untuk melihat-lihat dan memilih jalan lain.// Arduino Nano memiliki 21 pin yang dapat digunakan untuk digitalRead dan digitalWrite// Pin PWM 3, 5, 6, 9, 10, 11 dapat digunakan untuk analogWrite// pin 0 dan 1 dapat digunakan untuk TTL// pin 2 dan 3 dapat digunakan untuk interupsi eksternal// pin 10, 11, 12, 13 mendukung komunikasi SPI// pin 13 dapat berupa LED internal// pin 14 hingga 21 juga merupakan pin analog A0 hingga A7 dan dapat digunakan untuk analogRead#define INFRA_RED 9 // dapat berupa pin apa saja#define GREEN_LED 7 // dapat berupa pin apa saja tetapi membutuhkan resistor, mungkin 220 Ohm - atau pin ground mendapat 1 kOhm# define RED_LED 8 // dapat berupa pin apa saja tetapi membutuhkan resistor, mungkin 220 Ohm - atau pin ground mendapat 1 kOhm#define BUZZER 10 // perlu pin PWM untuk mengatur frekuensi, membutuhkan resistor, mungkin 1 kOhm// MR adalah motor kanan, ML adalah motor kiri#define MR_1 A1 // bisa berupa pin apa saja, jadi mari kita buat sesuai dengan nomor pin pada perisai L289N#define MR_2 A2 // bisa berupa pin apa saja, jadi mari kita buat sesuai dengan P dalam angka pada perisai L289N#define MR_ENABLE 5 // perlu pin PWM untuk kontrol kecepatan#define ML_1 A3 // dapat berupa pin apa saja, jadi mari kita buat agar sesuai dengan nomor pin pada perisai L289N#define ML_2 A4 // bisa berupa pin apa saja, jadi mari kita buat sesuai dengan nomor pin pada shield L289N#define ML_ENABLE 6 // perlu pin PWM untuk kontrol kecepatan// atur kecepatan normalnya ke maximumconst int NORMAL_SPEED =255;void setup() { // setelah menekan tombol reset, tunggu sebentar agar kita bisa mematikannya tanpa merusak komponen apapun melalui voltage spike delay(2000); // inisialisasi LED dan buzzer pinMode(GREEN_LED, OUTPUT); pinMode(RED_LED, OUTPUT);// pinMode(BUZZER, OUTPUT); // tidak perlu // reset LED ke green digitalWrite(RED_LED, LOW); digitalWrite(HIJAU_LED, TINGGI); // mengatur pin motor DC pinMode(MR_ENABLE, OUTPUT); //Mode pin kanan motor(MR_1, OUTPUT); pinMode(MR_2, OUTPUT); pinMode(ML_ENABLE, OUTPUT); // motor kiri pinMode(ML_1, OUTPUT); pinMode(ML_2, OUTPUT); // inisialisasi pinMode infra merah(INFRA_RED, INPUT); // inisialisasi generator angka acak untuk putaran acak randomSeed(analogRead(0)); // say hello playHello();}void loop() { // operasi normal driveForwards(NORMAL_SPEED); // setel LED ke digitalWrite(RED_LED, LOW); digitalWrite(HIJAU_LED, TINGGI); // periksa hambatan jika (digitalRead(INFRA_RED) ==LOW) { //LOW berarti hambatan terdeteksi // ubah LED menjadi merah digitalWrite(GREEN_LED, LOW); digitalWrite(RED_LED, TINGGI); // hentikan motor stop Driving(); // mainkan suara uh-oh playUhOh(); // centang belok kiri(500); rintangan booleanKiri =salah; if (digitalRead(INFRA_RED) ==RENDAH) { obstacleLeft =true; } // putar kembali ke tengah delay(100); belok Kanan(500); // tunggu sebentar, kita tidak ingin terlihat terburu-buru delay(500); // centang belok kanan Kanan(500); hambatan boolean Kanan =salah; if (digitalRead(INFRA_RED) ==RENDAH) { rintanganKanan =benar; } // putar kembali ke tengah delay(100); belok Kiri(500); // sekarang periksa cara keluar dari sini if ​​(obstacleLeft &&obstacleRight) { driveBackwards(NORMAL_SPEED / 3); // bip sambil mundur selama 5 detik untuk (int i =0; i <5; i++) { tone(BUZZER, 1000, 500); penundaan (1000); } // untuk menghindari macet di suatu tempat, belok secara acak ke arah sebelum melanjutkan perjalanan randomTurn(800, 1600); } else if (halangan Kiri) { turnRight(1000); } else if (obstacleRight) { turnLeft(1000); } else { randomTurn(1000, 1800); } } // lakukan hal-hal acak untuk interaksi lebih banyak int number =random(100); // membuat angka acak antara 0 dan 99 if (angka ==0) { randomTurn(200,2000); } }void driveForwards(int speed) { // setel motor ke arah yang sama digitalWrite(MR_1, LOW); digitalWrite(MR_2, TINGGI); digitalWrite(ML_1, TINGGI); digitalWrite(ML_2, RENDAH); setSpeed(speed);}void driveBackwards(int speed) { // setel motor ke arah yang berlawanan digitalWrite(MR_1, HIGH); digitalWrite(MR_2, RENDAH); digitalWrite(ML_1, RENDAH); digitalWrite(ML_2, TINGGI); setSpeed(speed);}void turnLeft(int durasi) { // belok kiri dengan maju dengan roda kanan dan mundur dengan roda kiri digitalWrite(MR_1, HIGH); digitalWrite(MR_2, RENDAH); digitalWrite(ML_1, TINGGI); digitalWrite(ML_2, RENDAH); // memperlambat untuk mengubah setSpeed(NORMAL_SPEED / 2); penundaan (durasi); stopDriving();}void turnRight(int durasi) { // belok kanan dengan mundur dengan roda kanan dan maju dengan roda kiri digitalWrite(MR_1, LOW); digitalWrite(MR_2, TINGGI); digitalWrite(ML_1, RENDAH); digitalWrite(ML_2, TINGGI); // memperlambat untuk mengubah setSpeed(NORMAL_SPEED / 2); penundaan (durasi); stopDriving();}void stopDriving() { // matikan semua pin motor digitalWrite(MR_1, LOW); digitalWrite(MR_2, RENDAH); digitalWrite(ML_1, RENDAH); digitalWrite(ML_2, RENDAH); // tidak yakin apa yang harus dilakukan dengan pin ENABLE, tetapi tidak ada salahnya untuk mematikannya juga kurasa digitalWrite(MR_ENABLE, LOW); digitalWrite(ML_ENABLE, LOW);}void setSpeed(int speed) { // speed harus antara 0 dan 255 speed =constrain(speed, 0, 255); // mengatur kecepatan untuk menghidupkan motor analogWrite(MR_ENABLE, speed); analogWrite(ML_ENABLE, speed);}void randomTurn(int minimum, int maximum) { unsigned long time =millis(); int durasi =acak(minimum, maksimum); if (waktu % 2) { belok Kanan(durasi); } else { belok Kiri(durasi); }}void playHalo() { nada(BUZZER, 262, 250); // memainkan penundaan C4(300); nada (BUZZER, 330, 250); // memainkan penundaan E4(300); nada (BUZZER, 392, 250); // memainkan penundaan G4(300); nada (BUZZER, 523, 500); // memainkan C5 delay(550);}void playUhOh() { tone(BUZZER, 523, 250); // memainkan penundaan C5(300); nada (BUZZER, 415, 500); // memainkan penundaan Gis4(600);}

Skema

Arti warna kabel:
merah =tegangan (positif)
hitam =tanah (negatif)
kuning =sinyal untuk sensor infra merah
oranye dan hijau =koneksi untuk input LED merah dan hijau
ungu =kontrol arah motor
biru =kontrol kecepatan motor (sayangnya, bagian Fritzing tidak memiliki dua pin yang dimiliki jembatan motor saya untuk koneksi ini, jadi sepertinya ada kabel yang longgar saat ini) wall-e2_3P6X71BCnP.fzz

Proses manufaktur

  1. Pemantauan CO2 dengan Sensor K30
  2. Komunikasi Tunarungu dengan 1Sheeld/Arduino
  3. Kontrol Penerima Koin dengan Arduino
  4. Penembak Lego Otomatis
  5. Hambatan Menghindari Robot Dengan Motor Servo
  6. Arduino dengan Bluetooth untuk Mengontrol LED!
  7. Sensor Sidik Jari Kapasitif dengan Arduino atau ESP8266
  8. Robot Pengikut Baris
  9. Bermain Dengan Tampilan Berikutnya
  10. Lengan Robot Terkendali Nunchuk (dengan Arduino)