Perangkat Android yang dikendalikan Bluetooth yang dikontrol Arduino - siklus penuh (bagian 1)

Pendahuluan


Sejarah terperinci tentang bagaimana mobil Arduino, dikendalikan oleh perangkat Android melalui Bluetooth, dirakit dari tiga mesin. Dalam beberapa lusin paragraf, saya akan mencoba menjelaskan sebanyak mungkin langkah demi langkah di mana untuk menghubungkan masing-masing kabel, cara menulis aplikasi berpemilik dan pada rake anak-anak mana saya harus melompat lebih dari seminggu.

Sedikit tentang level, penulis dan peringatan


Saya, seorang penulis, seorang anak berusia 16-17 tahun dari sebuah desa dekat Moskow, berspesialisasi dalam menulis aplikasi android (dan lebih sulit untuk membakar sesuatu di sana), jadi saya melepaskan tanggung jawab atas pendekatan optimal untuk menyelesaikan masalah.

Praktis setiap langkah yang dijelaskan di bawah ini membuat saya lebih daripada yang akan bernilai waktu. Mungkin karena alasan ini saya ingin membagikan pengalaman saya. Dan pada saat yang sama saya akan sangat senang jika Anda memarahi kesalahan dan memberi tahu saya untuk optimasi.

Tantangan


Tugas termudah adalah membuat drive mobil yang dikontrol Arduino, dan mengganti remote dengan android. Tetapi dalam sebagian besar momen saya harus menemukan kembali roda, karena tidak ada solusi yang cocok ditemukan di Internet.

Akan membutuhkan


  1. Arduino
  2. Pelindung Motor (dalam kasus saya dua)
  3. Bluetooth
  4. Android
  5. Kabel konvensional

Dasar desain


Lego Outdoor Challenger diambil sebagai dasarnya (pada kenyataannya, itu terlihat kurang menyedihkan). Semua yang tersisa darinya: kasing (semua elemen dekorasi dilepas) dan tiga mesin.
gambar
Mesin memiliki papan sendiri, tetapi salah satu tugas menyiratkan universalitas: Saya melakukannya, orang lain dapat mengulanginya. Dia mengeluarkan otaknya, menaruh Arduino Uno.

Instalasi Arduino


Untuk beberapa alasan, pencipta tidak menyediakan ruang untuk Arduino, jadi mereka mengikatnya ke sekrup dengan mengebor plastik. Dia meletakkan kayu lapis di bawah papan agar tidak ada yang mengalami hubungan pendek. Lebih baik menyelipkan sesuatu plastik di bawah sekrup (sepotong botol), karena papan tidak terlindung dari baut besi.



Di atas papan saya langsung menaruh dua motor shiling, jadi itu. Untuk mengontrol yang kedua, Anda harus membuang satu kabel dari port digital ke H1 (arah) dan yang kedua dari pin dengan dukungan shim (ditandai dengan "~", biasanya 10, 11) ke E1 (kecepatan).



Penentuan sudut rotasi


Secara mengejutkan bukan servo drive yang merespons putaran mesin, tetapi mesin biasa. Ada masalah: alangkah baiknya untuk tidak membakarnya, karena sudut rotasi terbatas, dan mesin dapat berputar sebanyak yang Anda suka.

Pilihan dengan metode poke menghilang, karena pada level baterai yang berbeda jumlah arus yang disuplai ke motor akan berubah, yang akan menyebabkan sudut yang terus berubah. Juga tidak mungkin untuk memutar ke stop, gigi cepat atau lambat akan hancur.

Solusi: melacak sudut melalui sirkuit. Foto menunjukkan hal kecil, yang dipasang di dekat mekanisme putar. Pada bagian yang berputar dengan roda kiri / kanan oleh mesin, scallop dengan kontak besi terpasang.





Prinsip operasi: kawat disolder ke setiap baris (ada empat total), bagian bawah terhubung ke plus (selalu dijepit dengan sisir, lihat gambar), kabel yang tersisa menjadi minus. Ketika gigi kerang jatuh di baris bawah, dan, katakanlah, yang ketiga, terjadi korsleting, arus mengalir, ini diperhatikan oleh Arduino.



Berkat berbagai kombinasi dari tiga pita, hingga tujuh sudut dapat ditentukan. Misalnya, ketika ada arus di semua lini, roda diputar ke posisi paling kanan, ketika ada arus hanya di atas, roda diputar ke kiri sebanyak mungkin. Tabel menyediakan semua opsi.



Sudut dan kode koneksi


Setiap warna memiliki warna sendiri: bagian bawah berwarna hijau, yang pertama di bawah adalah merah, yang kedua adalah hitam, dan yang ketiga adalah putih. Pada tahap awal, papan tempat memotong roti dan LED digunakan untuk debugging visual.



Diagram koneksi ditunjukkan pada gambar. Plus kita tarik ke hijau, yang lain kita peregangan ke minus. Melalui resistor yang dipasang untuk menghilangkan gangguan dan tidak adanya hubungan pendek, hubungkan kabel ke output A0-A2. Mereka dipilih hanya dari menyimpan port lain.



Kode diberikan dengan komentar. Kami menghubungkan pin dan menginterogasinya melalui digitarRead (). Jika ada tegangan, true akan dikembalikan. Selanjutnya, kita melihat apakah hasilnya berarti bahwa roda berada di posisi ekstrem, kita melarang belokan lebih lanjut ke arah ini.

Trik kecil: karena output pada 5V dan 3.3V akan dibutuhkan di masa depan, Anda dapat memberi nilai tambah pada salah satu pin digital. Sebelum setiap sudut mengecek, berikan arus melalui digitalWrite (whitePin), lalu periksa sudut dan singkirkan arus.

int speedTurn = 180; // ,  0  255 //    int pinRed = A0; int pinWhite = A1; int pinBlack = A2; int pinAngleStop = 12; //   ,    ,  //   void setup() { //    pinMode(pinRed, INPUT); pinMode(pinBlack, INPUT); pinMode(pinWhite, INPUT); // pinMode(pinAngleStop, OUTPUT); //  ,    pinMode(angleDirection, OUTPUT); pinMode(angleSpeed, OUTPUT); Serial.begin(9600); } //   loop(),      void turn(int angle) { digitalWrite(pinAngleStop, HIGH); //   ,    delay(5); // ,   ""  if(angle > 149) { if( digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinBlack) == LOW) { //    ,      ,   //  return; } //   ,  digitalWrite(angleDirection, HIGH); analogWrite(angleSpeed, speedTurn); } else if (angle < 31) { if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) { //    ,      ,   //  return; } //   ,  digitalWrite(angleDirection, LOW); analogWrite(angleSpeed, speedTurn); } digitalWrite(pinAngleStop, LOW); //     delay(5); } 

Paralelisasi roda yang berjalan


Awalnya, dua mesin penggerak dihubungkan bersama. Mereka terputus karena dua alasan: belokan lebih efektif jika roda berputar ke arah yang berbeda, dan dua mesin yang kuat tidak menarik satu papan.

Masalah: pelindung motor memiliki dua output, masing-masing menghasilkan hingga 2 ampere. Setiap mesin makan 0,7A. Tampaknya kurang, tetapi tidak pada beban maksimum. Katakanlah mesin macet di pasir atau diistirahatkan, arus naik di atas ampere. Tidak kritis, tetapi berpotensi berbahaya.

Tetapi ternyata menjadi kritis bahwa papan memanas. Beberapa menit setelah balapan, perisai motor memanas dan mulai bekerja dengan buruk: arus dipasok bukan yang tepat, roda tidak berputar, dan sebagainya.

Solusi untuk kedua masalah: satu mesin terhubung ke satu motor perisai, yang kedua ke yang lain. Anehnya, itu membantu. Suhunya turun, tidak ada overheating. Anda bisa memasang radiator, tetapi sulit dipasang.



Koneksi Bluetooth


Saya menggunakan model HC-05, yang memainkan lelucon fatal. Semua bluetooth terhubung dengan cara yang sama: satu kabel pada 3.3V (kadang-kadang mulai bekerja hanya dari 5V), yang kedua minus, dua lagi pada port 0 dan 1 (masing-masing baca dan kirim). Kawat yang ditandatangani oleh RXD di bluetooth macet di TXD arduino, dan TXD di RXD (jika Anda mencampurnya, Anda tidak akan melihat datanya).

Ada peringatan: port 0 dan 1 digunakan secara default oleh Serial, di mana sketsa dibanjiri. Artinya, saat bluetooth macet, sketsa tidak akan kebanjiran. Ada dua cara keluar: keluarkan bluetooth untuk saat mengisi atau menetapkan kembali input dan output dari bluetooth. Opsi kedua dilakukan dalam dua baris.

 #include <SoftwareSerial.h> \\  SoftwareSerial BTSerial(8, 9); \\ 8  9   0  1 

Jebakan yang telah memakan saya selama tiga hari kerja adalah kecepatan komunikasi. Karena kebiasaan, saya menginstal 9600 dan mencoba. Entah datanya tidak datang, maka ada kekacauan karakter. Dan pada akhirnya jawabannya adalah bahwa HC-05 berkomunikasi pada 38400! Perhatikan fakta bahwa dalam Setup () saya akan menjalankan BTSerial.begin (39400), meskipun Serial.begin (9600).

Sistem pengiriman perintah


Artikel ini terlalu panjang, jadi saya akan mempertimbangkan kode Arduino dan Android di bagian kedua yang terpisah, dan sekarang saya akan menjelaskan prinsipnya.

Ada joystick di perangkat android (lingkaran, implementasi yang juga di bagian kedua). Android membaca bacaan dari itu dan mengubahnya menjadi angka yang cocok untuk Arduino: kecepatan dari piksel berubah menjadi nilai dari -255 ke 255 (negatif - mundur), dan juga menentukan sudutnya. Saya sengaja memberikan tugas ini ke telepon, karena jauh lebih kuat dan dengan tenang mampu mengatasi perhitungan beberapa ratus nilai per detik.



Setelah memasang soket, data dikirim dalam format berikut: @ speed # * angle #. @ - menunjukkan bahwa digit berikut berisi kecepatan, # - menunjukkan akhir dari nilai kecepatan, * - awal dari nilai sudut, # - selesai merekam sudut. Siklusnya tidak ada habisnya, perintah dikirim setiap 100 milidetik (jumlah optimal dipilih). Jika tidak ada yang ditekan pada android, maka tidak ada yang dikirim.

Algoritma penerimaan data dijelaskan secara rinci dalam kode sketsa. Dia berkorespondensi lebih dari sekali dan, bagi saya, bekerja dengan sempurna.

Kesimpulan bagian pertama


Pada artikel ini, saya mencoba untuk mengungkapkan segala sesuatu yang berhubungan dengan bagian fisik mesin. Kemungkinan besar, saya melewatkan sesuatu, jadi pastikan untuk bertanya.

Tetapi yang paling menarik, bagi saya, tetap untuk yang kedua - program Arduino dan aplikasi Android, keajaiban nyata terjadi di sana, setidaknya untuk saya yang masih muda.

Jika Anda tidak menemukan jawaban untuk beberapa bagian dan ingin menyodok kekurangan saya secara pribadi, saya menunggu - dendolg1@mail.ru ,.

UPD: bagian kedua sudah keluar - habr.com/post/424813

Source: https://habr.com/ru/post/id424087/


All Articles