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).
sumber
Jawaban:
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.
sumber
flash
menggunakan programmer atauupload
menggunakan bootloader. Serta menangani penggabungan bootloader dengan firmware. Saya juga menulis setter sekering in-makefile.Cara paling sederhana untuk melakukan ini adalah menyalin file header dan kode perpustakaan ke direktori sumber Anda dan memasukkannya.
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:
sumber
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
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.
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 menggunakangit 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 perintahgit 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.
sumber
vendor
,node_modules
, dll). Git mereferensikan mereka dan melacaknya.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:
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 :
CMakeLists.txt
file konfigurasi untuk mengadaptasi properti yang diperlukan untuk lingkungan saya, misalnya jenis Arduino, port serial)di make yang dihasilkan, beberapa target dibuat untuk mendukung:
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):
Saya telah memutuskan untuk meletakkan semua proyek saya di bawah
arduino-stuff
direktori 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 githubcmake
: yang itu hanya salinan (tidak dimodifikasi) dari direktori cmake Arduino-CMake . Yang ini masuk github sehingga lebih mudah bagi seseorang yang ingin membangun proyek sayaCMakeLists.txt
: itulah konfigurasi CMake "global" yang menyatakan semua default untuk lingkungan saya (board, port serial) dan daftar subdirektori target buildTaskManager
: ini adalah proyek pertama saya berdasarkan Arduino-CMake, ini adalah perpustakaan dengan contoh; idrectory ini juga berisiCMakeLists.txt
yang menyatakan target untuk proyekPoin 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):
sumber
Folder MyProject (root repositori)
Alasan saya menyarankan
MyProject
folder 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
data
subfolder 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
src
subfolder memiliki properti khusus yang memungkinkan kompilasi rekursif . Ini berarti bahwa Anda dapat meninggalkan perpustakaan di folder itu dan memasukkannya dari sketsa Anda seperti ini:The Arduino 1,5 Perpustakaan struktur folder Format juga didukung, Anda hanya perlu menyesuaikan Anda
#include
pernyataan 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
#include
sintaks yang salah untuk menyertakan file lokal (misalnya,#include <ThirdPartyLibrary.h>
bukan#include "ThirdPartyLibrary.h"
). Ini masih berfungsi ketika perpustakaan diinstal ke salah satulibraries
folder 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:
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.
sumber
Anda dapat menggunakan makefile https://github.com/sudar/Arduino-Makefile untuk mengkompilasi kode Arduino. Anda tidak perlu IDE.
sumber
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
sumber