Показаны сообщения с ярлыком arduino. Показать все сообщения
Показаны сообщения с ярлыком arduino. Показать все сообщения

четверг, 10 апреля 2025 г.

Как показывать версию прошивки из Git для PlatformIO

Пример показа версии прошивки из Git для PlatformIO.

В platformio.ini файл добавляем новый дефайн (в моём случае это BUILD_VERSION) а его значением делаем результат команды, которая выдаёт версию из Git

build_flags = !echo -DBUILD_VERSION='\"'$(git describe --always --tags)'\"'

В самом коде используем BUILD_VERSION в нужных местах

void scpiIdentify(SCPI_C commands, SCPI_P parameters, Stream& interface) {
    interface.print(F("Andrei Tataranovich,Power Monitor,,"));
    interface.println(BUILD_VERSION);
}

Пример ответа на команду SCPI *IDN?

*IDN?
Andrei Tataranovich,Power Monitor,,v0.2.0-1-g81a681a

Если суффикс слишком длинный, то его можно сократить добавив в команду git аргумент --abbrev=4

воскресенье, 23 марта 2025 г.

Подсчёт времени на ATmega328P

В прошивке измерителя ёмкости аккумуляторов есть код, который считает время разряда аккумулятора. Этот код я нашёл на одном из форумов посвящённых Arduino тематике и он выглядит довольно простым:

volatile uint8_t runTimeIsr = 0;
uint8_t runTimeLoop;
uint32_t runTime;

// https://gist.github.com/raspberrypisig/8bf856ae9b55bb433d4c11ac9540a881
void timerInit() {
    noInterrupts();
    // Clear registers
    TCCR1A = 0;
    TCCR1B = 0;
    TCNT1 = 0;

    // 1 Hz (16000000/((15624+1)*1024))
    OCR1A = 15624;
    // CTC
    TCCR1B |= (1 << WGM12);
    // Prescaler 1024
    TCCR1B |= (1 << CS12) | (1 << CS10);
    // Output Compare Match A Interrupt Enable
    TIMSK1 |= (1 << OCIE1A);
    interrupts();
}

ISR(TIMER1_COMPA_vect) {
    runTimeIsr += 1;
}

После запуска таймера переменная runTimeIsr считывается в основном цикле и затем обнуляется. Поскольку операция сложения с четырёхбайтной переменной занимает несколько циклов, то используется промежуточная переменная runTimeLoop чтобы избежать конфликта с обработчиком прерывания

void timerDo() {
    runTimeLoop = runTimeIsr;
    runTimeIsr = 0;
    runTime += runTimeLoop;
}

В теории обработчик прерывания должен вызываться каждую секунду если микроконтроллер работает на частоте 16 МГц, но в реальности за 3 часа тестирования время, измеренное микроконтроллером отстало от реального на 35 секунд.

При этом посчитанная ёмкость составила 299 мАч вместо ожидаемых 300 - выглядит как допустимая погрешность, но стало любопытно в чём причина.

пятница, 11 августа 2023 г.

Разное поведение плат Arduino при работе через последовательный порт

Собрал на макетных платах минимальную начинку электронной нагрузки и стал искать готовую программу для компьютера, которая имеет описанный протокол работы с железом. На GitHub нашелся проект Electronic_load_px100 у которого есть описание протокола.

Чтобы отладить работу с протоколом я взял свободную Arduino Leonardo и набросал для нее скетч, который эмулирует поведение электронной нагрузки. После отладки стал переносить код протокола в основной скетч уже моей электронной нагрузки (которая сделана на базе Freeduino 2009, аналога Arduino Duemilanove) и столкнулся с проблемой, что программа на компьютере больше не определяет что подключена электронная нагрузка.

ASRL/dev/ttyUSB0::INSTR
SerialInstrument at ASRL/dev/ttyUSB0::INSTR
probe
<class 'pyvisa.errors.VisaIOError'>
('VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.',)
VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.
error reading bytes
no answer
ko
No instruments found

Был уже поздний вечер и хотелось увидеть реальные показания и потому сразу попробовал поменять местами Freeduino и Arduino Leonardo - не помогло. Разные распиновки для I2C и не инициализируется периферия. Залил скетч эмулятора в обе платы и стал сравнивать их поведение - на Leonardo все просто работает, а на Freeduino - ошибка. Обратил внимание что отличаются названия портов - у Leonardo это /dev/ttyACM0, а у Freeduino это /dev/ttyUSB0, но почему на одном работает, а на втором - нет я не понял и пошел спать.

пятница, 4 августа 2023 г.

Минимальное напряжение AREF для ADC

Нужно было измерить линейность R-2R ЦАП после резистивного делителя (было интересно насколько просядет максимум сигнала и сохранится ли линейность). Исходный сигнал лежит в диапазоне от 0V до почти напряжения питания (в моем случае было 0V - 4.95V), но для моих целей нужно чтобы сигнал был в пять раз меньше (0V - 0.5V).

Измерения делались через АЦП Atmega32U4 (Arduino Leonardo) - у этого микроконтроллера есть несколько вариантов опорного напряжения АЦП:

  • DEFAULT - 5V;
  • INTERNAL - 2.56V;
  • EXTERNAL - то, что подается на пин AREF;

Вначале попробовал вариант с 2.56V, но это в шесть раз больше чем максимум измеряемого сигнала и хотелось лучшей точности. Стал пробовать вариант EXTERNAL - подал на пин AREF 0.5V относительно земли и получил "зашкал" на АЦП - все значения были 1023 даже если на вход подавалось 0V. Вначале грешил на "кривую" ардуину и стал прозванивать пины микроконтроллера и сверяться с даташитом - никаких ошибок не нашёл.

А потом поднял напряжение AREF до 1V и оно заработало! В гугле на первой странице есть описание этой проблемы. Я не поленился и пошёл перечитывать даташит, но ничего про минимальное напряжение AREF в нем не нашёл. Если верить документации Arduino, то на AREF можно подавать от 0V до 5V и либо это целиком зависит от микроконтроллера, либо в документации стоит поправить.

воскресенье, 29 марта 2020 г.

Конфигурация сенсоров в arduino-air-sensors

Сделал обновление для моего проекта arduino-air-sensors - теперь есть возможность настраивать конфигурацию плат с контроллерами esp8266. Последняя ревизия кода поддерживает сенсоры DHT22/AM2302, BME280, SI7021, MH-Z19 и OLED экран на базе контроллера SSD1306.

Прошивку тестировал на платах ESP01 и ESP12S - получились такие конфигурации:
  • ESP01 + SI7021 (SI7021 подключен к GPIO0/GPIO2)
  • ESP01 + BME280 (BME280 подключен к GPIO0/GPIO2)
  • ESP12F + DHT22 + MH-Z19 + SSD1306 (SSD1306 подключен к GPIO4/GPIO5, DHT22 к GPIO14, a MH-Z19 к GPIO15/GPIO13).
В последней конфигурации используется переключение UART0 с GPIO1/GPIO3 на  GPIO15/GPIO13. До этого пробовал использовать библиотеку SoftwareSerial но работает она нестабильно.

Еще заказал на пробу AHT10 - это датчик температуры и влажности для шины I2C.

среда, 29 мая 2019 г.

Колесный робот - часть 1

О соревнованиях RoboRace я впервые узнал из доклада на MLUG (Minsk Linux User Group). Было интересно послушать о проблемах, которые нужно решить чтобы робот не только смог проехать по трассе, но и сделать это быстро. С тех пор прошло несколько лет, но относительно недавно на глаза попалось видео с их YouTube канала и остаток вечера ушел на просмотр записей соревнований вместе с детьми.

В начале этой весны мы сходили семьей на "Бал роботов" и детям очень понравились роботы, которыми можно было управлять или программировать на выполнение простых действий. Наверное так и родилась идея попробовать собрать простого робота, который сможет проехать по линии или хотя бы избегать препятствий, а заодно провести больше времени с детьми.

Для начала заказал на AliExpress полноприводное колесное шасси и шилд для управления моторами. В качестве контроллера предполагалось использовать плату Freeduino 2009, которую я покупал еще 10 лет назад и она до сих пор работает без нареканий.

воскресенье, 25 ноября 2018 г.

WARN src/common.c: unknown chip id! 0xe0042000

Я уже описывал программирование контроллера stm32f103c8t6 в Arduino IDE через stm32duino bootloader. Теперь пробую залить простенький скетч через программатор ST-Link/V2.


пятница, 10 ноября 2017 г.

Использование STM32F103C8T6 в Arduino IDE

Разобрался как использовать плату на базе контроллера STM32F103C8T6 в Arduino. Мой вариант платы выглядит вот так


В wiki сайта stm32duino.com такая плата называется Blue Pill. И эта плата имеет несколько недостатков, которые относительно просто устранить имея под рукой паяльник.

Крепление micro-usb разъема не внушает доверие - я пропаял его. USB D+ пин подтянут к питанию через резистор номиналом 10k, но чтобы устройство определилось на шине USB как Full Speed, нужно подтягивать USB D+ к питанию через резистор номиналом 1,5k. Гуру smd пайки могут заменить на плате резистор R10, но я выбрал вариант с подключением резистора номиналом 1,8k между пинами PA12 (на этот пин выведен USB D+) и 3.3v.

Прошивку можно заливать через USB-UART преобразователь. Для этого нужно переключить преобразователь в режим 3,3V и подключить выводы согласно таблице (в комментарии подсказали, что выводы PA9/PA10 толерантны к 5V)

USB-UARTBlue Pill
GndGnd
Vcc3.3V
RXPA9
TXPA10

В настройках Arduino IDE нужно добавить поддержку SMT32F103 (File / Preferences / Additional Boards Manager URL):

http://dan.drown.org/stm32duino/package_STM32duino_index.json

В Boards Manager (Tools / Board / Boards Manager) установить "SMT32F1xx/GD32F1xx boards by smt32duino" и активировать загрузку прошивки через Serial (Tools / Upload method / Serial). На плате нужно переключить перемычку BOOT0 в High, а BOOT1 в Low. После этого нужно сбросить плату и можно заливать скетчи. Для нормальной работы прошивки BOOT0 и BOOT1 должны быть в состоянии Low.

Но лично я рекомендую прошить STM32duino bootloader и пользоваться загрузкой скетча через USB. Для этого подключаем плату через USB-UART преобразователь, как описано выше. Затем в консоли выполняем команды

$ wget -P /tmp https://github.com/rogerclarkmelbourne/STM32duino-bootloader/raw/master/binaries/generic_boot20_pc13.bin
$ cd ~/.arduino15/packages/stm32duino/tools/stm32tools/2017.11.8/linux/stm32flash
$ ./stm32flash -w /tmp/generic_boot20_pc13.bin -v -g 0x0 /dev/ttyUSB0

Мне еще потребовалось подправить правила UDEV, чтобы ModemManager, libmtp и UDisks не трогали плату:

$ cat /etc/udev/rules.d/45-usbprog.rules
# STM32duino USB bootloader
ATTRS{idProduct}=="1001", ATTRS{idVendor}=="0110", MODE="0660", GROUP="plugdev", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"
ATTRS{idProduct}=="1002", ATTRS{idVendor}=="0110", MODE="0660", GROUP="plugdev", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"
ATTRS{idProduct}=="0003", ATTRS{idVendor}=="1eaf", MODE="0660", GROUP="plugdev" SYMLINK+="maple", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"
ATTRS{idProduct}=="0004", ATTRS{idVendor}=="1eaf", MODE="0660", GROUP="plugdev" SYMLINK+="maple", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_IGNORE}="1"

В начале файла /lib/udev/rules.d/69-libmtp.rules добавить

# STM32duino USB bootloader
ATTR{idVendor}=="1eaf", GOTO="libmtp_rules_end"
ATTR{idVendor}=="0110", GOTO="libmtp_rules_end"

После этого выполнить

$ sudo udevadm control --reload-rules

Мне пришлось перезагрузить компьютер - в моем случае UDisks не отставал от платы без перезагрузки. После этого отключить USB-UART преобразователь, выставить перемычки BOOT0 и BOOT1 в Low и подключить плату к компьютеру через USB. Теперь выбираем в Arduino IDE тип загрузки "STM32duino bootloader" (Tools / Upload method / STM32duino bootloader).

Первую загрузку скетча нужно делать включив режим infinite в загрузчике. Для этого подключается резистор номиналом 10k между 3,3v и PC14. После сброса светодиод на плате начинает постоянно мигать, что означает что загрузчик будет ждать начала загрузки без ограничения по времени. После первой загрузки этот режим можно выключить и дальше пользоваться платой как обычно.

Последовательный порт платы опознается в Linux как /dev/ttyACM0 и его нужно выбрать в "Tools / Port" чтобы работал Serial Monitor.

В Arduino IDE 1.6.8 у меня были ошибки при компиляции и я обновился до Arduino IDE 1.8.5. Для проверки работы платы можно использовать пример Blink (File / Examples / 01.Basics / Blink).

вторник, 31 октября 2017 г.

Тестирование OLED экрана 128x64

Сегодня пришли два монохромных OLED экрана с диагональю 0.96" и разрешением 128x64. Один из экранов собираюсь добавить в мой проект arduino-air-sensors, а второй - в радио-будильник для детей. О последнем я напишу отдельно, когда будет готово управление и индикация.

Модуль экрана использует контроллер SSD1306 и имеет четыре вывода: Gnd, Vcc, SCL, SDA. Подключение к Arduino выглядит так:

OLEDArduino
GndGnd
Vcc5V
SCLA4
SDAA5

Скачал библиотеки Adafruit_GFX и Adafruit_SSD1306. В последней нужно отредактировать файл Adafruit_SSD1306.h чтобы выбрать i2c адрес 0x3C и разрешение 128x64.

#define SSD1306_I2C_ADDRESS   0x3C
#define SSD1306_128_64

После этого залил минимальный скетч для инициализации экрана

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display;

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
}

void loop() {

}

Результат работы скетча:


В примерах библиотеки Adafruit_SSD1306 есть неплохая демка с элементами анимации.

воскресенье, 29 октября 2017 г.

ESP8266 + AM2302 + MH-Z19

Это продолжение поста про слежение за "погодой" в доме. Пришли заказанные в августе модули ESP8266 ESP-12S. Запаял их на платы и приступил к переделке проекта arduino-air-sensors.



На плате есть два резистора по 10k и один резистор-перемычка. Один из резисторов на 10k подтягивает ch_pd к питанию, а второй - gpio15 к земле. Чтобы плата запускалась без проблем еще нужно подтянуть gpio0 и gpio2 к питанию через резисторы номиналом 10k. Во время заливки прошивки нужно подтянуть gpio0 к земле.

Bootloader Modes
Modegpio0gpio2gpio15
UART Download Mode (Programming)010
Flash Startup (Normal)110
SD-Card Boot001

На нижней стороне платы есть место для стабилизатора напряжения на 3,3V и при его отстутствии нужен резистор-перемычка, который соединяет вход и выход питания для стабилизатора.

Но не спешите запаивать туда популярный AMS1117-3.3. Нужен стабилизатор, имеющий порядок выводов "Gnd, Vin, Vout", а у AMS1117 порядок выводов "Gnd, Vout, Vin". Можно попробовать MCP1700 в корпусе SOT-23 или SOT-89, но в этом случае максимальное входное напряжение не должно превышать 6V, а выходной ток - 250mA. Я не пробовал такое подключение, но при работе от USB или 3-х батареек AA должно работать.

Переписал скетч с Ethernet Shield на ESP8266 и добавил в проект схему в формате Eagle и PNG.

Для проверки надежности запустил siege на список урлов, которые поддерживает прошивка. Если за сутки ничего не отвалится и не зависнет, то можно говорить о какой-то надежности. Напомню, что версия на Ethernet Shield зависала случайным образом проработав от нескольких часов до суток и более.

воскресенье, 22 октября 2017 г.

Слежу за погодой в доме: DHT22 + MH-Z19

С наступлением холодов условия в помещении меняются. В качестве показателей "погоды" в доме я решил использовать температуру, относительную влажность и содержание углекислого газа. За показания температуры и влажности отвечает датчик AM2302 (DHT22), а за показания углекислоты - MH-Z19. При покупке на AliExpress оба сенсора обойдутся примерно 22$ - львиную долю составляет стоимость датчика MH-Z19. Химические датчики вроде MG811 я не рассматривал т.к. они довольно быстро деградируют и имеют невысокую точность.

Схема подключения и вид самой платы



К плате подключены два источника питания: USB порт, который питает саму Arduino и Ethernet shield, и AC-DC блок питания, подключенный через модуль питания макетной платы. Последний требуется из-за значительной просадки напряжения при питании MH-Z19 от внутреннего стабилизатора Arduino.

Изначально планировал использовать ESP8266 ESP-12S в качестве контроллера, но из-за проблем с покупкой пока собрал временный вариант на базе Arduino + Ethernet Shield. Показания сенсоров собираются в Munin а доступность платы по сети контролирует Nagios.


На графике хорошо заметны моменты, когда окно в комнате открывалось для проветривания. За время измерений уровень CO2 не превысил 1262 ppm (parts per million). Хотя это и не слишком много, но достаточно чтобы чувствовать себя уставшим. С одной стороны слеклопакеты дают отличную тепло- и звукоизоляцию, но расплата за это - фактически полное отсутствие вентиляции помещения.

Прошивка получилась незамысловатая, но вот ее надежность оставляет желать лучшего. Может проработать больше несколько суток без сбоев, а может зависнуть несколько раз за час. Сначала я грешил на нехватку оперативной памяти, т.к. после добавления всего функционала компилятор стал жаловаться ее нехватку.


Оказалось, что при запуске прошивки все строки копирутся в оперативную память и поэтому ее не хватает. Но если обернуть строку в макрос F(), то такая строка читается из флеш памяти с использованием функций доступа без копирования в оперативную. Использование памяти значительно снизилось


Но проблему зависаний это не решило. Подключил библиотеку MemoryFree - до момента зависания показывает больше килобайта свободной памяти. Сейчас хочу загрузить самый минимальный скетч, который не будет опрашивать сенсоры, а только отдавать OK на health check.

Если плата зависнет, то скорее всего либо проблема в самом Ethernet shield либо в библиотеке Ethernet. В последнем случае можно попробовать проверить стабильность работы заменив общение по сети на работу через Serial.

среда, 13 января 2016 г.

Munin-node на Arduino

Написал реализацию munin-node для Arduino. Для подключения к сети используется Ethernet shield. Сейчас мониторится относительная влажность и температура, но в планах добавить датчик CO2 и переписать на esp8266. В идеале хочется отказаться от Arduino вообще и использовать только ESP8266 с батарейным питанием.


Вначале было два датчика: DHT11 и DHT22, но их показания по части влажности отличались почти на 10%. Чтобы набрать кворум добавил еще 3 датчика DHT22. Теперь два старых датчика показывают похожие значения, а три новых почти не отличаются в показаниях между собой, но не совпадают с двумя старыми примерно на 10%.

Относительная влажность

Температура
Считается, что комфортный уровень влажности для человека это 40-60%. До включения отопления было 40-50%.

пятница, 22 марта 2013 г.

Плата для arduino за два вечера

Вчера закончил первый вариант платы микроконтроллера, которая после небольших доработок поддерживается средой Arduino. Сердцем платы является ATmega1284p - это самый навороченный кристал на ядре AVR в корпусе DIP.

МК имеет 128kb Flash, 16kb SRAM и 4kb EEPROM. Кроме того довольно богатый набор периферии на борту: 2 UART, 3 SPI и один I2C (TWI).

Последним штрихом в создании стало именование платы - после недолгого перебора созвучий с uino решил назвать ее "Tatuino". Хотя к ардуино-совместимым эта плата не относится, но менять название не стал - какая-то ассоциация со зведными войнами и Татуином.

Чтобы плата начала поддерживаться в среде Arduino, нужен файл с описанием платы. Содержимое нужно распаковать в ваш ProjectDir/hardware и перезапустить среду. Для правильной работы нужна версия 1.0.x+.

В процессе прикручивания платы я сделал бэкпорт пакетов arduino 1.0.4 (вроде самый свежий релиз на сегодня) для Debian Squeeze и залил в свой репозитарий. Чтобы установить нужно подключить секцию backports

deb http://www.tataranovich.com/debian squeeze backports

При установке должно стянуть пакеты arduino, arduino-core и librxtx-java.

P.S. Первый и последний раз связываюсь с пайкой на макетке. Печатную плату я бы сделал за два часа, а на соединение мелкими проводочками и их пайку на макетке ушел целый вечер.

понедельник, 18 марта 2013 г.

Моделирование Arduino скетчей во Fritzing

Иногда мне попадаются изображения макетной платы и arduino, на которых видно что, как и с чем соединяется на плате.
Нашлось в сети

Довольно наглядно особенно для новичков или людей, которые еще не научились читать принципиальные схемы.

Вчера случайно наткнулся на упоминание fritzing. В программе масса возможностей, что в теории позволяет создать законченный продукт из прототипа.

Решил попробовать нарисовать схему соединений для одного из своих скетчей.

Мой вариант
Попробовал запустить версию friting, которую скачал с сайта, но не получилось - бинарник в архиве собран под более новый libc6.so, чем тот, что есть в squeeze.

Чтобы все же оценить возможности приложения в Debian Squeeze я сделал бэкпорт версии 0.7.10b - его можно взять в моем репозитарии в секции backports.

пятница, 9 марта 2012 г.

Добавляем поддержку новой платы в Arduino IDE

В процессе переделки своего гигрометра с Arduino на самодельную плату пришлось задуматься о поддержке последней в Arduino IDE. Первый вариант "градусника" был собран на базе Freeduino 2009, который есть аналог Arduino Duemilanove, поэтому проблем не было. После перехода на собственную плату на базе Atmega8a пришлось отказаться от загрузчика и заливать прошивку через программатор. В качестве программатора у меня используется USBAsp v2.0, который был куплен на ebay.


С заливкой простеньких программок вида "помигать светодиодом" проблем не возникло. А вот собрать arduino-проект и залить его оказалось сложнее. Чтобы не писать длинные Makefile'ы я просто решил добавить поддержку своей новой платы в IDE. В этом нет ничего сложного, но есть пара подводных камней, на которые я наткнулся в процессе.

Типичная рекомендация из гугла - добавить описание своей платы и программатора в файлы boards.txt и programmers.txt, поставляемые с Arduino IDE. Мне не понравился такой подход, т.к. при апгрейде IDE мои изменения будут утеряны и придется снова все повторить.

Дальнейшее гугление привело меня на форум, где описывали похожий случай. Оказывается IDE позволяет определить пользовательский конфиг в папке со скетчами. В моем случае это ~/development/arduino, значит конфиги будут лежать в ~/development/arduino/hardware/own/boards.txt и ~/development/arduino/hardware/own/programmers.txt соответственно.

После добавления описаний получилось:
$ cat ~/development/arduino/hardware/own/boards.txt
own.name=Generic ATmega8 board
own.upload.using=usbasp
own.upload.maximum_size=8192

own.build.mcu=atmega8
own.build.f_cpu=16000000L
own.build.core=arduino

Фьюзы были прошиты заранее, когда игрался с простыми примерами. В моем случае lfuse=0xff hfuse=0xd9

$ cat ~/development/arduino/hardware/own/programmers.txt
usbasp.name=USBAsp
usbasp.communication=usb
usbasp.protocol=usbasp

Теперь в IDE появился мой программатор и плата. Запускаю компиляцию и... облом не может инклудить файл WProgram.h. Далее нагуглилось, что WProgram.h - файл принадлежащий платформе "arduino". Это та самая опция own.build.core=arduino, которую я просто скопировал из примера, но не задумывался о ее назначении.

Чтобы не плодить копии сделал символическую ссылку на директорию, поставляемую с arduino ide.
$ mkdir ~/development/arduino/hardware/own/cores
$ ln -s /usr/share/arduino/hardware/arduino/cores/arduino ~/development/arduino/hardware/own/cores/arduino

После этого заработала компиляция и скетч загрузился на плату.