Введение в язык программирования Arduino. Ардуино язык программирования

Подробно Arduino язык программирования для начинающих представлен в таблице далее. Микроконтроллер Arduino программируется на специальном языке программирования, основанном на C/C ++. Язык программирования Arduino является разновидностью C++, другими словами, не существует отдельного языка программирования для Arduino. Скачать книгу PDF можно в конце страницы.

В Arduino IDE все написанные скетчи компилируются в программу на языке C/C++ с минимальными изменениями. Компилятор Arduino IDE значительно упрощает написание программ для этой платформы и создание устройств на Ардуино становится намного доступней людям, не имеющих больших познаний в языке C/C++. Дадим далее небольшую справку с описанием основных функций языка Arduino с примерами.

Подробный справочник языка Ардуино

Язык можно разделить на четыре раздела: операторы, данные, функции и библиотеки.

Язык Arduino Пример Описание

Операторы

setup() void setup ()
{
pinMode (3, INPUT );
}
Функция используется для инициализации переменных, определения режимов работы выводов на плате и т.д. Функция запускается только один раз, после каждой подачи питания на микроконтроллер.
loop() void loop ()
{
digitalWrite (3, HIGH );
delay(1000);
digitalWrite (3, LOW );
delay(1000);
}
Функция loop крутится в цикле, позволяя программе совершать вычисления и реагировать на них. Функции setup() и loop() должны присутствовать в каждом скетче, даже если эти операторы в программе не используются.

Управляющие операторы

if
if (x >
if (x < 100) digitalWrite (3, LOW );
Оператор if используется в сочетании с операторами сравнения (==, !=, <, >) и проверяет, достигнута ли истинность условия. Например, если значение переменной x больше 100, то включается светодиод на выходе 13, если меньше — светодиодвыключается.
if..else
if (x > 100) digitalWrite (3, HIGH );
else digitalWrite (3, LOW );
Оператор else позволяет cделать проверку отличную от указанной в if, чтобы осуществлять несколько взаимо исключающих проверок. Если ни одна из проверок не получила результат ИСТИНА, то выполняется блок операторов в else.
switch…case
switch (x)
{


case 3: break ;

}
Подобно if, оператор switch управляет программой, позволяя задавать действия, которые будут выполняться при разных условиях. Break является командой выхода из оператора, default выполняется, если не выбрана ни одна альтернатива.
for void setup ()
{
pinMode (3, OUTPUT );
}
void loop ()
{
for (int i=0; i <= 255; i++){
analogWrite (3, i);
delay(10);
}
}
Конструкция for используется для повторения операторов, заключенных в фигурные скобки. Например, плавное затемнение светодиода. Заголовок цикла for состоит из трех частей: for (initialization; condition; increment) — initialization выполняется один раз, далее проверяется условие condition, если условие верно, то выполняется приращение increment. Цикл повторяется пока не станет ложным условие condition.
while void loop ()
{
while (x < 10)
{
x = x + 1;
Serial.println (x);
delay (200);
}
}
Оператор while используется, как цикл, который будет выполняться, пока условие в круглых скобках является истиной. В примере оператор цикла while будет повторять код в скобках бесконечно до тех пор, пока x будет меньше 10.
do…while void loop ()
{
do
{
x = x + 1;
delay (100);
Serial.println (x);
}
while (x < 10);
delay (900);
}
Оператор цикла do…while работает так же, как и цикл while. Однако, при истинности выражения в круглых скобках происходит продолжение работы цикла, а не выход из цикла. В приведенном примере, при x больше 10 операция сложения будет продолжаться, но с паузой 1000 мс.
break
continue
switch (x)
{
case 1: digitalWrite (3, HIGH );
case 2: digitalWrite (3, LOW );
case 3: break ;
case 4: continue ;
default : digitalWrite (4, HIGH );
}
Break используется для принудительного выхода из циклов switch, do, for и while, не дожидаясь завершения цикла.
Оператор continue пропускает оставшиеся операторы в текущем шаге цикла.

Синтаксис

;
(точка с запятой)

digitalWrite (3, HIGH );
Точка с запятой используется для обозначения конца оператора. Забытая в конце строки точка с запятой приводит к ошибке при компиляции.
{}
(фигурные скобки)
void setup ()
{
pinMode (3, INPUT );
}
Открывающая скобка “{” должна сопровождаться закрывающей скобкой “}”. Непарные скобки могут приводить к скрытым и непонятным ошибкам при компиляции скетча.
//
(комментарий)
x = 5; // комментарий

Целевой аудиторией Ардуино являются непрофессиональные пользователи в сфере роботостроения и простейших систем автоматики. Основной продукцией является набор плат, комбинируя которые, возможно создавать различные устройства, способные выполнять широкий ряд задач.

В качестве примера, из набора плат, выпускаемых данной фирмой, можно собрать автоматическую кормушку для своих домашних животных. И это лишь один из наиболее простых примеров. Сфера их возможного применения ограничивается лишь фантазией пользователей.

Кроме печатных плат, выпускаемых под торговой маркой Arduino, у них имеется собственный язык программирования Ардуино, который основывается на широко известном в кругу программистов языке C/C++ . Давайте более подробно разберемся, что он из себя представляет.

Язык программирования Ардуино довольно прост в освоении, так как основной целевой аудиторией его применения являются любители. Однако считается одним из самых лучших языков для программирования микроконтроллеров.

Arduino IDE является бесплатной программой, скачать которую может любой желающий. На нашем сайте вы можете любую подходящую для вас версию среды. Также доступ к скачиванию IDE предоставлен на официальном сайте компании, а при желании, разработчиков можно отблагодарить, сделав денежный перевод.

Программу, написанную на языке программирования Ардуино называют скетчем. Готовые скетчи записываются на плату для их выполнения.

Среда IDE поддерживается такими операционными системами, как Windows, MacOs и Linux. На официальном сайте компании указанно, что данный язык программирования написан на Wiring, но на самом деле его не существует и для написания используется C++ с небольшими изменениями.

Что необходимо для начала работы с Arduino IDE?

Для начала нам потребуются следующие вещи:

  • платы Arduino;
  • кабель USB;
  • компьютер с установленной на него программой Arduino IDE.

Имея этот набор, можно начинать экспериментировать с имеющимися у вас платами, записывая на них ваши первые скетчи.

Как настроить Ардуино на компьютере?

Делается это просто. Необходимо выполнить следующие действия:

  • необходимо подключить собранное вами изделие к компьютеру посредством USB кабеля;
  • в диспетчере устройств необходимо проверить, к какому порту подключен ваш микроконтроллер. Если он не отображается или написано, что устройство не опознано – значит, вы не правильно установили драйвер или ваша плата нуждается в диагностике;
  • следующим шагом будет запуск нашего языка программирования Arduino IDE. В меню необходимо выбрать вкладку инструменты. При ее нажатии откроется список, в котором необходимо выбрать пункт – порт. Там надо выбрать порт, указанный в диспетчере устройств;
  • конечным пунктом является выбор платы, которую мы будем использовать для загрузки скетчей.

Важно! При подключении вашей платы к другому USB порту все настройки будет необходимо произвести заново.

Знакомство с интерфейсом Ардуино

Одним из основных элементов ардуино является главное меню программы, которое позволяет получить доступ ко всем доступным функциям нашей программы.

Ниже расположена панель с иконками, которые отображают наиболее используемые функции Arduino IDE:

  • проверка на наличие ошибок;
  • создание нового скетча;
  • открытие окна порта микроконтроллера;
  • Следующим по важности элементом является вкладка с файлами проекта. Если это простой скетч, то файл будет всего один. Однако сложные скетчи могут состоять из нескольких файлов. В таком случае на панели вкладок можно быстро переключить просмотр с одного файла на другой. Это очень удобно.

    Самым большим из блоков является поле редактора наших скетчей. Тут мы можем просмотреть и, при необходимости, отредактировать нужный нам программный код. Отдельно реализовано поле для вывода системных сообщений. С его помощью можно убедиться, что сохранение вашего скетча или его загрузка были проведены успешно, и вы можете приступать к следующим действиям. Также в программе существует окно, отображающее наличие в ходе компиляции вашего скетча.

    Компиляция – преобразование исходного кода языка высокого уровня в машинный код или на язык ассемблера.

    Основные функции языка программирования

    Давайте наконец-то перейдем к самым основным функция языка программирования Ардуино.

    Сразу скажем, что все функции вы можете найти в нашем удобном на .

    Точка с запятой;

    Точка с запятой должна следовать за каждым выражением, написанным на языке программирования Arduino. Например:

    Int LEDpin = 9;

    В этом выражении мы присваиваем значение переменной и обратите внимание на точку с запятой в конце. Это говорит компилятору, что вы закончили кусок кода и переходите к следующему фрагменту. Точка с запятой в коде Ардуино отделяет одно полное выражение от другого.

    Двойная обратная косая черта для однострочных комментариев //

    // Всё что идет после двойной косой черты будет серым и не будет считываться программой

    Комментарии - это то, что вы используете для комментирования кода. Хороший код хорошо комментируется. Комментарии предназначены для того, чтобы сообщать вам и всем, кто мог бы наткнуться на ваш код, то как вы думали, когда вы его написали. Хорошим комментарием было бы что-то вроде этого:

    // К этому пину Arduino подключаем светодиод int LEDpin = 9;

    Теперь, даже через 3 месяца когда я просматриваю эту программу я знаю о том куда подключался светодиод.

    Компилятор будет игнорировать комментарии, поэтому вы можете писать все, что вам нравится. Если вам нужно много текста для комментария вы можете использовать многострочный комментарий, показанный ниже:

    /* Многострочный комментарий открывается одним обратным слэшем, за которым следует звездочка. Все последующее будет выделено серым цветом и будет игнорироваться компилятором, пока вы не закроете комментарий, используя сначала звездочку, а затем обратную косую черту */

    Комментарии похожи на сноски кода, но более распространены, чем те что ставят в книгах внизу страниц.

    Фигурные скобки { }

    Фигурные скобки используются для того, чтобы добавить инструкции, выполняемые функцией (мы обсудим функции дальше). Всегда есть открытая фигурная скобка и закрывающая фигурная скобка. Если вы забудете закрыть фигурную скобку, компилятор выведет код ошибки.

    Void loop() { //эта фигурная скобка открывается //крутая программа здесь }//эта фигурная скобка закрывается

    Помните - никакая фигурная скобка не может не быть закрыта!

    Функции ()

    Теперь пора поговорить о функциях. Функции - это фрагменты кода, которые используются так часто, что они инкапсулированы в определенные ключевые слова, чтобы вы могли использовать их более легко. Например, функцией может быть следующий набор инструкций в случае если вам нужно помыть собаку:

    1. Получить ведро
    2. Заполнить его водой
    3. Добавить мыло
    4. Найти собаку
    5. Намылить собаку
    6. Помыть собаку
    7. Ополоснуть собаку
    8. Посушить собака
    9. Отложить ведро

    Этот набор простых инструкций может быть инкапсулирован в функцию, которую мы можем назвать WashDog. Каждый раз, когда мы хотим выполнить все эти инструкции, мы просто набираем WashDog и вуаля - все инструкции выполняются.

    В Ардуино есть определенные функции, которые часто используются в среде . Когда вы вводите их, имя функции будет оранжевым. Например, функция pinMode() является общей функцией, используемой для обозначения режима вывода Arduino.

    А что с круглыми скобками после функции pinMode? Для многих функций требуются аргументы. Аргумент - это информация, которую функция использует при ее запуске. Для нашей функции WashDog аргументами могут быть имя собаки и тип мыла, а также температура и размер ведра.

    PinMode(13, OUTPUT); //Устанавливает режим вывода Arduino

    Аргумент 13 относится к выводу 13, а OUTPUT - режим, в котором вы хотите, чтобы пин работал. Когда вы вводите эти аргументы, в терминология это называется передачей данных, вы передаете необходимую информацию в функции. Не всем функциям требуются аргументы, но открытие и закрытие круглых скобок остаются, хотя и пустыми.

    Millis(); //Получает время в миллисекундах за которое Arduino запускается

    Обратите внимание, что слово OUTPUT обычно синего цвета. В языке программирования Ардуино есть определенные ключевые слова, которые часто используются, а синий цвет помогает их идентифицировать. Arduino IDE автоматически превращает их в синий цвет.

    void setup ()

    Функция setup (), как следует из названия, используется для настройки платы Arduino. Ардуино выполняет весь код, который содержится между фигурными скобками после setup() только один раз. Типичные вещи, которые происходят в setup() - это, например, установка режимом контактов:

    Void setup() { //код между фигурными фигурными скобками выполняется только один раз }

    Возможно, вам интересно что означает void перед функцией setup(). Void означает, что функция не возвращает информацию.

    Некоторые функции возвращают значения - наша функция DogWash может вернуть количество ведер, необходимых для очистки собаки. Функция analogRead() возвращает целое значение от 0 до 1023. Если это сейчас кажется немного странным, не беспокойтесь, поскольку мы будем охватывать каждую общую функцию Arduino по мере продолжения курса.

    Давайте рассмотрим пару вещей, которые вы должны знать о setup():

    1. setup() запускается только один раз;
    2. setup() должна быть первой функцией в скетче Ардуино;
    3. setup() должна иметь открывающиеся и закрывающие фигурные скобки.

    void loop()

    Вы должны любить разработчиков Arduino, потому они сделали так, что имена функций говорят сами за себя. Как следует из названия, весь код между фигурными скобками в loop() повторяется снова и снова, а слово loop переводится именно как "цикл". Функция loop() - это место, где будет находиться тело вашей программы.

    Как и в случае с setup(), функция loop() не возвращает никаких значений, поэтому перед неё предшествует слово void.

    Void loop() { //любой код, который вы здесь задаете, выполняется снова и снова }

    Вам кажется странным, что код работает в одном большом цикле? Это очевидное отсутствие вариации - иллюзия. Большая часть вашего кода будет иметь определенные условия ожидания, которые вызовут новые действия.

    Существуют ли еще программы, работающие с Ардуино?

    Помимо официальной Arduino IDE, существуют программы сторонних разработчиков, которые предлагают свои продукты для работы с микроконтроллерами на базе ардуино.

    Аналогичный набор функций нам может предоставить программа, которая называется Processing. Она очень схожа с Arduino IDE, так как обе сделаны на одном движке. Processing имеет обширный набор функций, который мало уступает оригинальной программе. С помощью загружаемой библиотеки Serial пользователь может создать связь между передачей данных, которые передают друг другу плата и Processing.При этом мы можем заставить плату выполнять программы прямо с нашего ПК.

    Существует еще одна интересная версия исходной программы. Называется она B4R, и главным ее отличием является использование в качестве основы не языка си, а другой язык программирования – Basic. Данный программный продукт является бесплатным. Для работы с ним существуют хорошие самоучители, в том числе и написанные создателями данного продукта.

    Есть и платные варианты Arduino IDE. Одним из таких является программа PROGROMINO. Главным ее достоинством считается возможность автодополнения кода. При составлении программы вам больше не нужно будет искать информацию в справочниках. Программа сама предложит вам возможные варианты использования той или иной процедуры. В ее набор входит еще множество интересных функций, отсутствующих в оригинальной программе и способных облегчить вам работу с платами.

    Конкуренты Ардуино

    Данный рынок по производству микроконтроллеров для создания различных электронных схем и робототехники имеет много поклонников по всему земному шару. Данная ситуация способствует появлению на рынке не только конкурентов, которые предлагают схожие продукты. Кроме них выпускается значительное количество подделок разного качества. Одни очень тяжело отличить от оригиналов, ведь они имеют идентичное качество, другие обладают очень плохими характеристиками и могут вовсе не работать с оригинальными продуктами.

    Существуют даже платы Arduino, которые поддерживают работу микропроцессоров с интерпретаторами JavaScript. Актуальны они, в первую очередь, для тех, кто желает использовать язык Java вместо Си. Ведь он более прост, и позволяет добиваться результатов с повышенной скоростью. Однако данные платы являются более дорогими по отношению к ардуино, что является существенным минусом.

    Если вы ищите себе хобби и вам интересно такое направление, как электротехника, вы смело можете выбирать для этого Arduino. Плюсов такое хобби имеет массу. Вы будете развиваться в интеллектуальном плане, так как данное занятие потребует от вас знаний в разных областях.

    Помимо развлечений, ваше хобби поможет вам в создании массы полезных изделий, которые вы сможете использовать для облегчения повседневной жизни. С каждым разом вы будете находить все новые и новые способы использования вашего увлечения.

    Освоить данное занятие будет не так сложно, благодаря наличию большого количества учебников и самоучителей. В дальнейшем вы найдете множество единомышленников по всему миру, которые поделятся с вами своими знаниями и дадут вам стимул для совершения новых экспериментов!

    Введение

    Freeduino/Arduino программируется на специальном языке программирования – он основан на C/C ++, и позволяет использовать любые его функции. Строго говоря, отдельного языка Arduino не существует, как и не существует компилятора Arduino – написанные программы преобразуются (с минимальными изменениям) в программу на языке C/C++, и затем компилируются компилятором AVR-GCC. Так что фактически, используется специализированный для микроконтроллеров AVR вариант C/C++.

    Разница заключается в том, что Вы получаете простую среду разработки, и набор базовых библиотек, упрощающих доступ к находящейся «на борту» микроконтроллера периферии.

    Согласитесь, очень удобно начать работу с последовательным портом на скорости 9600 бит в секунду, сделав вызов одной строчкой:

    Serial.begin(9600);

    А при использовании «голого» C/C++ Вам бы пришлось разбираться с документацией на микроконтроллер, и вызывать нечто подобное:

    UBRR0H = ((F_CPU / 16 + 9600 / 2) / 9600 - 1) >> 8;
    UBRR0L = ((F_CPU / 16 + 9600 / 2) / 9600 - 1);
    sbi(UCSR0B, RXEN0);
    sbi(UCSR0B, TXEN0);
    sbi(UCSR0B, RXCIE0);

    Здесь кратко рассмотрены основные функции и особенности программирования Arduino. Если Вы не знакомы с синтаксисом языков C/C++, советуем обратиться к любой литературе по данному вопросу, либо Internet-источникам.

    С другой стороны, все представленные примеры очень просты, и скорее всего у Вас не возникнет трудностей с пониманием исходных текстов и написанием собственных программ даже без чтения дополнительной литературы.

    Более полная документация (на английском языке) представлена на официальном сайте проекта – http://www.arduino.cc . Там же есть форум, ссылки на дополнительные библиотеки и их описание.

    По аналогии с описанием на официальном сайте проекта Arduino, под «портом» понимается контакт микроконтроллера, выведенный на разъем под соответствующим номером. Кроме того, существует порт последовательной передачи данных (COM-порт).

    Структура программы

    В своей программе Вы должны объявить две основных функции: setup() и loop().

    Функция setup() вызывается один раз, после каждого включения питания или сброса платы Freeduino. Используйте её, чтобы инициализировать переменные, установить режимы работы цифровых портов и т.д.

    Функция loop() последовательно раз за разом исполняет команды, которые описаны в ее теле. Т.е. после завершения функции снова произойдет ее вызов.

    Разберем простой пример:

    void setup() // начальные установки
    {
    beginSerial(9600); // установка скорости работы серийного порта на 9600 бит/сек
    pinMode(3, INPUT); // установка 3-его порта на ввод данных
    }

    // Программа проверяет 3-ий порт на наличие на нём сигнала и посылает ответ в
    // виде текстового сообщения на последовательный порт компьютера
    void loop() // тело программы
    {
    if (digitalRead(3) == HIGH) // условие на опрос 3го порта
    serialWrite("H"); // отправка сообщения в виде буквы «Н» на COM-порт
    else
    serialWrite("L"); // отправка сообщения в виде буквы «L» на COM-порт
    delay(1000); // задержка 1 сек.
    }

    pinMode (порт, режим);

    Описание:

    Конфигурирует указанный порт на ввод или вывод сигнала.

    Параметры:

    порт – номер порта, режим которого Вы желает установить (значение целого типа от 0 до 13).

    режим – либо INPUT (ввод) либо OUTPUT (вывод).

    pinMode(13, OUTPUT); //13й вывод будет выходом
    pinMode(12, INPUT); //а 12й – входом

    Примечание:

    Аналоговые входы могут использоваться как цифровые входы/выходы, при обращении к ним по номерам с 14 (аналоговый вход 0) по 19 (аналоговый вход 5)

    digitalWrite(порт, значение);

    Описание:

    Устанавливает высокий (HIGH) или низкий (LOW) уровень напряжения на указанном порте.

    Параметры:

    порт: номер порта

    значение: HIGH или LOW

    digitalWrite(13, HIGH); // выставляем 13й вывод в «высокое» состояние

    value = digitalRead (порт);

    Описание:

    Считывает значение на указанном порту

    Параметры:

    порт: номер опрашиваемого порта

    Возвращаемое значение: возвращает текущее значение на порту (HIGH или LOW) типа int

    int val;
    val = digitalRead(12); // опрашиваем 12й вывод

    Примечание:

    Если к считываемому порту ничего не подключено, то функция digitalRead () может беспорядочно возвращать значения HIGH или LOW.

    Аналоговый ввод/вывод сигнала

    value = analogRead(порт);

    Описание:

    Считывает значение с указанного аналогового порта. Freeduino содержит 6 каналов, аналого-цифрового преобразователя на 10 битов каждый. Это означает, что входное напряжения от 0 до 5В преобразовывается в целочисленное значение от 0 до 1023. Разрешающая способность считывания составляет: 5 В/1024 значений = 0,004883 В/значение (4,883 мВ). Требуется приблизительно 100 нС (0.0001 С), чтобы считать значение аналогового ввода, так что максимальная скорость считывания - приблизительно 10000 раз в секунду.

    Параметры:

    Возвращаемое значение: возвращает число типа int в диапазоне от 0 до 1023, считанное с указанного порта.

    int val;
    val = analogRead(0); // считываем значение на 0м аналоговом входе

    Примечание:

    Аналоговые порты по умолчанию определенны на ввод сигнала и в отличие от цифровых портов их не требуется конфигурировать с помощью вызова функции pinMode.

    analogWrite(порт, значение);

    Описание:

    Выводит на порт аналоговое значение. Эта функция работает на: 3, 5, 6, 9, 10, и 11 цифровых портах Freeduino.

    Может применяться для изменения яркости светодиода, для управления двигателем и т.д. После вызова функции analogWrite, соответствующий порт начинает работать в режиме широтно-импульсного модулирования напряжения до тех пор, пока не будет следующего вызова функции analogWrite (или функций digitalRead / digitalWrite на том же самом порте).

    Параметры:

    порт: номер опрашиваемого аналогового входа

    значение: целочисленное между 0 и 255. Значение 0 генерирует 0 В на указанном порте; значение 255 генерирует +5 В на указанном порте. Для значений между 0 и 255, порт начинает быстро чередовать уровень напряжения 0 и +5 В - чем выше значение, тем, более часто порт генерирует уровень HIGH (5 В).

    analogWrite(9, 128);// устанавливаем на 9 контакте значение эквивалентное 2,5В

    Примечание:

    Нет необходимости вызвать функцию pinMode, чтобы установить порт на вывод сигналов перед вызовом функции analogWrite.

    Частота генерирования сигнала – приблизительно 490 Гц.

    time = millis();

    Описание:

    Возвращает число миллисекунд, с момента исполнения Freeduino текущей программы. Счетчик переполнится и обнулится приблизительно через 9 часов.

    Возвращаемое значение: возвращает значение типа unsigned long

    unsigned long time; // объявление переменной time типа unsigned long
    time = millis(); // передача количества миллисекунд

    delay(время_мс);

    Описание:

    Приостанавливает программу на заданное число миллисекунд.

    Параметры:

    время_мс – время задержки программы в миллисекундах

    delay(1000); //пауза 1 секунда

    delayMicroseconds

    delayMicroseconds(время_мкс);

    Описание:

    Приостанавливает программу на заданное число микросекунд.

    Параметры:

    время_мкс – время задержки программы в микросекундах

    delayMicroseconds(500); //пауза 500 микросекунд

    pulseIn(порт, значение);

    Описание:

    Считывает импульс (высокий или низкий) c цифрового порта и возвращает продолжительность импульса в микросекундах.

    Например, если параметр «значение» при вызове функции установлен в HIGH, то pulseIn() ожидает, когда на порт поступит высокий уровень сигнала. С момента его поступления начинается отсчет времени до тех пор, пока на порт не поступит низкий уровень сигнала. Функция возвращает длину импульса (высокого уровня) в микросекундах. Работает с импульсами от 10 микросекунд до 3 минут. Обратите внимание, что эта функция не будет возвращать результат, пока импульс не будет обнаружен.

    Параметры:

    порт: номер порта, с которого считываем импульс

    значение: тип импульса HIGH или LOW

    Возвращаемое значение: возвращает длительность импульса в микросекундах (тип int)

    int duration; // объявление переменной duration типа int
    duration = pulseIn(pin, HIGH); // измеряем длительность импульса

    Последовательная передача данных

    Freeduino имеет встроенный контроллер для последовательной передачи данных, который может использоваться как для связи между Freeduino/Arduino устройствами, так и для связи с компьютером. На компьютере соответствующее соединение представлено USB COM-портом.

    Связь происходит по цифровым портам 0 и 1, и поэтому Вы не сможете использовать их для цифрового ввода/вывода если используете функции последовательной передачи данных.

    Serial.begin(скорость_передачи);

    Описание:

    Устанавливает скорость передачи информации COM порта битах в секунду для последовательной передачи данных. Для того чтобы поддерживать связь с компьютером, используйте одну из этих нормированных скоростей: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, или 115200. Также Вы можете определить другие скорости при связи с другим микроконтроллером по портам 0 и 1.

    Параметры:

    скорость_передачи: скорость потока данных в битах в секунду.

    Serial.begin(9600); //устанавливаем скорость 9600 бит/сек

    Serial.available

    count = Serial.available();

    Описание:

    Принимаемые по последовательному порту байты попадают в буфер микроконтроллера, откуда Ваша программа может их считать. Функция возвращает количество накопленных в буфере байт. Последовательный буфер может хранить до 128 байт.

    Возвращаемое значение:

    Возвращает значение типа int – количество байт, доступных для чтения, в последовательном буфере, или 0, если ничего не доступно.

    if (Serial.available() > 0) { // Если в буфере есть данные
    // здесь должен быть прием и обработка данных
    }

    char = Serial.read();

    Описание:

    Считывает следующий байт из буфера последовательного порта.

    Возвращаемое значение:

    Первый доступный байт входящих данных с последовательного порта, или -1 если нет входящих данных.

    incomingByte = Serial.read(); // читаем байт

    Описание:

    Очищает входной буфер последовательного порта. Находящиеся в буфере данные теряются, и дальнейшие вызовы Serial.read() или Serial.available() будут иметь смысл для данных, полученных после вызова Serial.flush().

    Serial.flush(); // Очищаем буфер – начинаем прием данных «с чистого листа»

    Описание:

    Вывод данных на последовательный порт.

    Параметры:

    Функция имеет несколько форм вызова в зависимости от типа и формата выводимых данных.

    Serial.print(b, DEC) выводит ASCII-строку - десятичное представление числа b.

    int b = 79;

    Serial.print(b, HEX) выводит ASCII-строку - шестнадцатиричное представление числа b.

    int b = 79;

    Serial.print(b, OCT) выводит ASCII-строку - восьмеричное представление числа b.

    int b = 79;
    Serial.print(b, OCT); //выдаст в порт строку «117»

    Serial.print(b, BIN) выводит ASCII-строку - двоичное представление числа b.

    int b = 79;
    Serial.print(b, BIN); //выдаст в порт строку «1001111»

    Serial.print(b, BYTE) выводит младший байт числа b.

    int b = 79;
    Serial.print(b, BYTE); //выведет число 79 (один байт). В мониторе
    //последовательного порта получим символ «O» - его
    //код равен 79

    Serial.print(str) если str – строка или массив символов, побайтно передает str на COM-порт.

    char bytes = {79, 80, 81}; //массив из 3 байт со значениями 79,80,81
    Serial.print("Here our bytes:"); //выводит строку «Here our bytes:»
    Serial.print(bytes); //выводит 3 символа с кодами 79,80,81 –
    //это символы «OPQ»

    Serial.print(b) если b имеет тип byte или char, выводит в порт само число b.

    char b = 79;
    Serial.print(b); //выдаст в порт символ «O»

    Serial.print(b) если b имеет целый тип, выводит в порт десятичное представление числа b.

    int b = 79;
    Serial.print(b); //выдаст в порт строку «79»

    Описание:

    Функция Serial.println аналогична функции Serial.print, и имеет такие же варианты вызова. Единственное отличие заключается в том, что после данных дополнительно выводятся два символа – символ возврата каретки (ASCII 13, или "\r") и символ новой линии (ASCII 10, или "\n").

    Пример 1 и пример 2 выведут в порт одно и то же:

    int b = 79;
    Serial.print(b, DEC); //выдаст в порт строку «79»
    Serial.print("\r\n"); //выведет символы "\r\n" – перевод строки
    Serial.print(b, HEX); //выдаст в порт строку «4F»
    Serial.print("\r\n");//выведет символы "\r\n" – перевод строки

    int b = 79;
    Serial.println(b, DEC); //выдаст в порт строку «79\r\n»
    Serial.println(b, HEX); //выдаст в порт строку «4F\r\n»

    В мониторе последовательного порта получим.

    Изучение микроконтроллеров кажется чем-то сложным и непонятным? До появления Арудино - это было действительно не легко и требовало определенный набор программаторов и прочего оборудования.

    Это своего рода электронный конструктор. Изначальная задача проекта - это позволить людям легко обучаться программированию электронных устройств, при этом уделяя минимальное время электронной части.

    Сборка сложнейших схем и соединение плат может осуществляться без паяльника, а с помощью перемычек с разъёмными соединениями «папа» и «мама». Так могут подключаться как навесные элементы, так и платы расширения, которые на лексиконе ардуинщиков зовут просто «Шилды» (shield).

    Какую первую плату Arduino купить новичку?

    Базовой и самой популярной платой считается . Эта плата размером напоминает кредитную карту. Довольно крупная. Большинство шилдов которые есть в продаже идеально подходят к ней. На плате для подключения внешних устройств расположены гнезда.

    В отечественных магазинах на 2017 год её цена порядка 4-5 долларов. На современных моделях её сердцем является Atmega328.

    Изображение платы ардуино и расшифровка функций каждого вывода, Arduino UNO pinout

    Микроконтроллер на данной плате это длинна микросхема в корпусе DIP28, что говорит о том, что у него 28 ножек.

    Следующая по популярности плата, стоит почти в двое дешевле предыдущей - 2-3 доллара. Это плата . Актуальные платы построены том же Atmega328, функционально они аналогичны с UNO, различия в размерах и решении согласования с USB, об этом позже подробнее. Еще одним отличием является то, что для подключения к плате устройств предусмотрены штекера, в виде иголок.

    Количество пинов (ножек) этой платы совпадает, но вы можете наблюдать что микроконтроллер выполнен в более компактном корпусе TQFP32, в корпусе добавлены ADC6 и ADC7, другие две «лишних» ножки дублируют шину питания. Её размеры довольно компактные - примерно, как большой палец вашей руки.

    Третья по популярности плата - это , на ней нет USB порта для подключения к компьютеру, как осуществляется связь я расскажу немного позже.

    Это самая маленькая плата из всех рассмотренных, в остальном она аналогична предыдущим двум, а её сердцем является по-прежнему Atmega328. Другие платы рассматривать не будем, так как это статья для начинающих, да и сравнение плат - это тема отдельной статьи.

    В верхней части схема подключения USB-UART, пин «GRN» - разведен на цепь сброса микроконтроллера, может называться по иному, для чего это нужно вы узнаете далее.

    Если UNO удобна для макетирования, то Nano и Pro Mini удобны для финальных версий вашего проекта, потому что занимают мало места.

    Как подключить Arduino к компьютеру?

    Arduino Uno и Nano подключаются к компьютеру по USB. При этом нет аппаратной поддержки USB порта, здесь применено схемное решение преобразования уровней, обычно называемое USB-to-Serial или USB-UART (rs-232). При этом в микроконтроллер прошит специальный Arduino загрузчик, который позволяет прошиваться по этим шинам.

    В Arduino Uno реализована эта вязь на микроконтроллере с поддержкой USB - ATmega16U2 (AT16U2). Получается такая ситуация, что дополнительный микроконтроллер на плате нужен для прошивки основного микроконтроллера.

    В Arduino Nano это реализовано микросхемой FT232R, или её аналогом CH340. Это не микроконтроллер — это преобразователь уровней, этот факт облегчает сборку Arduino Nano с нуля своими руками.

    Обычно драйвера устанавливаются автоматически при подключении платы Arduino. Однако, когда я купил китайскую копию Arduino Nano, устройство было опознано, но оно не работало, на преобразователе была наклеена круглая наклейка с данными о дате выпуска, не знаю нарочно ли это было сделано, но отклеив её я увидел маркировку CH340.

    До этого я не сталкивался с таким и думал, что все USB-UART преобразователи собраны на FT232, пришлось скачать драйвера, их очень легко найти по запросу «Arduino ch340 драйвера». После простой установки - всё заработало!

    Через этот же USB порт может и питаться микроконтроллер, т.е. если вы подключите его к адаптеру от мобильного телефона - ваша система будет работать.

    Что делать если на моей плате нет USB?

    Плата Arduino Pro Mini имеет меньшие габариты. Это достигли тем что убрали USB разъём для прошивки и тот самый USB-UART преобразователь. Поэтому его нужно докупить отдельно. Простейший преобразователь на CH340 (самый дешевый), CPL2102 и FT232R, продаётся стоит от 1 доллара.

    При покупке обратите внимание на какое напряжение рассчитан этот переходник. Pro mini бывает в версиях 3.3 и 5 В, на преобразователях часто расположен джампер для переключения напряжения питания.

    При прошивке Pro Mini, непосредственно перед её началом необходимо нажимать на RESET, однако в преобразователях с DTR это делать не нужно, схема подключения на рисунке ниже.

    Стыкуются они специальными клеммами «Мама-Мама» (female-female).

    Собственно, все соединения можно сделать с помощью таких клемм (Dupont), они бывают как с двух сторон с гнездами, так и со штекерами, так и с одной стороны гнездо, а с другой штекер.

    Как писать программы для Arduino?

    Для работы со скетчами (название прошивки на языке ардуинщиков), есть специальная интегрированная среда для разработки Arduino IDE, скачать бесплатно её можно с официального сайта или с любого тематического ресурса, с установкой проблем обычно не возникает.

    Так выглядит интерфейс программы. Писать программы можно на специально разработанном для ардуино упрощенном языке C AVR, по сути это набор библиотек, который называют Wiring, а также на чистом C AVR. Использование которого облегчает код и ускоряет его работу.

    В верхней части окна присутствует привычное меню, где можно открыть файл, настройки, выбрать плату, с которой вы работаете (Uno, Nano и много-много других) а также открыть проекты с готовыми примерами кода. Ниже расположен набор кнопок для работы с прошивкой, назначение клавиш вы увидите на рисунке ниже.

    В нижней части окна - область для вывода информации о проекте, о состоянии кода, прошивки и наличии ошибок.

    Основы программирования в Arduino IDE

    В начале кода нужно объявить переменные и подключить дополнительные библиотеки, если они имеются, делается это следующим образом:

    #include biblioteka.h; // подключаем библиотеку с названием “Biblioteka.h”

    #define peremennaya 1234; // Объявляем переменную со значением 1234

    Команда Define дают компилятору самому выбрать тип переменной, но вы можете его задать вручную, например, целочисленный int, или с плавающей точкой float.

    int led = 13; // создали переменную “led” и присвоили ей значение «13»

    Программа может определять состояние пина, как 1 или 0. 1 -это логическая единица, если пин 13 равен 1, то напряжение на его физической ножке будет равняться напряжению питания микроконтроллера (для ардуино UNO и Nano - 5 В)

    Запись цифрового сигнала осуществляется командой digitalWrite (пин, значение), например:

    digitalWrite(led, high); //запись единицы в пин 13(мы его объявили выше) лог. Единицы.

    Как вы могли понять обращение к портам идёт по нумерации на плате, соответствующей цифрой. Вот пример аналогичного предыдущему коду:

    digitalWrite (13, high); // устанавливаем вывод 13 в едиицу

    Часто востребованная функция задержки времени вызывается командой delay(), значение которой задаётся в миллисекундах, микросекунды достигаются с помощью

    delayMicroseconds() Delay (1000); //микроконтроллер будет ждать 1000 мс (1 секунду)

    Настройки портов на вход и выход задаются в функции void setup{}, командой:

    pinMode(NOMERPORTA, OUTPUT/INPUT); // аргументы - название переменной или номер порта, вход или выход на выбор

    Понимаем первую программу «Blink»

    В качестве своеобразного «Hello, world» для микроконтроллеров является программа мигания светодиодом, давайте разберем её код:

    В начале командой pinMode мы сказали микроконтроллеру назначить порт со светодиодом на выход. Вы уже заметили, что в коде нет объявления переменной “LED_BUILTIN”, дело в том, что в платах Uno, Nano и других с завода к 13 выводу подключен встроенный светодиод и он распаян на плате. Он может быть использован вами для индикации в ваших проектах или для простейшей проверки ваших программ-мигалок.

    Далее мы установили вывод к которому подпаян светодиод в единицу (5 В), следующая строка заставляет МК подождать 1 секунду, а затем устанавливает пин LED_BUILTIN в значение нуля, ждет секунду и программа повторяется по кругу, таким образом, когда LED_BUILTIN равен 1 - светодиод(да и любая другая нагрузка подключенная к порту) включен, когда в 0 - выключен.

    Читаем значение с аналогового порта и используем прочитанные данные

    Микроконтроллер AVR Atmega328 имеет встроенный 10 битный аналогово цифровой преобразователь. 10 битный АЦП позволяет считывать значение напряжение от 0 до 5 вольт, с шагом в 1/1024 от всего размаха амплитуды сигнала (5 В).

    Чтобы было понятнее рассмотрим ситуацию, допустим значение напряжения на аналоговом входе 2.5 В, значит микроконтроллер прочитает значение с пина «512», если напряжение равно 0 - «0», а если 5 В - (1023). 1023 - потому что счёт идёт с 0, т.е. 0, 1, 2, 3 и т.д. до 1023 - всего 1024 значения.

    Вот как это выглядит в коде, на примере стандартного скетча «analogInput»

    int sensorPin = A0;

    int ledPin = 13;

    int sensorValue = 0;

    pinMode(ledPin, OUTPUT);

    sensorValue = analogRead(sensorPin);

    digitalWrite(ledPin, HIGH);

    delay(sensorValue);

    digitalWrite(ledPin, LOW);

    delay(sensorValue);

    Объявляем переменные:

      Ledpin - самостоятельно назначаем пин со встроенным светодиодом на выход и даём индивидуальное имя;

      sensorPin - аналоговый вход, задаётся соответственно маркировке на плате: A0, A1, A2 и т.д.;

      sensorValue - переменная для хранения целочисленного прочитанного значения и дальнейшей работы с ним.

    Код работает так: sensorValue сохраняем прочитанное с sensorPin аналоговое значение (команда analogRead). - здесь работа с аналоговым сигналом заканчивается, дальше всё как в предыдущем примере.

    Записываем единицу в ledPin, светодиод включается и ждем время равное значению sensorValue, т.е. от 0 до 1023 миллисекунд. Выключаем светодиод и снова ждем этот период времени, после чего код повторяется.

    Таким образом положением потенциометра мы задаем частоту миганий светодиода.

    Функция map для Арудино

    Не все функции для исполнительных механизмов (мне ни одной не известно) в качестве аргумента поддерживают «1023», например, сервопривод ограничен углом поворота, т.е на пол оборотоа (180 градуов) (пол оборота) сервомоторчика максимальный аргумент функции равен «180»

    Теперь о синтаксисе: map (значение которое мы переводим, минимальная величина входного, максимальная величина входного, минимальная выходного, максимальная выходного значения).

    В коде это выглядит так:

    (map(analogRead(pot), 0, 1023, 0, 180));

    Мы считываем значение с потенциометра (analogRead(pot))от 0 до 1023, а на выходе получаем числа от 0 до 180

    Значения карты величин:

    На практике применим это к работе коду того-же сервопривода, взгляните на код с Arduino IDE, если вы внимательно читали предыдущие разделы, то он пояснений не требует.

    И схема подключения.

    Выводы Ардуино - очень удобное средство для обучения работы с микроконтроллерами. А если использовать чистый C AVR, или как его иногда называют «Pure C» - вы значительно уменьшите вес кода, и его больше поместиться в память микроконтроллера, в результате вы получите отличную отладочную плату заводского исполнения с возможностью прошивки по USB.

    Мне нравится ардуино. Жаль, что её многие опытные программисты микроконтроллеров безосновательно ругают, что она слишком упрощена. Упрощен, в принципе, только язык, но никто не заставляет пользоваться именно им, плюс вы можете прошить микроконтроллер через ICSP разъём, и залить туда тот код, который вам хочется, без всяких ненужных Вам бутлоадеров.

    Для тех, кто хочет проиграться с электроникой, как продвинутый конструктор - отлично подойдёт, а для опытных программистов как плата, не требующая сборки, тоже станет полезной!

    Еще больше информации про Ардуино и особенности его использования в различных схемах смотрите в электронной книге - .

    Исторически так сложилось, что программная часть Arduino состоит из интегрированной программной среды (IDE), позволяющей писать, компилировать, а также загружать написанный код в аппаратную часть. Cреда ArduinoIDE, и сам язык Wiring основаны, в первую очередь, на Processing, косвенно – на С/C++. По сути, Arduino IDE являет собой большую сборную солянку, не смеха ради, а удобства для.

    Даже внешне и Arduino IDE и Processing похожи


    Из чего состоит программа (скетч)?
    Каждая программа, какой сложной она не казалась бы, состоит из отдельных наборов блоков кода, который обозначается фигурными скобками {} . Для минимальной программы требуется всего 2 блока: setup и loop . Их присутствие обязательно в любой программе на C++ для Arduino, иначе на стадии компиляции можно получить ошибку.
    void setup() { } void loop() { }
    В функции setup() происходят начальные установки переменных, регистров. После завершения setup() управление переходит к функции loop() , которая являет собой бесконечный цикл, записанный в теле (между { } ). Именно эти команды и совершают все алгоритмические действия контроллера.

    Аппаратный « Hello , world !» - мигание светодиодом.
    То, с чего начинается первое знакомство с Arduino на стыке программной и аппаратной части - это мигание светодиодом.


    Сперва необходимо дополнить минимальную программу. У Arduino (например UNO), к 12 пину и GND подключим светодиод (цвет самого светодиода выбирается из личных предпочтений).

    Void setup() { pinMode(12, OUTPUT); } void loop() { digitalWrite(12, HIGH); delay(100); digitalWrite(12, LOW); delay(900); }
    Делаем Ctrl+C -> Ctrl+V, компилируем, загружаем, властвуем. Видим светопредставление, длящееся не более секунды. Разбираемся, почему происходит именно так.

    В ранее пустые блоки мы добавили несколько выражений . Они были размещены между фигурными скобками функций setup и loop .
    Каждое выражение – инструкция для процессора. Выражения в рамках одного блока исполняются друг за другом, строго по порядку без всяких пауз и переключений. То есть, если мы говорим об одном конкретном блоке кода, его можно читать сверху вниз, чтобы понять, что делается.

    Что же происходит между { } ?
    Как известно, пины Arduino могут работать как на выход так и на вход. Когда мы хотим чем-то управлять, то нам нужно перевести управляющий пин в состояние работы на выход. Это делается выражением в функции setup :
    pinMode(12, OUTPUT); В данной ситуации в выражении осуществляется вызов функции . В pinMode устанавливается заданный по номеру пин в заданный режим (INPUT или OUTPUT). О каком пине и о каком режиме идёт речь, указывается в круглых скобках, через запятую. В нашем случае мы хотим, чтобы 12-й пин работал как выход. OUTPUT означает выход, INPUT - вход. Уточняющие значения, такие как 12 и OUTPUT называются аргументами функции . Сколько у функции аргументов зависит от сути функции и воли ее создателя. Функции могут быть без аргументов вовсе, как это происходит на примере setup и loop.

    Далее переходим к блоку loop, по порядку:
    -вызов встроенной функции digitalWrite. Она предназначена для подачи на заданный пин логического нуля (LOW, 0 вольт) или логической единицы (HIGH, 5 вольт) В функцию digitalWrite передаётся 2 аргумента: номер пина и логическое значение.
    -вызов функции delay. Это, опять же, встроенная функция, которая заставляет процессор «уснуть» на определённое время. Она принимает всего один аргумент: время в миллисекундах, которое следует спать. В нашем случае это 100 мс. Как только 100 мс истекают, процессор просыпается и тут же переходит к следующему выражению.
    - вызов встроенной функции digitalWrite. Только на этот раз вторым аргументом является LOW. То есть устанавливаем на 12-м пине логический ноль -> подаём 0 вольт -> гасим светодиод.
    - вызов функции delay. На этот раз «спим» чуть подольше – 900 мс.

    Как только выполнена последняя функция, блок loop завершается и все происходит снова и снова. На самом деле условия, представленные в примере, достаточно вариативны, и вы можете поиграться со значениями delay, подключить несколько светодиодов и сделать подобие светофора или полицейской мигалки (все зависит от фантазии и воли создателя).

    Вместо заключения, немного о чистоте.
    На самом деле все пробелы, переносы строк, символы табуляции не имеют большого значения для компилятора. Там, где стоит пробел, может быть перенос строки и наоборот. На самом деле 10 пробелов подряд, 2 переноса строки и ещё 5 пробелов - это всё эквивалент одного пробела.


    С помощью пустого пространства можно сделать программу понятной и наглядной, или же наоборот изуродовать до неузнаваемости. Например, программу, указанную в качестве примера можно изменить так:

    void setup() { pinMode(12, OUTPUT); } void loop () { digitalWrite(12,HIGH); delay(100) ; digitalWrite(12,LOW); delay(900); }

    Чтобы при чтении ни у кого не начала течь кровь из глаз, можно следовать нескольким простым правилам:


    1. Всегда, при начале нового блока между { и } увеличивайте отступ. Обычно используют 2 или 4 пробела. Выберите одно из значений и придерживайтесь его всюду.

    Void loop() { digitalWrite(12, HIGH); delay(100); digitalWrite(12, LOW); delay(900); }
    2. Как и в обычном языке: ставьте пробел после запятых.

    digitalWrite(12, HIGH);
    3. Размещайте символ начала блока { на новой строке на текущем уровне отступа или в конце предыдущей. А символ конца блока } на отдельной строке на текущем уровне отступа:

    void setup() { pinMode(12, OUTPUT); } void setup() { pinMode(12, OUTPUT); }
    4. Используйте пустые строки для разделения смысловых блоков:

    void loop() { digitalWrite(12, HIGH); delay(100); digitalWrite(12, LOW); delay(900); digitalWrite(12, HIGH); delay(100); digitalWrite(12, LOW); delay(900); }
    5. Для того, чтобы Ваше детище было приятно читать существуют так называемые комментарии. Это конструкции в программном коде, которые полностью игнорируются компилятором и имеют значение только для того, кто это читает. Комментарии могут быть многострочными или однострочными:

    /* это многострочный комментарий */ // это однострочный