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

Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One

Komponen dan perlengkapan

Microsoft Xbox Controller dan Wireless Adapter untuk Windows
Kontroler ini dapat ditambahkan ke PC Windows menggunakan adapter
×1
Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One
SparkFun Bluetooth Modem - BlueSMiRF Silver
Atau modul Bluetooth identik (HC-05, HC-06)
×1
Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One
Arduino UNO
×1

Aplikasi dan layanan online

Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One
Microsoft Windows 10 IoT Core
Aplikasi ini adalah perantara antara skets Firmata standar dan kontroler Xbox One

Tentang proyek ini

Beberapa bulan lalu saya membeli rover kecil (dikontrol oleh Arduino Uno) dengan harga sangat baik. Kitnya sangat lengkap: Chassis mobil, 2 Roda Mobil, 2 Motor DC Gear, UNO R3, Pengontrol Motor Dual H-Bridge L298N dan beberapa komponen lainnya.

Rover ini dimaksudkan untuk diprogram untuk operasi otonom. Oleh karena itu sensor ultrasonik dan servo juga ditambahkan dalam kit. Juga sensor shield Arduino 5 yang bagus ada dalam kit. Ya, itu adalah koin yang sangat menguntungkan ;-)

Tapi ide saya adalah untuk menggunakan baik Kontroler Xbox One dan protokol Firmata untuk mengemudikan ini sendiri atau salah satu putra saya. Dan itu bekerja sangat bagus!

Ini adalah video dari solusi akhir:

Bagian utama yang digunakan dalam proyek ini adalah:

Membangun kit

Membangun kit tidak sulit. Meskipun manual konstruksi dalam bahasa Cina, semuanya terlihat cukup logis. Hanya ada satu plat dasar jadi saya harus meletakkan beberapa komponen di atasnya dan beberapa di bawahnya (sekarang pengontrol motor):

Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One

Dalam gambar ini dua tampungan baterai berbeda ditambahkan. Selama pemrograman saya menemukan bahwa saya harus menggunakan sumber daya terpisah hanya untuk menggerakkan motor.

Menghubungkan motor – tata letak pin pengontrol

Jantung perangkat keras kali ini, bukan Arduino Uno tetapi pengontrol motor.

“L298 adalah driver H-bridge dual untuk motor DC dengan brush dan motor stepper. Ini mendukung rentang tegangan operasi yang luas dan dapat menghasilkan 2 A per saluran dalam paket through-hole yang dapat diakses untuk proyek DIY.”

Pengontrol ini akan mengontrol kecepatan dan arah setiap motor dua, menggunakan sinyal yang datang dari Arduino.

Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One

Tata letak pin Pengontrol Motor Dual H-Bridge L298N adalah:

Catatan: pengontrol memiliki sumber daya sendiri. Arduino juga memiliki satu. Untuk menjaga agar tetap berjalan (tidak meledakkan sesuatu, berikan mereka ground umum. Lihat poin 4 di atas)

Menghubungkan motor – tata letak pin Arduino

Menghubungkan Arduino cukup sederhana. Kami menghubungkan ground dan 5 volt dari sumber daya ke Arduino. Dan kami menghubungkan enam garis (ENA, IN1-4 dan ENB) ke pin D10 sampai D5.

Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One

Harus jelas bahwa port 7 dan 8 (dan 9 dan 10 untuk motor lain) hanyalah port GPIO reguler. Ini akan digunakan untuk arah motor. Jika kedua port (mis. 7 dan 8) LOW, motor tidak akan melakukan apa pun (berhenti). Jika satu HIGH dan yang lain LOW motor akan berjalan di satu arah. Jika terhubung dengan cara lain (yang pertama diatur ke LOW dan yang lain ke HIGH) motor yang terhubung akan berjalan di arah lain.

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

Magis akan datang dari pin 5 dan 10. Ini adalah pin ‘khusus’ yang dapat menghasilkan sinyal PWM. Mengatur nilai antara 0 dan 255 akan menghasilkan motor berjalan SANGAT lambat (berhenti) atau dengan 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 (silangkan garis) dan memerlukan daya 5 volt dan ground dari Arduino.

Skets Firmata pada Arduino

Skets Firmata “StandardFirmata” adalah semua yang kita butuhkan pada Arduino! Cukup ambil dari contoh Arduino IDE dan unggah (mungkin Anda perlu mencabut TX/RX terlebih dahulu untuk menyelesaikan pengunggahan).

Catatan: karena kualitas modul Bluetooth saya yang buruk, saya selalu menurunkan baudrate yang dikodekan keras di dalam skets, dan mengatur ke 9600.

Saudara, nyalakan mesin Anda

Atau, uji koneksi…

Jadi mengapa saya menggunakan Firmata? karena mudah. Seberapa mudah? Sangat mudah. Dan itu bahkan dapat dilakukan tanpa pemrograman. Cukup jalankan aplikasi Windows Remote Arduino Experience (tersedia di toko dan juga bekerja pada perangkat Windows 10 Mobile).

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

Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One

Setelah dipasangkan, pergi ke halaman PWM. Aktifkan pin digital 5 dan berikan nilai, katakanlah, 128.

Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One

Hati-hati: langkah berikutnya akan membuat motor berjalan. Helm di atas dan roda dari lantai. Anda akan tahu mengapa saat melihatnya.

Lalu pergi ke halaman Digital. Dan balik saklar pin digital 6.

Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One

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

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

Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One

Dan itulah. 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 mengkode…

Aplikasi UWP sebagai pencocok

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

Saya sudah menulis blog tentang menggunakan Kontroler Xbox One di sini. Kali ini kita akan menggabungkan pengetahuan itu dengan rover kita.

Mari lihat antarmuka aplikasi UWP kita:

Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One

Cara ini agak membosankan, dua tombol dan sebuah blok teks. Saya tidak akan memiliki lebih banyak pekerjaan kecuali pertama terhubung ke Arduino menggunakan Firmata. Dan setelah koneksi dibuat, tombol kontroler akan harus memulai satu loop besar untuk membaca input kontroler dan mengubahnya menjadi perintah yang berguna.

Dan apa yang ingin kita buat adalah kontrol tank klasik dengan dua pegangan. Yang kita butuhkan hanyalah memeriksa dua jempol pada Kontroler Xbox One. Memindahkannya maju dan mundur juga akan memulai motor yang sesuai maju dan mundur:

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

Pertama kita tambahkan cuplikan XAML (lihat bagian kode untuk kode sumber XAML) dalam grid formulir utama jadi kita punya beberapa tombol.

Selanjutnya kita menambahkan kode di belakang (lihat bagian kode untuk kode sumber C#) dari formulir utama. Pada dasarnya terbagi menjadi dua bagian. Pertama kita membuat koneksi melalui Bluetooth dengan protokol Firmata. Selanjutnya kita mulai mendengarkan input pada Kontroler Xbox One.

Dalam loop untuk memeriksa kontrol, kita memutuskan apakah jempol mengarah ke depan atau ke belakang atau berada dalam rentang ‘berhenti’. Setelah itu kita memutuskan nilai apa yang akan diberikan untuk pin PWM.

Menarik untuk melihat bahwa penulisan nilai PWM direpresentasikan dalam Firmata sebagai penulisan nilai analog ke port digital. Tidak ada metode PWM khusus dalam kelas Arduino.

Saya telah menambahkan dua metode “ArduinoDigitalWrite” dan “ArduinoAnalogWrite” untuk mencegah penulisan nilai yang sama berulang kali ke Arduino. Ini akan membingungkan komunikasi dan menurunkan kinerja Arduino. (Dalam desain yang jauh lebih kaya saya menambahkan buzzer. Tanpa mengabaikan perintah duplikat kinerja buzzer sangat buruk dan menakutkan untuk didengar).

Ketika motor mendapatkan pulsa PWM rendah, motor tidak langsung mulai berjalan, itu akan berdengung dengan suara yang sangat khas. Ini adalah perilaku normal. Dan itulah bagaimana saya menemukan bahwa saya harus menambahkan dua sumber daya. Kali pertama saya menghubungkan semuanya, saya pikir kontroler rusak. Tidak ada yang terjadi. Sambil saya mencabut salah satu motor dan yang lain mulai berdengung.

Jadi itulah caranya:

Kendalikan Rover Arduino dengan Mulus menggunakan Firmata dan Gamepad Xbox One

Catatan kaki: lampu kilat bukan hanya untuk efek dramatis. Kapan pun ciptaan Anda mulai bergerak, harap waspadai keselamatan. Kontraption ini bodoh, Anda tidak! Oleh karena itu saya telah menempatkan lampu ini di atasnya dari awal.

Kode

Kontrol XAML untuk memulai komunikasisnippets
Tempelkan ini ke dalam formulir utama aplikasi UWP baru Anda
<StackPanel Orientation="Vertical"> <Button Name="btnStart" Click="btnStart_Click" FontSize="50" Width="400" Content="Start" /> <Button Name="btnController" Content="Controller" FontSize ="50" Width="400" IsEnabled="False" Click="btnController_Click" /> <TextBlock Name="tbRead" FontSize="20" Foreground="Gray" /> </StackPanel> 
Kode-Behind dari formulir utama aplikasi UWPC#
Kode ini terhubung ke rover menggunakan Firmata dan meneruskan perintah Kontroler Xbox One
public sealed partial class MainPage : Page { private BluetoothSerial _bluetooth; private RemoteDevice _arduino; private UwpFirmata _firmata = null; private Gamepad _Gamepad = null; // We never supply a PWM of more then 255 * 0,75 private double _SpeedLimit = 0.75; // values below this absolte value stop the rover private double _ActionPoint = 0.15; private byte _LeftForward = 6; private byte _LeftBackward = 7; private byte _LeftValue = 5; private byte _RightForward = 9; private byte _RightBackward = 8; private byte _RightValue = 10; private Dictionary<byte, PinState> _CurrentPinStates = new Dictionary<byte, PinState>(); private Dictionary<byte, ushort> _CurrentSpeedValues = new Dictionary<byte, ushort>(); public MainPage() { this.InitializeComponent(); } private void btnStart_Click(object sender, RoutedEventArgs e) { btnStart.IsEnabled = false; Gamepad.GamepadAdded += Gamepad_GamepadAdded; Gamepad.GamepadRemoved += Gamepad_GamepadRemoved; _bluetooth = new BluetoothSerial("HC-06"); _bluetooth.ConnectionLost += BluetoothConnectionLost; _bluetooth.ConnectionFailed += BluetoothConnectionFailed; _bluetooth.ConnectionEstablished += OnConnectionEstablished; _firmata = new UwpFirmata(); _arduino = new RemoteDevice(_firmata); _firmata.begin(_bluetooth); _bluetooth.begin(9600, SerialConfig.SERIAL_8N1); _arduino.DeviceReady += ArduinoDeviceReady; } private async void BluetoothConnectionLost(string message) { await Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text = "ConnectionLost" + message; btnStart.IsEnabled = true; }); } private async void BluetoothConnectionFailed(string message) { await Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text = "ConnectionFailed" + message; btnStart.IsEnabled = true; }); } private async void ArduinoDeviceReady() { await 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, PinState.LOW); ArduinoDigitalWrite(_RightBackward, PinState.LOW); ArduinoDigitalWrite(_RightForward, PinState.LOW); })); } private void DisableEnableButtons(bool enabled) { // Disable all buttons. Otherwise // the 'A' will press the one focussed. btnController.IsEnabled = enabled; btnStart.IsEnabled = enabled; } private async void Gamepad_GamepadRemoved( object sender, Gamepad e) { _Gamepad = null; await Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text = "Controller removed"; }); } private async void Gamepad_GamepadAdded( object sender, Gamepad e) { _Gamepad = e; await Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { tbRead.Text = "Controller added"; }); } private async void btnController_Click(object sender, RoutedEventArgs e) { DisableEnableButtons(false); while (true) { await Task.Delay(TimeSpan.FromMilliseconds(3)); if (_Gamepad == null) { continue; } // Get the current state var reading = _Gamepad.GetCurrentReading(); if (Math.Abs(reading.LeftThumbstickY) < _ActionPoint) { ArduinoDigitalWrite(_LeftForward, PinState.LOW); ArduinoDigitalWrite(_LeftBackward, PinState.LOW); sldrLeftSpeed.Value = 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(byte port, PinState state) { // ignore duplicate commands var exists = _CurrentPinStates.ContainsKey(port); if (!exists || _CurrentPinStates[port] != state) { _CurrentPinStates[port] = state; _arduino.digitalWrite(port, state); } } private void ArduinoAnalogWrite(byte port, ushort value) { // ignore duplicate commands var exists = _CurrentSpeedValues.ContainsKey(port); if (!exists || _CurrentSpeedValues[port] != value) { _CurrentSpeedValues[port] = value; _arduino.analogWrite(port, value); } } } 

Proses manufaktur

  1. Sistem Absensi RFID berbasis Arduino yang Andalkan dengan Python
  2. Membuat Remote Android Universal dengan Arduino, 1Sheeld & Kontrol IR
  3. Buat Voltmeter Cerdas dengan Arduino & Smartphone – Proyek DIY Mudah
  4. Kontrol Robotik Arm Custom Secara Jarak Jauh melalui IoT
  5. Pengukuran Frekuensi & Siklus Kerja Akurat dengan Arduino UNO
  6. Pengukuran Jarak Real-Time dengan Sonar Arduino & Visualisasi Processing
  7. Pengendalian Kecerahan LED Lancar Menggunakan Bolt IoT dan Arduino UNO
  8. Buat Lengan Robotik Arduino Pintar: Tutorial DIY Mudah
  9. Kendalikan TV Anda dengan Alexa melalui Arduino IoT Cloud – Panduan Langkah demi Langkah
  10. Membuat Radio FM Kompak dengan Arduino Nano dan RDA8057M