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

Robot Kontrol Suara 2WD dengan Arduino dan Server BitVoicer

Komponen dan persediaan

Arduino UNO
× 1
Pelindung Pengemudi Motor Pololu Ganda MC33926
× 1
SparkFun XBee Shield
× 1
Modul Microchip RN171VX
× 1
SparkFun Electret Microphone Breakout
× 1
Sasis Mobil Robot 2WD
× 1
Pengatur Tegangan Instrumen Texas LM1117 (TO-220)
× 1
Kapasitor 10 F
× 1
LED (generik)
× 4
Resistor 330 ohm
× 4
Baterai AA
× 4
Baterai 9V (generik)
× 1
Adaptor Jack Barrel 9V
× 1
Kabel jumper (generik)
× 17
Kawat Tembaga Biasa
× 1
Sekrup dan penjepit plastik fleksibel untuk pemasangan
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)
Tang
Obeng

Aplikasi dan layanan online

Server BitVoicer 1.0

Tentang proyek ini

Dalam tutorial ini, saya akan menunjukkan cara membuat robot dengan kendali suara 2WD. Meskipun saya hanya mengontrol motor DC untuk menggerakkan robot, pendekatan yang sama dapat digunakan untuk motor stepper dan motor servo yang mengontrol suara, jadi jika Anda berencana membuat robot yang dikendalikan suara yang melakukan gerakan mekanis, tutorial ini dapat berfungsi sebagai referensi untuk proyek Anda.

Untuk membuat robot ini, pada dasarnya Anda memerlukan satu sasis 2 roda, satu papan Arduino, satu pelindung driver motor DC, satu lisensi BitVoicer Server, satu modul WiFi, dan satu mikrofon yang telah diperkuat sebelumnya. Mengenai komponen, ada banyak variasi di pasaran dan Anda dapat mencapai hasil yang sama dengan menggunakan kombinasi yang berbeda. Pada Langkah 1, saya memberikan beberapa detail tentang beberapa komponen yang digunakan dalam robot, jadi jika Anda perlu mengubah beberapa di antaranya, cari saja komponen yang memiliki fitur serupa.

Prosedur berikut akan dijalankan untuk mengubah perintah suara menjadi gerakan robot:

  • 1. Gelombang audio akan ditangkap dan diperkuat oleh papan Sparkfun Electret Breakout;
  • 2. Sinyal yang diperkuat akan didigitalkan dan di-buffer di Arduino menggunakan analog-to-digital converter (ADC);
  • 3. Sampel audio akan dialirkan ke BitVoicer Server menggunakan modul WiFi Microchip;
  • 4. Server BitVoicer akan memproses aliran audio dan mengenali ucapan yang dikandungnya;
  • 5. Ucapan yang dikenali akan dipetakan ke perintah standar yang akan dikirim ke Arduino;
  • 6. Arduino akan mengidentifikasi perintah dan menentukan motor DC mana yang akan digunakan, untuk berapa lama dan berapa kecepatannya;
  • 7. Driver motor akan diaktifkan untuk memberikan tegangan dan arus yang diperlukan untuk menggerakkan motor.

Daftar Materi:

  • Arduino UNO:~U$ 25.00
  • Perlindungan Pengemudi Motor Pololu Ganda MC33926:US 29,95
  • SparkFun XBee Shield:U$ 14,95
  • Modul Microchip RN171VX dengan Antena:U$ 34,95
  • SparkFun Electret Microphone Breakout:U$7,95
  • Server BitVoicer 1.0:U$ 8.90
  • Sasis Mobil Robot 2WD:U$15,95
  • Pengatur Tegangan Texas Instruments LM1117 (TO-220):~U$1,95
  • 10μF Kapasitor Elektrolit:~U$ 0.35
  • 4 x LED:~US 1.00
  • Resistor 4 x 330 Ohm:~U$ 0,75
  • Baterai AA 4 x 1,5V:~US 2.00
  • Baterai 9V:~US 2.00
  • Adaptor Jack 9V ke Barel:~US 2.50
  • Kabel Jumper dan Kabel Biasa:~U$ 2.00
  • Sekrup dan penjepit plastik fleksibel untuk pemasangan
  • Besi Solder dan Solder

LANGKAH 1:Mengenal Komponen

Pada langkah ini saya memberikan beberapa informasi penting tentang komponen robot dan cara mempersiapkannya untuk pemasangan.

Di tempat pertama, jantung robot:Arduino UNO R3. Meskipun saya menggunakan Arduino UNO, Anda dapat menggunakan papan Arduino lain untuk memasang robot Anda. Saya memutuskan untuk menggunakan Arduino UNO karena, sejauh ini, papan Arduino paling populer dan lebih banyak orang akan dapat membangun kembali robot ini. Jika Anda memiliki Arduino DUE, Anda juga dapat menambahkan respons suara ke robot Anda seperti yang saya lakukan dalam tutorial ini.

Untuk menggerakkan motor DC, saya menggunakan perisai Pololu ini. Ini adalah driver motor ganda yang mampu mengendalikan motor DC 5 hingga 28V dan menghasilkan arus kontinu hingga 3A per motor. Meskipun menurut saya ini adalah perisai yang sangat bagus, yang paling mengesankan saya dalam produk Pololu adalah dokumentasinya yang jelas dan mendetail. Selain itu, Pololu menyediakan perpustakaan Arduino yang sangat sederhana untuk mengontrol motor. Anda hanya perlu meneruskan kecepatan dan arah (nilai negatif atau positif) ke setSpeeds fungsi. Jika Anda memilih untuk menggunakan driver motor DC lain, perhatikan pin yang digunakan oleh driver karena tidak dapat bertentangan dengan pin lain yang digunakan oleh robot. Perisai Pololu menggunakan pin Arduino berikut:digital 4, 7, 8, 9, 10 dan 12; analogi 0 dan 1; tanah; dan 5V. Aspek terpenting di sini adalah hanya pin 9 dan 10 yang digunakan sebagai pin PWM dan timer yang digunakan untuk menghasilkan pulsa pada pin ini bukan timer yang sama (timer 2 pada UNO) yang digunakan oleh kelas BVSMic dari BitSophia.

Untuk menjalin komunikasi dengan server dan mengakses layanan BitVoicer Server, saya menggunakan modul Microchip WiFi RN171VX. Dua fitur utama menonjol dalam modul ini:semua komunikasi dapat dilakukan melalui port serial dengan cara yang sederhana; dan modul ini memiliki faktor bentuk yang sama dengan kebanyakan modul XBee yang populer. Dengan kata lain, jika Anda sudah memiliki perisai XBee, kemungkinan besar Anda tidak perlu membeli perisai Sparkfun yang saya gunakan di robot ini.

Menggunakan pelindung XBee dengan modul WiFi Microchip membuat pemasangan robot cukup mudah. Namun, saya telah mengidentifikasi masalah dalam kombinasi ini. Diketahui bahwa bekerja dengan radio sangat kompleks dan dianggap oleh beberapa orang sebagai "keajaiban voodoo". Nah, saya perhatikan bahwa saat adaptor WiFi menyala dan mentransmisikan data, gangguan yang kuat terjadi pada sinyal audio yang diukur oleh ADC Arduino. Saya tidak dapat secara tepat mengidentifikasi sumber gangguan ini, tetapi saya memiliki dua kemungkinan sumber:penarikan arus puncak modul (hingga 240mA) tidak dipisahkan dengan benar dan membahayakan tegangan referensi yang diberikan ke ADC Arduino; atau sinyal yang dipancarkan oleh antena ditangkap oleh beberapa pin yang terbuka tepat di bawah modul. Biasanya, produsen modul WiFi menginstruksikan desainer untuk menghindari menempatkan apa pun (bahkan pesawat darat) di dekat antena secara tepat untuk mencegah masalah semacam ini.

Untuk memperbaiki masalah yang dijelaskan di atas, saya menyolder regulator tegangan 3.3V dan satu kapasitor elektrolit 10μF ke pelindung Sparkfun sehingga mereka dapat memberikan tegangan referensi ke ADC Arduino. Sumber daya yang sama digunakan oleh mikrofon elektret Sparkfun. Ini memecahkan masalah volume puncak yang saya lihat di BitVoicer Server Manager. Bahkan selama periode hening, level audio mencapai 35 (0-100) di Server Monitor. Jika Anda melihat hal yang sama terjadi di proyek Anda, selidiki apa yang terjadi dengan sinyal audio yang diukur oleh ADC Arduino.

Saya memutuskan saya juga akan menggunakan ruang prototyping yang tersedia di perisai Sparkfun untuk menyolder beberapa LED yang memberi tahu status beberapa fungsi BitVoicer Server. Pada gambar di bawah, dari kiri ke kanan, informasi berikut ditampilkan oleh LED:

  • Menunjukkan apakah Server BitVoicer sedang berjalan dan/atau jika koneksi tetap aktif;
  • Menunjukkan apakah layanan penerusan data sedang berjalan;
  • Menunjukkan apakah mesin pengenalan suara telah ditetapkan ke Arduino;
  • Menunjukkan apakah kita berada dalam periode aktivasi-kata-diaktifkan. LED ini hanya menyala ketika kata aktivasi diidentifikasi.

Mengenai mikrofon electret preamplified, ada banyak pilihan yang tersedia di pasar:Sparkfun, Adafruit, RoboCore, Hackerstore dan mungkin banyak lainnya. Untuk menggunakan kode yang saya posting pada tutorial ini, pastikan mikrofon yang Anda beli analog, tegangan yang diperlukan tersedia di papan Arduino Anda, dan amplifikasi cukup tinggi (biasanya 100x untuk mikrofon electret) untuk Arduino ADC.

Sasis 2WD yang digunakan dalam robot adalah salah satu yang termurah dan paling populer di ebay. Kit lengkap berisi satu platform akrilik, dua roda plastik/karet, satu roda 360, dua motor DC dengan roda gigi (rasio 1:48), satu dudukan baterai 4xAA, dua disk encoder kecepatan, dan satu set sekrup.

LANGKAH 2:Memasang

Ayo mulai bekerja! Pada langkah ini Anda harus memasang semua komponen pada sasis seperti yang ditunjukkan pada gambar di bawah ini.

Jika Anda tidak ingin menyolder LED dan pengatur tegangan pada pelindung XBee, Anda dapat memasangnya di papan tempat memotong roti kecil seperti yang ditunjukkan pada gambar di bawah ini. Dalam hal ini, pilih papan tempat memotong roti dengan ukuran yang lebih kecil sehingga Anda dapat memperbaikinya di suatu tempat di sasis tanpa masalah lebih lanjut.

Pada gambar di atas, Anda dapat mencatat bahwa saya membuat penyangga kawat besi untuk memegang mikrofon. Anda juga dapat melihat bahwa saya merekatkan secarik kain kempa di sekitar roda 360º. Saya mengambil dua langkah ini untuk mencoba mengurangi kebisingan yang dihasilkan oleh robot dan ditangkap oleh mikrofon saat robot bergerak. Saya bahkan memotong sepotong kecil spons untuk mengisolasi kabel mikrofon dari penyangga. Tentu saja itu tidak 100% efektif, tetapi sedikit mengurangi kebisingan dan meningkatkan akurasi pengenalan suara.

LANGKAH 3:Menyiapkan Modul WiFi

Seperti yang saya katakan di Langkah 1, modul WiFi Microchip RN171VX dapat dioperasikan secara total melalui port serial. Ini membuat pengaturan modul menjadi sangat mudah karena semua perintah adalah string sederhana yang dikirim melalui port serial Arduino. Anda hanya perlu mengirim string yang berisi “$$$” untuk masuk ke mode perintah, mengirim perintah dan kemudian mengirim string yang berisi “keluar” untuk kembali ke mode data.

Kode bernama WiFi Module Setup di bagian bawah tutorial ini adalah kode yang saya gunakan untuk menyiapkan modul WiFi di jaringan rumah saya. Anda harus mengubah bagian kode yang ditandai sebagai "XXXXXX" dengan informasi dari jaringan WiFi Anda. Tiga perintah harus diubah:

  • setel wlan ssid XXXXXX :ganti XXXXXX dengan nama jaringan Anda (SSID);
  • setel frasa wlan XXXXXX :ganti XXXXXX dengan kata sandi jaringan Anda;
  • setel alamat ip XXXXXX :ganti XXXXXX dengan alamat IP (statis) yang ingin Anda setel ke modul WiFi Anda.

Di jaringan WiFi saya, metode otentikasinya adalah WPA2-PSK. Jika jaringan Anda menggunakan metode autentikasi yang berbeda, Anda juga harus mengubah set wlan auth memerintah. Lihat dokumentasi modul WiFi (bagian 4.3 Mengatur Perintah) untuk mengetahui nilai mana yang benar untuk jaringan Anda.

Ada penting detail tentang perisai Sparkfun dan sakelar kecilnya (gambar di bawah). Untuk mengunggah kode ke Arduino menggunakan antarmuka USB-nya, sakelar harus diatur ke posisi DLINE. Agar Arduino dapat mengirim/menerima data melalui modul WiFi menggunakan port serialnya, sakelar harus diatur ke posisi UART. Hal ini diperlukan karena modul WiFi dan chip USB pada Arduino UNO menggunakan port serial yang sama pada mikrokontroler ATmega. Jika sakelar diatur ke UART dan Anda mencoba mengunggah kode ke Arduino, pesan kesalahan akan ditampilkan di Arduino IDE.

Untuk mengunggah Penyiapan Modul WiFi  kode ke Arduino dan izinkan Arduino untuk mengatur modul WiFi, ikuti langkah-langkah di bawah ini:

  • 1. Atur sakelar ke posisi DLINE;
  • 2. Buka Arduino IDE, paste dan upload kode ke Arduino;
  • 3. Segera setelah pengunggahan selesai, Anda akan memiliki 5 detik (penundaan di awal kode) untuk mengubah sakelar ke posisi UART sebelum perintah dikirim ke modul WiFi. Jika perintah pertama hilang, tidak ada yang lain akan bekerja. Dalam hal ini, cukup reset Arduino agar sketsa dapat berjalan kembali dari awal.

Selama konfigurasi modul, yang memakan waktu sekitar 25 detik, LED modul akan berkedip berbeda dari pola standarnya. Saat ini Anda akan mengetahui bahwa modul WiFi sedang dikonfigurasi.

Setelah modul dikonfigurasi, coba ping (Command Prompt --> “ping [IP Address]” --> tekan Enter) modul menggunakan alamat IP yang ditentukan dalam set alamat ip memerintah. Jika Anda tidak mendapatkan respons dari modul, berarti ada yang tidak beres pada langkah sebelumnya.

LANGKAH 4:Merencanakan Gerakan Robot

Meskipun robot hanya memiliki dua motor DC, ia mampu melakukan serangkaian gerakan kompleks. Untuk menjaga tutorial ini sesederhana mungkin, saya memilih untuk mendefinisikan hanya sekitar tiga lusin gerakan dasar seragam dan beberapa gerakan kompleks yang dibentuk oleh kombinasi gerakan dasar.

Seperti yang Anda lihat pada gambar di Langkah 2, saya tidak menggunakan sensor rotasi di roda, sensor ultrasonik, atau jenis sensor lainnya untuk mengukur jarak dari objek atau jarak yang ditempuh. Ini mencegah robot melakukan gerakan presisi tinggi. Namun, hanya dengan mengendalikan arah dan kecepatan motor, Anda dapat mencapai tingkat presisi yang cukup baik untuk menggerakkan robot.

Hal pertama yang perlu Anda ketahui untuk dapat menghitung waktu eksekusi yang diperlukan untuk setiap gerakan adalah kecepatan rata-rata robot. Untuk melakukan itu, letakkan pita pengukur sejajar dengan robot dan aktifkan kedua motor secara bersamaan selama satu atau dua detik, ukur jarak yang ditempuh dan hitung kecepatannya. Dalam konfigurasi saya, saya mendapat 13,7 sentimeter per detik menggunakan 62,5% dari kecepatan motor maksimum (250/400, lihat perpustakaan Pololu Arduino). Dengan kata lain, untuk menggerakkan robot 1 meter (100 cm) ke depan, motor harus diaktifkan secara bersamaan selama 7.299270… detik. Saya telah memilih untuk menghitung waktu dalam resolusi milidetik, tetapi jika Anda ingin mencapai presisi gerakan yang lebih tinggi, pertimbangkan untuk menaikkan resolusi ke mikrodetik. Singkat cerita, untuk menggerakkan robot 1 meter, saya harus mengaktifkan kedua motor secara bersamaan selama 7299 milidetik. Dari angka ini, semuanya menjadi aturan tiga untuk jarak lainnya. Untuk melakukan gerakan busur atau melingkar, satu roda harus bergerak lebih cepat dari yang lain. Untuk memutar robot ke samping, hanya satu roda yang harus diaktifkan atau keduanya berlawanan arah (untuk memutar porosnya sendiri). Di sini Anda harus menggunakan beberapa trigonometri untuk mengetahui jarak yang ditempuh oleh setiap roda dan untuk berapa lama setiap motor harus diaktifkan. Titik awal yang baik untuk konsep-konsep ini dapat ditemukan di tautan berikut (saya tidak bermaksud untuk melangkah lebih jauh di sini):http://rossum.sourceforge.net/papers/CalculationsForRobotics/CirclePath.htm dan http://math .stackexchange.com/questions/60176/move-two-wheeled-robot-from-one-point-to-another.

Seperti yang Anda lihat di akhir video di bawah ini, saya juga membuat robot "menggambar" beberapa bentuk geometris dasar (persegi, segitiga dan lingkaran) di lantai. Gerakan-gerakan ini dicapai dengan kombinasi gerakan dasar (misalnya maju, belok, maju, belok, dll.). Kombinasi gerakan-gerakan ini dibuat dalam Skema Suara Server BitVoicer dan Anda tidak akan melihatnya di sketsa Arduino yang disajikan pada langkah berikutnya.

LANGKAH 5:Mengunggah Kode ke Arduino

Pada langkah ini Anda harus mengunggah sketsa bernama Kode Sumber Robot , terletak di bagian bawah tutorial ini, ke Arduino. Anda juga dapat mengunduh sketsa Arduino dari tautan di bawah ini. Ingatlah bahwa untuk mengirim kode ke Arduino Anda harus mengatur sakelar pada pelindung Sparkfun ke posisi DLINE seperti yang dijelaskan pada Langkah 3. Sebelum Anda mengunggah kode, Anda harus menginstal Server BitVoicer dan perpustakaan driver motor Pololu dengan benar ke Arduino IDE (Mengimpor Perpustakaan .zip).

Kode Sumber Robot :BVS_Demo3.ino

Beberapa bagian dari sketsa ini mirip dengan bagian yang saya gunakan di salah satu tutorial saya sebelumnya dan berhubungan dengan komunikasi dengan BitVoicer Server (kelas BVSP dan BVSMic). Dalam tutorial ini, saya akan tetap berpegang pada penjelasan bagian-bagian baru dari sketsa. Jika Anda ingin mendapatkan informasi lebih lanjut tentang cara menggunakan kelas BVSP dan BVSMic, saya sarankan Anda merujuk ke tutorial yang saya sebutkan di atas.

  • Deklarasi Konstanta :di awal sketsa, saya mendeklarasikan serangkaian konstanta yang digunakan di seluruh kode. Kelompok konstanta dengan pengaturan motor mendefinisikan kecepatan motor default dan konstanta dua arah. Pustaka driver motor Pololu menerima nilai dari -400 hingga +400 untuk kecepatan motor di mana nol berarti mati. Nilai negatif menunjukkan rotasi terbalik atau, jika Anda telah membalikkan kabel motor seperti saya, rotasi maju. Kelompok konstanta dengan nilai perintah mengacu pada perintah yang akan dikirim dari BitVoicer Server. Dalam sketsa ini saya hanya mendefinisikan 40 perintah dasar byte ketik, tetapi gerakan yang lebih kompleks dapat dilakukan dengan menggabungkan perintah ini.
  • Variabel Kontrol Eksekusi :lima variabel didefinisikan di awal kode untuk mengontrol eksekusi perintah (kecepatan motor , cmdDuration , cmdStartTime , cmdBerjalan e lastFwdCmd ). Kecepatan motor variabel memegang kecepatan motor saat ini. Variabel ini diperbarui dengan salah satu nilai default yang ditentukan oleh konstanta kecepatan jika Arduino menerima perintah dari BitVoicer Server untuk memperbarui kecepatan motor. cmdDuration variabel memegang total durasi perintah saat ini. Variabel ini diperiksa terhadap cmdStartTime variabel di semua iterasi loop berfungsi jika cmdRunning apakah benar . Jika waktu eksekusi perintah telah berakhir, RunCommand fungsi dipanggil untuk menghentikan motor. FwdCmd terakhir variabel memegang perintah "go/move forward" terakhir. Variabel ini digunakan untuk mengetahui jarak tempuh terakhir sehingga perintah “kembali” dapat dijalankan. Perhatikan bahwa untuk menggunakan perintah ini, Anda harus terlebih dahulu memberi tahu robot untuk berbalik.
  • Koneksi WiFi :di akhir sketsa saya mendefinisikan dua fungsi untuk menghubungkan dan memutuskan dari Server BitVoicer (Hubungkan dan Putuskan sambungan ). Fungsi-fungsi ini menempatkan modul WiFi Microchip ke mode perintah, membuka atau menutup koneksi TCP/IP dan mengembalikan modul ke mode data. Di dalam loop fungsi, jika variabel yang terhubung tidak benar , saya memanggil Hubungkan fungsi. Jika kelas BVSP melaporkan status server telah kedaluwarsa, dengan kata lain tidak ada jawaban yang diterima untuk permintaan status terakhir, saya menganggap koneksi terputus dan saya memanggil Disconnect fungsi. Ini akan memaksa upaya koneksi baru pada iterasi loop berikutnya.
  • RunCommand fungsi :fungsi ini dipanggil setiap kali perintah diterima dari BitVoicer Server. Dibutuhkan byte nilai yang sesuai dengan salah satu perintah dasar yang ditentukan oleh konstanta di awal sketsa. Setiap perintah dasar diidentifikasi di dalam sakelar sehingga kecepatan motor yang sesuai dapat diatur serta durasi perintah. Di akhir fungsi, cmdRunning variabel disetel ke benar dan waktu yang dikembalikan oleh milis fungsi disimpan di cmdStartTime variabel. Ini memungkinkan Arduino untuk mengontrol eksekusi perintah seperti yang dijelaskan di atas. Waktu, dalam milidetik, untuk setiap perintah diperoleh seperti yang dijelaskan pada langkah sebelumnya.

LANGKAH 6:Menyiapkan Server BitVoicer

Pada langkah ini Anda harus membangun Skema Suara Server BitVoicer dengan kalimat yang akan dikenali dan perintah yang akan dikirim ke Arduino. Di akhir langkah ini, ada dua tautan ke file yang berisi semua Objek Solusi Server BitVoicer yang digunakan dalam tutorial ini. Jika Anda tidak ingin membuat semua objek solusi satu per satu, Anda dapat mengimpornya (Mengimpor Objek Solusi) menggunakan file ini.

Sebelum Anda mulai membangun Skema Suara, Anda harus membuat perangkat yang akan mewakili Arduino di Server BitVoicer. Buat perangkat campuran dan beri nama ArduinoUnoWiFi. Di tab Komunikasi, pilih TCP/IP dan masukkan alamat IP yang ditetapkan untuk modul WiFi di Langkah 3. Di tab Isyarat, aktifkan Mulai Periode Aktif dan Akhir Masa Aktif isyarat. Pilih perintah SendData Int16 untuk kedua isyarat dan pilih perangkat ArduinoUnoWiFi sebagai target perintah. Di bidang Data, masukkan 1 untuk Awal Periode Aktif isyarat dan 0 untuk Akhir Periode Aktif isyarat. Isyarat ini akan membuat Arduino menyalakan satu LED setiap kali kata aktivasi dikenali. Ketika periode aktif (didefinisikan dalam Skema Suara) berakhir, LED ini akan mati.

Sekarang mari kita buat Skema Suara. Meskipun robot hanya memiliki 40 perintah dasar, Anda mungkin ingin membuat banyak kombinasi kata yang memicu perintah yang sama. Sebagai contoh, Anda mungkin ingin kalimat "maju satu meter" dan "maju satu meter" untuk memicu perintah yang sama. Selain itu, Anda mungkin ingin membuat perintah kompleks sebagai "lakukan persegi" yang akan memicu serangkaian perintah sementara secara berurutan. Karena itu, Skema Suara Anda dapat berkembang pesat dan memiliki lebih dari 40 perintah dasar. BitVoicer Server mendukung kalimat tanpa batas sehingga Anda dapat menentukan kalimat sebanyak yang Anda butuhkan (milik saya berakhir dengan lebih dari 80 kalimat). Di sini saya ingin memberikan dua tips:buat perintah default di BitVoicer Server Manager Options; dan salin dan tempel perintah duplikat dari satu kalimat ke kalimat lainnya.

Perintah kalimat akan mengirimkan byte tipe data ke Arduino. Gunakan konstanta yang ditentukan di awal sketsa untuk mengetahui nilai mana yang harus dikirim untuk setiap perintah. Perintah kompleks akan mengirimkan banyak nilai secara berurutan dan Anda harus mengontrol interval (penundaan) di antara mereka sehingga tidak ada nilai yang dikirim saat perintah sebelumnya sedang dieksekusi. Gunakan bidang penundaan untuk mengatur interval antar perintah.

File Objek Solusi :

Perangkat.sof

VoiceSchema.sof

LANGKAH 7:Kesimpulan

Sekarang yang harus Anda lakukan adalah memasukkan baterai AA dan menghubungkan baterai 9V ke colokan listrik Arduino agar robot Anda hidup! Setelah Anda mengunggah kode ke Arduino, jangan lupa untuk mengubah sakelar yang terpasang pada pelindung Sparkfun ke posisi UART. Jika tidak, modul WiFi tidak akan menerima data apa pun yang dikirim dari port serial Arduino.

Setelah Anda menghidupkan robot, LED status akan memakan waktu beberapa saat sebelum menyala. Anda akan melihat modul WiFi memulai komunikasi dan ketika koneksi TCP/IP dibuat, salah satu LED modul akan menyala terus. Setelah beberapa saat, tiga dari empat LED status akan menyala juga. Ini berarti satu mesin pengenalan suara telah ditetapkan ke Arduino. Mulai sekarang, robot siap menerima perintah.

Setelah beberapa pengujian dengan robot, saya cukup puas dengan pengenalan suara, meskipun tidak selalu mengenali 100% perintah. Dalam aspek ini BitVoicer Server benar-benar mengejutkan saya. Namun, saya tidak terlalu puas dengan ketepatan gerakan robot. Untuk memperbaiki masalah ini, saya harus menambahkan sensor rotasi ke roda. Kit sasis yang saya gunakan di robot sudah dilengkapi dengan disk dekoder yang dapat dipasang ke roda gigi. Menerapkan sensor ke disk ini akan memungkinkan saya untuk menggerakkan robot berdasarkan jarak tempuh yang sebenarnya sehingga gerakannya akan lebih tepat. Saya juga bisa menambahkan sensor ultrasonik untuk menghindari menabrak furnitur saya. Saya mungkin akan melakukannya suatu hari nanti, tetapi untuk saat ini, saya serahkan kepada Anda.

Sampai jumpa lagi!


Kode

  • Penyiapan Modul WiFi
  • Kode Sumber Robot
Penyiapan Modul WiFiArduino
Mengonfigurasi modul Microchip WiFi RN171VX menggunakan port serial Arduino.
void setup() { Serial.begin(115200); pinMode(13, OUTPUT); penundaan(5000); Serial.print("$$$"); penundaan (1000); Serial.println("set wlan auth 4"); penundaan (1000); Serial.println("set wlan frase XXXXXX"); penundaan (1000); Serial.println("set wlan ssid XXXXXX"); penundaan (1000); Serial.println("setel saluran wlan 0"); penundaan (1000); Serial.println("set wlan gabung 1"); penundaan (1000); Serial.println("set wlan tx 0"); penundaan (1000); Serial.println("set ip dhcp 0"); penundaan (1000); Serial.println("setel alamat ip XXXXXX"); penundaan (1000); Serial.println("setel jarak jauh komunikasi 0"); penundaan (1000); Serial.println("set comm tutup 0"); penundaan (1000); Serial.println("set comm buka 0"); penundaan (1000); Serial.println("setel ukuran komunikasi 500"); penundaan (1000); Serial.println("setel waktu komunikasi 50"); penundaan (1000); Serial.println("set uart baud 115200"); penundaan (1000); Serial.println("setel aliran uart 0"); penundaan (1000); Serial.println("simpan"); penundaan (1000); Serial.println("keluar"); penundaan (1000); digitalWrite(13, LOW);}void loop() {}
Kode Sumber RobotArduino
Mengontrol gerakan robot, menangkap audio, mengelola koneksi TCP/IP dan berkomunikasi dengan BitVoicer Server.
#include #include #include // Mendefinisikan pin Arduino yang akan digunakan untuk mengontrol// LED dan menangkap audio#mendefinisikan BVS_RUNNING 2#mendefinisikan BVS_SRE 5#menentukan BVS_DATA_FWD 3#menentukan BVS_ACT_PERIOD 6#menentukan BVSM_AUDIO_INPUT 3// Mendefinisikan konstanta yang akan diteruskan sebagai parameter ke // BVSP. functionconst unsigned long STATUS_REQUEST_INTERVAL =2000;const unsigned long STATUS_REQUEST_TIMEOUT =1000;// Defines the size of the mic bufferconst int MIC_BUFFER_SIZE =64;// Initializes a new global instance of the BVSP classBVSP bvsp =BVSP();// Initializes a new global instance of the BVSMic classBVSMic bvsm =BVSMic();// Initializes a new global instance of the // DualMC33926MotorShield classDualMC33926MotorShield ms =DualMC33926MotorShield();// Creates a buffer that will be used to read recorded samples // from the BVSMic classbyte micBuffer[MIC_BUFFER_SIZE];// Creates a global variable that indicates whether the // Arduino is connected to BitVoicer Serverboolean connected =false;// Defines some constants for the motor settingsconst int SPEED_STOP =0;const int SPEED_SLOW =100;const int SPEED_NORMAL =250;const int SPEED_FAST =400;const int DIRECTION_FRONT =-1;const int DIRECTION_BACK =1;// Declares a global variables to hold the current motor speed.// The default is SPEED_NORMAL, but there are voice // commands that change this setting.int motorSpeed =SPEED_NORMAL;// Stores the command duration in millisecondsunsigned long cmdDuration =0;// Stores the time the command started runningunsigned long cmdStartTime =0;// Stores whether a command is running or notbool cmdRunning =false;// Stores the last MOVE_FORWARD command. This variable // is used only for the COME_BACK command.byte lastFwdCmd =0;// Defines some constants for command names/values// Just to make the code more readableconst byte CMD_STOP =0;const byte CMD_MOVE_FORWARD =1;const byte CMD_MOVE_FORWARD_1_CM =2;const byte CMD_MOVE_FORWARD_2_CM =3;const byte CMD_MOVE_FORWARD_5_CM =4;const byte CMD_MOVE_FORWARD_10_CM =5;const byte CMD_MOVE_FORWARD_25_CM =6;const byte CMD_MOVE_FORWARD_50_CM =7;const byte CMD_MOVE_FORWARD_1_M =8;const byte CMD_MOVE_BACKWARD =9;const byte CMD_MOVE_BACKWARD_1_CM =10;const byte CMD_MOVE_BACKWARD_2_CM =11;const byte CMD_MOVE_BACKWARD_5_CM =12;const byte CMD_MOVE_BACKWARD_10_CM =13;const byte CMD_MOVE_BACKWARD_25_CM =14;const byte CMD_MOVE_BACKWARD_50_CM =15;const byte CMD_MOVE_BACKWARD_1_M =16;const byte CMD_TURN_AROUND =17;const byte CMD_TURN_AROUND_RIGHT =18;const byte CMD_TURN_AROUND_LEFT =19;const byte CMD_DO_360 =20;const byte CMD_TURN_RIGHT =21;const byte CMD_TURN_RIGHT_10 =22;const byte C MD_TURN_RIGHT_25 =23;const byte CMD_TURN_RIGHT_45 =24;const byte CMD_TURN_LEFT =25;const byte CMD_TURN_LEFT_10 =26;const byte CMD_TURN_LEFT_25 =27;const byte CMD_TURN_LEFT_45 =28;const byte CMD_DO_CIRCLE =29;const byte CMD_COME_BACK =30;const byte CMD_MOVE_FORWARD_2_M =31;const byte CMD_MOVE_FORWARD_3_M =32;const byte CMD_MOVE_BACKWARD_2_M =33;const byte CMD_MOVE_BACKWARD_3_M =34;const byte CMD_SET_SPEED_SLOW =35;const byte CMD_SET_SPEED_NORMAL =36;const byte CMD_SET_SPEED_FAST =37;const byte CMD_TURN_LEFT_45_BACKWARD =38;const byte CMD_TURN_RIGHT_45_BACKWARD =39;void setup(){ // Starts serial communication at 115200 bps Serial.begin(115200); // Sets the Arduino pin modes pinMode(BVS_RUNNING, OUTPUT); pinMode(BVS_SRE, OUTPUT); pinMode(BVS_DATA_FWD, OUTPUT); pinMode(BVS_ACT_PERIOD, OUTPUT); AllLEDsOff(); // Sets the Arduino serial port that will be used for // communication, how long it will take before a status request // times out and how often status requests should be sent to // BitVoicer Server bvsp.begin(Serial, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL); // Sets the function that will handle the frameReceived // event bvsp.frameReceived =BVSP_frameReceived; // Prepares the BVSMic class timer bvsm.begin(); // Prepares the motor shield class (pins and timer1) ms.init();}void loop() { // If it is not connected to the server, opens a TCP/IP // connection, sets connected to true and resets the BVSP // class if (!connected) { Connect(Serial); connected =true; bvsp.reset(); } // Checks if the status request interval has elapsed and if it // has, sends a status request to BitVoicer Server bvsp.keepAlive(); // Checks if there is data available at the serial port buffer // and processes its content according to the specifications // of the BitVoicer Server Protocol bvsp.receive(); // Gets the respective status from the BVSP class and sets // the LEDs on or off digitalWrite(BVS_RUNNING, bvsp.isBVSRunning()); digitalWrite(BVS_DATA_FWD, bvsp.isDataFwdRunning()); // Checks if there is a SRE assigned to the Arduino if (bvsp.isSREAvailable()) { // Turns on the SRE available LED digitalWrite(BVS_SRE, HIGH); // If the BVSMic class is not recording, sets up the audio // input and starts recording if (!bvsm.isRecording) { bvsm.setAudioInput(BVSM_AUDIO_INPUT, EXTERNAL); bvsm.startRecording(); } // Checks if the BVSMic class has available samples if (bvsm.available) { // Makes sure the inbound mode is STREAM_MODE before // transmitting the stream if (bvsp.inboundMode ==FRAMED_MODE) bvsp.setInboundMode(STREAM_MODE); // Reads the audio samples from the BVSMic class int bytesRead =bvsm.read(micBuffer, MIC_BUFFER_SIZE); // Sends the audio stream to BitVoicer Server bvsp.sendStream(micBuffer, bytesRead); } } else { // There is no SRE available // Turns off the SRE and ACT_PERIOD LEDs digitalWrite(BVS_SRE, LOW); digitalWrite(BVS_ACT_PERIOD, LOW); // If the BVSMic class is recording, stops it if (bvsm.isRecording) bvsm.stopRecording(); } // If the status has timed out, the connection is considered // lost if (bvsp.hasStatusTimedOut()) { // If the BVSMic is recording, stops it if (bvsm.isRecording) bvsm.stopRecording(); // Closes the TCP/IP connection Disconnect(Serial); AllLEDsOff(); connected =false; } // If a command is running, checks if its duration has // expired. If it has, stop the motors. if (cmdRunning) if (millis() - cmdStartTime>=cmdDuration) RunCommand(CMD_STOP);}// Handles the frameReceived eventvoid BVSP_frameReceived(byte dataType, int payloadSize){ // Performs the appropriate actions based on the frame // data type. If the data type is byte, it is a command. // If the data type is int, changes the activated // period LED. switch (dataType) { case DATA_TYPE_BYTE:RunCommand(bvsp.getReceivedByte()); merusak; case DATA_TYPE_INT16:digitalWrite(BVS_ACT_PERIOD, bvsp.getReceivedInt16()); merusak; }}// Runs the command received from the servervoid RunCommand(byte cmd){ switch (cmd) { case CMD_STOP:ms.setSpeeds(SPEED_STOP, SPEED_STOP); cmdRunning =false; kembali; case CMD_MOVE_FORWARD:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =60000; merusak; case CMD_MOVE_FORWARD_1_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =23; merusak; case CMD_MOVE_FORWARD_2_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =47; merusak; case CMD_MOVE_FORWARD_5_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =117; merusak; case CMD_MOVE_FORWARD_10_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =234; merusak; case CMD_MOVE_FORWARD_25_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =468; merusak; case CMD_MOVE_FORWARD_50_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =1170; merusak; case CMD_MOVE_FORWARD_1_M:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =2339; merusak; case CMD_MOVE_FORWARD_2_M:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =4678; merusak; case CMD_MOVE_FORWARD_3_M:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =7018; merusak; case CMD_MOVE_BACKWARD:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =60000; merusak; case CMD_MOVE_BACKWARD_1_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =23; merusak; case CMD_MOVE_BACKWARD_2_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =47; merusak; case CMD_MOVE_BACKWARD_5_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =117; merusak; case CMD_MOVE_BACKWARD_10_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =234; merusak; case CMD_MOVE_BACKWARD_25_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =468; merusak; case CMD_MOVE_BACKWARD_50_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =1170; merusak; case CMD_MOVE_BACKWARD_1_M:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =2339; merusak; case CMD_MOVE_BACKWARD_2_M:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =4678; merusak; case CMD_MOVE_BACKWARD_3_M:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =7017; merusak; case CMD_TURN_AROUND:ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration =540; merusak; case CMD_TURN_AROUND_RIGHT:ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration =540; merusak; case CMD_TURN_AROUND_LEFT:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_FRONT); cmdDuration =540; merusak; case CMD_DO_360:ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration =1065; merusak; case CMD_TURN_RIGHT:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =503; merusak; case CMD_TURN_RIGHT_10:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =56; merusak; case CMD_TURN_RIGHT_25:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =140; merusak; case CMD_TURN_RIGHT_45:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =252; merusak; case CMD_TURN_LEFT:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =503; merusak; case CMD_TURN_LEFT_10:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =56; merusak; case CMD_TURN_LEFT_25:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =140; merusak; case CMD_TURN_LEFT_45:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =252; merusak; case CMD_DO_CIRCLE:ms.setSpeeds( SPEED_NORMAL * DIRECTION_FRONT, SPEED_NORMAL * DIRECTION_FRONT * 0.60); cmdDuration =4587; merusak; case CMD_COME_BACK:RunCommand(lastFwdCmd); kembali; case CMD_SET_SPEED_SLOW:motorSpeed =SPEED_SLOW; kembali; case CMD_SET_SPEED_NORMAL:motorSpeed =SPEED_NORMAL; kembali; case CMD_SET_SPEED_FAST:motorSpeed =SPEED_FAST; kembali; case CMD_TURN_LEFT_45_BACKWARD:ms.setSpeeds(motorSpeed * DIRECTION_BACK, 0); cmdDuration =252; merusak; case CMD_TURN_RIGHT_45_BACKWARD:ms.setSpeeds(0, motorSpeed * DIRECTION_BACK); cmdDuration =252; merusak; } // Sets the command start time cmdStartTime =millis(); // Sets cmdRunning to true cmdRunning =true;}// Opens a TCP/IP connection with the BitVoicer Servervoid Connect(HardwareSerial &serialPort){ serialPort.print("$$$"); penundaan (500); // Use the IP address of the server and the TCP port set // in the server properties serialPort.println("open 192.168.0.11 4194"); penundaan (1000); serialPort.println("exit"); delay(500);}// Closes the TCP/IP connection with the BitVoicer Servervoid Disconnect(HardwareSerial &serialPort){ serialPort.print("$$$"); penundaan (500); serialPort.println("close"); penundaan (1000); serialPort.println("exit"); delay(500);}// Turns all LEDs offvoid AllLEDsOff(){ digitalWrite(BVS_RUNNING, LOW); digitalWrite(BVS_SRE, LOW); digitalWrite(BVS_DATA_FWD, LOW); digitalWrite(BVS_ACT_PERIOD, LOW);}

Skema


Proses manufaktur

  1. Robot Raspberry Pi dikendalikan melalui Bluetooth
  2. Buat Robot Streaming Video Terkendali Internet Anda dengan Arduino dan Raspberry Pi
  3. Sistem Kehadiran Menggunakan Arduino dan RFID dengan Python
  4. Giroskop Menyenangkan dengan NeoPixel Ring
  5. Mainan yang Dikendalikan Android Menggunakan Raspberry Motor Shield
  6. Hambatan Menghindari Robot Dengan Motor Servo
  7. Mengontrol Robot Roomba Dengan Arduino Dan Perangkat Android
  8. Lengan Robot Terkendali Nunchuk (dengan Arduino)
  9. Robot yang Dikendalikan Bicara
  10. Peralatan yang Dikendalikan Suara Bluetooth dengan OK Google