Новогодние приколы от проекта Arduino Mega Server

image

Разработка проекта Arduino Mega Server идёт полным ходом и в процессе работы возникают неожиданные препятствия, которые приходится героически преодолевать. О некоторых из них вам сегодня расскажу и, возможно, это сэкономит вам немного вашего времени и нервов.

Прикол первый: и на старуху бывает проруха или зри в корень!


Готовлю к выходу 0.14 версию системы для Arduino Due и адаптирую эту версию для работы с Power Monitor. Для тех, кто не знает, Power Monitor это программно-аппаратный комплекс контроля сетевого электропитания, который позволяет контролировать уровень сетевого напряжения и потребляемой мощности по 14 каналам и имеет встроенный контроль частоты сетевого тока и даже сетевой осциллограф, которой прямо на веб-страничке показывает форму тока и напряжения в реальном времени.

image

Схему собрал, всё проверил, запускаю — не работает. Ну что же — бывает, дело привычное. Начинаю проверять код — всё в порядке, проверяю железо — всё окей, проверяю соединения — тоже всё в порядке. В глубокой задумчивости сажусь в кресло и начинаю соображать, где может быть ошибка. После долгих размышлений прихожу к выводу, что всё сделано правильно. Почему же не работает? Чудес не бывает, поэтому проверяю всё во второй раз.
image

Код, железо, соединения. Всё, вроде, правильно. Опять много думаю. Перелопачиваю код ещё раз, с пристрастием — результат — ноль. Поскольку все поликлинические методы исчерпаны, перевожу пациента в хирургическое отделение и достаю тестер и паяльник. Пациент опасливо косится на меня, но дара речи он лишён и не может мне ничего подсказать. После недолгих манипуляций выясняется, что питание на Power Monitor не подаётся вообще! Как же так? Ясно видны проводники подачи питания, а питания нет!

И тут до меня доходит, что, оказывается, бывают макетные платы такие,
image
которые мне обычно попадались и к которым я привык и считал их единственно возможными, а бывают и вот такие (найдите десять отличий, как говорится)
image
и именно такая плата мне попалась в этот раз. Это кажется пустяком и само-собой разумеющимся только когда вы об этом уже знаете, а когда не знаете, то можете себе всю голову сломать, пока сообразите, почему не работает ваше устройство.

Тут ещё присутствует психологический момент — если вы считаете шину целой, то не обращаете внимания на пропуск в маркировке (мало ли что там вздумалось нарисовать изготовителю). Вот такие приколы иногда случаются в разработке — зри, как говорится, в корень!

Прикол второй: привет от нашей любимой команды arduino.cc


Как я уже сказал, разработка идёт полным ходом и AMS стал уже довольно объёмным проектом и, естественно, в проекте невозможно обойтись без очень полезных директив условной компиляции. Это мощный инструмент управления работой кода, тем более, что Arduino Mega Server имеет модульную структуру и директивами условной компиляции включаются и отключаются различные модули системы.

#define
#ifdef
#endif


Это сделано для того, чтобы можно было отключить ненужные вам модули и сэкономить драгоценную память микроконтроллера. И я ещё не встречался в своей практике (на разных языках программирования), чтобы директивы условной компиляции не работали или «глючили». Это нонсенс! До последнего времени я считал, что это невозможно, но (весёлые) разработчики среды программирования Arduino не дают нам скучать, но обо всём по порядку.

Итак, пытаемся отключить ненужный нам модуль, в данном случае, модуль работы с MajorDoMo (и до сих пор это работало как и положено).

//#define MAJORDOMO_FEATURE


По идее, всё, что находится между директивами

#ifdef MAJORDOMO_FEATURE

...

#endif


должно быть выключено из компиляции. Но не тут то было!


#ifdef MAJORDOMO_FEATURE

char majorMegaObject[] = "ncMega01";
char majorCommObject[] = "comm_mega01";

// MajorDoMo net settings
byte MAJOR_IP[] = {192, 168, 2, 8};
int MAJOR_PORT = 80;

// <-------------------------------------- ВОТ ЗДЕСЬ ЕЩЁ ОТКЛЮЧАЕТСЯ КОМПИЛЯЦИЯ

// EthernetClient object
EthernetClient mclient;

// <-------------------------------------- А ВОТ ЗДЕСЬ УЖЕ НЕТ! ВСЁ, ЧТО НИЖЕ КОМПИЛИРУЕТСЯ, НЕСМОТРЯ НА ЗАПРЕТ!

void majordomoInit() {
  initStart("MajorDoMo");
  timeStamp();
  Serial.print("Connect to MajorDoMo... ");
  if (mclient.connect(MAJOR_IP, MAJOR_PORT)) {
    Serial.println("OK");
    //mclient.println("GET /search?q=arduino HTTP/1.0");
    mclient.println();
  } else {
      Serial.println("failed");
    }
  delay(200);
  mclient.stop();
  modulMajor = MODUL_ENABLE;
  initDone();
}

…


Как вы можете заметить, условная компиляция не просто не работает (это плохо, но еще куда не шло), а работает «как Бог на душу положит», то есть где хочет — компилирует, где не хочет — не компилирует! И это совсем плохо, потому, что такие непредсказуемые «глюки» очень трудно отловить и они могут приводить к совершенно непредсказуемым последствиям.

Кстати, в данной статье идёт речь о Arduino IDE версии 1.6.5. Но, судя по всему, версия среды разработки не имеет особого значения, все они достаточно глючны. О чём я узнал только в последнее время, до тех пор, пока я компилировал маленькие скетчи и небольшие проекты, всё было в порядке.

Прикол третий: опять наша любимая arduino.cc и совершенно фантастический баг


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

Объявляем переменную:

long errorsHttpSend = 0;


В цикле печатаем:

Serial.println(errorsHttpSend);


Результат:

808333615


Переименовываем, добавляя 2:

long errorsHttpSend2 = 0;


В цикле печатаем:

Serial.println(errorsHttpSend2);


Результат:

0 


Встаёт вопрос как вообще можно вести разработку в такой системе? Тут ещё можно упомянуть совершенно неадекватную работу различных версий Arduino IDE. Код, который прекрасно работает в одной версии среды, отказывается компилироваться в другой. Одна среда компилирует проект, другая «не видит» одну из библиотек. После переустановки среды разработки перестаёт компилировать проект та же версия 1.6.5 (которая до переустановки компилировала).

Так что имейте в виду, с чем вам придётся столкнуться, работая с Arduino. Здесь есть только один положительный момент: с такой системой вы волей-неволей станете гуру программирования и мастером системного администрирования.

Позволю себе высказать новогоднее пожелание для команды разработчиков Arduino: дорогие вы наши! Поздравляем вас с Новым Годом и желаем в новом году выпустить нормально работающую среду разработки!

С Новым Годом!


Друзья! Поздравляю вас с наступающим 2016 годом и надеюсь, что информация из этой статьи поможет вам сэкономить немного времени и нервов в новом году! И удачных разработок!

P.S.

Несмотря на все происки врагов, в ближайшее время всё-таки выйдет новая версия Arduino Mega Server под номером 0.14 для Arduino Mega и Arduino Due со множеством новых возможностей.

© Geektimes