Этот пост поможет начинающим сэкономить несколько часов(дней) для настройки среды Visual Studio для разработки под Arduino на языке С/C++.
Пару месяцев назад увидел у преподавателя некую платку, подключенную к компьютеру. На платке были видны семисегментные индикаторы и несколько светодиодов. Преподаватель разбирался в каком-то коде, платка тем временем живо сигнализировала ему что-то. Меня сразу заинтересовало, чем это он там занимается… Однако, всё, что я смогу узнать у него — это то, что платку зовут отладочной. Путём недолгого гугления выхожу на игрушку под названием «Arduino». Заказываю себе Arduino mega, та что с Atmega1280 (всего $29.99) и через две недели бегу на почту получать заветную игрушку.
Т.к. я являюсь заядлым Windows-разработчиком, привыкшим к среде VS, то я решил сразу отвлечься от родной среды Arduino IDE.
Итак, нам понадобится:
Всё гуглится на раз.
Итак, приступим. Устанавливаем WinAVR, avr-libc, скачивам Avrdude. Подключаем Arduino к компьтеру и устанавливаем драйвера. Создаём «makefile project» в Visual Studio. Заполняем поля так, как на рисунке ниже.
В месте, куда установился WinAVR в поддиректории sample находится Makefile, который можно использовать для сборки проекта. Копируем себе, в папку созданного makefile project, и изменяем некоторые строки:
Эта строка будет передаваться в качестве параметров для Avrdude.
Изменяем секцию all примерно так:
Добавляем к списку задачи «program». Это позволит при удачной компиляции автоматически грузить прошивку в МК.
В принципе, всё готово. Пробуем написать минимальную программу (моргалку светодиодом L). Смотрим в файлик arduino-mega-schematic.pdf и видим, что 13 порт Arduino есть ни что иное, как PB7. Пишем примерно следующую программу:
Минимальный интерфейс для работы с портами ввода-вывода:
Сохраняем makefile, собираем проект, любуемся результатом.
П.С. К 10-му числу приедет набор состоящий из всевозможных сенсоров и датчиков. К февралю соберу ультразвуковой дальномер и фоторегистратор.
Преамбула
Пару месяцев назад увидел у преподавателя некую платку, подключенную к компьютеру. На платке были видны семисегментные индикаторы и несколько светодиодов. Преподаватель разбирался в каком-то коде, платка тем временем живо сигнализировала ему что-то. Меня сразу заинтересовало, чем это он там занимается… Однако, всё, что я смогу узнать у него — это то, что платку зовут отладочной. Путём недолгого гугления выхожу на игрушку под названием «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. Пишем примерно следующую программу:
#include <avr/io.h>
#include <util/delay.h>
int main()
{
DDRB = 0xFF;
while(true)
{
PORTB |= (1 << 7);
_delay_ms(500);
PORTB &= ~(1 << 7);
_delay_ms(500);
}
return 0;
}
* This source code was highlighted with Source Code Highlighter.
Минимальный интерфейс для работы с портами ввода-вывода:
#include "utils.h"
class Port
{
public:
Port(PORT& p) : _p(p) {};
Port& operator! ();
Port& operator+= (uint8 b);
Port& operator-= (uint8 b);
Port& operator= (Port& p);
void SetLow();
void SetHigh();
PORT& GetValue();
bool ClearBit(uint8 b);
bool SetBit(uint8 b);
void Pulse(uint8 t);
void PulseBit(uint8 b, uint8 t);
private:
PORT& _p;
};
* This source code was highlighted with Source Code Highlighter.
Сохраняем makefile, собираем проект, любуемся результатом.
П.С. К 10-му числу приедет набор состоящий из всевозможных сенсоров и датчиков. К февралю соберу ультразвуковой дальномер и фоторегистратор.