쉬운 소스 제어를 위해 Arduino 프로젝트의 구조를 구성하는 방법은 무엇입니까?


75

이 질문에 대한 좋은 답변을 찾는 데 오랜 시간이 걸렸습니다.

일반적으로 Arduino 프로젝트이지만 가장 간단한 프로젝트는 다음과 같습니다.

  • 주요 소스 코드 파일 MyProject.ino
  • 프로젝트와 관련된 라이브러리 ( MyProjectLibrary1.h, MyProjectLibrary1.cpp...)
  • 타사 라이브러리 (일반적으로 무료 오픈 소스, Arduino 라이브러리 디렉토리에 수동으로 추가)
  • 회로도, PCB 다이어그램
  • 문서
  • ...

이 때문에 소스 코드 관리 (예 : Subversion, Git 또는 GitHub)에서 한 프로젝트의 전체 코드와 문서를 유지하기가 어렵습니다.

프로젝트의 소스 제어를 관리한다는 것은 타사 라이브러리를 포함하여 프로젝트에서 사용하는 모든 파일의 버전을 관리하는 것을 의미합니다.

이제 단일 프로젝트의 경우 다음과 같은 디렉토리 구조를 정의해야합니다.

  • 위에서 설명한 모든 프로젝트 파일을 포함
  • 소스 코드 관리 도구 (타사 종속성 포함)에 전념 할 수 있습니다.
  • 하드 드라이브의 어느 곳에서나 체크 아웃하고 거기에서 프로젝트를 빌드 할 수 있습니다 (Arduino IDE에서 부과 한 단일 위치 여야 함)
  • 가능한 한 쉽게 빌드 할 수 있도록 친구에게 보낼 수있는 독립적 인 아카이브에 압축 할 수 있습니다 (추가 수동 다운로드 없음)

Arduino 프로젝트에서 특히 까다로운 점은 외부 라이브러리 종속성 관리입니다. Java 프로젝트 개발자는이를 위해 maven 리포지토리를 가지고 있으며 모든 외부 dep 관리에 많은 도움이됩니다. 그러나 우리는 Arduino 라이브러리와 동등한 시스템을 가지고 있지 않습니다.

다른 Arduino 프로젝트 제작자가 자신의 프로젝트에서 이러한 측면을 어떻게 다루는 지 알고 싶습니다.

또한 IDE를 포함하여 개발 프로세스를 변경할 수 있습니다 (현재 Eclipse를 Arduino 플러그인과 함께 사용하고 프로젝트가 Arduino IDE와 직접 작동 할 수 있도록 보장합니다).


나는 또한 이것으로 어려움을 겪고있다. 다른 버전의 외부 라이브러리가 필요한 두 개의 프로젝트가 있으며 현재 버전 제어 외부에 있습니다.
Cybergibbons

1
패키지 관리자 라는 추가 조사를 위해 참고하십시오 . JavaScript는 Node.js / npm 및 bower, PHP는 PEAR 및 Composer 등을 얻었습니다.
kaiser

답변:


30

arduino 프로젝트를 구성하는 방법은 매우 간단합니다. 모든 프로젝트는 git 저장소이므로 최소한 다음이 있습니다.

나는 가장 좋아하는 편집기Makefile 을 사용하여 대부분의 유스 케이스에 대해 작동하도록 만들었습니다.

라이브러리의 경우 라이브러리를 자체 리포지토리로 유지하고 git 하위 모듈을 사용하여 프로젝트에 포함시키는 것을 선호합니다. 커뮤니티가 작성한 많은 라이브러리가 자식 리포지토리로 공유되므로 좋은 일반적인 솔루션입니다. 그런 다음 Makefile 내에서 LOCALLIBS 변수 에 포함하려는 라이브러리 경로를 추가하기 만하면 됩니다.

일부 프로젝트의 경우 라이브러리를 프로젝트 용으로 제작 된 하드웨어 추상화 계층 라이브러리로 캡슐화하는 것이 합리적이지만 다음과 같은 경로를 사용하는 것이 좋습니다.

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

arduino 1.5.xa 를 사용하면 라이브러리를 지정하는 새로운 방법 이 제공되지만 파이썬에서 pipy 및 virtualenv로 이미 수행하는 것과 같은 방식으로 arduino 프로젝트를 만들고 빌드하는 방법을 제공합니다. 즉 필요한 라이브러리 세트를 정의합니다. 다운로드하십시오.


나는 비슷한 대답을하고있었습니다. 당신은 나를 이길!
asheeshr

+1 감사합니다! 이 방법은 꽤 흥미로워 보입니다. 이번 주에 시도해보아야 할 것입니다 (하지만 먼저 Makefile을 설정하는 방법을 확인해야합니다).
jfpoilpret

@ AsheeshR 귀하의 답변이 비슷하다면 여전히 약간의 차이점이 있음을 의미합니까? 이것에 대해 알고 싶습니다!
jfpoilpret

실제로 내 Makefile의 다음 버전에서 제공되는 주요 변경 사항 flash은 프로그래머를 upload사용하거나 부트 로더를 사용하는 기능 입니다. 펌웨어와 부트 로더의 병합을 처리합니다. 또한 in-makefile 퓨즈 설정기를 작성했습니다.
zmo

@zmo 현상금은 당연하지만 Makefile 솔루션은 내 상황에서 작동하지 않지만 (Windows를 사용하지만 해당 지점을 지정하지 않았습니다). 그러나 기존의 makefile 솔루션 중 하나를 사용하는 것이 좋은 방법이라고 확신합니다. 내가 나를 위해 하나의 tworks를 발견하면 여기에 내 답변을 게시합니다.
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는 여러 가지면에서 상당히 제한적입니다. 이에 대한 지원이 더 나은 환경에서 더 나은 환경을 찾고 싶을 수도 있습니다. 사람들은 다른 소스에서 라이브러리를 가져올 수있는 사용자 지정 make 파일을 만들었습니다.
sachleen

1
이것은 소프트웨어 라이센스 관점에서 프로젝트를 구성하는 좋은 방법이 아닙니다. 라이센스가 다른 타사 라이브러리를 프로젝트에 포함시키는 경우 프로젝트 파일 공유를 시작하자마자 위반할 수 있습니다. 다른 오픈 소스 라이센스는 일반적으로 서로 호환되지 않습니다.
asheeshr

3
@AsheeshR은 모든 파일을 하나의 디렉토리에 저장하므로 arduino IDE가 불평하지 않는 것은 프로젝트를 구성하는 좋은 방법이 아닙니다. 그것은 단지 방법. 더 나은 솔루션을 제안하십시오. 여전히 Arduino 소프트웨어를 사용할 수있는 소프트웨어를 모르겠습니다.
sachleen

20

Git 하위 모듈 은 여러 개의 중첩 리포지토리를 구성 할 때 매우 강력합니다. 다른 소스에서 여러 라이브러리를 처리하고 git 서브 모듈을 사용하면 다른 소스에 저장 될 수있는 자신의 프로젝트 부분을 처리 할 수도 있습니다.

디렉토리 구조

프로젝트를 구성하는 방법은 다음과 같습니다.

  • projectA- 부모 디렉토리

    • projectA -Arduino 코드를 포함하는 소스 코드 디렉토리

      1. projectA.ino
      2. header.h
      3. implementation.cpp
    • docs- 기본 문서 디렉토리

    • 회로도 -이들은 별도의 Git 리포지토리 또는 동일한 리포지토리의 일부에 별도로 유지 될 수 있습니다

    • libs- 타사 라이브러리가 포함됩니다.

      1. libA-타사 리포지토리로 유지 관리 될 수 있음
      2. libC-...
    • 특허

    • 읽어보기

    • Makefile- 디렉토리 간 종속성 처리에 필요

워크 플로우

기본 저장소에 관한 한 정상적인 변경주기, 추가 및 커밋주기를 따릅니다. 하위 리포지토리가 흥미로워집니다.

기본 저장소의 상위 디렉토리에 저장소를 추가 할 수 있습니다. 즉, 디렉토리 구조, 즉 문서, 회로도 등의 일부는 별도의 저장소로 유지 관리하고 지속적으로 업데이트 할 수 있습니다.

git submodule add <repo.git>명령을 사용하여이 작업을 수행 할 수 있습니다 . 최신 상태로 유지하려면을 사용할 수 있습니다 git submodule update <path>.

리포지토리 내에 여러 타사 라이브러리를 유지 관리 할 때 각각 자체적으로 버전을 제어하거나 필요한 경우 최신 상태로 유지할 수 있도록 git submodule은 하루를 다시 절약합니다!

libs에 타사 저장소를 추가하려면 명령을 사용하십시오 git submodule add <lib1.git> libs/lib1. 그런 다음 릴리스주기에서 라이브러리를 고정 된 지점에 유지하려면 라이브러리를 체크 아웃하고 커밋하십시오. 라이브러리를 최신 상태로 유지하려면 명령을 사용하십시오 git submodule update <path>.

이제 독립 리포지토리 단계에서 여러 리포지토리를 기본 리포지토리와 여러 타사 라이브러리에서 유지 관리 할 수 ​​있습니다.

단일 디렉토리 접근 대

그동안 단일 디렉토리 접근 방식은 간단한이며, 그것은 많은 고통없이 디렉토리의 버전 관리 부분에 수 없습니다. 따라서 간단한 접근 방식은 프로젝트의 다양한 상태로 다른 리포지토리를 수용하지 못합니다.

이 방법을 사용하면 여러 리포지토리를 유지 관리 할 수 ​​있지만 컴파일 및 연결 프로세스를 처리하기 위해 Makefile이 필요합니다.

프로젝트의 복잡성에 따라 최적의 접근 방식을 선택할 수 있습니다.


1
+1, 그러나 참고 사항 : Git 서브 모듈은 매우 불안정하고 느슨합니다. 단일 디렉토리 또는 배수 (같이 사용하는 경우는 차이가 없습니다 vendor, node_modules등). 힘내 그들을 참조하고 추적합니다.
kaiser

"단일 디렉토리 또는 여러 디렉토리 (예 : 공급 업체, node_modules 등)를 사용하더라도 차이가 없습니다." 나는이 부분을 이해하지 못했다. 좀 더 자세히 설명해 주시겠습니까?
asheeshr

17

다음은 프로젝트를 위해 최종적으로 결정한 방법입니다.

아두 이노 -CMake

내가 결정한 첫 번째 중요한 결정은 내 환경에서 작동 할 수있는 빌드 도구 (Windows)를 선택하는 것이었지만 이에 국한되지 않았습니다 (다른 사람들이 프로젝트를 쉽게 재사용 할 수 있기를 바랍니다).

다양한 오픈 소스 Arduino make 도구를 테스트했습니다.

  • Guyzmo Makefile (@zmo 답변에서 제안) : Arduino 빌드 용으로 제작 된 표준 Makefile입니다. 이것은 Unix Makefile이지만 Windows 용 Unix make 좋은 포트 가 있습니다. 불행히도,이 Makefile은 유닉스에서만 작동합니다. 물론 Windows에 맞출 수는 있지만 "바로 사용할 수있는"도구를 원했습니다.
  • Arduino-Makefile (@adnues 답변에서 제안) : 이것은 모든 Arduino 프로젝트에서 쉽게 재사용 할 수있는 Unix Makefile 기반의 고급 프로젝트입니다. 그것은 Mac, Linux 및 Windows에서 작동하는 것으로 문서화되었지만 Windows 지원은 첫 번째 실험 (유닉스 쉘에 대한 많은 의존성)에서 잘못되었습니다.
  • Graduino (답변으로 제안되지 않음) :이 빌드 도구는 그루비 세계에서잘 알려진 gradle 빌드 도구를기반으로합니다. 이 도구는 잘 수행 된 것처럼 보이지만 약간의 그루비 / 그라데이션 지식이 필요하며 문서는 거의 없습니다. 나는 그루비와 gradle을 설치하는 부담 때문에 그 일을하지 않기로 결정했습니다 (환경에서 프로젝트를 구축하려는 사람들에게는 너무 많은 전제 조건을 피하고 싶습니다).
  • Arduino-CMake (어떤 대답도 제안하지 않음) : 이것은 가장 좋은 것 같습니다, 오랜 역사를 가지고 있으며 많은 지지자와 유지 보수자가 있으며 매우 잘 문서화되어 있으며 간단한 예제가 제공되며 웹, 예를 들어, 여기에 있다 . "Cross-Platform Make"인 CMake를 기반으로합니다.

유닉스 메이크 파일 이나 개미 파일을 생성 할 수있는 또 다른 Arduino 빌드 도구 인 ArduinoDevel 도 발견 했습니다 . 그 기능은 흥미로워 보였지만 기능면에서는 약간 제한적이었습니다. build.xml

마침내 나는 Arduino-CMake 와 함께 가기로 결정했습니다 .

  • 설정하기 쉬웠습니다 : 컴퓨터에 CMake 를 설치 하고 프로젝트 디렉토리에서 (상대 경로를 통해) 쉽게 액세스 할 수있는 일부 디렉토리에 Arduino-CMake를 복사하면됩니다.
  • 예제는 나를 위해 즉시 작동했습니다 ( CMakeLists.txtArduino 유형, 직렬 포트와 같이 내 환경에 필요한 속성을 조정하기 위해 구성 파일 의 주석을 따랐습니다 )
  • 원하는 방식으로 프로젝트를 구성 할 수 있습니다
  • Eclipse 프로젝트를 포함하여 다양한 빌드 도구에 대한 구성 파일을 생성 할 수 있습니다 ( 유닉스 메이크 파일 만 테스트 했습니다).
  • 생성 된 make에서 다음을 지원하기 위해 여러 대상이 작성됩니다.

    • 도서관 구축
    • 프로그램 빌드
    • 보드에 프로그램 업로드
    • 시리얼 모니터 출시
    • 그리고 아직 테스트하지 않은 몇 가지

프로젝트 구조

Arduono-CMake는 프로젝트의 디렉토리 구조를 강요하지 않기 때문에 가장 적합한 디렉토리 구조를 선택할 수 있습니다.

다음은 내가 개인적으로 한 일입니다 (여전히 더 세분화해야하지만 지금은 기쁩니다).

여기에 이미지 설명을 입력하십시오

모든 프로젝트를 공통 arduino-stuff디렉토리 에 넣기로 결정했습니다 (github 전체를 커밋하기 위해 github 에서 더 나은 조직을 위해 git 하위 모듈 을 사용할 수 는 있지만 아직 확인할 시간이 없다는 것을 알고 있습니다).

arduino-stuff 내용은 다음과 같습니다.

  • build: cmake와 make가 모든 것들 (makefiles, cache, object files ...)을 생성하는 디렉토리입니다. 이건 github에 헌신하지 않습니다.
  • cmake:이 파일은 Arduino-CMake cmake 디렉토리 의 복사본 (수정되지 않은) 일뿐 입니다. 이것은 프로젝트를 만들고 싶은 사람이 더 쉽게 github에 도착합니다.
  • CMakeLists.txt: 이것이 내 환경 (보드, 직렬 포트) 및 빌드 대상 서브 디렉토리의 모든 기본값을 선언하는 "글로벌"CMake 구성입니다.
  • TaskManager:이 프로젝트는 Arduino-CMake를 기반으로 한 첫 번째 프로젝트이며 예제가 포함 된 라이브러리입니다. 이 idrectory에는 또한 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 파일 이름이 문제가되지 않으면 중복 루트 폴더가 필요하지 않습니다.

데이터 폴더

dataArduino IDE에는 해당 이름의 하위 폴더가 특별히 취급되므로 비 코드 파일에 하위 폴더를 사용하는 것이 좋습니다 . 파일> 다른 이름으로 저장 ... 을 수행하면 새 위치로 복사됩니다 . 다른 이름의 하위 폴더는 없습니다.

src 폴더

src하위 폴더 허용하는 특별한 재산이 재귀 컴파일 . 즉, 해당 폴더에 라이브러리를 그대로두고 스케치에서 라이브러리를 다음과 같이 포함 할 수 있습니다.

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

아두 이노 1.5 라이브러리 형식의 폴더 구조는 또한 당신은 당신 조정할 필요가 지원됩니다 #include따라 문을.

Arduino IDE 1.6.10 (arduino-builder 1.3.19) 이상 만 재귀 스케치 컴파일을 지원합니다.

불행하게도 일부 라이브러리 #include는 로컬 파일 포함에 대해 잘못된 구문을 사용합니다 (예 : #include <ThirdPartyLibrary.h>대신 #include "ThirdPartyLibrary.h"). 라이브러리가 Arduino libraries폴더 중 하나에 설치된 경우에도 여전히 작동 하지만 라이브러리가 스케치와 번들로 제공되는 경우 작동하지 않습니다. 따라서 일부 라이브러리는이 방법을 사용하기 위해 약간의 편집이 필요할 수 있습니다.

스케치 폴더의 루트에있는 모든 라이브러리 파일을 덤프하는 대신 이것을 선호합니다. 왜냐하면 스케치가 열릴 때 모든 라이브러리 파일이 Arduino IDE에 탭으로 표시되기 때문입니다 (물론 모든 소스 파일 Arduino IDE에서 편집 할 수 있으려면 스케치 루트 폴더에 배치해야합니다.

번들 라이브러리를 제자리에 사용할 수 있다는 것도 다른 목표와 일치합니다.

가능한 한 쉽게 만들 수 있도록 친구에게 보내십시오.

라이브러리를 수동으로 설치해야하는 요구 사항을 제거하면 프로젝트를 훨씬 더 쉽게 사용할 수 있습니다.

또한 이전에 설치되었을 수있는 동일한 이름의 다른 버전의 라이브러리 파일과 충돌 할 가능성이 없습니다.


3

Arduino 코드를 컴파일 하기 위해 makefile https://github.com/sudar/Arduino-Makefile 을 사용할 수 있습니다 . 반드시 IDE가 필요하지는 않습니다.


1
유감스럽게도 유닉스 컴퓨터에서만 작동하며 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 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.