Bagaimana cara mengatur struktur proyek Arduino saya untuk kontrol sumber yang mudah?

75

Sudah lama saya mencari jawaban yang bagus untuk pertanyaan ini.

Biasanya, setiap proyek Arduino tetapi yang paling sederhana akan mencakup:

  • File kode sumber utama MyProject.ino
  • Perpustakaan khusus untuk proyek ( MyProjectLibrary1.h, MyProjectLibrary1.cpp...)
  • Perpustakaan pihak ketiga (umumnya open source, ditambahkan secara manual ke direktori perpustakaan Arduino)
  • Skema, diagram PCB
  • Dokumentasi
  • ...

Semua ini membuat sulit untuk menyimpan seluruh kode dan dokumen dari satu proyek di bawah Manajemen Kode Sumber (misalnya pada Subversion, Git atau GitHub).

Mengelola kontrol sumber proyek Anda berarti mengelola versi semua file yang digunakan oleh proyek termasuk perpustakaan pihak ketiga.

Sekarang untuk satu proyek, saya perlu mendefinisikan struktur direktori yang:

  • Termasuk semua file proyek seperti yang dijelaskan di atas
  • Saya sepenuhnya dapat berkomitmen pada alat Manajemen Kode Sumber (termasuk dependensi pihak ketiga)
  • Saya dapat checkout di mana saja di hard drive saya dan membangun proyek dari sana (apakah itu harus menjadi satu lokasi seperti yang diberlakukan oleh Arduino IDE)
  • Saya dapat menyalin ke arsip mandiri yang dapat saya kirim ke teman untuk dia buat semudah mungkin (tidak ada unduhan manual tambahan)

Apa yang saya temukan sangat rumit dengan proyek Arduino adalah pengelolaan dependensi perpustakaan eksternal. Pengembang proyek Java memiliki repositori pakar untuk itu dan itu banyak membantu dalam mengelola semua deps eksternal. Tetapi kami tidak memiliki sistem yang setara untuk perpustakaan Arduino.

Saya akan tertarik untuk mengetahui bagaimana pembuat proyek Arduino lain menangani aspek-aspek ini dalam proyek mereka sendiri.

Perhatikan juga bahwa saya terbuka untuk mengubah proses pengembangan saya, termasuk IDE saya (saat ini saya paling sering menggunakan Eclipse dengan plugin Arduino, dan kemudian saya memastikan proyek saya juga dapat bekerja langsung dengan Arduino IDE).

jfpoilpret
sumber
Saya juga telah berjuang dengan ini. Saya memiliki dua proyek yang memerlukan versi berbeda dari perpustakaan eksternal, dan saat ini mereka berada di luar kendali versi.
Cybergibbons
1
Harap dicatat untuk penelitian lebih lanjut bahwa mereka adalah Package Manager . JavaScript punya Node.js / npm dan bower, PHP punya PEAR dan Composer, dll.
kaiser

Jawaban:

30

Cara saya mengatur proyek arduino cukup sederhana, semua proyek saya adalah git repositori sehingga setidaknya ada yang berikut ini:

Saya memiliki preferensi menggunakan editor favorit saya dan Makefile yang telah saya buat untuk bekerja melawan sebagian besar kasus penggunaan (dan saya bahkan memperbaiki yang itu yang akan saya bagikan segera).

Untuk perpustakaan, saya lebih suka menyimpannya sebagai repositori mereka sendiri dan menggunakan git submodule untuk memasukkannya ke proyek. Karena banyak perpustakaan yang ditulis oleh komunitas dibagikan sebagai repositori git, itu adalah solusi umum yang bagus. Kemudian, di dalam Makefile, saya hanya perlu menambahkan path libraries yang ingin saya sertakan dalam variabel LOCALLIBS .

Meskipun, untuk beberapa proyek, masuk akal untuk merangkum pustaka ke dalam pustaka lapisan abstraksi perangkat keras yang dibuat untuk proyek tersebut, maka saya lebih suka menggunakan jalur seperti:

  • project
    • project.ino
    • Makefile
    • project_hal_lib
      • library1
      • library2
      • library3
      • ...

Meskipun, dengan arduino 1.5.xa cara baru untuk menentukan perpustakaan ditawarkan, yang akan menawarkan cara untuk membuat dan membangun proyek arduino dengan cara yang sama seperti yang telah kita lakukan dengan pipy dan virtualenv dalam python, yaitu Anda mendefinisikan set perpustakaan yang Anda butuhkan dan mereka dapatkan diunduh.

zmo
sumber
Saya sedang mengerjakan jawaban yang sama. Anda mengalahkan saya untuk itu!
asheeshr
+1 Terima kasih! Cara ini terlihat cukup menarik. Saya harus mencobanya minggu ini (saya perlu memeriksa cara menyiapkan barang-barang Makefile terlebih dahulu).
jfpoilpret
@ AsheeshR jika jawaban Anda mirip, itu artinya masih ada beberapa perbedaan, bukan? Saya tertarik untuk mengetahui tentang ini!
jfpoilpret
sebenarnya perubahan utama yang akan datang dengan versi Makefile saya berikutnya adalah kemampuan flashmenggunakan programmer atau uploadmenggunakan bootloader. Serta menangani penggabungan bootloader dengan firmware. Saya juga menulis setter sekering in-makefile.
zmo
@ zmo bounty pantas, meskipun solusi Makefile Anda tidak dapat bekerja dalam situasi saya (menggunakan Windows tapi saya tidak menentukan titik itu). Tapi saya yakin bahwa menggunakan salah satu solusi makefile yang ada adalah cara untuk pergi. Setelah saya menemukan satu ranting untuk saya, saya akan memposting jawaban saya di sini.
jfpoilpret
23

Cara paling sederhana untuk melakukan ini adalah menyalin file header dan kode perpustakaan ke direktori sumber Anda dan memasukkannya.

myproject/
    myproject.ino
    somelib.h
    somelib.cpp

Dalam kode Anda, Anda bisa melakukannya include "somelib.h"

Sisi buruknya adalah bahwa perpustakaan harus berada di folder yang sama, bukan sub folder, sehingga membuat direktori Anda terlihat berantakan.


Mengenai struktur direktori dari seluruh proyek saya, termasuk skema dan dokumentasi, milik saya biasanya terlihat seperti ini:

myproject/
  schematics/ - eagle files or whatever you may have
  docs/       - include relevant datasheets here
  test/       - any test cases or other code to test parts of the system.
  myproject/  - since Arduino code must be in a directory of the same name
    myproject.ino
    ...
sachleen
sumber
Kelemahan lain adalah bahwa saya harus menyalin perpustakaan yang sama di banyak proyek. Juga, tidak jelas bagi saya jika Anda hanya menempatkan perpustakaan ANDA di sana atau juga perpustakaan pihak ketiga?
jfpoilpret
Poin pertama: Itu bukan sisi bawah, itu hanya efek samping dari menjaga perpustakaan dan sumber proyek bersama seperti yang Anda inginkan dengan kontrol versi. Bagaimana jika proyek lain membutuhkan versi perpustakaan yang diperbarui? Bagaimana jika Anda memodifikasinya? Poin kedua: keduanya akan bekerja.
sachleen
1
Saya tidak. IDE Arduino sangat terbatas dalam banyak hal. Anda mungkin ingin melihat lingkungan kerja yang lebih baik yang memiliki dukungan lebih baik untuk ini. Orang-orang membuat custom make file yang memungkinkan Anda mengimpor perpustakaan dari sumber lain juga.
sachleen
1
Ini bukan cara yang baik untuk mengatur proyek dari sudut pandang lisensi perangkat lunak. Jika Anda menyertakan pustaka pihak ketiga dalam proyek Anda, yang mungkin memiliki lisensi berbeda, maka Anda mungkin akan melanggarnya begitu Anda mulai membagikan file proyek. Lisensi open source yang berbeda umumnya tidak kompatibel satu sama lain.
asheeshr
3
@AsheeshR memiliki semua file Anda dalam satu direktori sehingga arduino IDE tidak mengeluh bukanlah cara yang baik untuk mengatur proyek sama sekali. Ini hanya sebuah cara. Jangan ragu untuk mengusulkan solusi yang lebih baik. Saya tidak tahu satu yang masih memungkinkan Anda untuk menggunakan perangkat lunak Arduino.
sachleen
20

Git submodules sangat kuat ketika mengatur beberapa repositori bersarang. Menangani banyak pustaka dari sumber yang berbeda, dan bahkan menangani bagian dari proyek Anda sendiri yang dapat disimpan di sumber yang berbeda menjadi mudah dengan git submodules.

Struktur Direktori

Cara untuk mengatur proyek Anda adalah:

  • projectA - Direktori Induk

    • projectA - Direktori kode sumber yang berisi kode Arduino

      1. projectA.ino
      2. header.h
      3. implementasi.cpp
    • docs - Direktori dokumentasi utama Anda

    • skema - ini dapat dikelola secara terpisah pada repo Git yang terpisah atau bagian dari repo yang sama

    • libs - Ini akan berisi perpustakaan pihak ketiga Anda.

      1. libA - Ini dapat dipertahankan sebagai repositori pihak ketiga
      2. libC - ...
    • lisensi

    • Baca aku

    • Makefile - Diperlukan untuk menangani dependensi antar direktori

Alur kerja

Anda akan mengikuti siklus normal Anda melakukan perubahan, menambah, dan melakukan sejauh repositori utama. Banyak hal menjadi menarik dengan sub-repositori.

Anda memiliki opsi untuk menambahkan repositori ke dalam direktori induk repositori utama Anda. Ini berarti bahwa setiap bagian dari struktur direktori Anda, yaitu dokumen, skema, dll. Dapat dipertahankan sebagai repositori terpisah dan terus diperbarui dari.

Anda dapat melakukan ini menggunakan git submodule add <repo.git>perintah. Untuk tetap up to date, Anda dapat menggunakan git submodule update <path>.

Ketika datang untuk memelihara beberapa perpustakaan pihak ketiga di dalam repositori Anda sehingga masing-masing dapat dikontrol dengan sendirinya atau masing-masing dapat diperbarui, jika perlu, git submodule lagi menghemat hari Anda!

Untuk menambahkan repo pihak ketiga ke libs , gunakan perintah git submodule add <lib1.git> libs/lib1. Kemudian, untuk mempertahankan perpustakaan pada titik tetap dalam siklus rilis, checkout perpustakaan dan buat komit. Untuk tetap memperbarui perpustakaan, gunakan perintah git submodule update <path>.

Sekarang, Anda dapat mengelola beberapa repositori di dalam repositori utama serta beberapa pustaka pihak ketiga dalam tahap rilis independen.

Pendekatan Versus Direktori Tunggal

Sementara pendekatan direktori tunggal adalah yang paling sederhana, tidak mungkin untuk mengontrol bagian versi direktori tanpa banyak rasa sakit. Oleh karena itu, pendekatan sederhana gagal untuk mengakomodasi repositori yang berbeda dengan berbagai keadaan dalam proyek.

Pendekatan ini memungkinkan mempertahankan beberapa repositori tetapi membutuhkan Makefile untuk menangani proses kompilasi dan penautan.

Bergantung pada kompleksitas proyek Anda, pendekatan optimal dapat dipilih.

asheeshr
sumber
1
+1, tetapi hanya sebagai sidenote: Git Submodules sangat tidak stabil dan cenderung longgar. Tidak ada bedanya jika Anda menggunakan sebuah direktori tunggal atau kelipatan (seperti vendor, node_modules, dll). Git mereferensikan mereka dan melacaknya.
kaiser
"Tidak ada bedanya jika Anda menggunakan direktori tunggal atau banyak (seperti vendor, node_modules, dll.)." Saya tidak mengerti bagian ini. Bisakah Anda menguraikan?
asheeshr
17

Inilah cara saya akhirnya memutuskan untuk mengikuti proyek saya.

Arduino-CMake

Keputusan penting pertama yang saya buat adalah pilihan alat bangun yang dapat bekerja untuk lingkungan saya (Windows) tetapi tidak terbatas pada itu (saya ingin proyek saya mudah digunakan kembali oleh orang lain).

Saya telah menguji berbagai open source Arduino make tools:

  • Guyzmo Makefile (disarankan oleh @zmo answer): ini hanya buatan Makefile standar untuk pembuatan Arduino; ini adalah Unix Makefile tetapi ada port yang bagus dari Unix make untuk Windows ; tetap saja, sayangnya Makefile ini hanya berfungsi untuk Unix, tentu saja bisa diadaptasi untuk Windows, tapi saya menginginkan alat yang berfungsi "out of the box".
  • Arduino-Makefile (disarankan oleh jawaban @adnues): ini adalah proyek yang lebih maju, berdasarkan Unix Makefile, yang bertujuan agar mudah digunakan kembali oleh semua proyek Arduino; ini didokumentasikan sebagai bekerja pada Mac, Linux dan Windows, tetapi dukungan Windows terbukti salah dalam percobaan pertama saya (banyak ketergantungan pada Unix shell).
  • Graduino (tidak disarankan oleh jawaban apa pun): alat bangun ini didasarkan padaalat bangun gradle terkenaldaridunia asyik ; alat ini kelihatannya dikerjakan dengan sangat baik tetapi membutuhkan beberapa pengetahuan (sedikit) groovy / gradle, dan hanya memiliki sedikit dokumentasi; Saya memutuskan untuk tidak menggunakannya karena beban memasang groovy dan gradle hanya untuk itu (saya ingin menghindari terlalu banyak prasyarat untuk orang-orang yang ingin membangun proyek saya di lingkungan mereka).
  • Arduino-CMake (tidak disarankan oleh jawaban apa pun): ini tampaknya yang terbaik dari semuanya, ia memiliki sejarah panjang, memiliki banyak pendukung dan pengelola, didokumentasikan dengan sangat baik, dilengkapi dengan contoh sederhana dan juga memiliki beberapa posting blog tutorial yang bagus di Web, misalnya di sana - sini . Ini didasarkan pada CMake , "Cross-Platform Make".

Saya juga menemukan ArduinoDevel , alat pembuat Arduino lain - yang belum saya coba - yang dapat menghasilkan Unix Makefiles atau file semut build.xml ; yang tampak menarik tetapi agak terbatas dalam hal fungsionalitas.

Akhirnya saya memutuskan untuk pergi dengan Arduino-CMake :

  • itu mudah diatur: cukup instal CMake di mesin Anda dan salin Arduino-CMake di beberapa direktori yang mudah diakses (melalui jalur relatif) dari direktori proyek Anda.
  • contoh-contoh bekerja di luar kotak bagi saya (hanya mengikuti komentar dalam CMakeLists.txtfile konfigurasi untuk mengadaptasi properti yang diperlukan untuk lingkungan saya, misalnya jenis Arduino, port serial)
  • Anda dapat mengatur proyek Anda dengan cara apa pun yang Anda inginkan
  • itu dapat menghasilkan file konfigurasi untuk berbagai alat membangun di luar sana (saya hanya menguji Unix Makefiles sekalipun), termasuk proyek Eclipse .
  • di make yang dihasilkan, beberapa target dibuat untuk mendukung:

    • perpustakaan membangun
    • program dibangun
    • unggah program ke papan
    • peluncuran monitor serial
    • dan beberapa lainnya belum saya uji

Struktur Proyek

Karena Arduono-CMake tidak memaksakan struktur direktori untuk proyek Anda, Anda dapat memilih salah satu yang paling cocok untuk Anda.

Inilah yang saya lakukan secara pribadi (yang masih membutuhkan penyempurnaan lebih lanjut, tapi saya senang dengan itu sekarang):

masukkan deskripsi gambar di sini

Saya telah memutuskan untuk meletakkan semua proyek saya di bawah arduino-stuffdirektori umum (yang saya komit untuk github secara keseluruhan, saya tahu saya bisa menggunakan submit git untuk organisasi yang lebih baik di github, tetapi belum punya waktu untuk memeriksanya).

arduino-stuff memiliki konten berikut:

  • build: itu adalah direktori tempat cmake dan make akan menghasilkan semua barang mereka (makefile, cache, file objek ...); yang ini tidak berkomitmen untuk github
  • cmake: yang itu hanya salinan (tidak dimodifikasi) dari direktori cmake Arduino-CMake . Yang ini masuk github sehingga lebih mudah bagi seseorang yang ingin membangun proyek saya
  • CMakeLists.txt: itulah konfigurasi CMake "global" yang menyatakan semua default untuk lingkungan saya (board, port serial) dan daftar subdirektori target build
  • TaskManager: ini adalah proyek pertama saya berdasarkan Arduino-CMake, ini adalah perpustakaan dengan contoh; idrectory ini juga berisi CMakeLists.txtyang menyatakan target untuk proyek

Poin untuk ditingkatkan

Solusi saat ini tidak sempurna. Di antara perbaikan yang saya lihat (itu agaknya untuk proyek Arduino-CMake untuk memasukkan perbaikan ini jika mereka mau):

  • Fitur untuk menyalin direktori perpustakaan dari proyek saat ini ke direktori perpustakaan Arduino
  • Fitur untuk mengunggah perpustakaan ke github
  • Fitur untuk mengunduh perpustakaan dari github
jfpoilpret
sumber
2
Sudahkah Anda mencoba PlatformIO? Mungkin belum ada ketika Anda mengajukan pertanyaan ini .. platformio.org
ohhorob
4
MyProject
|_MyProject
  |_MyProject.ino
  |_data
  |  |_documentation 
  |  |_PCB
  |  |_schematics
  |_src
     |_MyProjectLibrary1
     |_ThirdPartyLibrary

Folder MyProject (root repositori)

Alasan saya menyarankan MyProjectfolder root yang tampaknya berlebihan adalah bahwa Anda menyebutkan menggunakan GitHub. Saat Anda mengunduh (alih-alih mengkloning) konten repositori GitHub, cabang atau nama tag ditambahkan ke nama repositori (mis.MyProject-master). Arduino IDE mensyaratkan bahwa nama folder sketsa cocok dengan nama file sketsa. Jika Anda membuka file .ino yang ada di folder yang tidak cocok dengan nama sketsa, Arduino IDE meminta Anda membuat folder sketsa bernama tepat dan memindahkan sketsa ke folder itu. Selain ini tidak menjadi pengalaman awal yang sangat baik bagi pengguna, masalah yang lebih besar adalah bahwa Arduino IDE mungkin tidak menyalin semua file terkait lainnya ke folder yang baru dibuat, yang dapat menyebabkan program tidak lagi mengkompilasi. Dengan memasukkan sketsa ke dalam subfolder, Anda menghindari GitHub mengubah nama folder sketsa.

Jika nama file GitHub tidak menjadi masalah bagi Anda maka folder root redundan tidak diperlukan.

folder data

Saya sarankan menggunakan datasubfolder untuk file non-kode Anda karena Arduino IDE memiliki perlakuan khusus untuk subfolder dengan nama itu. Mereka disalin ke lokasi baru ketika Anda melakukan File> Save As ... . Subfolder dari nama lain tidak.

folder src

The srcsubfolder memiliki properti khusus yang memungkinkan kompilasi rekursif . Ini berarti bahwa Anda dapat meninggalkan perpustakaan di folder itu dan memasukkannya dari sketsa Anda seperti ini:

#include "src/MyProjectLibrary1/MyProjectLibrary1.h"
#include "src/ThirdPartyLibrary/ThirdPartyLibrary.h"

The Arduino 1,5 Perpustakaan struktur folder Format juga didukung, Anda hanya perlu menyesuaikan Anda #includepernyataan sesuai.

Perhatikan bahwa hanya Arduino IDE 1.6.10 (arduino-builder 1.3.19) dan yang lebih baru mendukung kompilasi sketsa rekursif.

Sayangnya beberapa perpustakaan menggunakan #includesintaks yang salah untuk menyertakan file lokal (misalnya, #include <ThirdPartyLibrary.h>bukan #include "ThirdPartyLibrary.h"). Ini masih berfungsi ketika perpustakaan diinstal ke salah satu librariesfolder Arduino tetapi tidak berfungsi ketika perpustakaan dibundel dengan sketsa. Jadi beberapa perpustakaan mungkin memerlukan suntingan kecil untuk menggunakan cara ini.

Saya sangat suka ini daripada membuang semua file perpustakaan di root folder sketsa karena itu berantakan dan setiap file perpustakaan akan ditampilkan di IDE Arduino sebagai tab ketika Anda membuka sketsa (Tentu saja semua file sumber yang Anda lakukan ingin dapat diedit dari Arduino IDE harus ditempatkan di folder root sketsa).

Mampu menggunakan perpustakaan yang dibundel di tempat juga sejalan dengan tujuan Anda yang lain:

kirim ke teman untuk membangunnya semudah mungkin

Menghapus persyaratan untuk menginstal pustaka secara manual membuat proyek lebih mudah digunakan.

Ini juga akan menghindari kemungkinan konflik dengan versi lain dari file perpustakaan dengan nama yang sama yang mungkin diinstal sebelumnya.

per1234
sumber
3

Anda dapat menggunakan makefile https://github.com/sudar/Arduino-Makefile untuk mengkompilasi kode Arduino. Anda tidak perlu IDE.

anujdeshpande
sumber
1
Saya telah mencoba tetapi sayangnya itu hanya akan berfungsi pada mesin Unix dan saya membutuhkan dukungan Windows. Saat ini saya sedang mengevaluasi proyek lain berdasarkan CMake tapi saya belum selesai dengan itu. Saya akan mengirim jawaban ketika saya telah memutuskan alat.
jfpoilpret
0

Mungkin benar-benar terlambat ke permainan tetapi itu adalah pertanyaan yang cukup populer untuk dijawab menggunakan metode yang sedikit berbeda dari yang sudah diposting.

Jika Anda perlu mempertahankan kompatibilitas dengan Arduino IDE secara langsung, Anda dapat menggunakan sesuatu seperti yang saya jelaskan di sini:

https://gitlab.com/mikealger/ExampleArduinoProjectStructure/tree/master/ExampleSketchBook

Saya mendasarkan sebagian besar dari catatan Arduino - Struktur proyek dan proses pembangunan , dan beberapa tips yang saya ambil selama bertahun-tahun.

Saya benar-benar tidak tahu mengapa ini sangat sulit ditemukan melalui halaman Arduino secara langsung, tampaknya konyol berasal dari latar belakang semi profesional sehingga proses pembuatannya sangat tumpul.

semoga sukses di luar sana

Mike Alger
sumber
Tautan gitlab tampaknya rusak
Greenonline
aneh apakah itu bekerja tanpa tautan langsung? yaitu gitlab.com/mikealger/ExampleArduinoProjectStructure
Mike Alger
Sebenarnya kedua tautan berfungsi di Firefox, tetapi tidak berfungsi di versi Chrome saya yang sudah usang 49.0.2623.112 (64-bit). Tidak ada yang perlu dikhawatirkan, saya kira. :-)
Greenonline