Есть все основания полагать, что в ближайшее время мы сможем наблюдать постепенное вытеснение 8-битных AVR-контроллеров в Arduino-совместимых платформах за счет ARM. Микроконтроллеры постоянно совершенствуются, становятся доступнее по цене, богаче по функциональности, экономичнее по энергопотреблению.
Я уже
рассказывал о
Leaf Maple от
leaflabs.com, и проект, кстати, успешно существует до сих пор. На фоне массы преимуществ остаются недостатки, связанные с
совместимостью шилдов и библиотек. Работа продвигается неспешно, но зато это первая в истории Arduino-совместимая плата на ARM.
В этом году Google выпустил ARM-плату
ADK 2012 - она может быть задействована с помощью одноименного приложения
ADK 2012 для Android. Доступны как исходники самого Android-приложения, так и того, что находится внутри платы, а также схема, разводка и тулчейн. Поддержка в ArduinoIDE ожидается этой осенью, вместе с выходом
Arduino Due - однако все мы помним, как итальянцы умеют выдерживать драматическую паузу ;)
Существует и еще одна популярная ARM-плата -
Netduino. Повторяя форм-фактор Arduino, тем не менее программируется она на Microsoft C#, на базе специального
.NET Micro Framework. Исходные тексты и CAD-файлы - открыты (в том числе и для улучшений). И поскольку экземпляр такой платы недавно попал ко мне в руки, хочу воспользоваться случаем и поделиться опытом.
Внешне это выглядит так:
Как видите - всё честно, можно стыковать с шилдами для Arduino, и даже вилку программирования, столь важную для совместимости SPI-ориентированными шилдами не забыли. На негодование по поводу отсутствия поддержки в ArduinoIDE могу только развести руками и напомнить о паре положительных моментов:
- По отношению к новичку .NET выглядит более-менее дружественно (оценим это ниже, в примерах кода);
- Micro Framework хоть и урезана, но все-таки поддерживает многопоточность, события и пошаговую отладку.
Первым делом надо установить программное окружение, способное компилировать код на языке Microsoft C#, начнем с платформы Windows (для Linux и Mac OS X есть возможность использовать Mono, про это в следующий раз):
- Установите бесплатный Microsoft Visual C# Express 2010
- Скачайте и установите Microsoft .NET Micro Framework v4.1 SDK
(в инсталляторе можно выбрать вариант "Typical")
- Скачайте и установите Netduino SDK v4.1
Установка протекает скучно и, как правило, вопросов не вызывает. Конечно, Express нужен только если не установлена платная версия студии. Можно использовать и версию SDK 4.2, но потребуется 1) дополнительно повозиться с перепрошивкой платы, 2) использовать версию студии не ниже 2010.
После запуска MSVC выбираем в меню File | New Project, и далее в появившемся окне - Micro Framework, затем Netduino Application.
В окне Solution Explorer-а справа дважды щелкам на созданной из дефолтового темплейта Program.cs, это будет приблизительно так:
using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
namespace NetduinoApplication1
{
public class Program
{
public static void Main()
{
// write your code here
}
}
}
Теперь вместо строчки "write your code here" вписываем:
OutputPort led = new OutputPort(Pins.ONBOARD_LED, false);
while (true) {
led.Write(true);
Thread.Sleep(500);
led.Write(false);
Thread.Sleep(500);
}
Самое время опробовать этот "Blink" в работе, однако по умолчанию среда компилирует и загружает результат в эмулятор от Microsoft. Вещь это красивая, но для нас бесполезная - специального эмулятора для Netduino вместе с SDK не устанавливается (хотя, существует как минимум одна попытка его создания,
здесь можно ознакомиться подробнее).
Поэтому, самое время подключить Netduino к компьютеру и установить драйвера из папки Netduino SDK (по умолчанию это Program Files/Secret Labs/Netduino SDK/Drivers). После этого в студии щелкаем правой кнопкой по имени проекта (имя проекта располагается сразу под именем солюшена, т.е. второй строкой), в появившемся окне меняем Transport с "Emulator" на "USB", и, если плата подключена, в строке Device увидим "Netduino_netduino".
Теперь можно вернуться на закладку с программой и проверить, успешно ли она компилируется (F6), после чего загрузить ее в плату (F5). При этом произойдет тоже самое, что обычно происходит в ArduinoIDE - скомпилированная программа будет записана во флеш. Если же надо начать пошаговую отладку - нажимайте F11.
После успешного запуска Blink-а можно взглянуть на плату поподробнее:
- "сердцем" является AT91SAM7X512 - ARM7TDMI с 512К FLASH, 128К RAM, аппаратной поддержкой USB 2.0, Ethernet MAC 10/100 base-T, CAN, I2C, I2S, SPI, USART, JTAG. Все пины 5В-совместимые, в том числе четыре - с повышенной нагрузочной способностью (до 16мА). МК работает на частоте 48 МГц и питается от +3.3В;
- для пользовательских программ доступно 128К FLASH и 60K RAM;
- аналоговых пинов - 6 (как и в Arduino, они могут быть переведены в цифровой режим);
- цифровых пинов - 14;
- кнопка сброса, которая может быть использована и в качестве генератора внешнего события в программе (то есть, не обязательно строго сбрасывает устройство);
- светодиод, индицирующий подачу питания (кстати, белый) и еще один - доступный пользователю (так же, как светодиод L в Arduino);
- разъем внешнего питания 2.1/5.5, плюс в центре, защитный диод от переполюсовки;
- microUSB с предохранителем 0.5 мА;
- специальный erase pad для обновления прошивки.
Разъем Ethernet присутствует только на плате
Netduino Plus, и на ней же есть слот microSD, с которого можно грузиться. И, напротив - существует модификация
Netduino Mini, которая по аналогии с
Freeduino Pro Mini - хорошо подходит для беспаечной макетки, но не содержит даже порта USB.
Несколько слов о нагрузочной способности портов. Привычные для Arduino и ATMEL/AVR 40 мА на пин здесь оказыаются недостижимой роскошью - большинство пинов выдерживают
максимум 8 мА, так что возьмите на заметку значение токоограничительного резистора для светодиода с падением напряжения 2.1В - около 150 Ом. Более подробно про назначения пинов можно прочесть
здесь.
Вернемся к программированию - точнее, оценим наглядность кода. Как уже упоминалось, встроенная кнопка сброса может быть использована в программе:
InputPort button = new InputPort(Pins.ONBOARD_SW1, false, Port.ResistorMode.Disabled);
Обычная кнопка инициализируется аналогичным способом:
InputPort button = new InputPort(Pins.GPIO_PIN_D1, false, Port.ResistorMode.PullUp);
(обратите внимание на последний параметр - это управление встроенными подтягивающими резисторами). Далее чтение состояния производится простым button.Read(), которое возвращает true или false.
Аналоговые входы, позволяющие оцифровывать величину приложенного к ним напряжения, работают в диапазоне 0..+3.3В в дестиразрядном режиме (т.е. возвращают значения от 0 до 1023) :
AnalogInput pot = new AnalogInput(Pins.GPIO_PIN_A0);
и далее, для считывания - pot.Read(). Если диапазон значений 0..1023 не выглядит удобно, можно его масштабировать таким способом: pot.SetRange(0, 100).
Возможность аппаратного ШИМ-а есть на пинах 5, 6, 9, 10, инициализировать его можно так:
PWM led = new PWM(Pins.GPIO_PIN_D5);
Затем передаем potValue - число от 0 до 100 в качестве аргумента, меняя скважность импульсов (или яркость свечения светодиода, соответственно): led.SetDutyCycle((uint) potValue). Или, прямо указываем длительность всего импульса и его - led.SetPulse(duration * 2, duration).
Кстати, с помощью Thread.Sleep можно приостановить выполнение "навсегда": Thread.Sleep(Timeout.Infinite);
Подводя краткие итоги по использованию моего Netduino c Windows XP (запущенном в Oracle VirtualBox, совместимость с которым прямо декларирована в спецификациях платы), отмечу явное подтормаживание во взаимодействии студии с платой. Программы исправно компилировались, но процесс загрузки был инфинитным - такое впечатление, что программа загружалась, но не запускалась (приходится жать на сброс). Также мне не удалось войти в режим пошаговой отладки :( Возможно, это какая-то особенность работы в виртуальной машине или сочетание версий софта и firmware - надеюсь ее победить в ближайшее время.
Для кого Netduino будет полезен? В первую очередь, для приверженцев C# от M$. В основном, конечно, эффектно будет смотреться перенос существующих исходников, работающих с сетевым интерфейсом (насколько я могу судить - изменения там минимальные). Но, с другой стороны, не стоит забывать о том, что
Netduino Plus со встроенной сетевой поддержкой дает пользователю еще меньше свободы - 64К FLASH и 42K RAM.
Для начинающих может пригодиться
Getting Started with Netduino, написанная Крисом Уолкером (Chris Walker) - собственно автором железки и главой сообщества Netduino.