Як організувати структуру проектів Arduino для зручного контролю джерел?


75

Давно я шукав гарну відповідь на це питання.

Як правило, будь-який проект Arduino, але найпростіший, включатиме:

  • Основний файл вихідного коду MyProject.ino
  • Бібліотеки, характерні для проекту ( MyProjectLibrary1.h, MyProjectLibrary1.cpp...)
  • Сторонні бібліотеки (як правило, безкоштовний відкритий код, доданий вручну до каталогу бібліотек Arduino)
  • Схеми, схеми друкованої плати
  • Документація
  • ...

Все це ускладнює збереження всього коду та документа одного проекту під управлінням вихідного коду (наприклад, на Subversion, Git або GitHub).

Управління джерелом управління проектом означає керування версією всіх файлів, що використовуються проектом, включаючи сторонні бібліотеки.

Тепер для одного проекту мені потрібно визначити структуру каталогу, яка:

  • Включає всі файли проекту, як описано вище
  • Я можу повністю взяти на себе зобов’язання використовувати інструмент управління вихідним кодом (включаючи сторонні залежності)
  • Я можу оформити замовлення будь-де на своєму жорсткому диску і створити проект звідти (чи повинен він бути одним місцем, як накладено Arduino IDE)
  • Я можу зафіксувати автономний архів, який я можу надіслати другові, щоб він склав якомога простіше (без додаткової завантаження вручну)

Що мені особливо складно в проектах Arduino - це управління залежностями зовнішніх бібліотек. Розробники проектів Java мають для цього сховища Maven , що дуже допомагає в управлінні всіма зовнішніми депами. Але у нас немає еквівалентної системи для бібліотек Arduino.

Мені було б цікаво дізнатись, як інші розробники проектів Arduino мають справу з цими аспектами у власних проектах.

Також зауважте, що я відкритий для зміни свого процесу розробки, включаючи свій IDE (в даний час я використовую Eclipse з плагіном Arduino більшу частину часу, і тоді я переконуюсь, що мої проекти також можуть працювати безпосередньо з ID Arduino IDE).


Я також боровся з цим. У мене є два проекти, для яких потрібні різні версії зовнішньої бібліотеки, і зараз вони знаходяться поза контролем версій.
Кібергіббони

1
Зверніть увагу на подальші дослідження, що це менеджери пакунків . JavaScript отримав Node.js / npm та bower, PHP отримав PEAR та Composer тощо
kaiser

Відповіді:


30

Мій спосіб організації проекту arduino досить простий, весь мій проект - це сховища git, щоб було принаймні наступне:

Я маю перевагу використовувати свій улюблений редактор та Makefile, який я створив для роботи проти більшості випадків використання (і я навіть покращив той, яким незабаром поділюсь).

Для бібліотек я вважаю за краще зберігати їх як власні сховища і використовувати підмодуль git для включення їх до проекту. Оскільки багато бібліотек, написаних спільнотою, є спільними сховищами git, це хороше загальне рішення. Потім у Makefile я просто повинен додати шлях бібліотеки, який я хочу включити до змінної LOCALLIBS .

Хоча для деяких проектів є сенс інкапсулювати бібліотеки в бібліотеку апаратного шару абстракції, створену для проекту, тоді я вважаю за краще використовувати шлях, такий як:

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

Хоча з arduino 1.5.xa запропоновано новий спосіб вказівки бібліотек , який запропонує спосіб створювати та створювати проекти arduino так само, як ми вже робимо з pipy та virtualenv в python, тобто ви визначаєте набір потрібних вам бібліотек, і вони завантажити.


Я працював над подібною відповіддю. Ти побив мене до цього!
asheeshr

+1 Дякую! Цей спосіб виглядає досить цікаво. Мені доведеться спробувати цей тиждень (мені потрібно перевірити, як налаштувати матеріали Makefile спочатку).
jfpoilpret

@AsheeshR, якщо ваша відповідь була схожа, це означає, що вона все ще має деякі відмінності, правда? Мені буде цікаво знати про них!
jfpoilpret

насправді основними змінами, що надходять із наступною версією мого Makefile, буде можливість або flashвикористання програміста, або uploadвикористання завантажувача. А також обробка об'єднання завантажувача з прошивкою. Я також написав програвач запобіжників, який працює в makefile.
змо

@zmo bounty заслужив, хоча рішення Makefile не може працювати в моїй ситуації (використовуючи Windows, але я не вказав цю точку). Але я переконаний, що використання одного з існуючих рішень для makefile - це шлях. Після того, як я знайшов одну туру для мене, я опублікую свою відповідь тут.
jfpoilpret

23

Найпростіший спосіб зробити це - скопіювати файли заголовків та кодів бібліотеки у свій вихідний каталог та включити їх.

myproject/
    myproject.ino
    somelib.h
    somelib.cpp

У своєму коді ви можете це зробити include "somelib.h"

Суть до цього полягає в тому, що бібліотеки повинні бути в одній папці, а не в підпапках, тому ваш каталог виглядає безладним.


Що стосується структури каталогу всього мого проекту, включаючи схеми та документацію, моє зазвичай виглядає так:

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

Ще один недолік полягає в тому, що мені доведеться копіювати одні і ті ж бібліотеки для багатьох проектів. Крім того, мені незрозуміло, якщо ви розміщуєте туди лише ВАШІ бібліотеки чи також сторонні бібліотеки?
jfpoilpret

Перший момент: Це насправді не сторона, це лише побічний ефект збереження бібліотек та джерела проекту, як ви хотіли, за допомогою контролю версій. Що робити, якщо інший проект потребує оновленої версії бібліотеки? Що робити, якщо ви його змінили? Другий момент: обидва будуть працювати.
sachleen

1
Я не. Ідентифікатор Arduino IDE досить обмежений багатьма способами. Можливо, ви захочете заглянути в кращу середу для роботи, яка має кращу підтримку для цього. Люди створили власні файли, які дозволяють імпортувати бібліотеки також з інших джерел.
sachleen

1
Це не гарний спосіб організації проектів з точки зору ліцензій на програмне забезпечення. Якщо ви до свого проекту включаєте сторонні бібліотеки, які можуть мати різні ліцензії, ви можете порушити їх, як тільки розпочнете спільний доступ до файлу проекту. Різні ліцензії з відкритим кодом, як правило, не сумісні між собою.
asheeshr

3
@AsheeshR, що має всі ваші файли в одному каталозі, щоб ардуїно IDE не скаржився, це зовсім не хороший спосіб організації проектів. Це просто шлях. Не соромтеся запропонувати краще рішення. Я не знаю жодної, яка все ще дозволяє використовувати програмне забезпечення Arduino.
sachleen

20

Підмодулі Git надзвичайно потужні, коли йдеться про організацію кількох вкладених сховищ. За допомогою підмодулів git стає легко обробляти декілька бібліотек з різних джерел і навіть обробляти частини власного проекту, які можуть зберігатися в різних джерелах.

Структура каталогів

Способом організації ваших проектів буде:

  • projectA - батьківський довідник

    • projectA - Каталог вихідних кодів, що містить код Arduino

      1. projectA.ino
      2. заголовок.h
      3. implemen.cpp
    • docs - Ваш основний каталог документації

    • схеми - вони можуть підтримуватися окремо на окремому репортажі Git або в частині того ж репо

    • libs - Тут будуть міститися ваші сторонні бібліотеки.

      1. libA - Вони можуть підтримуватися як сховища сторонніх розробників
      2. libC - ...
    • ліцензія

    • ЧИТАЙТЕ

    • Makefile - Необхідно обробляти залежності в каталогах

Робочий процес

Ви дотримуєтесь свого звичайного циклу внесення змін, додавання та введення даних, що стосується основного сховища. Все стає цікавим із підрепозиторіями.

Ви можете додати сховище до батьківського каталогу вашого основного сховища. Це означає, що будь-яка частина вашої структури каталогу, тобто документи, схеми тощо, може підтримуватися як окремий сховище та постійно оновлюватися з нього.

Це можна зробити за допомогою git submodule add <repo.git>команди. Щоб оновлювати його, ви можете використовувати git submodule update <path>.

Якщо мова йде про підтримку декількох сторонніх бібліотек у вашому сховищі, таким чином, щоб кожна могла бути контрольована версією сама по собі або кожна може бути оновлена, якщо потрібно, підмодуль git знову економить ваш день!

Щоб додати третій репо в сторону libs , скористайтеся командою git submodule add <lib1.git> libs/lib1. Потім, щоб підтримувати бібліотеку у фіксований момент циклу випуску, огляньте бібліотеку та зробіть фіксацію. Щоб оновити бібліотеку, використовуйте команду git submodule update <path>.

Тепер ви можете підтримувати декілька сховищ як в основному сховищі, так і в декількох сторонніх бібліотеках на їх незалежних етапах випуску.

Версальний підхід до єдиного каталогу

Незважаючи на те, що підхід до єдиного каталогу є найпростішим, неможливо виконати керування версіями каталогу без особливого болю. Отже, простий підхід не вміщує у проекті різні сховища з різними станами.

Цей підхід дозволяє підтримувати декілька сховищ, але викликає необхідність у Makefile для обробки компіляції та зв’язування.

Залежно від складності вашого проекту може бути обраний оптимальний підхід.


1
+1, але так само, як сторонне позначення: Підмодулі Git є досить нестабільними та, ймовірно, вільними. Це не має ніякого значення , якщо ви використовуєте один каталог або кратні (як vendor, node_modulesі т.д.). Git посилається на них і відслідковує це.
кайзер

Msgstr "Немає жодної різниці, якщо ви використовуєте один каталог або множини (наприклад, постачальник, node_modules тощо)." Я не розумів цієї частини. Не могли б ви детальніше розробити?
asheeshr

17

Ось як я нарешті вирішив наслідувати свої проекти.

Arduino-CMake

Перше важливе рішення, яке я прийняв, - це вибір інструменту збирання, який міг би працювати для мого середовища (Windows), але не обмежувався ним (я хочу, щоб мої проекти легко використовувались іншими людьми).

Я протестував різні інструменти для виготовлення Arduino з відкритим кодом:

  • Guyzmo Makefile (запропонований відповіддю @zmo): це просто стандартний Makefile, виготовлений вручну для ардуїнових побудов; це Unix Makefileале є хороший порт в Unix робить для ОС Windows ; все ж, на жаль, цей Makefile працює лише для Unix, звичайно, він може бути адаптований для Windows, але я хотів інструмент, який працює "поза коробкою".
  • Arduino-Makefile (запропонований відповіддю @adnues): це більш просунутий проект, заснований на Unix Makefile, який має на меті легко використовувати повторно всі проекти Arduino; це документально підтверджено як робота на Mac, Linux та Windows, але підтримка Windows виявилася неправильною в моїх перших експериментах (багато залежностей від оболонки Unix).
  • Graduino (не запропонували будьяку відповідь): цей інструмент збірки заснований на добре відомий Gradle інструменту збірки з заводним світу; інструмент здається досить добре виконаним, але вимагає трохи (мало) groovy / gradle knowlegde і має лише мало документації; Я вирішив не їхати з цим через тягар встановлення groovy та gradle саме для цього (я хотів би уникати занадто багато передумов для людей, які хочуть будувати мої проекти у своїх середовищах).
  • Arduino-CMake (не пропонується жодною відповіддю): це здається найкращим з усіх, він має багатовікову історію, має багато прихильників і підтримувачів, дуже добре документований, має прості приклади, а також має кілька хороших підручників в блогах на Інтернет, наприклад, тут і там . Він заснований на CMake , "крос-платформі".

Я також знайшов ArduinoDevel , ще один інструмент для збирання Arduino - з яким я не експериментував - який може створювати Unix Makefiles або файли мурашок build.xml ; це здавалося цікавим, але трохи обмеженим з точки зору функціональності.

Нарешті я вирішив поїхати з Arduino-CMake :

  • налаштувати його було просто: просто встановіть CMake на свою машину та скопіюйте Arduino-CMake в якийсь каталог, який легко доступний (через відносні шляхи) з каталогів ваших проектів.
  • приклади, розроблені для мене (я просто слідкував за коментарями у CMakeLists.txtфайлі конфігурації, щоб адаптувати властивості, необхідні для мого середовища, наприклад, тип Arduino, послідовний порт)
  • ви можете організовувати свої проекти будь-яким способом
  • він може генерувати файли конфігурації для різних інструментів збирання (я протестував лише Unix Makefiles ), включаючи проекти Eclipse .
  • в створеному марці створюється кілька цілей для підтримки:

    • бібліотеки будують
    • програми будують
    • завантаження програми на дошки
    • запуск серійного монітора
    • і кілька інших, яких я ще не перевіряв

Структура проекту

Оскільки Arduono-CMake не нав'язує жодної структури каталогів для вашого проекту, ви можете вибрати ту, яка вам найбільше підходить.

Ось що я зробив особисто (що все ще потребує подальшого вдосконалення, але я задоволений цим зараз):

введіть тут опис зображення

Я вирішив поставити всі свої проекти під загальний arduino-stuffкаталог (який я зобов'язуюсь до github в цілому, я знаю, що міг би використовувати підмодулі git для кращої організації в github, але ще не встиг перевірити це).

arduino-stuff містить такий зміст:

  • build: ось каталог, в якому cmake і make буде генерувати всі свої речі (makefiles, кеш, файли об'єктів ...); цей не захоплюється github
  • cmake: це лише копія (немодифікована) каталогу cmake Arduino-CMake . Цей потрапляє на github, щоб було легше тому, хто хоче будувати мої проекти
  • CMakeLists.txt: ось "глобальна" конфігурація CMake, яка оголошує всі параметри за замовчуванням для мого середовища (плата, послідовний порт) та список підкаталогів збірки цілей
  • TaskManager: це мій перший проект, заснований на Arduino-CMake, це бібліотека з прикладами; цей ідентифікатор також містить CMakeLists.txtте, що визначає цілі для проекту

Бали для покращення

Нинішнє рішення не є ідеальним. Серед вдосконалень, які я бачу (це швидше для проекту Arduino-CMake включити ці покращення, якщо вони вважають за потрібне):

  • Можливість скопіювати каталог бібліотеки з поточного проекту в каталог бібліотек Arduino
  • Особливість завантаження бібліотеки в github
  • Особливість завантаження бібліотеки з github

2
Ви вже пробували PlatformIO? Можливо, його не було, коли ви задавали це питання .. platformio.org
ohhorob

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

Папка MyProject (корінь сховища)

Причиною, яку я пропоную, здавалося б, зайвою MyProjectкореневою папкою, є те, що ви згадали про використання GitHub. Коли ви завантажуєте (а не клонували) вміст сховища GitHub, ім'я гілки або тегу додається до імені сховища (наприклад,MyProject-master). Ідентифікатор Arduino IDE вимагає, щоб назва папки ескізу відповідала імені файлу ескізу. Якщо ви відкриєте файл .ino, який знаходиться у папці, яка не відповідає назві ескізу, Arduino IDE запропонує вам створити відповідну папку ескізу та перемістити ескіз до цієї папки. Окрім того, що це не дуже хороший початковий досвід для користувача, більша проблема полягає в тому, що Arduino IDE може не копіювати всі інші пов'язані файли в новостворену папку, що може призвести до того, що програма більше не збирається. Поклавши ескіз у підпапку, ви уникнете зміни GitHub назви папки ескізів.

Якщо річ з іменем файлу GitHub не є проблемою для вас, то зайва коренева папка не потрібна.

папка даних

Я рекомендую використовувати dataпідпапку для своїх файлів без коду, оскільки в Arduino IDE є спеціальна обробка підпапок цього імені. Вони копіюються в нове місце , коли ви робите Файл> Зберегти як ... . Папки будь-якого іншого імені не є.

src папка

srcПідпапка має особливу властивість дозволяє рекурсивні компіляції . Це означає, що ви можете залишити бібліотеки в цій папці і включити їх зі свого ескізу так:

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

Структура папок формату бібліотеки Arduino 1.5 також підтримується, вам потрібно лише відповідним чином відрегулювати свої #includeзаяви.

Зауважте, що тільки Arduino IDE 1.6.10 (arduino-builder 1.3.19) та новіша підтримка рекурсивної компіляції ескізів.

На жаль, деякі бібліотеки використовують неправильний #includeсинтаксис для локального файлу, що включає (наприклад, #include <ThirdPartyLibrary.h>замість #include "ThirdPartyLibrary.h"). Це все ще працює, коли бібліотека встановлена ​​до однієї з librariesпапок Arduino, але не працює, коли бібліотека поєднується з ескізом. Тому деякі бібліотеки можуть вимагати незначних редагувань, щоб використовувати цей спосіб.

Я дуже вважаю за краще це альтернативне завантаження всіх бібліотечних файлів у корені папки ескізів, оскільки це брудно, і кожен файл бібліотеки буде показаний у Arduino IDE як вкладки, коли ви відкриєте ескіз (Звичайно, будь-які вихідні файли, які ви робите хочете редагувати з Arduino IDE слід помістити в кореневу папку ескізу).

Можливість використання пакетних бібліотек на місці також відповідає іншій вашій цілі:

відправте другу для нього, щоб він будував якомога легше

Видалення вимоги до встановлення бібліотек вручну робить проект набагато простішим у використанні.

Це також уникне будь-яких шансів на конфлікт з іншими версіями бібліотечних файлів з тим самим іменем, які можуть бути встановлені раніше.


3

Ви можете використовувати makefile https://github.com/sudar/Arduino-Makefile для компіляції Arduino кодів. Вам не обов’язково потрібен IDE.


1
Я спробував, але, на жаль, він буде працювати тільки на машинах Unix, і мені потрібна підтримка Windows. Наразі я оцінюю ще один проект на основі CMake, але я ще не закінчив його. Я опублікую відповідь, коли зважусь на інструмент.
jfpoilpret

0

Напевно, дуже пізно в грі, але це досить популярне питання, щоб відповісти, використовуючи дещо інші методи, ніж ті, які вже розміщені.

Якщо вам потрібно підтримувати сумісність з Arduino IDE безпосередньо, ви можете використовувати щось на кшталт того, яке я окреслив тут:

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

Я ґрунтував більшу частину цього на нотах Arduino - Структура проекту та процес збирання , а також деякі поради, які я підбирав за ці роки.

Я дійсно не знаю, чому це так важко знайти безпосередньо на сторінках Arduino, здається, що це нерозумно з напівпрофесійного тла, що процес збирання настільки тупий.

удача там


Здається, посилання gitlab розірвано
Greenonline

Незвичайно це працює з прямим посиланням? тобто gitlab.com/mikealger/ExampleArduinoProjectStructure
Майк

Насправді обидва посилання працюють у Firefox, але жодна не працює в застарілій версії Chrome 49.0.2623.112 (64-розрядна). Думаю, нема про що хвилюватися. :-)
Greenonline
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.