Простота Arduino во многом обусловлена тем, что практически все действия в программе осуществляются в ее главном цикле. Но такая простота оборачивается недостаточной надежностью работы — «правильно» запрограммированный контроллер работает почти исключительно через прерывания. Например, неверно заставлять программу отслеживать нажатие кнопки в главном цикле и убирать дребезг путем простых временных задержек, как это делается в распространенном примере для начинающих[54]
. Когда контроллер основное время занят последовательным отслеживанием происходящих событий, он запросто может потерять какое-то из них. Так поступали в семидесятые годы, когда контроллеры были намного примитивнее сегодняшних. В «правильной» программе состояние кнопки отслеживается по внешнему прерыванию, а дребезг убирается его запретом и последующим разрешением по прерыванию таймера. Только так эти действия не могут помешать никаким другим процедурам в программе.В Arduino просто эксплуатируется факт, что современные микроконтроллеры работают очень быстро, но, по мере усложнения программы, вы довольно скоро упретесь в порог этого быстродействия и не будете понимать, как из этой ситуации вывернуться. На
Впечатляют и размеры программ, получающихся после компилирования скетчей в среде Arduino IDE. Программа метеостанции с ЖК-дисплеем займет почти 20 килобайт — около 10 тыс. AVR-команд. Это непредставимо большая величина для таких устройств, и неудивительно, что при выполнении времязависимых операций они будут тормозить, — именно по этой причине при сборе данных, поступающих из последовательного порта, нам приходится с помощью задержек ожидать, пока они не соберутся в буфере. А если нам понадобится принять или передать пару десятков килобайт или мегабайт данных, что много больше объема буфера? Как угадать задержки так, чтобы гарантированно ничего не потерять?
Программа, состоящая из всего двух функций:
Хорошей иллюстрацией к расточительности языка служит также пример пустой программы из двух строк, которую мы употребляли в качестве заглушки при программировании Xbee-модуля. Ее размер после компиляции составит целых 466 байтов — с помощью ассемблера в такой объем можно запросто втиснуть небольшую программку ориентирования по звездам для орбитального аппарата (реальный случай с одним программистом 60-х годов прошлого века из НАСА, который упаковал такую программу в остававшиеся свободными 256 байт памяти бортовой ЭВМ спутника).
Нет особых проблем применять к разработке программ для Arduino все возможности МК AVR, включая и прерывания, но при этом среда Arduino потеряет свою простоту и идеальную приспособленность к нуждам любителей. Придется ковыряться в англоязычных «даташитах», изучать регистры, прерывания и таймеры, вникать в тонкости программирования той или иной процедуры, и тогда вы быстро придете к выводу, что Arduino IDE вместе с языком Proccesing только мешают — придется переходить на обычный С или на ассемблер. К этому выводу в конце концов приходят все, кто старается двигаться дальше. Но не унывайте: Arduino дает отличный старт!
Приложения
Резисторы
Далее приведены множители для номиналов резисторов и конденсаторов (см.
Резисторы с допуском 1 % (ряд Е96) имеют следующие множители для номиналов:
Стандартные обозначения...
... размеры и характеристики некоторых гальванических элементов