Arduino projelerimin yapısı kolay kaynak kontrolü için nasıl düzenlenir?


75

Uzun zamandır bu soruya iyi bir cevap arıyordum.

Genellikle, herhangi bir Arduino projesi, ancak en basit olanı:

  • Ana kaynak kod dosyası MyProject.ino
  • Projeye özgü kütüphaneler ( MyProjectLibrary1.h, MyProjectLibrary1.cpp...)
  • Üçüncü taraf kütüphaneleri (genellikle ücretsiz açık kaynak, Arduino kütüphaneleri dizinine manuel olarak eklenir)
  • Şemalar, PCB diyagramları
  • belgeleme
  • ...

Tüm bunlar, bir projenin tüm kodunu ve belgesini Kaynak Kod Yönetimi altında tutmayı zorlaştırıyor (örn. Subversion, Git veya GitHub).

Projenizin kaynak kontrolünü yönetmek, 3. taraf kütüphaneleri de dahil olmak üzere proje tarafından kullanılan tüm dosyaların versiyonunu yönetmek anlamına gelir.

Şimdi, tek bir proje için, şöyle bir dizin yapısını tanımlamam gerekiyor:

  • Tüm proje dosyalarını yukarıda açıklandığı şekilde içerir
  • Tamamen Kaynak Kod Yönetimi aracına bağlı kalabilirim (3. taraf bağımlılıkları dahil)
  • Sabit diskimdeki herhangi bir yeri kontrol edebilirim ve projeyi oradan inşa edebilirim (Arduino IDE'nin uyguladığı tek bir yer olmalı mı)
  • Bir arkadaşıma gönderebileceğim bağımsız bir arşivi oluşturabilirim.

Arduino projelerinde özellikle zor bulduğum şey, dış kütüphane bağımlılıklarının yönetimi. Java projeleri geliştiricileri bunun için maven depolarına sahiptir ve bu da tüm harici depremlerin yönetiminde çok yardımcı olur. Fakat Arduino kütüphaneleri için eşdeğer bir sistemimiz yok.

Diğer Arduino proje üreticilerinin bu konularla kendi projelerinde nasıl başa çıktıklarını bilmek isterim.

Ayrıca, IDE'm de dahil olmak üzere geliştirme sürecimi değiştirmeye açık olduğumu ve şu anda çoğu zaman Arduino eklentisi ile Eclipse kullanıyorum ve ardından projelerimin doğrudan Arduino IDE ile çalışabilmesini sağladığımı da unutmayın.


Ben de bununla mücadele ediyorum. Harici bir kütüphanenin farklı sürümlerine ihtiyaç duyan iki projem var ve şu anda sürüm kontrolü dışındalar.
Cybergibbons

1
Lütfen bunların Paket Yöneticileri olduğunu daha fazla araştırma için not alın . JavaScript Node.js / npm ile bower, PHP ise PEAR ve Composer, vb. Aldı
kaiser

Yanıtlar:


30

Bir arduino projesi düzenleme yöntemim oldukça basittir, tüm projem git depolardır, böylece en azından aşağıdakiler vardır:

En sevdiğim editörüm ve çoğu davaya karşı çalışmak için hazırladığım Makefile'i tercih ediyorum (ve yakında paylaşacağım bir tanesini bile geliştirdim).

Kütüphaneler için onları kendi depoları olarak tutmayı ve projeye dahil etmek için git alt modülünü kullanmayı tercih ediyorum. Topluluk tarafından yazılan birçok kütüphane git depoları olarak paylaşıldığından, bu iyi bir genel çözümdür. Sonra, Makefile içinde sadece LOCALLIBS değişkenine dahil etmek istediğim kütüphaneler yolunu eklemem gerekiyor .

Bazı projeler için, kütüphaneleri proje için hazırlanmış bir donanım soyutlama katmanı kütüphanesine yerleştirmek mantıklı olsa da, daha sonra şöyle bir yolu kullanmayı tercih ederim:

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

Arduino 1.5.xa ile kütüphaneleri belirtmek için yeni bir yöntem önerilmiş olsa da, bu arduino projeleri oluşturup inşa etmenin bir yolunu sunacaktır, python'da pipy ve virtualenv ile yaptığımız gibi, yani ihtiyaç duyduğunuz kütüphaneleri tanımlarsınız ve bunlar indirildi.


Benzer bir cevap üzerinde çalışıyordum. Beni yendin!
asheeshr

+1 Teşekkürler! Bu yol oldukça ilginç görünüyor. Bu hafta denemek zorunda kalacağım (Yine de önce Makefile ayarlarını nasıl yapacağımı kontrol etmem gerekiyor).
jfpoilpret

Yanıtınız benzer olsaydı @ AsheRR, bu hala bazı farklılıklar olduğu anlamına gelir, değil mi? Bunlar hakkında bilmek isterdim!
jfpoilpret

Aslında Makefile dosyamın bir sonraki sürümünde ortaya çıkacak olan ana değişiklikler, flashbir programlayıcı ya uploadda bootloader'ı kullanma yeteneği olacaktır . Ayrıca, bootloader'ın firmware ile birleştirilmesi ile de ilgilidir. Ayrıca bir dosya içi sigorta ayarlayıcısı yazdım.
zmo

@filmo ödülü hak etse de, Makefile çözümünüz benim durumumda işe yaramasa da (Windows kullanarak ama o noktayı belirtmedim). Ancak, mevcut makefile çözümlerinden birini kullanmanın devam etmenin yolu olduğuna ikna oldum. Bir kere tha tworks bulduktan sonra cevabımı buraya yazacağım.
jfpoilpret

23

Bunu yapmanın en basit yolu, kitaplığın başlık ve kod dosyalarını kaynak dizininize kopyalayıp eklemektir.

myproject/
    myproject.ino
    somelib.h
    somelib.cpp

Kodunuzda yapabilirsiniz include "somelib.h"

Bunun aşağı tarafı, kütüphanelerin alt klasörler değil aynı klasörde olmaları gerektiğidir, bu yüzden dizininizin dağınık görünmesini sağlar.


Şema ve dokümantasyon da dahil olmak üzere tüm projemin dizin yapısı ile ilgili olarak, benim genel olarak şöyle görünüyor:

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
    ...

Diğer bir dezavantajı, aynı kütüphaneleri birçok projeye kopyalamak zorunda kalacağım. Ayrıca, oraya sadece SİZİN kütüphanelerini mi, yoksa 3. parti kütüphaneleri mi koyduğunuz açık değil mi?
jfpoilpret

İlk nokta: Bu gerçekten bir aşağı yön değil, kütüphaneleri ve proje kaynağını sürüm kontrolü ile istediğiniz gibi bir arada tutmanın bir yan etkisi. Ya başka bir projenin kütüphanenin güncellenmiş bir versiyonuna ihtiyacı varsa? Ya değiştirdiyseniz? İkinci nokta: her ikisi de işe yarayacak.
sachleen

1
Yapmıyorum. Arduino IDE birçok yönden oldukça sınırlıdır. Bunun için daha iyi desteği olan, çalışmak için daha iyi bir ortama bakmak isteyebilirsiniz. İnsanlar, diğer kaynaklardan da kitaplıklar içe aktarmanıza izin veren özel dosyalar yarattı.
sachleen

1
Bu, projeleri yazılım lisansları açısından düzenlemek için iyi bir yol değildir. Projenize farklı lisanslara sahip üçüncü taraf kütüphaneleri ekliyorsanız, proje dosyasını paylaşmaya başlar başlamaz onları ihlal ediyor olabilirsiniz. Farklı açık kaynaklı lisanslar genellikle birbirleriyle uyumlu değildir.
asheeshr

3
@AsheeshR tüm dosyalarınızı tek bir dizinde bulunduruyor, böylece arduino IDE şikayet etmiyor, projeleri organize etmenin iyi bir yolu değil. Bu sadece bir yol. Daha iyi bir çözüm önermek için çekinmeyin. Arduino yazılımını kullanmana hala izin veren birini tanımıyorum.
sachleen

20

Git alt modülleri çoklu iç içe geçmiş depoları organize etme konusunda son derece güçlüdür. Farklı kaynaklardan birden fazla kütüphaneyi kullanmak ve hatta kendi projenizin farklı kaynaklarda depolanabilecek kısımlarını kullanmak, git alt modülleriyle kolaylaşır.

Dizin yapısı

Projelerinizi organize etmenin bir yolu:

  • projectA - Ana Dizin

    • projectA - Arduino kodunu içeren kaynak kod dizini

      1. projectA.ino
      2. header.h
      3. implementation.cpp
    • dokümanlar - Ana dokümantasyon dizininiz

    • şemalar - bunlar ayrı bir Git deposunda veya aynı deponun bir parçası üzerinde ayrı olarak tutulabilir

    • libs - Bu, üçüncü şahıs kütüphanelerinizi içerecektir.

      1. libA - Bunlar üçüncü taraf depoları olarak korunabilir.
      2. libC - ...
    • lisans

    • README

    • Makefile - Dizinler arasındaki bağımlılıkları ele almak için gerekli

İş Akışı

Ana depo ile ilgili yaptığınız normal değişim değişikliklerini takip eder, ekler ve taahhüt edersiniz. İşler alt depolarla ilginçleşiyor.

Ana havuzunuzun üst dizinine bir havuz ekleme seçeneğiniz vardır. Bu, dizin yapınızın herhangi bir kısmının, yani dokümanlar, şemalar vb. Ayrı bir depo olarak muhafaza edilebileceği ve sürekli olarak güncellenebileceği anlamına gelir.

Bunu git submodule add <repo.git>komutu kullanarak yapabilirsiniz . Güncel tutmak için kullanabilirsiniz git submodule update <path>.

Deponuzda birden fazla üçüncü taraf kütüphanesi bulundurmak söz konusu olduğunda, her biri kendi başına kontrol edilebilecek sürümde olabilir veya gerektiğinde her biri güncel tutulabilir, git alt modülü yine gününüzden tasarruf sağlar!

Libs'e üçüncü taraf bir repo eklemek için komutu kullanın git submodule add <lib1.git> libs/lib1. Ardından, kütüphaneyi bırakma döngüsünde sabit bir noktada tutmak için kütüphaneyi kontrol edin ve bir taahhütte bulunun. Kütüphaneyi güncel tutmak için komutu kullanın git submodule update <path>.

Şimdi, bir ana havuzdaki çoklu depoları ve bağımsız yayınlanma aşamalarındaki birden fazla üçüncü taraf kütüphanesini koruyabilirsiniz.

Versus Tek Dizin Yaklaşımı

Tek dizin yaklaşımı en basit olmasına rağmen, bir dizinin kontrol bölümlerini çok fazla acı çekmeden sürümlemek mümkün değildir. Bu nedenle, basit yaklaşım, projede farklı devletlerle farklı havuzlara yer verememektedir.

Bu yaklaşım, çoklu depoların korunmasına izin verir, ancak derleme ve bağlama sürecini idare etmek için bir Makefile'a ihtiyaç duyulmasını sağlar.

Projenizin karmaşıklığına bağlı olarak, en uygun yaklaşım seçilebilir.


1
+1, ancak yalnızca bir yazı tipi olarak: Git Submodules oldukça dengesiz ve muhtemelen gevşek bir iz. Tek bir dizin veya katlarına (gibi kullanırsanız Hiç fark etmez vendor, node_modulesvs.). Git onlara referans verir ve izler.
kaiser

"Tek bir dizin veya katları (satıcı, node_modules, vb.) Kullanırsanız farketmez." Bu kısmı anlamadım. Ayrıntılı misiniz?
asheeshr

17

İşte sonunda projelerim için takip etmeye karar verdim.

Arduino-CKağıt

Yaptığım ilk önemli karar, çevrem için işe yarayabilecek bir yapı aracı seçimi (Windows) idi, ancak bununla sınırlı değildi (projelerimin başkaları tarafından kolayca tekrar kullanılabilmesini istiyorum).

Çeşitli açık kaynaklı Arduino markaları test ettim:

  • Guyzmo Makefile (@zmo answer tarafından önerilen): bu sadece Arduino için yapılmış standart bir Makefile yapımıdır; Bu Unix Makefile ama bir orada iyi liman arasında Unix, Windows için yapmak ; Yine de, ne yazık ki bu Makefile yalnızca Unix için çalışıyor, elbette Windows için uyarlanabilirdi, ama ben "kutudan çıkmayan" bir araç istiyorum.
  • Arduino-Makefile (@adnues answer tarafından önerildi): Bu, tüm Arduino projeleri tarafından kolaylıkla yeniden kullanılabilir olmayı amaçlayan Unix Makefile'a dayanan daha gelişmiş bir proje; Mac, Linux ve Windows üzerinde çalıştığı belgelenmiştir, ancak Windows desteği ilk deneylerimde yanlış oldu (Unix kabuğundaki birçok bağımlılık).
  • Graduino (herhangi bir cevap önerdiği değil): Bu aracı inşa tanınmış dayanmaktadır gradle gelen yapı aracını harika dünyasında; araç oldukça iyi görünüyor, ancak bazı (küçük) groovy / gradle knowlegde gerektiriyor ve sadece çok az belgeye sahip; Sadece groovy ve gradle kurma yükü nedeniyle onunla gitmemeye karar verdim (projelerimi kendi ortamlarında inşa etmek isteyenlerin ön koşullarından kaçınmak istiyorum).
  • Arduino-CMake (herhangi bir cevapla önerilmemiştir): bu, hepsinden daha iyi görünüyor, uzun bir geçmişe sahip, birçok taraftar ve bakıcıya sahip, çok iyi belgelenmiş, basit örneklerle gelen ve aynı zamanda birkaç iyi öğretici blog yazısına sahip Web, örneğin burada ve orada . CMake'e , "Cross-Platform Make" edayanmaktadır.

Ayrıca , Unix Makefiles veya karınca dosyaları oluşturabilen, henüz denemediğim başka bir Arduino derleme aracı olan ArduinoDevel'i de buldum ; Bu ilginç görünüyordu, ancak işlevsellik açısından biraz sınırlı. build.xml

Sonunda Arduino-CMake ile gitmeye karar verdim :

  • kurulumu kolaydı: CMake'i makinenize kurun ve Arduino-CMake'i projeler dizinlerinden kolayca erişilebilen (göreceli yollardan) bir dizine kopyalayın.
  • örnekler benim için kutudan çıktı ( CMakeLists.txtortamım için gereken özellikleri uyarlamak için yapılandırma dosyasındaki yorumları takip ettim, örn. Arduino tipi, seri port)
  • projelerinizi istediğiniz gibi düzenleyebilirsiniz
  • Eclipse projeleri de dahil olmak üzere çeşitli yapı araçları için yapılandırma dosyaları oluşturabilir (yalnızca Unix Makefiles'i test ettim ) .
  • Oluşturulan yapımda, aşağıdakileri desteklemek için birkaç hedef oluşturulur:

    • kütüphaneler inşa
    • programlar oluşturma
    • panolara program yükleme
    • seri monitör başlatma
    • ve birkaç tane daha test etmedim

Proje Yapısı

Arduono-CMake, projeniz için herhangi bir dizin yapısı getirmediğinden, size en uygun olanı seçebilirsiniz.

İşte kişisel olarak yaptığım şey (bu hala daha fazla ayrıntılandırma gerektiriyor, ama şimdi bundan mutluyum):

görüntü tanımını buraya girin

Tüm projelerimi ortak bir arduino-stuffdizine koymaya karar verdim (bir bütün olarak github'u taahhüt ediyorum , github'ta daha iyi bir organizasyon için git alt modüllerini kullanabileceğimi biliyorum , ancak bunu kontrol etmek için zamanım yoktu).

arduino-stuff aşağıdaki içeriğe sahiptir:

  • build: cmake ve make'in tüm eşyalarını üreteceği bir dizin (makefiles, önbellek, nesne dosyaları ...); bu ot github için taahhüt olsun
  • cmake: bu bir Arduino-CMake cmake dizininin bir kopyası (değiştirilmemiş) . Bu, github'a büründü ki projelerimi yapmak isteyen biri için daha kolay
  • CMakeLists.txt: Bu, ortamım (pano, seri bağlantı noktası) ve yapı hedefi alt dizinlerinin listesi için tüm varsayılanları bildiren "global" CMake yapılandırmasıdır.
  • TaskManager: bu benim Arduino-CMake'e dayanan ilk projem, bu örneklerden oluşan bir kütüphane; Bu idrectory ayrıca CMakeLists.txtproje için hedefleri belirten bir içerir.

Geliştirilecek noktalar

Mevcut çözüm olsa mükemmel değil. İyileştirmeler arasında (Arduino-CMake projesi için uygun gördükleri takdirde bu gelişmeleri dahil etmeleri yerine) görüyorum:

  • Mevcut projeden Arduino kütüphaneleri dizinine bir kütüphane dizini kopyalama özelliği
  • Github'a bir kütüphane yükleme özelliği
  • Bir kitaplığı github'dan indirme özelliği

2
PlatformIO'yu denedin mi? Bu soruyu sorarken etrafta olmayabilirdi .. platformio.org
ohhorob

4
MyProject
|_MyProject
  |_MyProject.ino
  |_data
  |  |_documentation 
  |  |_PCB
  |  |_schematics
  |_src
     |_MyProjectLibrary1
     |_ThirdPartyLibrary

MyProject klasörü (depo kökü)

Görünüşe göre gereksiz MyProjectkök klasör önermek nedeni GitHub kullanarak bahsetmiş olmasıdır. GitHub deposunun içeriğini indirdiğinizde (klonlamak yerine) şube veya etiket adı havuz adına eklenir (örn.MyProject-master). Arduino IDE, çizim klasörü adının çizim dosyası adıyla eşleşmesini gerektirir. Çizim adıyla eşleşmeyen bir klasördeki bir .ino dosyasını açarsanız, Arduino IDE uygun şekilde adlandırılmış bir çizim klasörü oluşturmanızı ve çizimi bu klasöre taşımanızı ister. Bunun kullanıcı için çok iyi bir başlangıç ​​deneyimi olmamasına ek olarak, asıl sorun Arduino IDE'nin ilişkili tüm dosyaları yeni oluşturulan klasöre kopyalamaması, bu da programın derlenmemesine neden olabilir. Çizimi bir alt klasöre koyarak GitHub'ın çizim klasörünün adını değiştirmesini önlersiniz.

GitHub dosya adı meselesi sizin için bir sorun değilse, gereksiz kök klasör gerekli değildir.

veri klasörü

dataKod olmayan dosyalarınız için alt klasörü kullanmanızı öneririz, çünkü Arduino IDE bu isimdeki alt klasörlerin özel bir muamelesine sahiptir. Bir Dosya> Farklı Kaydet ... yaptığınızda bunlar yeni konuma kopyalanır . Başka bir ismin alt klasörleri değildir.

src klasörü

Alt srcklasör özyinelemeli derlemeye izin verme özelliğine sahiptir . Bu, kütüphaneleri bu klasörde bırakabileceğiniz ve taslaklarınızdan şöyle ekleyebilirsiniz:

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

Arduino 1.5 Kütüphane biçimi klasör yapısı de yalnızca ayarlamak gerekir, desteklenen #includebuna göre açıklamalarda.

Yalnızca Arduino IDE 1.6.10 (arduino oluşturucu 1.3.19) ve daha yenisinin özyinelemeli taslak derlemesini desteklediğini unutmayın.

Ne yazık ki, bazı kütüphaneler #includeyerel dosya içerme (örneğin #include <ThirdPartyLibrary.h>yerine #include "ThirdPartyLibrary.h") için yanlış sözdizimini kullanıyor . Bu, kitaplık Arduino librariesklasörlerinden birine yüklendiğinde hala çalışır ancak kitaplık çizimle birlikte verildiğinde çalışmaz. Bu nedenle, bazı kütüphaneler bu şekilde kullanmak için küçük düzenlemeler gerektirebilir.

Ben bunu eskiz klasörünün kök kısmındaki tüm kütüphane dosyalarını atma alternatifine tercih ederim, çünkü bu karışık ve her kütüphane dosyası Arduino IDE'de taslağı açtığınızda sekmeler olarak gösterilecek (Tabii ki yaptığınız tüm kaynak dosyaları Arduino IDE'den düzenlenebilir olmak istiyorsanız taslak kök klasörüne yerleştirilmelidir).

Birlikte verilen kitaplıkları yerinde kullanabilmek, hedeflerinizden biri ile de uyumludur:

mümkün olduğu kadar kolay inşa etmesi için bir arkadaşına gönder

Kitaplıkları elle yükleme gereksinimini kaldırmak, projenin kullanımını çok kolaylaştırır.

Bu, aynı zamanda daha önceden kurulabilecek aynı isimdeki diğer kütüphane dosya sürümleriyle çakışma ihtimalini de önleyecektir.


3

Arduino kodlarını derlemek için makefile https://github.com/sudar/Arduino-Makefile kullanabilirsiniz . IDE'ye mutlaka ihtiyacınız yok.


1
Denedim ama ne yazık ki sadece Unix makinelerinde çalışacak ve Windows desteğine ihtiyacım var. Şu anda CMake'e dayanan başka bir projeyi değerlendiriyorum ancak henüz bitmedi. Bir araca karar verdiğimde bir cevap göndereceğim.
jfpoilpret

0

Muhtemelen oyuna gerçekten geç kaldım, ancak daha önce yayınlanmış olanlardan biraz farklı yöntemler kullanarak cevap verebilecek kadar popüler bir soru.

Doğrudan Arduino IDE ile uyumluluğu sağlamanız gerekirse, burada ana hatlarıyla belirtdiğim gibi kullanabilirsiniz:

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

Bunların çoğunu Arduino - Proje yapısı ve inşa sürecinin notlarına ve yıllar boyunca edindiğim bazı ipuçlarına dayandırdım .

Bunun doğrudan Arduino sayfalarında bulmanın neden bu kadar zor olduğunu bilmiyorum, yapım sürecinin çok geniş olduğu yarı profesyonel bir altyapıdan geliyor aptalca görünüyor.

orada iyi şanslar


Gitlab bağlantısı kopmuş gibi görünüyor
Greenonline

garip doğrudan bağlantı ile çalışır mı? yani gitlab.com/mikealger/ExampleArduinoProjectStructure
Mike Alger

Aslında her iki bağlantı da Firefox'ta çalışıyor, ancak ikisi de eski Chrome sürümüm 49.0.2623.112'de (64-bit) çalışmıyor. Endişelenecek bir şey yok sanırım. :-)
Greenonline
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.