О книге Саймона Монка «Программируем Arduino. Профессиональная работа со скетчами»

в 8:38, , рубрики: arduino, книги, Электроника для начинающих

По сути это комментарий к презентации книги, но получилось довольно многа букв, потому пришлось выделить в отдельную статью.
Книга довольно интересная и может быть рекомендована всем, кто, так сказать, «продолжает» работу с Arduino. Совсем начинающим она довольно бесполезна, а вот для расширения представления о том, как со всем этим хозяйством обращаться, подходит вполне. Но целевая аудитория не настолько разбирается в предмете, чтобы воспринять критично некоторые утверждения автора и расшифровать многочисленные ляпы переводчика в сговоре с редакторами. Причем автору промахи простительнее, так как он явно программист, а не электронщик, и не может разбираться в предмете досконально. А вот редакторы обязаны были такие места прокомментировать.
Все написанное далее не имеет цели как-то задеть автора и издательство, которые сделали хорошее дело. Я пишу это с надеждой облегчить жизнь читателю, которому посчастливится наткнуться на эти мои измышлизмы. Книга, повторяю, полезная и содержательная, и отдельные промахи не меняют этого моего отношения.

В перечислении далее страницы указываются по официальной электронной версии.

О хорошем

Сначала, как принято, о хорошем.

1. «Использование переменных типа int для хранения номеров контактов приводит к напрасному расходованию памяти» (стр. 63) — более, чем своевременное замечание. Далее в книге несколько раз напоминается, что номера контактов должны вообще-то вводиться 8-битовыми константами. Жаль только, что эта мысль проводится не очень последовательно, потому что широко распространенное стремление обозначать переменными типа int номера выводов — клиника, которая не оправдывается никакой удобочитаемостью текста (и чего там удобочитаемого-то?).
2. «Но в действительности температура в виде вещественного числа нужна только тогда, когда требуется отобразить ее на экране. Другие операции с температурой, такие как сравнение или усреднение при нескольких попытках чтения, вполне можно выполнять с непреобразованным значением типа int, и при этом они будут выполняться значительно быстрее» (стр. 91). Без комментариев.
3. «Быстрый ввод/вывод» (стр. 94) — очень правильный раздел, в нем идет речь об преодолении основного недостатка платформы Arduino: многотонных наслоений нагроможденных друг на друга библиотек.
4. Упоминание о том, что для снижения потребления нужно удалить светодиод по питанию (стр. 110). Почему-то в разговоре о снижении энергопотребления об этом забывают упомянуть абсолютно все.
5. Весьма содержательная и полезная для любителей глава 13 «Цифровая обработка сигналов».

О плохом

Теперь о досадных ошибках. Я их поделил на грубые ляпы (автора или переводчиков/редакторов) и мелкие придирки с моей стороны.

Грубые ляпы:

1. «Контакты в следующей группе подписаны Analog In (аналоговые входы) с номерами от 0 до 5. … Несмотря на то что они обозначены как аналоговые входы, их можно использовать и как цифровые входы или выходы. Но по умолчанию они действуют как аналоговые входы» (стр. 24).
Нет, не так. Все выводы портов AVR по умолчанию работают, как цифровые входы без подключенного подтягивающего резистора. И аналоговые выводы А1-А5 не исключение – с чего бы? Это обычные выводы обычных портов (Arduino-номера 14-19), которые среди прочего могут работать, как входы АЦП. И это качество они приобретают только тогда, когда вы обращаетесь к analogRead, не ранее.

2. Табл 5.1. «Потребление электроэнергии платами Arduino» (стр. 105) ввела меня в настоящий ступор:
image
Извините, а чего там в Mini есть такого, что должно потреблять лишних 20 мА от внешнего источника? Полез смотреть в оф. схему: вроде ничего. Стабилизатор MIC5205, судя по его описанию потребляет что-то 150 мкА. Не поленился проверить живьем: включил Mini Pro в источник 5 В (напрямую) и в 12 В (через RAW). Как и следовало ожидать, совершенно одинаковое потребление: около 20 мА. Так до сих пор и не могу понять, откуда автор эти данные надыбал — не из головы же выдумал?

3. «Снижение рабочей частоты» (стр. 108). Заблуждение, что снижение рабочей частоты будто бы уменьшает энергопотребление, широко распространено даже в профессиональной среде. На самом деле оно уменьшает только потребление тока, а потребление энергии в расчете на каждый такт заметно увеличивает (так как график рис. 5.3 не прямой, а изогнутый, причем, по словам Монка, несуразный светодиод по питанию тут был отключен.):
image
В двух словах: пусть напряжение питания = 3 В. Процедура в 16 тактов при 16 МГц займет 1 мкс, то есть энергии при этом потребится (ток 8 мА, табл 5.2) 3х8х10-3х10-6 = 24 нДж. При 1 МГц та же процедура займет 16 мкс, и энергии при этом потребится (ток 2,6 мА, табл 5.2) 3х2,6х10-3х16х10-6 = 124,8 нДж. И если в промежутках между этими процедурами вы вводите AVR в состояние энергосбережения, то потеряете в энергии в пять раз. Потому выигрыш будет только, если использовать снижение тактовой частоты, как отдельный прием, больше ничего не делая. А тогда, когда основное время контроллер простаивает, куда больший эффект даст применение sleep, и в этом случае частоту стоит делать как можно выше.

4. «Операции чтения/записи с памятью ЭСППЗУ выполняются очень медленно — около 3 мс» (стр. 142).
Типичный признак непонимания, как работает EEPROM. Запись в нее действительно длится 3,3 мс. Но чтение совсем нет: 1 такт для первого байта, плюс по 4 такта задержки перед чтением каждого последующего, если читать подряд. То есть максимум 5 тактов — 0,3125 микросекунды в случае Arduino 16 МГц, в 10 000 раз быстрее, чем утверждает Монк. А вот про то, чему в каждом даташите по AVR посвящен стандартный раздел «Preventing EEPROM Corruption», в главе про EEPROM почему-то ни слова.

Мелкие придирки

Стр. 50. «и сохранив в папку Libraries, находящуюся в папке Arduino (в папке Documents (Документы))» — вы способны понять из этой фразы, в какой папке какая расположена? Я нет.
Далее там же: «Чтобы среда разработки Arduino IDE обнаружила вновь установленную библиотеку, ее нужно перезапустить» — кого ее? Библиотеку?
Стр. 54. «Аналогичный справочник с описанием команд на русском языке можно найти по адресу arduino.ru/Reference. — Примеч. пер». Спасибо, дарагой, но при этом нужно упомянуть, что arduino.ru/Reference не обновлялось с неизвестно какого времени, а перевод там местами сделан с грубыми ошибками. Иначе твой неискушенный читатель будет поставлен в тупик, например, не найдя по указанному адресу неоднократно упоминаемой в книге константы INPUT_PULLUP.
Стр. 57. «…программы можно выгружать в микросхемы памяти на плате Arduino, а затем переносить их на свои платы» — да? И где же на плате Arduino эти самые «микросхемы памяти»?
Стр. 59. «…и последовательными интерфейсами трех типов, поддерживаемыми микроконтроллером: УСАПП, ППИ и ДПИ». Хотел без комментариев, но не удержался. Что характерно, глава 7 называется «Интерфейс I2C» и речь в ней идет про TWI, а глава 9 называется «Взаимодействие с устройствами SPI». Так что ни, извините за выражение, ППИ, ни ДПИ вы больше в книге не встретите и можете до скончания века гадать над расшифровкой этих сокращений. Зато УАПП и УСАПП вовсю эксплуатируются в главе 10 «Программирование последовательного интерфейса». Ну да, а вулкан, который уничтожит Соединенные Штаты, проснется на территории Желтокаменного национального парка.
Стр. 78. «Попробуйте нажимать кнопку энергичнее, это должно помочь получить четкий переход между состояниями без эффекта дребезга» — совершенно непростительная рекомендация для книги, претендующей на некий «профессиональный» подход. И тоже очень распространенное заблуждение для тех, кто своими руками кнопки включает редко. Единственная разновидность кнопок, мало подверженная дребезгу — из токопроводящей резины (телефонные тастатуры, например). Все остальные кнопки, выключатели, переключатели и т.д. дребезжат абсолютно вне зависимости от того, как на них нажимают, и требуют специальных мер защиты от дребезга.
Стр. 84. Спасибо за наводку на библиотеку TimerOne, но из текста и примера понять, как с ней работать, невозможно. И, кстати, интересный вопрос, точнее, сразу пучок вопросов: почему картинки для разных пинов на рис. 3.3 сдвинуты на восьмую часть периода? Это так само получается? За счет чего, и как этим можно управлять? и т.д.
image
Стр. 103. «Следующий скетч увеличивает частоту АЦП со 128 кГц до 1 МГц»
Наш уважаемый Монк кое-что забыл упомянуть. А именно, во всех даташитах всех AVR имеется следующий абзац:

By default, the successive approximation circuitry requires an input clock frequency between 50kHz and 200kHz to get maximum resolution. If a lower resolution than 10 bits is needed, the input clock frequency to the ADC can be higher than 200kHz to get a higher sample rate.

На самом деле в АЦП источников ошибок и дребезга и без того хватает, чтобы их еще увеличивать искусственно. А задач, которые требуют быстрого АЦП-преобразования, для 8-битовых контроллеров просто не возникает (не обрабатывать же на них звук, в самом деле). Если нужно точная/быстрая АЦП-конверсия, то проще поставить внешний модуль и не маяться дурью.
Стр. 142. «Флеш-память в Arduino гарантирует сохранность данных только для 100 000 циклов записи» – на самом деле до 10 000.
Стр. 196. Рис. 10.4. – не соответствует тексту и скетчам, потому что один из изображенных Uno использует штатный Serial, а не его программную имитацию, о которой идет речь в этом разделе.

Кажется, все. Может, чего-то пропустил, не знаю.

Автор: YRevich

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js