Домой / Группы / Язык программирования Arduino. Arduino для начинающих: пошаговые инструкции. Программирование и проекты Arduino: с чего начать

Язык программирования Arduino. Arduino для начинающих: пошаговые инструкции. Программирование и проекты Arduino: с чего начать

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

В целом, не важно какой именно у вас процессор: последний Intel Pentium в вашем ноутбуке или микроконтроллер на плате Arduino. Принципы написания программы, т.е. программирования , в обоих случаях одни и те же. Различается лишь быстродействие и объём возможностей по работе с другими устройствами.

Что такое программа и куда её писать

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

Байт инструкции Что он означает для процессора
00001001 означает: взять следующий байт и запомнить его в ячейке №1
00000110 …это как раз следующий байт, который мы запоминаем в ячейке №1: число 5
00011001 означает: отнять от значения в ячейке №1 единицу и оставить там обновлённый результат
00101001 означает: сравнить значение в ячейке №1 с нулём и если оно ноль - перепрыгнуть через столько байт, сколько указано в следующем байте
00000100 …если результат был ноль, мы хотим прыгнуть через 4 байта, к предпоследней инструкции
10000011
01000001 …букве «A» как раз соответствует этот код
00101000 означает, что мы хотим прыгнуть назад на столько байт, сколько указано в следующем байте
00000110 …прыгать будем на 6 байт назад, к инструкции №3
10000011 означает, что мы хотим вывести на экран символ, код которого записан в следующем байте
00100001 …знаку «!» как раз соответствует этот код

В результате исполнения такой последовательности инструкций на экран будет выведена паническая фраза «АААА!».

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

Зачем нужны языки программирования

Для упрощения задачи в миллион раз были придуманы языки программирования. Их очень много и даже из тех, что постоянно на слуху можно быстро вспомнить десяток-другой: Assembler, C, C++, C#, Java, Python, Ruby, PHP, Scala, JavaScript.

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

Проблема в том, что такие языки не понятны процессору и перед тем как отдать ему эту программу, её нужно скомпилировать : перевести с естественного языка в те самые инструкции в виде нулей и единиц. Этим занимаются программы, которые называются компиляторами . У каждого языка, если только он не остался на уровне фантазий, есть свой компилятор. Для популярных языков их обычно несколько на выбор, от разных производителей и для разных платформ. Большинство из них свободно доступно в интернете.

Итак, есть программы на вполне понятном человеку языке: их ещё называют «исходным кодом», просто «кодом» или «исходниками». Они пишутся в простые текстовые файлы с помощью любого текстового редактора, хоть с помощью notepad. Затем они превращаются в понятные процессору наборы нулей и единиц с помощью компилятора: компилятор получает на вход исходный код, а на выходе создаёт бинарный исполняемый файл , тот самый, понятный процессору.

Бинарные файлы не пригодны для чтения и предназначены, в общем, лишь для исполнения процессором. Они могут иметь разный тип в зависимости от того для чего получены: .exe - это программы для Windows, .hex - программы для исполнения микроконтроллером типа Arduino и т.п.

Почему же существует столько языков программирования и в чём разница?

    Почему? Потому что на Земле много людей и компаний, и многие считали, что могут сделать лучше всех: удобнее, понятнее, быстрее, стройнее.

    В чём разница: разные языки - это разный баланс скорости написания, понятности при чтении и скорости исполнения.

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

Например, язык Perl. Пишется быстро; понять, что имел в виду программист невозможно; исполняется медленно:

sub b{ $n = 99 - @_ - $_ || No; "$n bottle" . "s" x!!-- $n . " of beer" } ; $w = " on the wall" ; die map { b. "$w,\n " . b. ",\n Take one down, pass it around,\n " . b(0 ) . "$w.\n \n " } 0 .. 98

Язык Java. Пишется относительно долго; читается просто; исполняется довольно быстро, но занимает много памяти:

class bottles { public static void main(String args ) { String s = "s" ; for (int beers= 99 ; beers>- 1 ; ) { System .out .print (beers + " bottle" + s + " of beer on the wall, " ) ; System .out .println (beers + " bottle" + s + " of beer, " ) ; if (beers== 0 ) { System .out .print ("Go to the store, buy some more, " ) ; System .out .println ("99 bottles of beer on the wall.\n " ) ; System .exit (0 ) ; } else System .out .print ("Take one down, pass it around, " ) ; s = (-- beers == 1 ) ? "" : "s" ; System .out .println (beers + " bottle" + s + " of beer on the wall.\n " ) ; } } }

Язык Assembler. Пишется долго; читается сложно; исполняется очень быстро:

code segment assume cs : code , ds : code org 100h start : ; Main loop mov cx , 99 ; bottles to start with loopstart: call printcx ; print the number mov dx , offset line1 ; print the rest of the first line mov ah , 9 ; MS-DOS print string routine int 21h call printcx ; print the number mov dx , offset line2_3 ; rest of the 2nd and 3rd lines mov ah , 9 int 21h dec cx ; take one down call printcx ; print the number mov dx , offset line4 ; print the rest of the fourth line mov ah , 9 int 21h cmp cx , 0 ; Out of beer? jne loopstart ; if not, continue int 20h ; quit to MS-DOS ; subroutine to print CX register in decimal printcx: mov di , offset numbufferend ; fill the buffer in from the end mov ax , cx ; put the number in AX so we can divide it printcxloop: mov dx , 0 ; high-order word of numerator - always 0 mov bx , 10 div bx ; divide DX:AX by 10. AX=quotient, DX=remainder add dl , "0" ; convert remainder to an ASCII character mov [ ds : di ] , dl ; put it in the print buffer cmp ax , 0 ; Any more digits to compute? je printcxend ; if not, end dec di ; put the next digit before the current one jmp printcxloop ; loop printcxend: mov dx , di ; print, starting at the last digit computed mov ah , 9 int 21h ret ; Data line1 db " bottles of beer on the wall," , 13 , 10 , "$" line2_3 db " bottles of beer," , 13 , 10 , "Take one down, pass it around," , 13 , 10 , "$" line4 db " bottles of beer on the wall." , 13 , 10 , 13 , 10 , "$" numbuffer db 0 , 0 , 0 , 0 , 0 numbufferend db 0 , "$" code ends end start

На чём программируется Arduino

Если говорить об Arduino или о микроконтроллерах от компании Atmel, на каком языке можно писать программы для них? Теоретический ответ: на любом. Но на практике, выбор ограничивается языками Assembler, C и C++. Это связанно с тем, что в сравнении с настольным компьютером у них очень ограниченные ресурсы. Килобайты памяти, а не гигабайты. Мегагерцы на процессоре, а не гигагерцы. Это плата за дешевизну и энергоэффективность.

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

Assembler, как вы видели, нельзя назвать самым простым и элегантным и, как результат, флагманским языком для Arduino является C/C++.

Во многих источниках говорится, что Arduino программируется на языке Arduino, Processing, Wiring. Это не совсем корректное утверждение. Arduino программируется на C/C++, а то, что называется этими словами - это просто удобный «обвес», который позволяет решать многие типичные задачи, не изобретая велосипед каждый раз.

Почему C и C++ упоминаются в одном предложении? C++ - это надстройка над C. Всякая программа на C является корректной программой для C++, но не наоборот. Вы можете пользоваться и тем и другим. Чаще всего вы даже не будете задумываться о том, что используете, решая текущую задачу.

Ближе к делу: первая программа

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

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

Установите среду и запустите её. В появившемся окне вы увидите: большая часть места отдана текстовому редактору. В него и пишется код. Код в мире Arduino ещё называют скетчем .

Итак, давайте напишем скетч, который ничего не делает. То есть минимально возможную правильную программу на C++, которая просто прожигает время.

void setup() { } void loop() { }

Не будем пока заострять внимание на значении написанного кода. Скомпилируем его. Для этого в Arduino IDE, на панели инструментов есть кнопка «Verify». Нажмите её и через несколько секунд бинарный файл будет готов. Об этом возвестит надпись «Done compiling» под текстовым редактором.

В результате, у нас получился бинарный файл с расширением.hex , который может исполнять микроконтроллер.

Теперь необходимо подсунуть его Arduino. Этот процесс называется загрузкой, прошивкой или заливкой. Для выполнения загрузки в Arduino IDE, на панели инструментов есть кнопка «Upload». Соедините Arduino с компьютером через USB-кабель, нажмите «Upload» и через несколько мгновений программа будет загружена в Arduino. При этом программа, которая была там ранее будет стёрта.

Об успешной прошивке возвестит надпись «Done Uploading».

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

    В меню Tools → Board выбран тот порт, к которому действительно подключена Arduino. Можете повставлять и повынимать USB-кабель, чтобы понять какой порт появляется и исчезает: это и есть Arduino.

    Вы установили необходимые драйверы для Arduino. Это необходимо для Windows, не требуется под Linux и необходимо только для старых плат до Arduino Duemilanove на MacOS.

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

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

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

Сборка сложнейших схем и соединение плат может осуществляться без паяльника, а с помощью перемычек с разъёмными соединениями «папа» и «мама». Так могут подключаться как навесные элементы, так и платы расширения, которые на лексиконе ардуинщиков зовут просто «Шилды» (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 разъём, и залить туда тот код, который вам хочется, без всяких ненужных Вам бутлоадеров.

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

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

28 09.2016

Вы задумывались облегчить себе жизнь в быту? Чтобы были вещи, которые решали бы за вас повседневные, рутинные задачи. Умное устройство, которое бы осуществляло полезную функцию, например поливало огород, убирало комнату, переносило груз. Эти задачи может решать . Но просто купить её будет недостаточно. Любому промышленному логическому контроллеру или микросхеме нужен “мозг”, чтобы выполнять определённую последовательность действий. Для свершений операций в нашем случае подойдёт язык программирования ардуино.

Из этой статьи вы узнаете:

Приветствую вас, друзья! Для тех, кто меня не знает — меня зовут Гридин Семён. Вы можете прочитать обо мне . Сегодняшняя статья будет посвящена двум основным программам, без которых не будет у нас дальнейшего движения и взаимопонимания.

Общее описание языков программирования

Как я и писал выше, рассматривать мы с вами будем две популярные среды разработки. По аналогии с , можно разделить на графический редактор и “умный блокнот”. Это программы Arduino IDE и FLprog.

Основой среды разработки является Processing/Wiring — это обычный C++, дополненный функциями и различными библиотеками. Существует несколько версий для операционных систем windows, Mac OS и Linux.

В чём их принципиальное различие?? Arduino IDE — это среда разработки, в которой описывается код программы. А FLprog похож на CFC CoDeSyS, позволяющий рисовать диаграммы. Какая среда лучше? Обе хороши и удобны по своему, но если хотите заниматься контроллерами серьёзно, лучше всего изучить языки, похожие на СИ. Их главный плюс в гибкости и неограниченности алгоритма. Мне очень нравится Arduino IDE.

Описание Arduino IDE

Дистрибутив можно скачать на официальном сайте . Скачиваем архив, он занимает чуть более 100 мб. Установка стандартная, как и все приложения для Windows. Драйвера для всех типов плат должны быть установлены в пакете. И вот каким образом выглядит рабочее окно программы.

Среда разработки Arduino состоит из:

  • редактора программного кода;
  • области сообщений;
  • окна вывода текста;
  • панели инструментов с кнопками часто используемых команд;
  • нескольких меню

Настройки Arduino IDE

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

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

Многие библиотеки снабжаются примерами, расположенными в папке example. Выбор библиотеки в меню приведет к добавлению в исходный код строчки:

Arduino

#include

#include

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

После того как мы подключили электронную плату к компьютеру. Мы осуществляем следующие настройки — выбираем плату Arduino и Com-порт по которому будем соединяться.

Arduino

void setup() { // initialize digital pin 13 as an output. pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000);

void setup () {

// initialize digital pin 13 as an output.

pinMode (13 , OUTPUT ) ;

void loop () {

digitalWrite (13 , HIGH ) ;

delay (1000 ) ;

digitalWrite (13 , LOW ) ;

delay (1000 ) ;

Так, кстати говоря, удобно проверять работоспособность платы, пришедшей с магазина. Быстро и легко.

Есть ещё одна удобная вещь. Называется она Монитор последовательного порта (Serial Monitor ). Отображает данные, посылаемые в платформу Arduino. Я обычно смотрю, какие сигналы выдают мне различные датчики, подключённые к плате.

Подключение библиотек

Существуют разные способы для добавления пользовательских функции. Подключить библиотеки можно тремя способами:

  1. С помощью Library Manager
  2. С помощью импорта в виде файла.zip
  3. Установка вручную.

1. С помощью Library Manager. В рабочем окне программы выбираем вкладку Скетч. После этого нажимаем на кнопку Подключить библиотеку. Перед нами откроется менеджер библиотек. В окне будут отображаться уже установленные файлы с подписью installed, и те, которые можно установить.

2.С помощью импорта в виде файла.zip. Часто в просторах интернета можно встретить запакованные в архивы файлы библиотек с расширением zip. В нём содержится заголовочный файл.h и файл кода.cpp. При установке не нужно распаковывать архив. Достаточно в меню Скетч — Подключить библиотеку — Add .ZIP library

3.Установка вручную. Сначала закрываем программу Arduino IDE. Наш архив мы сначала распаковываем. И файлы с расширением.h и.cpp переносим в папку с тем же названием, как и архив. Закидываем папку в корневой каталог.

Мои документы\Arduino\libraries

Описание FLPprog

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

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

Попробуем с вами создать простенький проект. Будем переключать 13 выход на светодиод.

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

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

После создания алгоритма, кликнем на кнопочку компилировать, программа даёт готовый скетч на IDE.

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

22 сентября я участвовал в Краснодаре на семинаре “Сенсорные панельные контроллеры ОВЕН СПК”. Проводили конференцию в фешенебельном и красивом отеле “Бристоль”. Было очень интересно и круто.

В первой части семинара нам рассказывали о возможностях и преимуществах продукции компании ОВЕН. После был кофе-брейк с пончиками. Я понабрал кучу всего, и пончиков, и печенья, и конфет, так как был очень голодным.=)

Во второй части семинара после обеда нам презентовали . Много чего рассказали про Web — визуализацию. Эта тенденция начинает набирать обороты. Ну конечно, управлять оборудованием через любой интернет — браузер. Это реально круто. Вот кстати говоря само оборудование в чемоданчике.

Я в ближайшем будущем опубликую серию статей по CoDeSyS 3.5. Так что, если кому интересно подписывайтесь или просто заходите в гости. Буду всегда рад!!!

Кстати чуть не забыл, следующая статья будет о к электронной плате 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»

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

Вам понадобится

  • плата Arduino UNO;
  • кабель USB (USB A - USB B);
  • персональный компьютер;
  • светодиод;
  • пара соединительных проводов длиной 5-10 см;
  • при наличии - макетная плата (breadboard).
Arduino IDE

Загрузите среду разработки для Ардуино (Arduino IDE) с официального сайта для своей операционной системы (поддерживаются ОС Windows, Mac OS X, Linux). Можете выбрать установщик (Installer ), можете архив (ZIP file for non admin install ). Во втором случае программа просто запускается из папки, без установки. Скачанный файл содержит кроме среды разработки также драйверы для плат семейства Arduino.

Загружаем среду разработки Arduino IDE с официального сайта

2 Подключение Arduino к компьютеру

Подключите плату Arduino с помощью USB кабеля (типа USB-A - USB-B) к компьютеру. Должен загореться зелёный светодиод ON на плате.


Кабель "USB-A - USB-B" для подключения Arduino к компьютеру

3 Установка драйвера для Arduino

Установите драйвер для Arduino. Рассмотрим вариант установки на операционную систему Windows. Для этого дождитесь, когда операционная система предложит установить драйвер. Откажитесь. Нажмите клавиши Win + Pause , запустите Диспетчер устройств . Найдите раздел «Порты (COM и LPT)» . Увидите там порт с названием Arduino UNO (COMxx) . Кликните правой кнопкой мыши на нём и выберите Обновить драйвер . Укажите операционной системе расположение драйвера. Он находится в поддиректории drivers в той папке, которую мы только что скачали.

Запомните порт, к которому подключена плата Arduino. Чтобы узнать номер порта, запустите диспетчер устройств и найдите раздел «Порты (COM и LPT)». В скобках после названия платы будет указан номер порта. Если платы нет в списке, попробуйте отключить её от компьютера и, выждав несколько секунд, подключить снова.

Arduino в диспетчере устройств Windows

4 Настройка Arduino IDE

Укажите среде разработки свою плату. Для этого в меню Инструменты Плата выберите Arduino UNO .


Выбираем плату Arduino UNO в настройках

Укажите номер COM-порта, к которому подключена плата Arduino: Инструменты Порт .


Задаём последовательный порт, к которому подключена плата Arduino

5 Открываем пример программы

Среда разработки уже содержит в себе множество примеров программ для изучения работы платы. Откройте пример "Blink": Файл Образцы 01.Basics Blink .Кстати, программы для Ардуино называются «скетчи».


Открываем пример скетча для Arduino

6 Сборка схемы со светодиодом

Отключите Arduino от компьютера. Соберите схему, как показано на рисунке. Обратите внимание, что короткая ножка светодиода должна быть соединена с выводом GND, длинная - с цифровым пином "13" платы Arduino. Удобно пользоваться макетной платой, но при её отсутствии соедините провода скруткой.

Цифровой пин "13" имеет встроенный резистор на плате. Поэтому при подключении светодиода к плате внешний токоограничивающий резистор использовать не обязательно. При подключении светодиода к любым другим выводам Ардуино использование резистора обязательно, иначе сожжёте светодиод, а в худшем случае - порт Ардуино, к которому подключён светодиод!


Схема подключения светодиода к Arduino в память Ардуино

Теперь можно загрузить программу в память платы. Подключите плату к компьютеру, подождите несколько секунд, пока происходит инициализация платы. Нажмите кнопку Загрузить , и Ваш скетч запишется в память платы Arduino. Светодиод должен начать весело подмигивать вам с периодичностью 2 секунды (1 секунду горит, 1 выключен). Ниже приведён код нашей первой программы для Ардуино.

void setup() { // блок инициализации pinMode(13, OUTPUT); // задаём пин 13 в качестве выхода. } void loop() { // цикл, который повторяется бесконечно, пока включена плата: digitalWrite(13, HIGH); // подаём на 13 вывод высокий уровень - зажигаем светодиод delay(1000); // на 1000 мсек = 1 сек. digitalWrite(13, LOW); // подаём на 13 вывод низкий уровень - гасим светодиод delay(1000); // на 1 сек. } // далее цикл повторяется

Почитайте комментарии в тексте программы - их достаточно чтобы разобраться с нашим первым экспериментом. Сначала описываем блок инициализации setup() , в котором задаём начальные значения переменных и функции выводов Arduino. Далее следует бесконечный цикл loop() , который повторяется снова и снова, пока на плату подаётся питание. В этом цикле мы выполняем все необходимые действия. В данном случае - зажигаем и гасим светодиод. Оператор delay() задаёт длительность выполнения (в миллисекундах) предшествующего оператора. Оператор digitalWrite() указывает Ардуино, на какой вывод подать напряжение, и какой именно уровень напряжения.Ваш первый скетч готов!

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

Обратите внимание

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