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

Kendalikan Fungsi Daya Lego

Komponen dan persediaan

Arduino UNO
× 1
Driver motor H-Bridge Ganda Instrumen Texas L293D
(beli satu dengan pin panjang, bukan versi pemasangan permukaan yang ditunjukkan pada foto)
× 1
Breadboard (generik)
× 1
Konektor 9V ke Barrel Jack
× 1
Fungsi Daya Lego Kabel ekstensi (Item:8886)
× 3
Modul Bluetooth HC-05
× 1

Tentang proyek ini

Apakah Anda memiliki salah satu model Lego Power Functions yang mengagumkan dengan motor listrik dan motor servo? Dalam tutorial ini saya akan menunjukkan kepada Anda bagaimana Anda dapat mengontrol model Lego Anda dengan Arduino Anda dan komponen elektronik minimum. Saya akan menjelaskan sirkuit dan pemrograman secara rinci untuk membuat tutorial ini mudah dimengerti untuk pemula. Model Lego yang harus Anda buat sendiri (jika Anda tidak memiliki anak laki-laki), saya tidak akan membantu Anda dengan itu.

Kita juga akan mempelajari cara menggunakan penemu aplikasi MIT untuk memprogram aplikasi Android kendali jarak jauh kita sendiri. Segera, Anda akan memiliki penjelajah Lego Mars sendiri di halaman belakang Anda!

Ini adalah proyek Arduino pertama saya dan anak saya memiliki model mobil Lego Technic yang cantik (9398 4X4 Crawler) dengan Fungsi Daya Lego:satu Lego Servo Motor untuk kemudi dan dua Lego L-motor untuk mengemudi. Dia mengizinkan saya menggunakan mobil untuk proyek ini (selama saya tidak memotong kabel motor). Di sini, kami menguji prototipe yang sudah jadi:

Memahami kabel Fungsi Daya

Pertama, beli beberapa kabel Ekstensi Fungsi Daya Lego (item 8886 di toko web Lego). Selanjutnya, potong-potong (serius). Kami akan membuat beberapa kabel "putus" yang memiliki bata Lego di satu ujung dan pin di ujung lainnya. Solder pin pada atau yang serupa. Berikut adalah penjelasan kabelnya:

GND adalah singkatan dari Ground yang merupakan terminal negatif (-) dari baterai (anoda). C1 dan C2 dapat beralih polaritas untuk membuat motor dan servos beralih arah. TechnicRobot telah membuat video bagus yang menjelaskan semuanya secara detail. (PERINGATAN:Anda melakukan ini atas tanggung jawab Anda sendiri. Saya tidak akan bertanggung jawab jika Anda merusak sesuatu!) Untuk konektor servo Lego, Anda perlu menyolder pin ke keempat kabel. Anda dapat menggunakan steker abu-abu muda. Untuk kabel power yang menghubungkan kotak baterai dengan breadboard, kita hanya membutuhkan +9 Volt dan GND tetapi Anda harus menggunakan steker abu-abu tua (karena Anda membutuhkan konektor laki-laki):

Untuk kabel motor, kita hanya perlu menghubungkan C1 dan C2 dan Anda dapat menggunakan steker abu-abu muda. (Pelajari skema untuk detailnya).

Mengontrol motor Lego dengan chip L293D

Kami menginginkan kontrol kecepatan variabel untuk motor DC kami dan kontrol posisi untuk servo Lego kami. Hal ini dicapai dengan Pulse Width Modulation (PWM). Bahasa pemrograman Arduino membuat PWM mudah digunakan; cukup panggil analogWrite(pin, dutyCycle), di mana dutyCycle adalah nilai dari 0 hingga 255. Pin PWM ditandai dengan ~ pada arduino Anda.

Pin output Arduino adalah 5 Volt dan maks. 30 mA sedangkan motor Lego membutuhkan 9 Volt dan masing-masing menarik lebih dari 100 mA. Kami membutuhkan semacam "perangkat pengalih" di antaranya. Kami juga ingin dapat menjalankan motor DC di kedua arah. Fungsi-fungsi ini diselesaikan dengan apa yang disebut jembatan-H. Kami akan menggunakan L293D, yang berisi dua jembatan-H pada satu chip terintegrasi, yang berarti kami dapat menghubungkan motor Lego (M) secara paralel ke satu sisi dan servo Lego (S) ke sisi lain chip. (Jika Anda ingin mengontrol kedua motor secara mandiri, Anda memerlukan L293D kedua). Servo Lego juga perlu dihubungkan ke GND dan Lego +9 Volt.

Chip membuat Lego +9 Volt dan Arduino +5 Volt benar-benar terpisah. Jangan pernah menghubungkan mereka bersama-sama atau Anda akan merusak sesuatu! Namun Anda harus menghubungkan semua saluran arde bersama-sama dan dengan pin arde L293D.

Dari Arduino kami, kami akan menggunakan pin 9 untuk mengontrol kecepatan motor dan pin 2 dan 5 untuk mengontrol arah putaran. Lego servo dikendalikan seperti motor:kami menghubungkan pin 3 untuk posisi dan pin 6 dan 8 untuk arah (kiri atau kanan).

Di bagian atas program kami, kami mendefinisikan pin Arduino yang digunakan sebagai konstanta. Selanjutnya, kami mendefinisikan beberapa variabel yang akan kami gunakan untuk mengontrol motor:

// Pin output digital kontrol motor didefinisikan sebagai konstanta globalconst int controlPin1A =2; const int controlPin2A =5; const int ENablePin =9; // Pin output digital kontrol servo didefinisikan sebagai konstanta global const int controlPin3A =6; const int controlPin4A =8; const int servoENablePin =3; // Variabel global kontrol motor:int kecepatan motor =0; // Kecepatan motor 0.255int motorDirection =1; // Maju (1) atau mundur (0)// Kontrol servo variabel global:int kemudi =0; // Posisi servo 0..255int steeringDirection =0; // Kiri (0) dan Kanan (1) 

Dalam pengaturan, kami mendefinisikan pin ini sebagai output dengan perintah pinmode() dan kemudian mengaturnya ke 0 Volt dengan digitalWrite().

void setup() { //other stuff.... // Deklarasikan pin keluaran digital:pinMode(controlPin1A, OUTPUT); // 1A pinMode(controlPin2A, OUTPUT); // 2A pinMode(ENablePin, OUTPUT); // EN1,2 pinMode(controlPin3A, OUTPUT); // 3A pinMode(controlPin4A, OUTPUT); // 4A pinMode(servoENablePin, OUTPUT); // EN3,4 digitalWrite(ENablePin, LOW); // motor mati digitalWrite(servoENablePin, LOW); // kemudi terpusat} 

Sekarang kita perlu memahami bagaimana chip L293D mengontrol arah putaran motor. Kami harus menyediakan sinyal berikut (Tinggi ==5 Volt; Rendah ==0 Volt):

  • EN1,2     1A       2A
  • Tinggi       Tinggi   Rendah     Motor berbelok ke kiri (Maju; Arah motor ==1)
  • Tinggi       Rendah    Tinggi    Motor berbelok ke kanan (Mundur; motorDirection ==0)
  • ID3,4     3A     4A
  • Tinggi       Tinggi   Rendah     Servo berbelok ke kiri (SteeringDirection ==0)
  • Tinggi       Rendah    Tinggi    Servo berbelok ke kanan (SteeringDirection ==1)

Baik. Kami siap untuk menulis subrutin yang membaca variabel global untuk arah dan kecepatan/posisi dan mengontrol motor dan servo:

void SetMotorControl(){ if (motorDirection ==1) //Maju { digitalWrite(controlPin1A, HIGH); digitalWrite(controlPin2A, RENDAH); } else //Reverse { digitalWrite(controlPin1A, LOW); digitalWrite(controlPin2A, TINGGI); } analogWrite(ENablePin, kecepatan motor); //Kecepatan jika (Arah Kemudi ==0) //Kiri { digitalWrite(controlPin3A, HIGH); digitalWrite(controlPin4A, RENDAH); } else //Kanan { digitalWrite(controlPin3A, LOW); digitalWrite(controlPin4A, TINGGI); } analogWrite(servoENablePin, kemudi); //Posisi servo} 

Aplikasi RC Android sederhana dengan joystick

Selanjutnya, mari buat aplikasi Android sederhana untuk mengontrol model. (Jika Anda ingin menguji aplikasi yang sudah jadi terlebih dahulu:Saya telah menyediakannya untuk Anda di Google play store. Ini tautannya:bluetooth mobil Arduino RC).

Kami akan menggunakan MIT app inventor 2. MIT App Inventor adalah pengantar pemula yang inovatif untuk pemrograman dan pembuatan aplikasi. Mark Friedman dari Google dan Profesor MIT Hal Abelson memimpin pengembangan App Inventor. Ini berjalan sebagai layanan web yang dikelola oleh staf di Pusat Pembelajaran Seluler MIT.

Di ponsel Android Anda, buka Google Play dan instal aplikasi MIT AI2 Companion. Di komputer Anda, buka tautan ke aplikasi RC saya di browser Firefox atau Chrome (Internet Explorer tidak didukung). Anda harus masuk menggunakan alamat gmail Anda dan membuat akun untuk melihat kode sumber. Jika Anda membuka aplikasi pendamping di ponsel Anda, Anda dapat melihat kode sumber di browser, membuat perubahan dan mengujinya segera di ponsel Anda.

Di browser, Anda sekarang akan melihat tampilan aplikasi Designer:

Di bagian bawah, kita melihat pad oranye dengan joystickball biru di dalamnya. Sekarang ubah ke tampilan Blok untuk melihat program. Inti dari program ini adalah blok kapan yang melacak gerakan jari Anda menyentuh dan menyeret bola joystick biru:

Posisi jari Anda dilacak dalam dua variabel currentX dan saat iniY dan digunakan untuk menghitung nilai untuk dua variabel kemudi dan kecepatan (kisaran:-100..0..+100). Pertama, program akan memeriksa apakah jari Anda berada di luar bantalan dan membatasi nilainya menjadi +/- 100. Jika jari berada di dalam bantalan, program akan menghitung nilai untuk kemudi dan kecepatan . Selanjutnya, program menghasilkan string perintah dengan bentuk:

Perintah dimulai dengan "RC" untuk kendali jarak jauh (idenya adalah bahwa di masa mendatang, Anda mungkin ingin memiliki lebih banyak perintah) diikuti dengan koma. Kemudian kami mengirimkan nilai untuk kemudi dan kecepatan . Karakter baris baru ('\n') di akhir perintah adalah sinyal ke Arduino bahwa perintah sudah selesai. String perintah ini dikirim melalui bluetooth ke Arduino. Untuk referensi Anda, string juga ditampilkan di layar.

Membaca perintah bluetooth ke Arduino

Untuk membaca string perintah Bluetooth, kita perlu menghubungkan modul Bluetooth HC-05. Lihat modul Anda:

Milik saya memiliki 6 pin. Kami hanya membutuhkan empat pin. VCC adalah tegangan suplai (positif) dan GND adalah ground. Modul mentolerir tegangan suplai 6 Volt, yang berarti kita dapat menghubungkannya ke pin power arduino 5 Volt. TXD dan RXD adalah sinyal serial. Kita harus melewati batas dan menghubungkan TXD ke arduino RXD (pin 0) dan sebaliknya. Hati-hati: Ini menyatakan LEVEL:3.3V yang berarti RXD tidak bisa langsung terhubung ke 5V arduino TXD (pin 1). Kita harus membangun pembagi tegangan dengan tiga resistor 1 kOhm untuk menghasilkan tegangan output yang 2/3 dari 5V (lihat skema). Di sisi lain, sinyal TXD 3.3V dapat langsung dihubungkan ke Arduino RXD. Arduino akan mengenali 3,3 Volt sebagai TINGGI.

Karena pin 0 dan 1 digunakan bersama dengan port USB Arduino, Anda harus memutuskan sinyal RXD dan TXD dari pin 0 dan 1 saat mengupload program melalui USB ke board. Unggahan tidak akan berfungsi jika Anda tidak melepaskan kabelnya.

Selanjutnya, Anda harus memasangkan modul HC-05 dengan perangkat Android Anda. Aktifkan Bluetooth; mulai aplikasi; tekan "koneksi Bluetooth"; buat ponsel Anda terlihat dan cari perangkat bernama HC-05 atau yang serupa. Pilih perangkat. Anda akan dimintai kode. Tekan "1234". Saat Anda kembali ke layar joystick, itu akan menyatakan "terhubung" dengan warna hijau.

Sekarang, mari kita lihat kodenya:

// Ukuran buffer serial:hitung berdasarkan ukuran input maksimal yang diharapkan untuk satu perintah#define INPUT_SIZE 30 void loop() { // Dapatkan perintah berikutnya dari serial bluetooth (tambahkan 1 byte untuk input 0) char terakhir[ INPUT_SIZE + 1]; // array tipe char (C-string) //baca Serial sampai baris baru atau buffer penuh atau time out ukuran byte =Serial.readBytesUntil('\n', input, INPUT_SIZE); // Tambahkan 0 terakhir untuk mengakhiri input C-string[size] =0; // Pisahkan string yang berbentuk:"RC,steering,speed,\n\0" char* command =strtok(input, ","); // command (RC) // RCsteering dalam Range:-100 (kiri).. 0 .. 100 (kanan) char* RCsteering =strtok(NULL, ","); // RCspeed di Range:-100 (kecepatan penuh mundur).. 0 .. 100 (maju kecepatan penuh) char* RCspeed =strtok(NULL, ","); int iRCsteering =atoi(RCsteering); // mengubah string menjadi integer int iRCspeed =atoi(RCspeed); // mengubah string menjadi integer //program lainnya}  

String yang dikirim oleh aplikasi Android dibaca menjadi string-construct khusus:string-C dengan null-termination. (Karakter 0 memberi tahu program bahwa ia telah sampai di akhir string). Ini dilakukan dengan menggunakan fungsi Serial.readBytesUntil('\n', input, ...), yang membaca dari antarmuka serial (bluetooth) hingga mendapatkan karakter baris baru ('\n'). Dengan begitu, kita terus membaca byte sampai kita memiliki perintah lengkap di input :

Cara yang sangat efisien untuk memproses masukan adalah fungsi token string, yang memotong string menjadi beberapa bagian menggunakan koma sebagai pembatas. Panggilan pertama ke strtok() mengembalikan "RC". Bagian selanjutnya dari perintah kemudian dibaca dengan meneruskan NULL ke strtok(). Nilai yang dikembalikan disimpan di RCsteering dan RCspeed . Variabel ini sebenarnya adalah penunjuk ke posisi di input . Fungsi atoi() mengubahnya akhirnya menjadi bilangan bulat. Sekarang, kami memiliki:

Kami hampir selesai sekarang. Kita harus mengalikan nilai ini dengan 2,55 sebelum kita meneruskannya ke SetMotorControl() rutin kita (Ingat bahwa kecepatan motor berada di kisaran 0..255). Pelajari sisa program di bagian KODE, buat sirkuit, dan uji model Lego Anda yang dikendalikan dari jarak jauh!

Apa selanjutnya?

Sekarang setelah Anda memiliki Arduino yang mengendalikan model Lego Anda, Anda mungkin ingin menggunakan model itu sebagai platform robotika:tambahkan beberapa sensor ping ultrasonik, program logika penghindar rintangan Anda sendiri dan buat robot penjelajah Mars Anda sendiri. Atau tambahkan lebih banyak perintah ke remote control dan lebih banyak fungsi ke model. Tapi pertama-tama, temukan metode untuk Arduino untuk mengetahui bahwa model telah melakukan perjalanan di luar jangkauan koneksi bluetooth dan menghentikan model. Ceritakan tentang solusi Anda.

Tak lama kemudian, Anda akan menemukan bahwa papan tempat memotong roti prototyping dan kabel longgar bukanlah ide yang baik untuk model yang bergerak. Dapatkan diri Anda sebuah motorshield adafruit dengan konektor blok terminal besar dan rewire dan program ulang. Ini juga akan membebaskan sinyal digital yang dapat Anda gunakan untuk input. Anda juga dapat mempertimbangkan pelindung sensor untuk koneksi sensor yang lebih baik.

Beri tahu saya proyek Anda yang sudah selesai!

Kode

  • Legocar_v3_bluetooth
Legocar_v3_bluetoothArduino
/* Lego Powerfunctions model mobil dikendalikan melalui bluetooth Arduino Uno mengontrol motor dan servo Remote dikendalikan dengan aplikasi android yang dikembangkan dengan MIT App Inventor 2 Sirkuit:* Komunikasi serial (menggunakan Uno pin 0,1) Modul Bluetooth terpasang (harus dilepas saat memuat program melalui USB) * L293D dengan motor (menggunakan pin digital Uno 2,5,9) * L293D dengan servo (menggunakan pin digital Uno 6,8,3) */// Pustaka yang digunakan:#include  // Perpustakaan Antarmuka Periferal Serial#include  // berisi fungsi strtok:pisahkan string menjadi token// Ukuran buffer serial:hitung berdasarkan ukuran input maksimum yang diharapkan untuk satu perintah melalui antarmuka serial bluetooth#define INPUT_SIZE 30/ / Pin output digital kontrol motor didefinisikan sebagai konstanta global (penggerak 4 roda dengan 2 motor Lego):const int controlPin1A =2; // L293D input driver 1A pada pin no 2 http://www.ti.com/lit/ds/symlink/l293.pdf terhubung ke pin output digital Arduino 2const int controlPin2A =5; // input driver L293D 2A pada pin no 7 terhubung ke output digital Arduino pin 5const int ENablePin =9; // L293D ENable(1,2) input pada pin no 1 yang terhubung ke pin output digital Arduino 9// Kontrol servo pin output digital yang didefinisikan sebagai konstanta global (Kemudi servo dengan 1 Lego servo):const int controlPin3A =6; // L293D driver input 3A pada pin no 10 terhubung ke Arduino digital output pin 6const int controlPin4A =8; // L293D input driver 4A pada pin no 15 terhubung ke output digital Arduino pin 8 const int servoENablePin =3; // L293D ENable(3,4) input pada pin no 9 terhubung ke output digital Arduino pin 3// Kontrol motor variabel global:int motorSpeed ​​=0; // Kecepatan motor 0.255int motorDirection =1; // Maju (1) atau mundur (0)// Kontrol servo variabel global:int kemudi =0; // Posisi servo 0..255int steeringDirection =0; // Kiri (0) dan Kanan (1)void setup() { Serial.begin(9600); // menginisialisasi komunikasi serial Serial.setTimeout(1000); // 1000 ms time out // Deklarasikan pin keluaran digital:pinMode(controlPin1A, OUTPUT); // 1A pinMode(controlPin2A, OUTPUT); // 2A pinMode(ENablePin, OUTPUT); // EN1,2 pinMode(controlPin3A, OUTPUT); // 3A pinMode(controlPin4A, OUTPUT); // 4A pinMode(servoENablePin, OUTPUT); // EN3,4 digitalWrite(ENablePin, LOW); // motor mati digitalWrite(servoENablePin, LOW); // steering centered}void loop() { // Dapatkan perintah selanjutnya dari serial bluetooth (tambahkan 1 byte untuk 0) input char[INPUT_SIZE + 1]; // array tipe char (C-string) dengan null-termination (https://www.arduino.cc/en/Reference/String) ukuran byte =Serial.readBytesUntil('\n', input, INPUT_SIZE); //baca Serial sampai baris baru atau buffer penuh atau habis // Tambahkan 0 terakhir untuk mengakhiri input C-string[size] =0; // Baca perintah yang merupakan C-string dari bentuk:"RC,RCsteering,RCspeed,\n\0" (diakhiri dengan karakter baris baru dan null) char* command =strtok(input, ","); // abaikan perintah untuk saat ini (RC untuk Remote Control adalah satu-satunya perintah yang dikirim oleh aplikasi untuk saat ini) char* RCsteering =strtok(NULL, ","); // selanjutnya muncul RCsteering yang ada di Range:-100 (kiri).. 0 .. 100 (kanan) char* RCspeed =strtok(NULL, ","); // selanjutnya muncul RCspeed yang berada di Range:-100 (kecepatan penuh mundur).. 0 .. 100 (maju kecepatan penuh) int iRCsteering =atoi(RCsteering); // mengubah string RCsteering menjadi integer iRCsteering int iRCspeed =atoi(RCspeed); // mengkonversi string RCspeed menjadi integer iRCspeed // Mengatur variabel kontrol motor dan servo jika (iRCsteering> 0) steeringDirection =1; // belok kanan jika iRCsteering =1..100 else steeringDirection =0; // belok kiri jika iRCsteering =-100..0 steering =int(2.55*abs(iRCsteering)); // Posisi servo 0..255 berdasarkan perintah 0..100 jika (iRCspeed> 0) motorDirection =1; // Atur mobil ke depan jika iRCspeed =1..100 else motorDirection =0; // Atur mobil mundur jika iRCspeed =-100..0 motorSpeed ​​=int(2.55*abs(iRCspeed)); // Atur kecepatan 0..255 berdasarkan perintah 0..100 SetMotorControl(); // sesuaikan arah dan kecepatan motor }batalkan SetMotorControl()/*L293 logika:EN1,2 1A 2A HHL Motor belok kiri (Maju; motorDirection ==1) HLH Motor belok kanan (Mundur; motorDirection ==0) EN3,4 3A 4A HHL Servo belok kiri (steeringDirection ==0) HLH Servo belok kanan (steeringDirection ==1)Kecepatan motor:Sinyal PWM pada EN1,2 (490 Hz; nilai output digital 0..255 untuk kecepatan motor)Posisi servo:Sinyal PWM aktif EN3,4 (490 Hz; nilai keluaran digital 0..255 untuk posisi; 0 lurus ke depan)*/{ if (Arah motor ==1) //Maju { digitalWrite(controlPin1A, HIGH); digitalWrite(controlPin2A, RENDAH); } else //Reverse { digitalWrite(controlPin1A, LOW); digitalWrite(controlPin2A, TINGGI); } analogWrite(ENablePin, kecepatan motor); //Kecepatan jika (Arah Kemudi ==0) //Kiri { digitalWrite(controlPin3A, HIGH); digitalWrite(controlPin4A, RENDAH); } else //Kanan { digitalWrite(controlPin3A, LOW); digitalWrite(controlPin4A, TINGGI); } analogWrite(servoENablePin, kemudi); //Posisi servo}
Github Lego-car-Arduino
Berisi kode sumber Arduino; diagram fritzing; aplikasi android kode sumber untuk diunggah ke penemu aplikasi MIThttps://github.com/Notthemarsian/Lego-car-Arduino

Skema

Github Lego-car-Arduino
Berisi kode sumber Arduino; diagram fritzing; aplikasi android kode sumber untuk diunggah ke penemu aplikasi MIThttps://github.com/Notthemarsian/Lego-car-Arduino Lego%20rc%20car%20v2.fzz

Proses manufaktur

  1. Kendalikan Pedang SaaS Bermata Dua
  2. Turunan dari Fungsi Daya dari e
  3. Antiturunan dari Fungsi Daya e
  4. Strategi untuk Komponen Transmisi Daya yang Lebih Andal
  5. Dasar-dasar Panel Kontrol Listrik
  6. Tenaga angin
  7. Produsen Inggris Menghabiskan Lebih dari £2,5 juta untuk Memperbaiki Kesalahan
  8. Kontrol Daya dan HVAC/Iklim
  9. 8 Langkah untuk Men-debug Sistem Kontrol Proses Anda
  10. Kontrol Tegangan dalam Penanganan Web – Komponen Utama