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

Kuasai Fungsi Dayo Lego dengan Arduino & Kontrol Bluetooth

Komponen dan Perlengkapan

Tentang Proyek

Apakah Anda memiliki salah satu model Fungsi Dayo Lego yang luar biasa dengan motor listrik dan servo-motor? Dalam tutorial ini, saya akan menunjukkan bagaimana Anda dapat mengontrol model Lego Anda dengan Arduino dan sejumlah komponen elektronik minimum. Saya akan menjelaskan rangkaian dan pemrograman secara detail untuk membuat tutorial ini mudah dipahami bagi pemula. Model Lego yang harus Anda bangun sendiri (jika Anda tidak memiliki anak), saya tidak akan membantu Anda dengan itu.

Kami juga akan belajar cara menggunakan MIT App Inventor untuk memprogram aplikasi remote kontrol Android Anda sendiri. Segera, Anda akan memiliki rover Lego Mars Anda sendiri di halaman belakang rumah!

Ini adalah proyek Arduino pertama saya dan anak saya memiliki model mobil Lego Technic indah (9398 4X4 Crawler) dengan Fungsi Dayo Lego: satu Servo Motor Lego untuk pengarahan dan dua motor L-motor Lego untuk pengemudi. Dia mengizinkan saya menggunakan mobil untuk proyek ini (selama saya tidak memotong kabel motor apa pun). Di sini, kami menguji prototipe yang selesai:

Memahami Rangkaian Fungsi Dayo

Pertama, beli beberapa kabel Ekstensi Fungsi Dayo Lego (item 8886 di toko web Lego). Selanjutnya, potong mereka (serius). Kami akan membuat beberapa kabel "break-out" yang memiliki batu Lego di satu ujung dan pin di ujung lainnya. Solder pin atau serupa. Di sini penjelasan rangkaian:

Kuasai Fungsi Dayo Lego dengan Arduino & Kontrol Bluetooth

GND berarti Ground yang merupakan terminal negatif (-) dari paket baterai (anoda). C1 dan C2 dapat mengubah polaritas untuk membuat motor dan servo berbalik arah. TechnicRobot telah membuat video yang bagus menjelaskan semuanya secara detail. (PERINGATAN: Anda melakukan ini atas tanggung jawab Anda sendiri. Saya tidak akan ditanggung jawab jika Anda merusak sesuatu!) Untuk konektor servo Lego, Anda perlu solder pin pada keempat kabel. Anda dapat menggunakan steker abu-abu terang. Untuk kabel daya yang menghubungkan kotak baterai dengan breadboard, kita hanya membutuhkan +9 Volt dan GND tetapi Anda harus menggunakan steker abu-abu gelap (karena Anda memerlukan konektor jantan):

Kuasai Fungsi Dayo Lego dengan Arduino & Kontrol Bluetooth

Untuk kabel motor, kita hanya perlu menghubungkan C1 dan C2 dan Anda dapat menggunakan steker abu-abu terang. (Pelajari skematik untuk detail).

Mengontrol Motor Lego dengan Chip L293D

Kami ingin kontrol kecepatan variabel untuk motor DC kami dan kontrol posisi untuk servo Lego kami. Ini dicapai dengan Modulasi Lebar Pulsa (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 sementara motor Lego membutuhkan 9 Volt dan menarik lebih dari 100 mA masing-masing. Kami memerlukan sejenis "perangkat pemindah" di antaranya. Kami juga ingin dapat menjalankan motor DC di kedua arah. Fungsi-fungsi ini diatasi oleh yang disebut H-bridge. Kami akan menggunakan L293D, yang berisi dua H-bridge 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 dua motor secara independen, Anda akan membutuhkan L293D kedua). Servo Lego juga perlu dihubungkan ke GND dan Lego +9 Volt.

Chip menjaga Lego +9 Volt dan Arduino +5 Volt sepenuhnya terpisah. Jangan pernah menghubungkannya bersama atau Anda akan merusak sesuatu! Tetapi Anda harus menghubungkan semua garis ground bersama-sama dan dengan pin ground L293D.

Kuasai Fungsi Dayo Lego dengan Arduino & Kontrol Bluetooth

Dari Arduino kami, kami akan menggunakan pin 9 untuk mengontrol kecepatan motor dan pin 2 dan 5 untuk mengontrol arah rotasi. Servo Lego dikontrol 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 global. Selanjutnya, kami mendefinisikan beberapa variabel yang akan kami gunakan untuk mengontrol motor:

// Motor control digital output pins defined as global constants const int controlPin1A = 2; const int controlPin2A = 5; const int ENablePin = 9; // Servo control digital output pins defined as global constants const int controlPin3A = 6; const int controlPin4A = 8; const int servoENablePin = 3; // Motor control global variables: int motorSpeed = 0; // Motor speed 0..255 int motorDirection = 1; // Forward (1) or reverse (0) // Servo control global variables: int steering = 0; // Servo position 0..255 int steeringDirection = 0; // Left (0) and Right (1) 

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

void setup() { //other stuff.... // Declare digital output pins: 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 off digitalWrite(servoENablePin, LOW); // steering centered } 

Sekarang kita perlu memahami bagaimana chip L293D mengontrol arah rotasi motor. Kita harus menyediakan sinyal berikut (High == 5 Volt; Low == 0 Volt):

Ok. Kita siap untuk menulis subroutine yang membaca variabel global untuk arah dan kecepatan/posisi dan mengontrol motor serta servo:

void SetMotorControl() { if (motorDirection == 1) //Forward { digitalWrite(controlPin1A, HIGH); digitalWrite(controlPin2A, LOW); } else //Reverse { digitalWrite(controlPin1A, LOW); digitalWrite(controlPin2A, HIGH); } analogWrite(ENablePin, motorSpeed); //Speed if (steeringDirection == 0) //Left { digitalWrite(controlPin3A, HIGH); digitalWrite(controlPin4A, LOW); } else //Right { digitalWrite(controlPin3A, LOW); digitalWrite(controlPin4A, HIGH); } analogWrite(servoENablePin, steering); //Servo position } 

Aplikasi Android RC Sederhana dengan Joystick

Selanjutnya, mari kita buat aplikasi Android sederhana untuk mengontrol model. (Jika Anda ingin mencoba aplikasi yang selesai terlebih dahulu: Saya telah menyediakannya untuk Anda di Google play store. Di sini adalah tautan: Arduino RC car bluetooth).

Kami akan menggunakan MIT app inventor 2. MIT App Inventor adalah pengenalan inovatif bagi pemula tentang pemrograman dan pembuatan aplikasi. Mark Friedman dari Google dan Profesor MIT Hal Abelson memimpin pengembangan App Inventor. Ini berjalan sebagai layanan web yang diadmin oleh staf di Center for Mobile Learning MIT.

Di ponsel Android Anda, pergi ke 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 login menggunakan alamat gmail Anda dan membuat akun untuk dapat melihat kode sumber. Jika Anda membuka aplikasi companion di ponsel Anda, Anda dapat melihat kode sumber di browser, membuat perubahan padanya dan mengujinya segera di ponsel Anda.

Di browser, Anda sekarang akan melihat tampilan Designer dari aplikasi:

Kuasai Fungsi Dayo Lego dengan Arduino & Kontrol Bluetooth

Di bagian bawah, kita melihat balok oranye dengan bola joystick biru di dalamnya. Sekarang beralih ke tampilan Blocks untuk melihat program. Jantung program adalah blok when yang melacak gerakan jari Anda yang menyentuh dan menyeret bola joystick biru:

Kuasai Fungsi Dayo Lego dengan Arduino & Kontrol Bluetooth

Posisi jari Anda dilacak dalam dua variabel currentX dan currentY dan digunakan untuk menghitung nilai untuk dua variabel steering dan speed (rentang: -100..0..+100). Pertama program memeriksa apakah jari Anda di luar balok dan membatasi nilai ke +/- 100. Jika jari berada di dalam balok, program menghitung nilai untuk steering dan speed. Selanjutnya, program menghasilkan string perintah dalam bentuk:

Perintah dimulai dengan "RC" untuk remote control (ide adalah di masa depan, Anda mungkin ingin memiliki lebih banyak perintah) diikuti oleh koma. Kemudian kita mengirim nilai untuk steering dan speed. Karakter newline ('\n') di akhir perintah adalah sinyal ke Arduino bahwa perintah lengkap. 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:

Kuasai Fungsi Dayo Lego dengan Arduino & Kontrol Bluetooth

Modul saya memiliki 6 pin. Kami hanya membutuhkan empat pin. VCC adalah tegangan suplai (positif) dan GND adalah ground. Modul menahan tegangan suplai 6 Volt, yang berarti kita dapat menghubungkannya ke pin daya 5 Volt Arduino. TXD dan RXD adalah sinyal serial. Kita harus melintasi garis dan menghubungkan TXD ke RXD Arduino (pin 0) dan sebaliknya. Hati-hati: Ini menyatakan LEVEL: 3.3V yang berarti RXD tidak dapat langsung dihubungkan ke TXD 5V Arduino (pin 1). Kita harus membuat pembagi tegangan dengan tiga resistor 1 kOhm untuk menghasilkan tegangan output yang adalah 2/3 dari 5V (lihat skematik). Di sisi lain, sinyal TXD 3.3V dapat langsung dihubungkan ke RXD Arduino. Arduino akan mengenali 3.3 Volt sebagai HIGH.

Karena pin 0 dan 1 dibagi dengan port USB Arduino Anda, Anda harus mencabut sinyal RXD dan TXD dari pin 0 dan 1 saat mengunggah program melalui USB ke papan. Unggahan tidak akan berhasil jika Anda tidak mencabut kabel.

Selanjutnya, Anda harus memasangkan modul HC-05 dengan perangkat Android Anda. Nyalakan Bluetooth; mulai aplikasi; tekan "Bluetooth connect"; buat ponsel Anda terlihat dan cari perangkat bernama HC-05 atau serupa. Pilih perangkat. Anda akan diminta untuk kode. Tekan "1234". Ketika Anda kembali ke layar joystick, seharusnya menyatakan "connected" dalam warna hijau.

Sekarang, mari kita lihat kode:

// Serial buffer size: calculate based on max input size expected for one command #define INPUT_SIZE 30 void loop() { // Get next command from serial bluetooth (add 1 byte for final 0) char input[INPUT_SIZE + 1]; // array of type char (C-string) //read Serial until new line or buffer full or time out byte size = Serial.readBytesUntil('\n', input, INPUT_SIZE); // Add the final 0 to end the C-string input[size] = 0; // Split string which is of the form: "RC,steering,speed,\n\0" char* command = strtok(input, ","); // command (RC) // RCsteering in Range: -100 (left).. 0 .. 100 (right) char* RCsteering = strtok(NULL, ","); // RCspeed in Range: -100 (full speed reverse).. 0 .. 100 (full speed forward) char* RCspeed = strtok(NULL, ","); int iRCsteering = atoi(RCsteering); // convert string into integer int iRCspeed = atoi(RCspeed); // convert string into integer //rest of program } 

String yang dikirim oleh aplikasi Android dibaca ke dalam konstruksi string khusus: sebuah C-string dengan null-termination. (Karakter 0 memberi tahu program bahwa telah mencapai akhir string). Ini dilakukan dengan menggunakan fungsi Serial.readBytesUntil('\n', input, ...), yang membaca dari antarmuka serial (bluetooth) sampai mendapatkan karakter newline ('\n'). Dengan cara itu, kita terus membaca byte sampai kita memiliki perintah lengkap di input:

Cara yang sangat efisien untuk memproses input adalah fungsi token string, yang memotong string menjadi bagian menggunakan koma sebagai pemisah. Panggilan pertama ke strtok() mengembalikan "RC". Bagian berikutnya dari perintah kemudian dibaca dengan melewatkan NULL ke strtok(). Nilai yang dikembalikan disimpan di RCsteering dan RCspeed. Variabel-variabel ini sebenarnya adalah pointer ke posisi di input. Fungsi atoi() mengonversi mereka menjadi integer. Sekarang, kita memiliki:

Kami hampir selesai sekarang. Kita harus mengalikan nilai ini dengan 2.55 sebelum kita melewatkannya ke rutinitas SetMotorControl() kami (Ingat bahwa kecepatan motor berada dalam rentang 0..255). Pelajari sisa program di bagian CODE, bangun rangkaian dan uji model Lego yang dikontrol jarak jauh Anda!

Apa Selanjutnya?

Sekarang setelah Anda memiliki Arduino yang mengontrol model Lego Anda, Anda mungkin ingin menggunakan model tersebut sebagai platform robotika: tambahkan sensor ping ultrasonik, program logika menghindari rintangan Anda sendiri dan buat rover Mars yang dikendalikan sendiri. Atau tambahkan lebih banyak perintah ke remote control dan lebih banyak fungsi ke model. Namun pertama, cari cara bagi Arduino untuk mengetahui bahwa model telah keluar dari jangkauan koneksi bluetooth dan hentikan model. Beritahu saya tentang solusi Anda.

Segera, Anda akan menemukan bahwa breadboard prototipe dan kabel longgar bukan ide yang baik untuk model yang bergerak. Dapatkanlah adafruit motorshield dengan konektor blok terminal besar dan rerangkaian serta reprogram. Ini juga akan membebaskan sinyal digital yang dapat Anda gunakan untuk input. Anda mungkin juga mempertimbangkan sensor shield untuk koneksi sensor yang lebih baik.

Beritahu saya tentang proyek-proyek yang menarik Anda!

Kode

Legocar_v3_bluetoothArduino
/* Lego Powerfunctions car model controlled over bluetooth Arduino Uno controls motors and servo Remote controlled with android app developed with MIT App Inventor 2 Circuit: * Serial communication (uses Uno pin 0,1) Bluetooth-module is attached (has to be detached when loading program over USB) * L293D with motor (uses Uno digital pins 2,5,9) * L293D with servo (uses Uno digital pins 6,8,3) */ // Used libraries: #include <SPI.h> // Serial Peripheral Interface Library #include <String.h> // contains function strtok: split string into tokens // Serial buffer size: calculate based on max input size expected for one command over bluetooth serial interface #define INPUT_SIZE 30 // Motor control digital output pins defined as global constants (4 wheel drive with 2 Lego motors): const int controlPin1A = 2; // L293D driver input 1A on pin no 2 https://www.ti.com/lit/ds/symlink/l293.pdf connected to Arduino digital output pin 2 const int controlPin2A = 5; // L293D driver input 2A on pin no 7 connected to Arduino digital output pin 5 const int ENablePin = 9; // L293D ENable(1,2) input on pin no 1 connected to Arduino digital output pin 9 // Servo control digital output pins defined as global constants (Servo steering with 1 Lego servo): const int controlPin3A = 6; // L293D driver input 3A on pin no 10 connected to Arduino digital output pin 6 const int controlPin4A = 8; // L293D driver input 4A on pin no 15 connected to Arduino digital output pin 8 const int servoENablePin = 3; // L293D ENable(3,4) input on pin no 9 connected to Arduino digital output pin 3 // Motor control global variables: int motorSpeed = 0; // Motor speed 0..255 int motorDirection = 1; // Forward (1) or reverse (0) // Servo control global variables: int steering = 0; // Servo position 0..255 int steeringDirection = 0; // Left (0) and Right (1) void setup() { Serial.begin(9600); // initialize serial communication Serial.setTimeout(1000); // 1000 ms time out // Declare digital output pins: 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 off digitalWrite(servoENablePin, LOW); // steering centered } void loop() { // Get next command from serial bluetooth (add 1 byte for final 0) char input[INPUT_SIZE + 1]; // array of type char (C-string) with null-termination (https://www.arduino.cc/en/Reference/String) byte size = Serial.readBytesUntil('\n', input, INPUT_SIZE); //read Serial until new line or buffer full or time out // Add the final 0 to end the C-string input[size] = 0; // Read command which is a C-string of the form: "RC,RCsteering,RCspeed,\n\0" (ends with a new line character and a null) char* command = strtok(input, ","); // ignore command for now (RC for Remote Control is the only command sent by the app for the time being) char* RCsteering = strtok(NULL, ","); // next comes RCsteering which is in the Range: -100 (left).. 0 .. 100 (right) char* RCspeed = strtok(NULL, ","); // next comes RCspeed which is in the Range: -100 (full speed reverse).. 0 .. 100 (full speed forward) int iRCsteering = atoi(RCsteering); // convert string RCsteering into integer iRCsteering int iRCspeed = atoi(RCspeed); // convert string RCspeed into integer iRCspeed // Set motor and servo control variables if (iRCsteering > 0) steeringDirection = 1; // turn right if iRCsteering = 1..100 else steeringDirection = 0; // turn left if iRCsteering = -100..0 steering = int(2.55*abs(iRCsteering)); // Servo position 0..255 based on command 0..100 if (iRCspeed > 0) motorDirection = 1; // Set car in forward if iRCspeed = 1..100 else motorDirection = 0; // Set car in reverse if iRCspeed = -100..0 motorSpeed = int(2.55*abs(iRCspeed)); // Set speed 0..255 based on command 0..100 SetMotorControl(); // adjust motor direction and speed } void SetMotorControl() /* L293 logic: EN1,2 1A 2A H H L Motor turns left (Forward; motorDirection == 1) H L H Motor turns right (Reverse; motorDirection == 0) EN3,4 3A 4A H H L Servo turns left (steeringDirection == 0) H L H Servo turns right (steeringDirection == 1) Motor speed: PWM signal on EN1,2 (490 Hz; digital output value 0..255 for motorSpeed) Servo position:PWM signal on EN3,4 (490 Hz; digital output value 0..255 for position; 0 is straight ahead) */ { if (motorDirection == 1) //Forward { digitalWrite(controlPin1A, HIGH); digitalWrite(controlPin2A, LOW); } else //Reverse { digitalWrite(controlPin1A, LOW); digitalWrite(controlPin2A, HIGH); } analogWrite(ENablePin, motorSpeed); //Speed if (steeringDirection == 0) //Left { digitalWrite(controlPin3A, HIGH); digitalWrite(controlPin4A, LOW); } else //Right { digitalWrite(controlPin3A, LOW); digitalWrite(controlPin4A, HIGH); } analogWrite(servoENablePin, steering); //Servo position } 
Github Lego-car-Arduino

Berisi kode sumber Arduino; diagram Fritzing; kode sumber aplikasi android untuk diunggah ke MIT app inventorhttps://github.com/Notthemarsian/Lego-car-Arduino

Skematik

Github Lego-car-Arduino

Berisi kode sumber Arduino; diagram Fritzing; kode sumber aplikasi android untuk diunggah ke MIT app inventorhttps://github.com/Notthemarsian/Lego-car-ArduinoLego%20rc%20car%20v2.fzz

Proses manufaktur

  1. Menguasai SaaS: Strategi untuk Mempertahankan Sambil Memanfaatkan Cloud
  2. Mengenalkan Fungsi Eksponensial Basis e
  3. Mencari Antiturunan Fungsi Eksponensial Pangkat
  4. Meningkatkan Keandalan Komponen Transmisi Daya: Strategi Terbukti untuk Operasi Pertambangan, Manufaktur & Industri
  5. Panel Kontrol Listrik: Esensi Desain untuk Keamanan dan ROI
  6. Energi Angin: Mengubah Gerakan Udara menjadi Listrik Bersih
  7. Produsen Inggris Hilang £2,5 Juta untuk Memperbaiki Kesalahan Desain dalam Proyek Otomatisasi
  8. Sewa Listrik dan HVAC Terpercaya untuk Kontrol Iklim yang Mulus
  9. Delapan Langkah Terbukti untuk Mendiagnosis dan Memperbaiki Sistem Kontrol Proses Anda
  10. Menguasai Kontrol Tegangan dalam Pengolahan Web: Komponen Esensial Dijelaskan