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

Kontrol Arduino Rover menggunakan Firmata dan Pengontrol Xbox One

Komponen dan persediaan

Pengontrol Microsoft Xbox dan Adaptor Nirkabel untuk Windows
Pengontrol ini dapat ditambahkan ke PC Windows menggunakan adaptor
× 1
Modem Bluetooth SparkFun - BlueSMiRF Silver
Atau modul Bluetooth yang identik (HC-05, HC-06)
× 1
Arduino UNO
× 1

Aplikasi dan layanan online

Microsoft Windows 10 IoT Core
Aplikasi ini adalah perantara antara sketsa Firmata standar dan pengontrol Xbox One

Tentang proyek ini

Beberapa bulan yang lalu saya membeli rover kecil (dikendalikan oleh Arduino Uno) dengan harga yang sangat bagus. Perlengkapannya sangat lengkap:Sasis mobil, 2 Roda Mobil, 2 Motor DC Gear, UNO R3, Pengontrol Motor H-Bridge Ganda L298N, dan beberapa komponen lainnya.

Penjelajah ini dimaksudkan untuk diprogram untuk operasi otonom. Oleh karena itu sensor ultrasonik dan servo juga ditambahkan dalam kit. Juga pelindung sensor Arduino 5 yang bagus ada di dalam kit. Ya, itu benar-benar murah;-)

Tetapi ide saya adalah menggunakan Pengontrol Xbox One dan protokol Firmata untuk mengemudikan yang ini sendiri atau salah satu putra saya. Dan itu bekerja dengan sangat baik!

Berikut adalah video dari solusi terakhir:

Bagian utama yang digunakan dalam proyek ini adalah:

  • Kit rover (kami menggunakan untuk demonstrasi ini hanya sebagian dari suku cadang:pelat dasar, roda, motor, Arduino Uno, dudukan baterai 9 volt, dan L298N Dual H-Bridge Motor Controller)
  • Tempat baterai ekstra untuk 6 baterai AA
  • Modul Bluetooth (HC-06)
  • Pengontrol Xbox One dengan adaptor nirkabel untuk windows (untuk menghubungkannya ke laptop)
  • Laptop (dengan Windows 10 + VS2015 + dongle Bluetooth)
  • Lampu berkedip hanya untuk efek dramatis

Membuat perangkat

Membangun kit tidak terlalu sulit. Meskipun manual konstruksinya dalam bahasa Cina, semuanya tampak cukup logis. Hanya ada satu pelat dasar sehingga saya harus meletakkan beberapa komponen di atasnya dan beberapa di bawah (sekarang pengontrol motor):

Dalam gambar ini dua dudukan baterai yang berbeda ditambahkan. Selama pemrograman, saya menemukan bahwa saya harus menggunakan catu daya terpisah hanya untuk menjalankan motor.

Menghubungkan motor – tata letak pin pengontrol

Yang terpenting dari perangkat keras kali ini, bukanlah arduino Uno, melainkan pengontrol motor.

“L298 adalah driver H-bridge ganda untuk motor DC brush dan motor stepper. Ini mendukung rentang tegangan pengoperasian yang lebar dan dapat menghasilkan 2 A per saluran dalam paket lubang-lubang yang dapat diakses untuk proyek mandiri.”

Pengontrol ini akan mengontrol kecepatan dan arah masing-masing dari kedua motor tersebut, menggunakan sinyal yang berasal dari Arduino.

Tata letak pin Pengendali Motor H-Bridge Ganda L298N  adalah:

  • Plus + motor DC 1
  • Minus – motor DC 1
  • Daya Masuk. Saya mensuplai 9 volt dari tempat baterai terpisah
  • Hal yang sama. Terhubung ke dudukan baterai saya yang terpisah dan Arduino
  • Matikan listrik . Dapat menghasilkan 5 volt (tidak digunakan . Arduino saya mendapat daya dari dudukan baterai lain)
  • ENA terhubung ke Arduino D10. Port ini mampu PWM (putih)
  • IN1 terhubung ke Arduino D9. (abu-abu)
  • IN2 terhubung ke Arduino D8. (ungu)
  • IN3 terhubung ke Arduino D7. (biru)
  • IN4 terhubung ke Arduino D6. (hijau)
  • ENB terhubung ke Arduino D5. Port ini mampu PWM (kuning)
  • Plus + motor DC 2
  • Minus – motor DC 2
  • Pelompat di sebelah 2 dan 3 TIDAK dihapus karena saya tidak melebihi daya input lebih dari 12 volt (sampai 35 volt) (jumper tidak ditandai pada gambar)

Catatan:pengontrol memiliki catu daya sendiri. Arduino juga memilikinya. Agar semuanya tetap berjalan (tanpa meledak, beri mereka kesamaan . Lihat butir 4 di atas)

Menghubungkan motor – tata letak pin Arduino

Menghubungkan Arduino cukup mudah. Kami menghubungkan ground dan 5 volt catu daya ke Arduino. Dan kami menghubungkan enam jalur (ENA, IN1-4 dan ENB) ke pin D10 hingga D5.

Harus jelas bahwa port 7 dan 8 (dan 9 dan 10 untuk motor lain) hanyalah port GPIO biasa. Ini akan digunakan untuk arah motor. Jika kedua port (mis. 7 dan 8) LOW, motor tidak akan melakukan apa-apa (berhenti). Jika yang satu TINGGI dan yang lain RENDAH, motor akan berjalan dalam satu arah. Jika terhubung sebaliknya (yang pertama disetel ke RENDAH dan yang lainnya ke TINGGI) motor yang terhubung akan berjalan ke arah lain.

Tapi .. hanya mengatur pin ini tidak akan menghasilkan apa-apa. Belum ada bagian yang bergerak!

Keajaiban akan datang dari pin 5 dan 10. Ini adalah pin 'khusus' yang dapat menghasilkan sinyal PWM. Menyetel nilai antara 0 dan 255 akan mengakibatkan motor berjalan SANGAT lambat (berhenti) atau pada kecepatan tinggi.

Catatan:Setiap port pada Arduino Uno yang mampu PWM ditandai dengan tilde (~).

Menghubungkan Bluetooth

Modul Bluetooth yang saya gunakan hanya perlu dihubungkan ke port RX dan TX (melintasi batas) dan membutuhkan daya 5 volt dan ground dari Arduino.

Sketsa Firma di Arduino

Sketsa Firma "StandardFirmata" adalah semua yang kita butuhkan di Arduino! Dapatkan saja dari contoh Arduino IDE dan unggah (mungkin Anda perlu melepas pin TX/RX terlebih dahulu untuk menyelesaikan unggahan).

Catatan:karena kurangnya kualitas modul Bluetooth saya, saya selalu menurunkan baudrate yang di-hardcode di dalam sketsa, dan menyetelnya ke 9600.

Tuan-tuan, nyalakan mesin Anda

Atau, uji koneksi…

Jadi mengapa saya menggunakan Firma? karena itu mudah. Seberapa mudah? Sangat mudah. Dan itu bahkan bisa dilakukan tanpa pemrograman. Cukup mulai aplikasi Windows Remote Arduino Experience (tersedia di toko dan juga berfungsi di perangkat Windows 10 Mobile).

Pertama, Anda harus menyambungkan ke modul Bluetooth HC-6 yang sudah dipasangkan.

Saat dipasangkan, buka halaman PWM. Aktifkan pin 5 digital dan beri nilai, katakanlah, 128.

Hati-hati:langkah selanjutnya akan membuat motor Anda berjalan. Helm dan roda dari tepung. Anda akan tahu mengapa saat melihatnya.

Kemudian pergi ke halaman Digital. Dan balikkan sakelar pin digital 6.

Sekarang, jika semuanya terhubung dan berjalan, salah satu motor akan berputar!

Jika demikian, Anda dapat memeriksa kecepatan lainnya (menggunakan nilai PWM yang lebih tinggi atau lebih rendah) atau mengubah arahnya (setel pin digital 6 ke 0 volt dan pin digital 7 ke 5 volt).

Dan di sana Anda memilikinya. Anda dapat mengontrol roda itu!

Tapi ada lagi, hal yang sama berlaku untuk pin 10 (PWM) dan pin digital 9 dan pin digital 8.

Kedua roda berjalan. Sekarang mulai coding…

Aplikasi UWP sebagai pembuat jodoh

Harus jelas bahwa kita memerlukan aplikasi UWP baru antara pengontrol Xbox One dan rover.

Saya sudah membuat blog tentang menggunakan pengontrol Xbox One di sini. Kali ini kita akan menggabungkan pengetahuan itu dengan out rover.

Mari kita lihat antarmuka aplikasi UWP kami:

Ini cukup membosankan, dua tombol dan satu blok teks. Saya tidak akan melakukan apa-apa lagi, pertama-tama menghubungkan ke Arduino menggunakan Firmata. Dan setelah koneksi dibuat, tombol pengontrol harus memulai satu loop raksasa untuk membaca input pengontrol dan mengubahnya menjadi perintah yang berguna.

Dan yang ingin kami buat adalah kontrol tangki klasik ini dengan dua pegangan. Yang kita butuhkan hanyalah memeriksa dua stik pada pengontrol Xbox One. Memindahkannya ke depan dan ke belakang juga akan menghidupkan motor yang sesuai ke depan dan ke belakang:

Catatan:Jika Anda memulai aplikasi UWP baru, jangan lupa untuk menambahkan kemampuan Bluetooth. Dan Anda harus menginstal paket nuget untuk Firma.

Pertama kita tambahkan cuplikan XAML (lihat bagian kode untuk kode sumber Xaml) di kisi bentuk utama sehingga kita memiliki beberapa tombol.

Selanjutnya kita tambahkan kode di belakang (lihat bagian kode untuk kode sumber C#) dari formulir utama. Saya pada dasarnya dibagi menjadi dua bagian. Pertama kita membuat koneksi melalui Bluetooth dengan protokol Firma. Selanjutnya kita mulai mendengarkan masukan pada pengontrol Xbox One.

Dalam lingkaran untuk memeriksa kontrol, kami memutuskan apakah stik jempol mengarah ke depan atau ke belakang atau berada dalam kisaran 'berhenti'. Setelah itu kita putuskan berapa nilai pin PWM tersebut.

Sangat menarik untuk melihat bahwa menulis nilai PWM direpresentasikan dalam Firmata sebagai menulis nilai analog ke port digital. Tidak ada metode PWM khusus di kelas Arduino.

Saya telah menambahkan dua metode "ArduinoDigitalWrite" dan "ArduinoAnalogWrite" untuk mencegah penulisan nilai yang sama berulang-ulang ke Arduino. Ini akan mengacaukan komunikasi dan menurunkan kinerja Arduino. (Dalam desain yang jauh lebih kaya, saya menambahkan bel. Tanpa mengabaikan perintah duplikat, kinerja bel sangat buruk dan tidak enak didengar).

Ketika motor mendapatkan pulsa PMW rendah, motor tidak langsung mulai berjalan, akan merengek dengan suara yang sangat khas. Ini adalah perilaku normal. Dan begitulah cara saya mengetahui bahwa saya harus menambahkan dua sumber daya. Pertama kali saya menghubungkan semuanya, saya pikir pengontrolnya rusak. Tidak ada yang terjadi. Sampai saya mencabut salah satu motor dan yang lainnya mulai merengek.

Jadi begitulah cara kerjanya:

Catatan kaki:lampu berkedip tidak hanya untuk efek dramatis. Setiap kali kreasi Anda mulai bergerak, harap perhatikan keamanannya. Alat itu bodoh, Anda tidak! Oleh karena itu, saya telah meletakkan lampu ini di atasnya.

Kode

  • Kontrol Xaml untuk memulai komunikasi
  • Kode-Di belakang formulir utama aplikasi UWP
Xaml mengontrol untuk memulai komunikasisnippet
Rekatkan ini ke formulir utama aplikasi UWP baru Anda
 
Kode-Di belakang formulir utama aplikasi UWPC#
Kode ini terhubung ke rover menggunakan Firmata dan melewati perintah Kontroler Xbox One
kelas parsial tertutup publik MainPage :Halaman{ private BluetoothSerial _bluetooth; RemoteDevice pribadi _arduino; private UwpFirmata _firma =null; Gamepad pribadi _Gamepad =null; // Kami tidak pernah menyediakan PWM lebih dari 255 * 0,75 private double _SpeedLimit =0.75; // nilai di bawah nilai absolut ini menghentikan rover private double _ActionPoint =0,15; byte pribadi _LeftForward =6; byte pribadi _LeftBackward =7; byte pribadi _LeftValue =5; byte pribadi _RightForward =9; byte pribadi _RightBackward =8; byte pribadi _RightValue =10; Kamus pribadi _CurrentPinStates =Kamus baru(); kamus pribadi _CurrentSpeedValues ​​=Kamus baru(); public MainPage() { this.InitializeComponent(); } private void btnStart_Click(pengirim objek, RoutedEventArgs e) { btnStart.IsEnabled =false; Gamepad.GamepadDitambahkan +=Gamepad_GamepadDitambahkan; Gamepad.GamepadRemoved +=Gamepad_GamepadRemoved; _bluetooth =new BluetoothSerial("HC-06"); _bluetooth.ConnectionLost +=BluetoothConnectionLost; _bluetooth.ConnectionFailed +=BluetoothConnectionFailed; _bluetooth.ConnectionEstablished +=OnConnectionEstablished; _firma =UwpFirmata baru(); _arduino =Perangkat Jarak Jauh baru(_firma); _firma.begin(_bluetooth); _bluetooth.begin(9600, SerialConfig.SERIAL_8N1); _arduino.DeviceReady +=ArduinoDeviceReady; } private async void BluetoothConnectionLost(string message) { menunggu Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="ConnectionLost" + pesan;      btnStart.IsEnabled =true; }); } private async void BluetoothConnectionFailed(string message) { menunggu Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="ConnectionFailed" + pesan;      btnStart.IsEnabled =true; }); } private async void ArduinoDeviceReady() { menunggu Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="Device Ready"; }); } private void OnConnectionEstablished() { var action =Dispatcher.RunAsync( CoreDispatcherPriority.Normal, new DispatchedHandler(() => { DisableEnableButtons(true); ArduinoDigitalWrite(_LeftForward, PinState.LOW); ArduinoDigitalWrite(_LeftBackward), ArduinoDigitalWrite. (_RightBackward, PinState.LOW); ArduinoDigitalWrite(_RightForward, PinState.LOW); })); } private void DisableEnableButtons(bool diaktifkan) { // Nonaktifkan semua tombol. Jika tidak // 'A' akan menekan yang difokuskan. btnController.IsEnabled =diaktifkan; btnStart.IsEnabled =diaktifkan; } private async void Gamepad_GamepadRemoved( pengirim objek, Gamepad e) { _Gamepad =null; menunggu Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="Pengontrol dihapus"; }); } private async void Gamepad_GamepadAdded( pengirim objek, Gamepad e) { _Gamepad =e; menunggu Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text ="Pengontrol ditambahkan"; }); } private async void btnController_Click(pengirim objek, RoutedEventArgs e) { DisableEnableButtons(false); while (true) { menunggu Task.Delay(TimeSpan.FromMilliseconds(3)); if (_Gamepad ==null) { lanjutkan; } // Dapatkan status saat ini var reading =_Gamepad.GetCurrentReading(); if (Math.Abs(reading.LeftThumbstickY) <_ActionPoint) { ArduinoDigitalWrite(_LeftForward, PinState.LOW); ArduinoDigitalWrite(_LeftBackward, PinState.LOW); sldrLeftSpeed.Nilai =0; } else if (reading.LeftThumbstickY>=_ActionPoint) { ArduinoDigitalWrite(_LeftForward, PinState.HIGH); ArduinoDigitalWrite(_LeftBackward, PinState.LOW); sldrLeftSpeed.Value =255 * Math.Abs(reading.LeftThumbstickY) * _SpeedLimit; } else if (reading.LeftThumbstickY <=-_ActionPoint) { ArduinoDigitalWrite(_LeftForward, PinState.LOW); ArduinoDigitalWrite(_LeftBackward, PinState.HIGH); sldrLeftSpeed.Value =255 * Math.Abs(reading.LeftThumbstickY) * _SpeedLimit; } if (Math.Abs(reading.RightThumbstickY) <_ActionPoint) { ArduinoDigitalWrite(_RightForward, PinState.LOW); ArduinoDigitalWrite(_RightBackward, PinState.LOW); sldrRightSpeed.Value =0; } else if (reading.RightThumbstickY>=_ActionPoint) { ArduinoDigitalWrite(_RightForward, PinState.HIGH); ArduinoDigitalWrite(_RightBackward, PinState.LOW); sldrRightSpeed.Value =255 * Math.Abs(reading.RightThumbstickY) * _SpeedLimit; } else if (reading.RightThumbstickY <=-_ActionPoint) { ArduinoDigitalWrite(_RightForward, PinState.LOW); ArduinoDigitalWrite(_RightBackward, PinState.HIGH); sldrRightSpeed.Value =255 * Math.Abs(reading.RightThumbstickY) * _SpeedLimit; } } } private void ArduinoDigitalWrite(port byte, status PinState) { // abaikan perintah duplikat var existing =_CurrentPinStates.ContainsKey(port); if (!exists || _CurrentPinStates[port] !=state) { _CurrentPinStates[port] =state; _arduino.digitalWrite(port, status); } } private void ArduinoAnalogWrite(port byte, nilai ushort) { // abaikan perintah duplikat var existing =_CurrentSpeedValues.ContainsKey(port); if (!exists || _CurrentSpeedValues[port] !=nilai) { _CurrentSpeedValues[port] =nilai; _arduino.analogWrite(port, nilai); } }}

Proses manufaktur

  1. Sistem Kehadiran Menggunakan Arduino dan RFID dengan Python
  2. Kontrol Jarak Jauh Universal menggunakan Arduino, 1Sheeld, dan Android
  3. Voltmeter DIY Menggunakan Arduino dan Smartphone
  4. Menggunakan IoT untuk Mengontrol Lengan Robot dari Jarak Jauh
  5. Pengukuran Frekuensi dan Siklus Tugas Menggunakan Arduino
  6. Sonar menggunakan arduino dan ditampilkan pada pemrosesan IDE
  7. Mengontrol Kecerahan LED Menggunakan Bolt dan Arduino
  8. Lengan Robot Sederhana dan Cerdas Menggunakan Arduino
  9. Kontrol Penuh TV Anda Menggunakan Alexa dan Arduino IoT Cloud
  10. Radio FM Menggunakan Arduino dan RDA8057M