Как написать программу для ардуино самому

После ознакомления с основными элементами Arduino, а также написания программы «Hello World!» пришло время для знакомства с языком программирования.

Структура языка основана главным образом на C/C++, поэтому те, кто ранее программировал на этом языке, не будут испытывать затруднений при освоении программирования Arduino. Остальные должны освоить основную информацию о командах управления, типах данных и функциях.

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

Внимание: Рекомендуется ознакомиться (хотя бы бегло) с курсом C++, а именно с системой счисления, алгоритмами, записи кода…

Основы основ

Несколько формальных вещей, то есть таких, о которых все знают, но иногда забывают…

В Arduino IDE, как в C/C++, необходимо помнить о регистрах символов. Ключевые слова, такие как if, for всегда записываются в нижнем регистре. Каждая инструкция заканчивается на «;». Точка с запятой сообщает компилятору, какую часть интерпретировать как инструкцию.

🚀 Как написать первую программу для Arduino? Простой урок для начинающих

Скобки используются для обозначения программных блоков. Мы используем их для ограничения тела функции (см. ниже), циклов и условных операторов.

Хорошей практикой является добавление комментариев к содержимому программы, это помогает легко понять код. Однострочные комментарии начинаются с // (двойная косая черта). Многострочные комментарии начинаются с /* и заканчиваются на */

Если мы хотим подключить в нашу программу какую-либо библиотеку, мы используем команду include. Вот примеры подключения библиотек:

[slh lang=»php»] #include // стандартная библиотека
#include «svoya_biblioteka.h» // библиотека в каталоге проекта
[/slh]

Функции в Arduino

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

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

Объявление функции

Схема объявления функции выглядит следующим образом:

Блок питания 0. 30В/3A
Набор для сборки регулируемого блока питания.

[slh lang=»php»] тип имя_функции(параметр)
// инструкции для выполнения (тело функции)
return (/* возвращение значения*/);
>
[/slh]

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

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

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

параметр — параметр вызова функции. Параметры не обязательны, но зачастую они бывают полезны. Если мы напишем функцию, у которой нет аргументов, мы оставляем круглые скобки пустыми.

Внутри скобок «» содержится собственно тело функции или инструкция, которые мы хотим выполнить. Описание конкретных инструкций укажем в отдельной статье.

Все функции, возвращающие значение, заканчиваются оператором return, за которым следует возвращаемое значение. Только функции, объявленные нулевым указателем («void»), не содержат оператор return. Необходимо знать, что оператор return завершает выполнение функции независимо от местоположения.

Ниже приведены некоторые примеры деклараций функций.

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

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

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

Вызов функции

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

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

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

Если функция f1() объявлена без параметров, то при ее вызове нельзя указывать никакие параметры, т.е. вызов функции f1(0) будет неверным.

Функция plus(int a, int b) требует ровно двух параметров, поэтому вызов с одним или тремя параметрами невозможно.

Вызов y=plus(1,5) приведет к выполнению функции «plus» с параметрами «1» и «5» и сохранить возвращаемое значение в переменную «y».

Функции setup() и loop().

Обладая знаниями об объявлении и вызове функций, мы можем перейти к системным функциям Arduino: setup() и loop(). Arduino IDE в обязательном порядке необходимо объявлять эти две функции.

setup () — это функция, которая вызывается автоматически при включении питания или нажатии кнопки RESET.

В соответствии с ее именем она используется для установки начальных значений переменных, деклараций входов и выходов системы, которые обычно задаются в начальных параметрах. Благодаря своей специфике эта функция не возвращает значения и не вызывается с параметрами. Правильная декларация функции setup() представлена ниже:

[slh lang=»php»] void setup ()
// тело функции — инициализация системы
>
[/slh]

loop () — это функция, которая вызывается в бесконечном цикле. Данная функция также не возвращает значения и не вызывается с параметрами. Ниже показано правильное объявление функции loop():

Читайте также:
Как запустить программу без adobe flash player

[slh lang=»php»] void loop ()
// тело функции — программный код
>
[/slh]

Как вы видите, объявление функции loop () идентично объявлению функции setup (). Различие состоит в выполнении этих функций микроконтроллером.

Теперь мы проанализируем следующий псевдокод:

[slh lang=»php»] void setup ()
on_led1 (); //включаем светодиод led1
off_led1 (); //выключаем светодиод led1
>
void loop ()
on_led2 (); //включаем светодиод led2
off_led2 (); //выключаем светодиод led2
>
[/slh]

В функции setup () есть две инструкции: первая включает светодиод led1, подключенный к плате (например, контакт 13), а вторая выключает светодиод led1.

Функция loop () имеет идентичные инструкции для включения и выключения светодиода led2, подключенного к плате (например, контакт 12).

В результате запуска программы светодиод led1 мигнет один раз, в то время как led2 будет загораться и гаснуть до тех пор, пока включено питание Arduino.

Нажатие кнопки RESET приведет к тому, что led1 снова мигнет один раз, а led2 снова начнет постоянно мигать.

Подведем итог:

  • Функции setup () и loop () — это системные функции, которые должны быть определены в каждом проекте. Даже в ситуации, когда в одном из них мы не пропишем какой-либо код, мы все равно должны объявить эти две функции;
  • Функция setup () выполняется один раз, loop() выполняется непрерывно;
  • Мы создаем собственные функции в одном файле;
  • Мы можем вызвать свои функции как из setup () и loop (), так и из других функций;
  • Наши собственные функции можно вызывать с параметрами и возвращать значение;
  • Вызов функции должен быть совершен в соответствии с ее декларацией.

Источник: www.joyta.ru

«Пишем свой первый скетч» Урок № 1

Урок № 1
Это продолжение цикла уроков про Ардуино для начинающих.

Предыдущие уроки можно посмотреть здесь.
Урок № 0 — «Введение в программирование Ардуино»
Урок № 0.5 — «Продолжение вводного урока.»Первое подключение Ардуино к компьютеру.»

В этом уроке, видео на который можно посмотреть на канале YOUTUBE
рассказано как подключить светодиод, рассчитать значение токоограничивающего резистора, про закон Ома, и многое другое.
Что такое функция void setup() и void loop(), вообщем посмотрите, не пожалеете.

Для этого урока, для основной его части потребуются.

Ардуино Нано v 3.0
Макетная плата (беспаечная) Breadboard
Провода 5 шт.
Резисторы 220 Ом 3 шт.
Светодиоды 3 шт.

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

Для дополнительного занятия потребуется ещё

Этот урок надо использовать вместе с видео.

Скетчи основной части урока.
Мигание 1 светодиодом. Скачать.
Мигание 3 светодиодами. Скачать.

Теперь, как и обещал некоторые интересности.

Вот наш код из первого скетча

void setup() pinMode(LED, OUTPUT); // УСТАНАВЛИВАЕМ ЦИФРОВОЙ ПИН 13 НА ВЫХОД
>

void loop() digitalWrite(LED, HIGH); // ЗАЖИГАЕМ СВЕТОДИОД
delay(1000); // ЖДЁМ 1 СЕКУНДУ
digitalWrite(LED, LOW); // ГАСИМ СВЕТОДИОД
delay(1000); // ЖДЁМ 1 СЕКУНДУ
>

Теперь как и обещал сократим код в функции loop()
И вместо 4 строчек написать всего 2
void loop() digitalWrite(LED, !digitalRead(LED)); // если светодиод был выключен – включаем и наоборот
delay(1000); // ждем 1 секунду
>
Что делают эти строчки.
Мы получаем текущее значение светодиода digitalRead(LED) и !digitalRead(LED) переворачиваем его(инвертируем).
Если светодиод горел, то гасим его
Если светодиод не горел, то зажигаем его.

с Логическими операторами мы познакомимся в следующих уроках

(логическое И) Истина, если оба операнда истина.

|| (логическое ИЛИ) Истина, если хотя бы один операнд истина.

! (логическое отрицание) Истина, если операнд Ложь, и наоборот.

Замена delay()

Эта функция служит для остановки микроконтроллера.
Как я и говорил в видео, функцию delay() надо применять очень осторожно.
Означает остановить выполнение всех программ (ну почти всех) и ждать пока не пройдёт время, указанное в скобках. Оно указывается в миллисекундах (1000 миллисекунд = 1 секунде) и пока это время не закончится ARDUINO будет бездействовать.
Есть ещё прерывания, но это мы будем изучать в следующих уроках.

Правильнее будет использовать функцию millis();
Она возвращает количество миллисекунд с момента начала выполнения программы.
Количество миллисекунд в millis() ограничено 50 днями. При наступлении этого времени счётчик сбросится 0.

Вот что у нас теперь получилось
#define LED 13
#define STOP 1000 // 1000 миллисекунд — это 1 секунды
unsigned long prev_ms = 0; // здесь будет храниться время последнего изменения состояния светодиода

void setup() pinMode(LED, OUTPUT); // УСТАНАВЛИВАЕМ ЦИФРОВОЙ ПИН 13 НА ВЫХОД
>

void loop()
/*
проверяем – настало ли время изменить состояние светодиода
для этого считываем значение светодиода digitalRead(LED),
а затем сверяем полученный интервал с нужным интервалом
*/
if (millis() — prev_ms > STOP) <
// текущее время –(минус) время последнего изменения. Если он больше 1000(1 сек.) то условие верно
digitalWrite(LED, !digitalRead(LED)); // если светодиод был выключен – включаем и наоборот
prev_ms = millis();
>
/*
Здесь могут быть другие команды, которые нужно выполнить и неважно, что будет делать микроконтроллер в данное время,Если настало время STOP, он прервётся, выполнит задачу, и начнёт с того же места, где прервался.
*/
>

Теперь переходим к самому интересному.
Дополнительной части урока.
Напишу её сегодня-завтра. Хочу, чтобы на выходные вам было чем заняться.

Удачи вам в освоении этого непростого, но интересного дела.
Изучив эти уроки, вы освоите новую, интересную профессию – Программист. Освоив её, вы можете быть спокойны за свою будущее, ведь по статистике, программист самый востребованный и высокооплачиваемый специалист в наше время.
Смотрите новые уроки. Подписывайтесь на канал. И удачи.

Читайте также:
Программа открывается в фоновом режиме как исправить

Источник: arduino-kid.ru

Arduino первая программа


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

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

Среда разработки программ для arduino

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

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

А узнает он по адресу ячейки памяти. То есть наткнувшись на команду сложения двух чисел, он спрашивает: «А где мол лежат данные?» А ему говорят: «В ячейке 0x56FE и 0xD34A». Он: «Понял». Вроде все ясно. Программист написал в программе что данные лежат по этим адресам, если код написан на ассемблере, и все встает на свои места.

Но нам-то такое счастье-то не надо. Нам не пристало ковырятся в дедовском коде. Вот для нас и придумали такое понятие как переменная. То есть например переменная с именем val говорит нам о том что мы выделяли ячейку памяти по какому-то адресу в памяти под именем val. Мудрено, да.

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

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

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

За это отвечает тип переменной. Я приведу несколько типов, которые считаются самые необходимые и часто использующие. Если вам захочется узнать все типы, то можно зайти на сайт учебника arduino и там изучить все варианты.(Правда на английском). И так, типы переменных.

boolean Переменная с таким типом является логической. Она может принимать всего два значения, либо true(истина), либо false(лож)
char Переменная с таким типом является знаковой и длинной в один байт. Может принимать значение от -127 до +127, либо принимать значение символа из таблицы ASCII. Например символ ‘1’ примет значение 48. Более подробное описание символов мы затронем когда будем работать со строками.
unsigned char То же самое что и char за одним исключением. Слово unsigned говорит о том, что значение данной переменной может принимать только в положительном диапазоне. То есть от 0 до 255 и никаких отрицательных.
int Переменные с таким типом являются знаковыми, но в отличии от char имеют длину в два байта. Значения, которые можно хранить в данной переменной, лежат в диапазоне от -32768 до +32767.
unsigned int Этот тип переменной указывает тоже на двубайтовое значение, но как и unsigned char имеет строго положительное значение и лежит в диапазоне от 0 до 65535.
byte Данный тип переменной похож на unsigned char и принимает значения в пределах от 0 до 255.
float Данный тип переменной дает возможность храить значения с плавающей точкой. Под эту переменную будет выделено 4 байта. Диапазон значений может лежать в пределах от -3.4028235E+38 до 3.4028235E+38.

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

Поэтому рекомендую задавать человекопонятные имена, например LEDdiod. Сразу понятно, что в данной переменной лежит значения состояния светодиода, либо ноль, либо единица. Но есть одно ограничение, нельзя начинать имя переменной с цифры. 5LEDdiod будет являться ошибкой.

Это правило тянется из языка С, я не пробовал проверять на arduino, но надеюсь что оно и здесь работает. Так же необходимо запомнить что имя LED и led это не одно и тоже. Регистр тоже учитывается.
Так, с именами разобрались. Давайте, опираясь на полученные знания, попробуем написать первую программу. Что она будет делать? А ничего, просто микать светодиодом установленным на плате. На чистом поле текстового редактора пишем следующий код.

Читайте также:
Какая дисциплина отсутствовала в программе

Первая программа

Что мы собственно здесь написали. А написали мы следующее, сначала мы объявили функцию setup(), а за ней функцию loop(). Объяснять что такое функция, пока очень рановато, поэтому просто копируем написанное, но на одном моменте я все же подробно остановлюсь.

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

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

Отсюда на первых парах вам нужно просто запомнить, что любая программа для arduino должна начинаться именно с объявления этих двух функций. А теперь давайте разберемся для чего эти функции нужны. Первая с названием setup() нужна для начальной конфигурации программы.

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

Поэтому нужно пока запомнить, что код написанный в теле функции setup() выполнится один раз. А вот основная программа, которая будет выполнятся на протяжении всей работы микроконтроллера, записывается в тело функции loop(). Давайте подведем итоги. Для начальной настройки и выполнении разово некого кода заполняем тело функции setup().

Для работы основной программы заполняем тело функции loop(). От слов к делу. Для того чтобы помигать светодиодом, нам необходимо посмотреть где он подключен. На плате arduino UNO что у меня, он подключен к 13 ножке выводов DIGITAL. А теперь смотрите. Сначала в функции setup() мы настроим ножку, а затем в функции loop() будем включат и выключать светодиод.

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

(тело любой функции обременяется фигурными скобками)

Инициализация пина 13

Что собственно делает эта строчка. Задача функции pinMode() является настройка пина на вход или на выход. Для того чтобы данная функция поняла что ей делать, она принимает два аргумента. Первый аргумент отвечает за номер пина. В нашем случае это 13, а второй аргумент

(все аргументы передаваемые функциям пишутся через запятую)

это направление. В нашем случае это выход OUTPUT. в конце функции как можно заметить стоит точка с запятой. Данная точка с запятой говорит о том что текущая коменда закончилась. Следует запомнить как таблицу умножения, что каждая команда ОБЯЗТЕЛЬНО должна заканчиваться точкой с запятой. Вот таким образом мы настроили вывод.

Теперь переходим к телу функции loop() и напишем четыре строки.

Основное тело программы

Что эти строчки делают. Первая digitalWrite(13, HIGH); это функция которая выводит в пин некое значение. Для того чтобы она понимала какое значение и куда ей выводить мы снова передаем два аргумента. Первый это номер пина, а второй HIGH то есть 1. Как только эта функция отработает, на ножке 13 появится логическая единица

(логическая единица всегда равна напряжению питания МК. Чаще всего это 5 вольт или 3,3 вольта)

. Следующая строка delay(1000); это пауза. Данной функции в качестве аргумента передается значение времени в миллисекундах. В нашем случае это 1000 мс или 1 секунда. Теперь смотрите что происходит. Сначала функция digitalWrite(13, HIGH); выводит на ножку логическую единицу. Затем функция delay(1000); останавливает работу программы на 1 секунду

(она не останавливает в прямом смысле, а просто заставляет процессор таптаться на одном месте ничего не делая 1 секунду)

, а затем выполняется функция digitalWrite(13, LOW);. Как не трудно догадаться она выводит на ножку логический ноль. А затем снова останавливается на 1 секунду. Так как функция loop() является циклической, то после паузы программа возвращается к началу тела функции loop() и все начинается с начала. Вот и все, наша первая программа написана.

Давайте ее загрузим в нашу arduino. Для этого нажмите на кнопку «Вгрузить».

Загрузка программы

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

Читать предыдущий урок Читать следущий урок
JW Player goes here

Вадим 07.03.15 22:34

А как правильно записать если у нас несколько пинов настроено на выход, пробовал через запятую pinMode(1,2,3 OUTPUT) ардуино ругается.

Алексей 07.03.15 23:52

Правильно что ругается. Функция pinMode() принимает всего два аргумента, а вы ей четыре пихаете. Выход из положения проинициализировать в цикле.

Источник: www.avrki.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru