19.09.2012

Netduino

Есть все основания полагать, что в ближайшее время мы сможем наблюдать постепенное вытеснение 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 могу только развести руками и напомнить о паре положительных моментов:
  1. По отношению к новичку .NET выглядит более-менее дружественно (оценим это ниже, в примерах кода);
  2. Micro Framework хоть и урезана, но все-таки поддерживает многопоточность, события и пошаговую отладку.
Первым делом надо установить программное окружение, способное компилировать код на языке Microsoft C#, начнем с платформы Windows (для Linux и Mac OS X есть возможность использовать Mono, про это в следующий раз):
  1. Установите бесплатный Microsoft Visual C# Express 2010 
  2. Скачайте и установите Microsoft .NET Micro Framework v4.1 SDK 
  3. (в инсталляторе можно выбрать вариант "Typical")  
  4. Скачайте и установите 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.

3 комментария:

  1. из пол мегабайа флэша можно только 100 кило использовать, на нахер это C# нужен на М.К.???
    да....
    есть же CoIDE для армов, там компилятор GCC, есть репозитарий да и IDE обновляется всё врмя. Смотрите в сторону CooCox...
    А .нет - для детей...

    ОтветитьУдалить
  2. Да и цена у арм-атмела не хилая. 8битники ни куда не денутся, пик и авр долго будут ещё жить, учитываю косячные(на easyelectronics.ru ищите) стм8

    ОтветитьУдалить
  3. о_0 тут надо сделать поправочку. В "любительском arduino-сегменте" еще не скоро. а вот во всех остальных смыслах\направлениях - уже вымерли..

    ОтветитьУдалить