Программирование Arduino в CLion

  • Tutorial
В этой статье я расскажу о небольшом how to о разработке для Arduino в CLion www.jetbrains.com/clion.
CLion — новая IDE для C/C++ от JetBrains. По стилю и поведению очень похожа на IDEA (IDE для Java). А так как я пишу на Java под IDEA с использованием «фишек» это IDE, то хотелось бы все эти «фишки» и use case разработки перенести на разработку для Arduino.

Вообще я пробовал разные IDE для Arduino — Arduino IDE, Eclipse с плагином для Arduino, Eclipse с плагином для AVR, Atmel Studio, Visual Studio с плагином VisualMicro и ReSharper C++. Последнее время остановился на Eclipse с плагином для Arduino. Но всё же некоторых привычных возможностей из IDEA не хватало.

И вот наконец JetBrains сделали IDE для C\C++ — CLion. Но пока без Arduino плагина. Но с поддержкой CMake. Вот этим можно воспользоваться!

arduino-cmake


В задаче по поддержке Arduino youtrack.jetbrains.com/issue/CPP-364 упоминается сборка CMake для Arduino github.com/queezythegreat/arduino-cmake вот ей то и воспользуемся.

Для этого установим Arduino SDK в папку, указанную в arduino-cmake (в Win это Program Files(x86)\Arduino). Использовать нужно именно 1.0.x версию, т.к. версия 1.5.x не поддерживается. Я брал последнюю версию 1.0.6.

Потом скачаем github.com/queezythegreat/arduino-cmake, далее вся работа будет построена на основе него. Для Windows нужно в файле cmake/Platform/Arduino.cmake исправить в строчках 1177, 1178 названия переменных с TARGET_PATH на TARGET_NAME. Это нужно сделать потому что в Windows не корректно формируется путь к hex файлу прошивки для avrdude. Скорее всего из за Win-like пути с буквой диска. Как это экранировать я не нашёл, поэтому просто указал относительный путь. Тем более что перед вызовом команды avrdude происходит переход в каталог с hex файлом. Эти изменения нужны, чтобы происходил upload программы в Arduino. Если не сделать, то будет только компилироваться.

Далее просто в CLion открываем этот CMake проект, через File->Import project.


Немного ждём, пока CLion обработает CMake файлы. И всё, проект готов.

Что бы настроить этот проект для загрузки в Arduino нужно выбрать конкретную Arduino-плату и порт с Arduino для загрузки программы. В example проекте это настраивается в example/CMakeLists.txt. Вся информация по настройке с примерами есть в arduino-cmake/README.rst

Создание своей программы


Сначала я пробовал использовать «скетчи» из Arduino, но в CLion у них не работал autocomplite, хотя контекст (в CLion справа внизу) был указан корректно. Поэтому я использовал просто cpp файл, который по содержимому был всего на пару строк больше «скетча».
При настройке своего CMakeLists.txt я использовал пример из duinoworks.bakketti.com/?p=11

Сначала создадим папку serial в корневой папке приложение (на одном уровне в папкой example) и добавим туда два файла — serial.cpp с кодом программы и CMakeLists.txt с настройкой проекта.

Содержимое serial/CMakeLists.txt
# Set a variable for commands below
set(PROJECT_NAME serial)

# Define your project and language
project(${PROJECT_NAME} C CXX)

set(${PROJECT_NAME}_BOARD nano328)

# Define the source code
set(${PROJECT_NAME}_SRCS serial.cpp)

# Define the port for uploading code to the Arduino
set(${PROJECT_NAME}_PORT COM8)

# Command to generate code arduino firmware (.hex file)
generate_arduino_firmware(${PROJECT_NAME})


Обратите внимание, что в качестве платы я выбрал Arduino Nano с ATMEGA328 на порту COM8. Список всех поддерживаемых плат есть в C:\Program Files (x86)\Arduino\hardware\arduino\boards.txt (это название параметра до точки — uno, atmega328, diecimila и т.д.)

Содержимое serial/serial.cpp
#if ARDUINO >= 100
#include "Arduino.h"
#else
    #include "WProgram.h"
#endif

void setup() {
    Serial.begin(9600);
}

void loop() {
    Serial.println("Hello from CLion!");
    delay(5000);
}


И подключаем папку serial — в корневом CMakeLists.txt добавляем строчку
add_subdirectory(serial)


Далее в CLion в окне CMake выбираем Reload CMake project:


Далее можно писать код как обычно. Пример редактирование кода с поддержкой autocomplite:


В CLion должны создаться конфигурации serial, serial-size, serial-upload. Нас интересует конфигурация serial-upload — она собирает и загружает программу.

Выбираем её и нажимаем либо Run->Buid (Ctrl+F9) либо просто кнопки Run или Debug возле выпадающего списка с конфигурациями. В первом случае произойдёт сборка и загрузка в Arduino, во втором тоже самое, но ещё попробует запуститься elf файл, что не получится и будет ошибка, но на результат это не влияет.

Работа с Arduino Library


Для работы с Arduino Library нужно явно указать путь к папке libraries. Это можно сделать добавив
link_directories(${ARDUINO_SDK}/libraries)
в корневой CMakeLists.txt. Далее в программе просто подключает header как обычно, например
 #include "LiquidCrystal.h"


Пример


Пример программы есть у меня на GitHub:
github.com/TimReset/arduino-cmake

Заключение


Сейчас из CLion нельзя подключиться к COM порту для общения с Arduino — я для этого использовал возможности мониторинга COM порта из Arduino IDE или Eclipse. Хотя в arduino-cmake можно добавить задачу запуска программы мониторинга COM порта (в CMakeLists.txt указать set(${PROJECT_NAME}_SERIAL <Имя_имя_программы @SERIAL_PORT@)). Так же при загрузке программы через avrdude COM порт не должен ни кем использоваться (например, нельзя параллельно к нему подключиться через Arduino IDE), иначе загрузка не произойдёт, но при этом ни каких ошибок не будет. Так что при каждой загрузке нужно закрывать соединение.

Для себя пока решил использовать CLion в разработке — основные возможности по написанию C\C++ кода он поддерживает, а этого для меня вполне достаточно плюс привычная среда разработки. Хотя пока практически не работает с CMakeLists.txt — есть только подсветка синтаксиса, но не работает даже комментирование.
Share post

Similar posts

Comments 20

    +3
    Спасибо за интересный опыт. А что Вы имеете в виду под «но не работает даже комментирование.»?

    Комплишен для CMake синтаксиса запланирован на самое ближайшее будущее. Как и автоматическое обновление CMakeLists.txt при добавлении/удалении файлов. Плюс есть еще несколько идей, как сделать поддержку CMake умнее, но это уже на будущее.
      0
      Ну по Ctrl+/ строка не комментируется. Хотя если просматривать diff файла CMakeLists.txt перед коммитом, строку можно закомментировать. :)
      Не работает переход на декларацию метода (по Ctrl+click или Ctrl+B). У меня работал только autocomplite по путям (т.е. когда нужно указать имя папки или файла в проекте). Но вообще CMake нормально работает — по крайней мере у меня все target'ы корректно сгенерировал и корректно запускает.
      Вообще пока всем доволен.
      P.S. А куда делись настройки проекта? В IDEA они по Ctrl+Shift+Alt+S открываются. Какой теперь use case по работы с проектом?
        +2
        Да, шорткат не работает действительно в CMake, только в C/C++ коде. Спасибо. Постараемся исправить в будущем (соб-но, ишью youtrack.jetbrains.com/issue/CPP-469).

        Про декларацию метода и неработающую навигацию можно пример? Правда ли, что что файл с декларацией входит в проект с точки зрения CLion, то есть не серый в дереве?
          0
          Уточню — я говорю про методы в CMakeLists.txt файле. Честно говоря не знаю, как они правильно называются, т.к. я больше по Java :)
          Я имею ввиду, когда в CMakeLists.txt есть строчка
          print_board_list()
          

          И в другом файле есть декларация этого метода:
          function(PRINT_BOARD_LIST)
              foreach(PLATFORM ${ARDUINO_PLATFORMS})
                  if(${PLATFORM}_BOARDS)
                      message(STATUS "${PLATFORM} Boards:")
                      print_list(${PLATFORM}_BOARDS)
                      message(STATUS "")
                  endif()
              endforeach()
          endfunction()
          

          То нельзя по Ctrl+click или Ctrl+B перейти на декларацию метода, пишет — «Cannot find declaration to go to».
          Файлы входят в проект с точки зрения CLion, они не серые, в отличие от некоторых других файлов (т.е. есть с чем сравнить).
          Если этого примера не достаточно, то можно скачать проект github.com/TimReset/arduino-cmake и посмотреть самим.
            +2
            А, тогда понятно. Для CMake методов пока не работает. Это тоже одна из мыслей на будущее )
      0
      И еще такой вопрос — а зачем Вы делаете Import? Почему просто не открыть проект в CLion (import актуален для не-cmake проектов)? Для этого надо просто указать верхнеуровневый CMakeLists.txt
        +1
        Да, Вы знаете, Open project тоже работает :) Import делал по аналогии с IDEA — если проект не IDEA проект (т.е. не содержит в себе папку .idea) то его нужно импортировать. Тут так же поступил — это CMake проект без папки .idea и по этому его импортировал.
          0
          Это хорошо, что работает )
          .idea создастся при открытии проекта. Import функциональность мы добавили, чтобы те, у кого С/С++ проект не на базе CMake построен, могли попробовать CLion для своего проекта, импортировав в CMake билд-систему.
        +2
        Спасибо за статью, надо обязательно попробовать.
        На маке мне очень понравилось использовать XCode с EmbedXcode. Пара пассов с инклудами, и путями библиотек и вуаля!
          +2
          Меня пока напрягает частично неработающий дебаг (https://youtrack.jetbrains.com/issue/CPP-1807) и прожорливость по процу. Та же idea на проекте в 1М строк (lucene-solr) работает куда шустрее и с меньшей нагрузкой на проц, чем clion на 150k строк (nginx).
            0
            Ну для Arduino проблема с дебагером — не проблема — там всё равно дебажить ни как нельзя :-D
            Ребята из VisualMicro сделали свой костыль для дебага, но там у них не тру дебаг.
              0
              Коль JTAG'а нет, то не подебажишь нормально, да. Но для тех платформ, где он есть в clion по этому поводу есть ещё youtrack.jetbrains.com/issue/CPP-871
            +1
            Расскажу о том, какие могут возникнуть сложности с настройкой JetBrains CLion + Arduino + Windows 7, и как их решать.

            1) CLion под Windows требует выставить правильное окружение в настройках
            File -> Settings => Build, Execudion, Deployment -> Toolchain
            Правильные настройки можно увидеть на скриншоте
            habrastorage.org/files/d67/ba0/bb6/d67ba0bb63a54794abb5ed049a3dc4fb.png
            Так вот там есть две опции MinGW и Cygwin.
            С cygwin ничего не получится, так как при запуске через cywgin пути в системе меняются на /cygdrive/c/…
            и при попытке скомпиллировать ваши исходники avr-g++ сразу же будет жаловаться на то, что файла
            с исходниками она найти не может. Другими словами make из cygwin работает с путями /cygdrive/c/, а
            весь toolkit из Arduino IDE нет, им нужны обычные пути c:\…
            Поэтому нужно поставить MinGW

            1.1) Сначала нужно скачать его по ссылке sourceforge.net/projects/mingw/files/Installer
            Тестировалось на версии mingw-get-0.6.2-mingw32-beta-20131004-1
            Затем установить с дефолтными настройками

            1.2) Запустить MinGW Installation Manager

            1.3) Выбрать пакеты для установки из Basic Setup
            — mingw-developer-toolkit
            — mingw32-base
            — mingw32-gcc-g++
            — msys-base
            и нажать Apply Changes

            2) В переменную окружения Path можно ничего не прописывать (несмотря на инструкцию с github.com/queezythegreat/arduino-cmake)
            И даже более того, возможно потребуется даже убрать лишнее.

            2.1) Есть проблема со сборкой через cmake, если в путях прописана Anaconda (https://store.continuum.io/cshop/anaconda/)
            А по-умолчанию anaconda прописывается в путях, чтобы можно было вызывать python из командной строки.
            Так вот в anaconda есть свой toolkit с make и прочими вещами, поэтому arduino-cmake находит не путь к Arduino SDK, а путь к Anaconda
            По аналогии такие проблемы могут возникнуть с любым другим софтом
            Решается такая проблема исключением из путей (как из переменной windows окружения Path для пользователя так и для системы)
            Но это не всё, после этого нужно почистить кеш cmake
            %USERPROFILE%\.clion10\system\cmake\generated\*

            2.2) В Arduino SDK есть файл sh.exe, о котором может предупредить CLion на той же странице настроек toolchain'а.
            Поэтому и путь к Arduino SDK тоже нужно исключить из путей окружения windows

            После решения этих двух проблем, JetBrains CLion + Arduino нормально работает на Windows 7.
            А для коннекта к COM порту можно использовать PuTTY + Pageant с сохранёнными настройками для используемых COM портов.

            Но так же остаются пока не решённые проблемы.

            3) arduino-cmake не работает с последними версиями Arduino (тестировалось на 1.6.1 и 1.6.3)
            Это можно решить, подправив нужным образом cmake файлы, но пока эта проблема не решена.
            Почему это проблема — в последних версиях Arduino IDE более новый toolkit, и в частности
            некоторые конструкции C++ не работают в Arduino IDE 1.0.6, а в 1.6.1+ работают.

            Так что если кому-то удалось их решить, буду признателен, если поделитесь своим опытом.
              +1
              Уточнения и дополнения:

              Проблема в пункте 2.1 решена этим pull request'ом
              github.com/queezythegreat/arduino-cmake/pull/109

              Поддержка 1.5 заявлена в этом pull request'е
              github.com/queezythegreat/arduino-cmake/pull/104

              И форк оригинального arduino-cmake с поддержкой 1.5
              github.com/blemasle/arduino-cmake
                +1
                Добавил экспериментальную поддержку Arduino IDE 1.6, благодаря готовым pull requests из оригинального проекта, и написал README.txt с деталями по установке и настройке github.com/altexdim/arduino-cmake
                  0
                  Я тут Вас плюсую потихоньку :), но решил таки сказать явно — Спасибо за проделанную работу!
              0
              Пытаюсь запустить пример с github.com/queezythegreat/arduino-cmake, но не получается побороть:

              $ ../configure Project Sources: /Users/romeo/myProjects/arduino/autoclass/arduino-cmake CMake Executable: /Applications/CMake.app/Contents/bin/cmake Building within build directory -- -- Generating blink_original CMake Error at cmake/Platform/Arduino.cmake:830 (message): Invalid Arduino board ID (uno), aborting. Call Stack (most recent call first): cmake/Platform/Arduino.cmake:1071 (get_arduino_flags) cmake/Platform/Arduino.cmake:516 (setup_arduino_target) example/CMakeLists.txt:45 (generate_arduino_firmware)

              У меня Arduino.app 1.6.5.

              В example/CMakeLists.txt

              set(ARDUINO_DEFAULT_BOARD uno)
              
                0
                boards.txt лежит в ${ARDUINO_SDK_PATH}/hardware/arduino/avr/
                  0
                  Потому что в github.com/queezythegreat/arduino-cmake нет поддержки arduino ide 1.5+
                  Пробуйте github.com/altexdim/arduino-cmake
                    0
                    Спасибо, все заработало!!! (MacOS: Arduino 1.6.5 + CLion 1.1 + bundled cmake (3.3.0) + Arduino UNO)

              Only users with full accounts can post comments. Log in, please.