OMower SDK untuk robot beroda (open source, open hardware)

Akhirnya, kami sempat menerbitkan SDK yang dijanjikan untuk proyek OMower (platform perangkat keras dan perangkat lunak terbuka untuk robot beroda berdasarkan pengontrol ATSAM3X8E 32-bit dengan dukungan pengembangan di Arduino IDE). Tingkat penyelesaian perangkat lunak tidak terlalu baik (misalnya, tidak ada kelas untuk sensor bemper, hujan dan rumput, beberapa fungsi tidak sepenuhnya disadap), tetapi bahkan dalam bentuknya yang sekarang robot dapat mengemudi dengan akurasi tinggi melalui GPS RTK, mendukung hampir semua yang diperlukan untuk mesin pemotong - sonar, perimeter kabel, kompas dan navigasi GPS, pengisian daya dari stasiun pengisian daya atau panel surya.


Artikel saya sebelumnya tentang proyek OMower

Kode SDK dan file Kicad dengan sirkuit dan kabel papan terletak di github .

Hanya dua platform yang saat ini didukung - OMower board v3 dengan driver motor Polulu dual MC33926 dan sekelompok driver motor Arduino Due + IHM12A1 (mesin uji pada sasis roda empat kecil). Dukungan Ardumower berdasarkan Arduino Due dapat ditambahkan. Sangat diinginkan untuk memiliki papan IMU GY-80, tanpa itu, navigasi tidak akan bekerja dengan mudah (meskipun Anda dapat membuat orang yang menggunakan mesin pemotong rumput sederhana yang secara tidak sengaja mengemudi di dalam perimeter kawat).

Dalam board versi baru keempat, direncanakan untuk memasang IMU MPU9250 di atasnya dan menambahkan chip FRAM untuk menyimpan pengaturan pengguna tidak dalam flash internal controller (yang diatur ulang saat firmware dimuat), yah, semua jenis kartu dapat disimpan di dalamnya. Juga, saya mungkin akan meningkatkan ukuran resistor dan rakitan kapasitor, menyolder 0402 "di lutut" dengan pengering rambut menyenangkan di bawah rata-rata, dan meningkatkan ruang untuk konektor sehingga Anda dapat menempatkan mereka dengan klem, tidak hanya menempel pin.

Kode API ditulis dalam bentuk beberapa kelas (file lebih lambat - *. H) yang perlu Anda sertakan sebagai objek dalam perangkat lunak Anda (dan, secara opsional, sertakan semuanya, Anda dapat mengambil hanya yang diperlukan, kecuali yang dasar). Untuk menyederhanakan pemahaman dan pengujian, OMower_Simple ditulis , yang mengeksekusi serangkaian perintah yang cukup besar yang dikeluarkan melalui pfodApp dari smartphone apa pun.

SDK mengendalikan semua fungsi tingkat rendah dan bekerja terutama pada gangguan, yang memberikan programmer perangkat lunak akhir kemampuan untuk menulis perangkat lunak terlepas dari rincian spesifik dari robot tertentu, dan dengan cara yang sangat bebas (Anda dapat menulis mesin negara, atau Anda dapat memanggil fungsi start drive) dan tunggu sampai robot mencapai titik yang diinginkan). Hanya prosedur untuk memanggil fungsi inisialisasi dan kontrol pengendaraan robot yang jatuh di pundak programmer (instruksi tentang ke mana, pada kenyataannya, untuk pergi dan memproses operasi sonar dan sensor lainnya).

Untuk menghubungkan perangkat eksternal tambahan di papan tulis (dan dukungan di SDK, tentu saja) - ada banyak konektor eksternal. Misalnya, drive servo standar dengan input PPM dapat terhubung hingga empat bagian (atau bahkan enam jika Anda menolak dua motor). Ada banyak sensor "standar" untuk mesin pemotong rumput, ada sebanyak enam sonar ini, dan empat sensor perimeter. Tentu saja, dalam banyak kasus, begitu banyak yang tidak diperlukan dan bagian dari konektor mereka dapat digunakan untuk menghubungkan beberapa perangkat lain (hampir semua output dari mikrokontroler adalah output). Bagian intelektual (pemrosesan RTK GPS, konektivitas dengan wifi) dilakukan oleh Orange PI Zero, yang dipasang di konektor khusus.

Saya meminta maaf sebelumnya untuk kurva dan kode yang belum selesai di beberapa tempat, saya harus menggali ke dalam proyek-proyek lain, dan banyak dari semua jenis kesulitan terungkap yang sulit saya atasi. Tetapi saya belajar banyak hal baru, misalnya, bahwa kelengkungan elips Bumi di tempat kami hampir 40 meter, dan kutub magnet Bumi berkeliaran puluhan kilometer dari tahun ke tahun (tanpa memperhitungkan hal ini, robot melakukan perjalanan dari satu titik ke titik lain dengan garis-garis yang sangat melengkung). Kadang-kadang, sepertinya saya meluncurkan roket ruang angkasa, dan bukan memotong rumput. :)

Nah, sebagai bonus, saya juga meletakkan sumber firmware saya untuk Arduino dengan Decawave DW1000, yang mengatur jaringan mini perangkat ini dan memungkinkan robot untuk menentukan lokasi di dalam ruangan atau di mana GPS RTK tidak dapat menentukan koordinatnya (dengan dukungan untuk jumlah yang hampir tak terbatas) tag dan membaginya menjadi kamar). Firmware ini masih sangat, sangat mentah, tetapi mungkin berguna bagi seseorang.

Pembaruan, saya memutuskan untuk menambah artikel dengan cerita bagaimana diatur di dalam:

Pengguna SDK harus menentukan semua objek yang dibutuhkannya, memanggil fungsi begin () untuk semua orang (inisialisasi perangkat keras, hanya sekali), kemudian mengatur nilai parameternya (setelah membacanya dari flash atau hanya nilai default), memanggil init () untuk semua orang (fungsi dapat digunakan untuk mengatur ulang perangkat yang menjadi tanggung jawab objek), atur fungsi kait untuk poll10 / poll20 / poll50 (10, 20 dan 50 kali per detik) dari mana ia harus memanggil fungsi polling yang sesuai * () dari semua objek yang digunakan. Secara teoritis, itu mungkin untuk mengotomatisasi semua ini dalam kode SDK itu sendiri, tetapi saya memutuskan untuk tidak melakukan ini karena konsumsi tambahan sumber daya pengontrol. Contoh penggunaan harus dilihat pada OMower_Simple.ino

Salah satu kelas utama adalah objek motor (omower-motor.h), yang mengontrol driver motor dari fungsi poll10 (). Pengguna cukup memanggil roll / move (berputar dan naik tanpa navigasi) atau rollCourse / moveCourse (ride dengan navigasi / koreksi berdasarkan data dari beberapa objek anak dari kelas navThing yang, melalui fungsi readCourseError (), memberikan nilai deviasi dari arah mengemudi yang diinginkan. )

Turunan dari navThing adalah objek dari kelas imu dan gps (omower-imu.h dan omower-gps.h), yang pertama bertanggung jawab untuk membaca dan mengubah data kompas / akselerometer / giroskop menjadi bentuk yang nyaman (memberikan nilai kompas dan kemiringan dalam derajat pada dua sumbu) ) Yang kedua - memproses data GPS dan mengarahkan objek motor ke arah yang benar jika Anda memerlukan tumpangan dalam koordinat GPS atau RTK GPS (untuk yang terakhir, koreksi dihitung ketika antena ditempatkan tidak di tengah tubuh robot dan koreksi jangka pendek oleh sensor odometer). Program pengguna bertanggung jawab untuk komunikasi dengan penerima GPS itu sendiri dan mentransmisikan string NMEA atau koordinat siap ke objek gps.

Objek mow (omower-mow.h) bertanggung jawab untuk motor geser dan hoist aktuatornya dengan motor stepper (jika ada). Pengguna mengatakan berapa kecepatan untuk memutar dan berapa tinggi pemotongan untuk ditetapkan.

Objek pwmServo (omower-pwmservo.h) mengontrol PWM-A / B / C / D / E / F / G / H output (ini tidak dapat dilakukan melalui perpustakaan lain karena kemungkinan konflik dengan timer).

Objek daya (omower-power.h) bertanggung jawab untuk mengontrol regulator muatan dan mengubah nilai ADC menjadi volt dan ampere yang dipahami semua orang. Program pengguna harus mendeteksi terjadinya tegangan pada elektroda pengisian dan memanggil fungsi menyalakan pengisian, maka ia akan mengambil siklus PWM dari regulator agar sesuai dengan arus pengisian.

Karena penggunaan objek Arduin Serial * standar dapat mengganggu pemrosesan interupsi (lihat di bawah), ada objek serial (omower-serial.h) untuk membaca dan mengirim port serial. Sayangnya, masalah yang sama ada dengan bus I2C, mereka harus digunakan menggunakan fungsi yang didefinisikan dalam due-i2c-blocking.h.

Fungsi dari objek lain jelas dari namanya, Anda hanya dapat menonton komentar di file header (omower-sonars.h, omower-rtc.h, omower-current * .h, omower-odometry.h, dll.).

Sekarang tentang interupsi di level terendah. Objek sasis (omower-chassis.h) mengkonfigurasi TIM7 pada 100 interupsi per detik. Pada setiap interupsi, 12 saluran chip ADC MAX11617 dibaca (dimasukkan ke dalam array khusus, dari mana objek OMower SDK membaca nilainya - max11617-adc-scan.h). Pada setiap detik - interupsi lunak dihasilkan untuk kait fungsi poll50 (), pada setiap kelima - poll20 (), pada setiap kesepuluh - poll10 (). Mereka semua bekerja secara serempak (yang nyaman, tetapi memberlakukan pembatasan penggunaan bus I2C, kemudian saya berencana untuk menambahkan beberapa transaksi / semafor di sana).

Timer TIM5 juga dikonfigurasi untuk menghasilkan interupsi dengan frekuensi 38462 hertz. Dari interupsi ini, semua saluran pengendali ADC internal dibaca dan dimasukkan ke dalam array khusus (ini juga mendukung memasukkan setiap nilai yang diterima untuk buffer yang dipilih ke buffer cincin, yang dilakukan, misalnya, oleh kelas perimeter, memfilter sampel ini kemudian menggunakan transformasi Fourier).

Untuk menampilkan informasi debug, ada fungsi debug () dengan prioritas minimum untuk menampilkan pesan (yaitu, ketika debugging tidak dilakukan, tidak ada yang akan ditampilkan ke konsol, tetapi setiap saat Anda dapat mengaktifkan setidaknya level maksimum, itu akan dipadamkan). Dalam format nilai debugging (* format printf), angka floating-point didukung (tidak seperti fungsi Arduin standar).

Pembaruan: Versi keempat baru dari papan OMower, sejauh ini hanya sebuah sirkuit (menunggu pembuatan PCB). Selain itu termasuk kompas / accelerometer MPU9250, 128 kilobyte F-RAM untuk menyimpan pengaturan, peta, titik arah dan hal-hal lain, semua konektor dengan kait (Molex 22-11-20x3 / 10-11-20x3, kompatibel dengan versi lama dari satu 2.54- pin), penerjemah level logika 74HC4050 untuk sonar dan odometer, konverter daya 3,3 / 5 volt yang lebih kuat (hingga tiga ampere), dua lagi output PWM / PPM pada konektor, jalur terpisah untuk kontrol independen driver motor stepper kedua, kapasitor buffer lebih untuk stabilitas Elemen SMD besar untuk perakitan mudah amandemen minor.


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


All Articles