Показаны сообщения с ярлыком ARM. Показать все сообщения
Показаны сообщения с ярлыком ARM. Показать все сообщения

12.11.2012

Апгрейдим Netduino

Перед тем, как пройти процедуру апгрейда прошивки в Netduino, несколько слов о структуре firmware, надо которым мы собираемся надругаться.

Оно состоит из двух фрагментов:
  1. TinyBooter - бутлоадер;
  2. TinyCLR - .NET Micro Framework runtime.
Бутлоадер запускается сразу после включения питания, грузит TinyCLR, который, в свою очередь - запускает ваше приложение из flash-памяти.

Итак, сначала надо найти интересующую прошивку, например в wiki. Важно скачать именно тот вариант, который относится к вашему типу платы (т.е. прошивки для Netduino и Netduino Plus отличаются).

Если требуется апдейтить только TinyCLR (еще это называют minor-апдейтом, то есть незначительными исправлениями), используют утилиту MFDeploy (ее можно найти через меню "Пуск": .Net Micro Framework SDK | Tools). После запуска установите в боке Device USB и Netduino_netduino и нажмите Ping:



Как видите, если устройство подключено, оно должно откликнуться и хоть что-то сообщить. Чтобы получить более подробную информацию о выбранном устройстве, используйте команду Device Capabilities (Ctrl+Shift+C), там можно разглядеть текущую прошитую версию TinyCLR:



Если Netduino все-таки не отзывается, нажмите расположенную на нем кнопку сброса, и, не отпуская, переподключите плату к шине (отключите, а потом снова воткните в USB - после 20 секунд плата войдет в специальный failsafe-режим), при этом на Ping она будет отвечать "TinyBoot".

Теперь в боксе Image File надо выбрать файлы для прошивания. Обычно их два - ER_CONFIG и ER_FLASH. Можете добавить сразу оба, после этого можно нажать Deploy.



Дождитесь завершения процесса и еще раз нажмите Ctrl+Shift+C -  информация с номерами прошивок должна измениться.

Для более значимых апгрейдов (например, с 4.1 до 4.2) требуется замена TinyBooter. В этом случае надо прибегнуть к фирменной атмеловской утилите "SAM-BA CDC" (можно скачать бесплатно с сайта ATMEL, правда придется заполнить несложную регистрационную форму), но для начала надо полностью похерить содержимое флеш-памяти:
Подключите Netduino к источнику питания, затем соедините Erase Pad (небольшая токопроводящая площадочка рядом с пином D0) с питанием +3.3В на более чем полсекунды. Готово! Если и было там какое-то firmware, то теперь оно стерто.

Переподключите плату - теперь вы увидите в списке устройств неизвестное устройство  c VID=03EB и PID=6124. Если указать мастеру установки поискать драйвера в папке инсталлированной атмеловской утилиты, должен установиться виртуальный последовательный порт (запомните его номер!):



Самое время запустить SAM-BA-CDC Tool, выбрать номер свежеустановленного последовательного порта, тип платы "at91sam7x512-ek" и нажать Connect:



Теперь последовательно проделаем следующие действия:
  1. Выберите в выпадающем списке Scripts "Boot from Flash (GPNVM2)", затем нажмите кнопку Execute;
  2. Выберите там же "Enable Flash Access", затем опять нажмите Execute;
  3. Выберите файл для зашивания (кнопка рядом с полем Send File Name), выберите файл TinyBooterDecompressor.bin;
  4. Нажмите Send File и подождите завершения (всего пара секунд);
  5. В окне с вопросом о залочивании областей (lock regions) откажитесь - ответьте No;
  6. По желанию, можно проверить записанный файл - поправьте размер файла в поле size (receivedfile) путем добавления 2-3 нулей в конце и нажмите "Compare sent file with memory". Должно появиться "match".
После этого можно закрыть  SAM-BA-CDC Tool и переподключить Netduino к источнику питания - новый TinyBooter будет ожидать загрузки нового TinyCLR, как это делать - см. выше.

От себя добавлю - после обновления до .Net Micro Framework 4.2 все мои нарекания по работе с Visual Studio исчезли. Только не забудьте после апгрейда выбрать в свойствах проекта .Net целевую версию 4.2, иначе Deploy вашего приложения из студии будет завершаться неуспехом:



Ну и вот ради чего все это было проделано ;) Пошаговая отладка великолепно работает в виртуальной машине:




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.

02.07.2012

ADK 2012

Недавно в официальном блоге Arduino появилось сообщение о том, что на очередной конференции Google IO была представлена новая плата ADK 2012, уже базирующаяся на Arduino Due:


Официальный выход собственно Arduino Due запланирован на этот год, вместе с новой  ArduinoIDE, которая будет способна генерировать код под ARM. Пока что можно полюбоваться на фото ограниченного выпуска для разработчиков:

Фото в этом посте лицензированы под CC BY-NC-SA.