Pull to refresh

Программируем на С/С++ в Visual Studio под Arduino

Reading time3 min
Views48K
Этот пост поможет начинающим сэкономить несколько часов(дней) для настройки среды Visual Studio для разработки под Arduino на языке С/C++.

image


Преамбула



Пару месяцев назад увидел у преподавателя некую платку, подключенную к компьютеру. На платке были видны семисегментные индикаторы и несколько светодиодов. Преподаватель разбирался в каком-то коде, платка тем временем живо сигнализировала ему что-то. Меня сразу заинтересовало, чем это он там занимается… Однако, всё, что я смогу узнать у него — это то, что платку зовут отладочной. Путём недолгого гугления выхожу на игрушку под названием «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. Заполняем поля так, как на рисунке ниже.

image

В месте, куда установился 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, собираем проект, любуемся результатом.
image

П.С. К 10-му числу приедет набор состоящий из всевозможных сенсоров и датчиков. К февралю соберу ультразвуковой дальномер и фоторегистратор.
Tags:
Hubs:
Total votes 39: ↑34 and ↓5+29
Comments16

Articles