RoboCraft
Здесь упоминалось, что Arduino/CraftDuino/Freeduino можно программировать не только на Wiring-е, но и на других языках программирования.
Попробуем разобраться как это можно сделать — написать программу на обычном С/C++.
Для этого воспользуемся компилятором WinAVR.
WinAVR — это интегрированная среда разработки; она включает мощные компиляторы Си и ассемблера, программатор AVRDUDE, отладчик, симулятор и множество других вспомогательных программ и утилит.
Скачать WinAVR можно на странице проекта:
http://sourceforge.net/projects/winavr/
однако, в комплекте Arduino IDE уже идёт WinAVR (\hardware\tools\avr\), поэтому можно воспользоваться им.
Для работы с исходными текстами подойдёт компонент WinAVR – Programmers Notepad (\hardware\tools\avr\pn\pn.exe) — удобный редактор программиста и интегрированная среда разработки (IDE):
Для более подробного знакомства со средой разработки WinAVR рекомендую статьи
Среда разработки WinAVR.
Makefile и компиляция программы.
Возьмём пример из второй статьи и адаптируем его для Arduino:
Создаём файл avrblink.c
— адаптировали, изменив частоту на 16МГц и время задержки 😉 Однако, как видно в исходнике – сейчас МК мигает всем портом D! Т.е., если посмотреть Arduino Pin Mapping – цифровыми выходами, начиная с digital pin 0 и заканчивая digital pin 7.
В WinAVR исходный текст программы компилируется при помощи утилиты make.exe, которая находится в папке WinAVR\utils\bin. Make.exe контролирует генерацию исполняемых файлов из исходного кода программы. Для управления работой этой утилиты используют make-файлы. Make-файл сообщает компилятору, какие команды запускать, какие файлы компилировать и линковать, какой выходной код генерировать и т. д.
Копируем в директорию с нашим .c-файлом Makefile–образец (\hardware\tools\avr\sample\ Makefile)
и вносим требуемые изменения:
указываем тип микроконтроллера
Далее указываем частоту
название нашего проекта
Уровень оптимизации s – можно заменить на 0, чтобы отключить оптимизацию
Тип и порт программатора
Сохраняем изменения и пробуем скомпилировать (Tools – Make All)
Но, получаем сообщение об ошибке, т.к. Programmers Notepad не знает где искать компилятор и утилиту make.exe
Прописываем пути к нужным директориям:
c:\utils\arduino-0016\hardware\tools\avr\utils\bin\
c:\utils\arduino-0016\hardware\tools\avr\bin\
c:\utils\arduino-0016\hardware\tools\avr\avr\bin\
в переменную среды PATH, перезагружаемся и пробуем снова
В ОС Windows это делается через Мой Компьютер — Свойства — Дополнительно — Переменные среды. Выбираете PATH, щёлкаете изменить и через точку с запятой добавляете нужные пути.
Получилось!
А в директории рядом с нашим avrblink.c и Makefile появилось много интересного:
— .dep/avrblink.o.d
— avrblink.eep
— avrblink.elf
— avrblink.hex
— avrblink.lss
— avrblink.lst
— avrblink.map
— avrblink.o
— avrblink.sym
Самый важный из этих файлов — это avrblink.hex. В нем хранится шестнадцатиричный код для загрузки в память программ (Flash ROM) микроконтроллера.
А avrblink.eep — хранит шестнадцатиричный код для загрузки в энергонезависимую память данных (EEPROM).
Попробуем загрузить наш .hex в наш proteus-кий простейший симулятор ардуины
Мигает 🙂
Однако, нужно привести нашу программу ближе к стандартному Blink-у и помигать одним встроенным светодиодом на digital pin13. Как видим по схеме или по Arduino Pin Mapping – это пятая линия порта B.
Читаем крайне познавательную статью
AVR GCC :: Управление портами микроконтроллера AVR.
и вносим нужные изменения в нашу программу:
UPD — обновлённая версия для новых версий компилятора:
Компилируем, загружаем в протеус – работает!
Сравним размеры файлов 🙂
Ардуиновский Blink.hex весит 2031 байт
Наш hex при оптимизации по размеру (OPT = s) по размеру весит 410 байт
а с отключённой оптимизацией (OPT = 0) все 3184 байта!
Теперь осталось разобраться как же в реальности прошить наш .hex в ардуину 🙂
Например, можно воспользоваться каким-нибудь программатором 🙂
Однако, у нас ведь есть загрузчик и поэтому можем просто воспользоваться родным приёмом ардуины – самопрограммированием МК.
В любом случае, нам понадобится воспользоваться утилитой AVRDUDE, которая идёт в составе WinAVR и находится внутри Arduino IDE (\hardware\tools\avr\)
AVRDUDE позволяет загружать программы и данные в память микроконтроллера, а также считывать их оттуда. AVRDUDE использует SPI-интерфейс. Существуют версии для Windows и Linux. Первоначальный код был написан Брайеном Дином (Brian S. Dean) и имел название avrprog.
При использвании ардуиновского «параллельного программатора» или популярных для LPT – пяти проводков – нужная дополнительная настройка:
В Windows 2000 и Windows XP запрещена прямая работа с параллельным (LPT) портом, поэтому для нормальной работы AVRDUDE необходимо установить драйвер giveio.sys. Для установки этого драйвера зайдите в папку WinAVR\bin и запустите файл install_giveio.bat (удалить драйвер из системы можно, запустив файл remove_giveio.bat).
В Windows 98 никаких специальных настроек не требуется.
AVRDUDE — консольная программа и для её работы ей нужно передавать кучу параметров, но для упрощения задачи, уже есть готовая программа — ArduinoUpload, которая написана на C# и которая как раз и делает – то что нам нужно — загружает в ардуину .hex-файл через утилиту avrdude.
остаётся выбрать наш .hex-файл, COM-порт к которому подключена ардуина и указать путь до avrdude (\hardware\tools\avr\bin\avrdude.exe)
Как видим, всё что делает программа — это формирует команду вида:
разберёмся, что значат все эти параметры:
-F: Игнорировать проверку соединения с МК. Разумеется, такая проверка желательна – поэтому использование этого флага стоит избегать.
-v: так называемый «многословный» (verbose) вывод – полезно для контроля и отладки.
: Указываем тип МК для программирования. Например, если бы был ATtiny2313, здесь нужно было бы написать: attiny2313. Мы же указываем нашу атмегу 🙂
m8 ATmega8
m16 ATmega16
m32 ATmega32
: Указываем тип программатора. Если используется STK500 — пишем stk500 и т.д.
: указывается коммуникационный порт, к которому подключён программатор. Это может быть COM1 или LPT1 или даже USB.
-b : Указывается скорость для работы с последовательным портом – нужно для программаторов, работающих через COM-порт – таких как STK500.
-D: Отключаем очистку МК перед прошивкой.
-U :r|w|v: [:format]: Самая важная команда – выполнение прошивки.
— тип памяти МК — flash или eeprom (или hfuse, lfuse, efuse для конфигурации фьюзов МК).
r|w|v – флаги определяют, что мы хотим сделать:
r (read — считать)
w (write — записать)
v (verify — проверить).
файл для записи или чтения.
[:format] флаг формата данных. Здесь всегда используется формат «Intel Hex», поэтому стоит i
Таким образом, командой -Uflash:w:»file.hex»:I – мы записываем файл file.hex в FLASH-память МК. Если нам потребуется считать eeprom-память в файл «eedump.hex» – мы напишем -Ueeprom:r:eedump.hex:i
Дополнительные параметры AVRDUDE:
-C : указываем путь до конфигурационного файла avrdude
-e: очистка МК
-n: ничего не записывать в МК. Защита, чтобы не отправить в МК ничего лишнего 🙂
-u: указывает, что хотим модифицировать фьюзы МК.
-t: терминальный режим
-q: в противоположность -v – это «тихий» режим – меньше слов – больше дела 🙂
список параметров с их кратким описанием можно получить просто запустив avrdude без параметров или с параметром -?
А более подробную документацию можно найти здесь(\hardware\tools\avr\doc\avrdude\avrdude.pdf).
Ну что же – пробуем прошить. Жму Reset на плате и сразу кнопку “Program”
Ошибка!
AVRDUDE пишет, что не находит своего конфигурационного файла 🙁
Хм… попробуем ему помочь – дописываем в конец строчку:
И снова перезагружаю плату и жму “Program”.
Ура! Получилось! Пойду допишу об этом нюансе на сайт ардуины 😉
Вот так – научились загружать в ардуину другие программы, которые можно писать хоть на ассемблере! 🙂
А так же теперь становится понятно, насколько Arduino IDE упрощает процесс программирования микроконтроллеров! 🙂
Скетч WinAVR-кого Blink-а, перенесённый в Arduino IDE
Программируем на С/С++ в Visual Studio под Arduino
Этот пост поможет начинающим сэкономить несколько часов(дней) для настройки среды Visual Studio для разработки под Arduino на языке С/C++.
Преамбула
Пару месяцев назад увидел у преподавателя некую платку, подключенную к компьютеру. На платке были видны семисегментные индикаторы и несколько светодиодов. Преподаватель разбирался в каком-то коде, платка тем временем живо сигнализировала ему что-то. Меня сразу заинтересовало, чем это он там занимается… Однако, всё, что я смогу узнать у него — это то, что платку зовут отладочной. Путём недолгого гугления выхожу на игрушку под названием «Arduino». Заказываю себе Arduino mega, та что с Atmega1280 (всего $29.99) и через две недели бегу на почту получать заветную игрушку.
Фабула
Т.к. я являюсь заядлым Windows-разработчиком, привыкшим к среде VS, то я решил сразу отвлечься от родной среды Arduino IDE.
Итак, нам понадобится:
- Собственно, сама среда;
- Visual Assist X — опционально, для облегчения разработки. Заменяет собой встроенный IntelliSense встроенный в VS. Еще куча дополнительных опций. Платное;
- WinAVR последней версии. Это компилятор программ на С/С++ для «платформы» AVR;
- avr-libc. Минимальная реализация стандартной библиотеки С для AVR. Содержит такие полезные функции, как, например, _delay_ms или _delay_us (задержка в милли- и микросекундах);
- Avrdude. Желательно свежей версии, универсальный программатор для AVR;
- FTDI Virtual Com Port Drivers. Не вдаваясь в подробности, будем называть это «драйверами для Arduino»;
- AvrStudio — опционально. Имеет встроенный симулятор микроконтроллера, позволяющий пошагово отлаживать программу;
- Arduino schematic. Этот pdf-файл понадобится для того, чтобы узнать к каким портам МК подключены выходы Arduino.
Всё гуглится на раз.
Итак, приступим. Устанавливаем WinAVR, avr-libc, скачивам Avrdude. Подключаем Arduino к компьтеру и устанавливаем драйвера. Создаём «makefile project» в Visual Studio. Заполняем поля так, как на рисунке ниже.
В месте, куда установился WinAVR в поддиректории sample находится Makefile, который можно использовать для сборки проекта. Копируем себе, в папку созданного makefile project, и изменяем некоторые строки:
MCU = atmega1280
F_CPU = 16000000
FORMAT = ihex
TARGET = ATMEGA-1280-DEV-BOARD
SRC = $(TARGET).C
- Первая строчка обозначает тип микроконтроллера. Для Arduino mega это atmega1280;
- Вторая строчка задаёт частоту, на которой будет работать наш МК;
- Третья строка — формат выходного файла. Лучше оставить intel hex;
- Четвёртая — имя вашего проекта;
- Пятая — список исходных файлов проекта.
PROGRAMMER_FLAGS = -p m1280 -c arduino -b 57600 -P COM3 -U flash:w:$(TARGET).hex
Эта строка будет передаваться в качестве параметров для Avrdude.
- Опция -p указывает тип девайса, который будем шить;
- -с указывает тип программатора. Arduino использует протокол обмена информацией позаимствованный у программатора STK500, поэтому здесь можно смело вписывать stk500. Однако, в новой версии avrdude добавили в качестве программатора Arduino, поэтому с пущей уверенностью вписываем сюда arduino;
- Следующая опция указывает на какой скорости будет происходить передача данных. Здесь всегда нужно ставить 57600;
- Опция -P указывает порт, к которому подключен программатор;
- Последняя опция указывает какую конкретно операцию следует выполнить. Для нас это загрузка в флеш-память микроконтроллера программы.
Изменяем секцию all примерно так:
all: build program
Добавляем к списку задачи «program». Это позволит при удачной компиляции автоматически грузить прошивку в МК.
В принципе, всё готово. Пробуем написать минимальную программу (моргалку светодиодом L). Смотрим в файлик arduino-mega-schematic.pdf и видим, что 13 порт Arduino есть ни что иное, как PB7. Пишем примерно следующую программу:
int main()
<
DDRB = 0xFF;
while ( true )
<
PORTB |= (1 return 0;
>
* This source code was highlighted with Source Code Highlighter .
Минимальный интерфейс для работы с портами ввода-вывода:
* This source code was highlighted with Source Code Highlighter .
Сохраняем makefile, собираем проект, любуемся результатом.
П.С. К 10-му числу приедет набор состоящий из всевозможных сенсоров и датчиков. К февралю соберу ультразвуковой дальномер и фоторегистратор.
Программируем Arduino на чистом Си
В жизни ардуинщика рано или поздно наступает момент, когда в штатной среде разработки становится тесно. Если скетчам перестает хватать памяти, требуется жесткий реалтайм и работа с прерываниями или просто хочется быть ближе к железу — значит пришло время переходить на C. Бывалые электронщики при упоминании Arduino презрительно поморщатся и отправят новичка в радиомагазин за паяльником. Возможно, это не самый плохой совет, но мы пока не будем ему следовать. Если отбросить Arduino IDE и язык wiring/processing, у нас в руках останется прекрасная отладочная плата, уже оснащенная всем необходимым для работы микроконтроллера. И, что немаловажно, в память контроллера уже зашит бутлоадер, позволяющий загружать прошивку без использования программатора.
Для программирования на языке C нам понадобится AVR GCC Toolchain.
Windows:
Устанавливаем WinAVR, который содержит все необходимое.
Debian и Ubuntu:
sudo apt-get install gcc-avr binutils-avr avr-libc
Также нам потребуется установленная Arduino IDE, т.к. она содержит утилиту avrdude, которая нужна для загрузки прошивки в контроллер. CrossPack тоже содержит avrdude, но версия, идущая с ним, не умеет работать с Arduino.
После того, как все установлено, создадим наш первый проект. Для начала напишем Makefile. Он позволит нам избежать ввода длинных команд вручную при каждой компиляции и загрузке прошивки.
В этом файле нам нужно вписать свою команду для запуска avrdude. На разных системах она будет выглядеть по разному. Чтобы узнать свой вариант, запускаем Arduino IDE и в настройках ставим галочку «Show verbose output during upload».
Теперь загружаем в Arduino любой скетч и смотрим сообщения, выводимые в нижней части окна. Находим там вызов avrdude, копируем все, кроме параметра -Uflash и вставляем в Makefile после «AVRDUDE = ».
Небольшое замечание: все отступы в Makefile делаются символами табуляции (клавишей Tab). Если ваш текстовый редактор заменяет эти символы пробелами, команда make откажется собирать проект.
Теперь создадим файл main.c — собственно текст нашей программы, в которой традиционно помигаем светодиодом.
Наш проект готов. Откроем консоль в директории нашего проекта и введем команду «make»:
Как видим, размер получившейся прошивки составляет всего 180 байт. Аналогичный ардуиновский скетч занимает 1116 байт в памяти контроллера.
Теперь вернемся к консоли и введем «make flash» чтобы загрузить скомпилированный файл в контроллер:
Если загрузка прошла без ошибок, то светодиод, подключенный к 13 контакту платы, радостно замигает. Иногда avrdude не может найти плату или отваливается по таймауту — в этом случае может помочь передегивание USB кабеля. Также, во избежание конфликтов доступа к плате, не забудьте закрыть Arduino IDE перед командой «make flash».
Возможно многие вещи, описанные в этой статье, покажутся очевидными матерым разработчикам. Я постарался описать процесс максимально понятным для начинающего ардуинщика языком и собрать в одном месте информацию, которую мне удалось добыть в различных источниках, и проверенную опытным путем. Может быть кому-то эта статья сэкономит пару часов времени.