Open Fab Lab Wiki Знакомство с Arduino — Сайт русскоязычного фаблаб-сообщества

Знакомство с Arduino

Материал из Сайт русскоязычного фаблаб-сообщества
Перейти к: навигация, поиск

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

Содержание

Контроллер Arduino

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

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

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

Теперь подсоедините контроллер к компьютеру, и выждав несколько секунд, чтобы он распознался, запустите Arduino IDE. Вам надо указать два параметра настроек. В меню Сервис >> Плата выберите Arduino Nano w/ ATmega328. А в меню Сервис >> Последовательный порт выберите один из предложенных портов (иногда он там всего один). У меня это COM68 (На Linux-машинах порт может называться как-нибудь вроде devttyUSB0, но как бы он не назывался, это не важно).

Arduino connect.jpg

В интерфейсе программы есть пять сине-зеленых кнопочек. Обратим внимание на четвертую из них, с направленной вверх стрелкой. Это кнопка "Открыть файл". Нажмем ее. Откроется список примеров. Выберем 01.Basics >> Blink и в основном окне появится текст программы с комментариями. Это программа для микроконтроллера на языке Arduino или, как ее еще называют, скетч. На самом деле она очень проста, и, если Вы дружите с английским, то уже догадались, что она будет мигать светодиодом.

ArduinoIDE.png

Все в программе, что начинается с "//" отображается серым цветом и является комментарием для читателя, и никак не воспринимается компьютером.

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

int led = 13;

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

Оставшаяся часть программы состоит из двух функций, которые есть и в каждой другой Arduino-программе:

void setup() { ...что-то исполняемое однажды, при запуске контроллера... }
void loop() { ...что-то исполняемое снова и снова в цикле... }

В первой из них находится строка указывающая режим работы 13-го вывода, который мы в еще первой строке обозвали led, что означает по-русски светодиодъ :)

Во второй происходит следующий незамысловатый цикл:

void loop() {
  digitalWrite(led, HIGH);   // включить светодиод (HIGH означает логическую 1)
  delay(1000);               // ждем 1000 мс
  digitalWrite(led, LOW);    // выключить светодиод (LOW означает логическую 0)
  delay(1000);               // ждем 1000 мс 
  }

Все, вот и вся программа. Нажмем вторую кнопочку в верхнем ряду. ту что со стрелкой вправо ("Загрузить"). Произойдут процессы компиляции и загрузки. Если на этом этапе ArduinoIDE найдет ошибку в программке, то станет негодовать, указывая положение и предполагаемый характер ошибки. Но мы ничего не меняли, и этого произойти не должно.

В результате этих действий, на борту контролера должен замигать светодиод с длительностью свечения 1000 мс (то есть 1 секунду) и такими же паузами между импульсами.

Насладившись этим зрелищем, давайте модифицируем программу. А именно - в первом операторе delay(1000); удалим два нуля, так, чтобы получилось delay(10); то есть пауза не в 1000, а в 10 миллисекунд. И, снова нажмем кнопочку "Загрузить". Как и следовало ожидать, характер мигания изменится - интервал между вспышками останется равным 1000 мс, но сами они станут очень короткими. Замечательно то, что для перепрограммирования контроллера нам не пришлось делать ничего сложного - просто изменить программу и нажать кнопку загрузки. Это позволяет редактировать программы и быстро испытывать их сколько угодно раз не разбирая и не отключая собранного электронного устройства.

Работа с макетной платой

А что, если мы хотим мигать не встроенным светодиодом, а, например, лампочкой?

Для этого нам понадобится макетная плата (разберитесь в статье про нее как она устроена и работает). Соберите цепь, показанную на фотографии. Найдите у контроллера вывод, обозначенный GND - это "земля", или общий, в смысле нулевой провод. Идущий от него столбик отверстий соединим перемычкой с одним из контактов самого нижнего ряда макетной платы. Теперь на все отверстия платы, расположенные вдоль синей линии, подан "ноль" с контроллера.

Найдем вывод D13, которым мы управляем и установим на плату лампочку так, чтобы один ее вывод попал в "ноль", а второй в одно из отверстий соответствующих выводу D13.

Arduino lamp.jpg

Мы видим, что теперь ни светодиод не мигает, ни лампочка не горит. Так и должно быть - лампочка ведь светит из-за нагрева, а он просто не успевает произойти за 10 миллисекунд. То есть дело не в схеме, а в программе. Давайте вернем программу Blink в исходное состояние, дописав удаленные было нули. Загрузим ее в контроллер - и вот теперь лапочка замигает. И светодиод замигает тоже.

Arduino lamp light.jpg

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

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

Аналоговые сигналы и передача данных

Давайте попробуем измерить что-нибудь при помощи контроллера. Соберем для начала такую вот схему:

Arduino abstract measurement.jpg

Здесь мы выводим нулевое напряжение и на верхнюю синюю линейку макетной платы (обратите внимание что она расположена на этот раз ближе к середине платы чем красная). Для удобства этого на верхней стороне контроллера есть дополнительный вывод GND. Межд выводом D9 и нулевой линейкой устанавливаем лампочку.

Почему понадобилось переносить ее сюда? Что ей не сиделось на D13? Дело в том, что в отличие от дискретных (либо есть, либо нет) сигналов из предыдущего примера, теперь мы будем работать с аналоговыми, то есть плавно изменяющимися сигналами. А не каждый вывод контроллера способен такие сигналы выдавать. Если мы сравним надписи D9 и D8 на плате, то увидим над D9 небольшой значок, означающий как раз способность этого вывода выдавать якобы аналоговый сигнал.

Почему якобы? На самом деле, этот сигнал не вполне аналоговый. Он тоже дискретный, но представляет собой быстро следующие импульсы с регулируемой длительностью промежутков между ними (т.е. скважностью). Регулируя длительность импульсов и промежутков между ними, мы можем таким образом подавать больше или меньше энергии в единицу времени. Этот принцип называется ШИМ (широтно-импульсная модуляция). Получаемый на его выходе сигнал можно сгладить (усреднить во времени) при помощи специального фильтра, и получить истинно аналоговый сигнал, но пока мы не будем загружаться этим. Такие устройства, как лампочка, сами по себе усредняют сигнал, и мы можем забыть пока про все эти длительности промежутков и смотреть просто на яркость ее свечения.

Кроме того, на этой схеме мы задействовали красную линию контактных отверстий внизу макетной платы для распространения напряжения 5В взятого с соответствующего вывода контроллера. Мы подводим это напряжение, так же как и 0 к крайним выводам переменного резистора, про который нам пока достаточно знать только то, что напряжение на среднем выводе зависит от угла поворота винтика. Мы можем регулировать его отверткой в пределах 0...5 В и по длинному оранжевому проводу передавать на вход A0 контроллера. Буковка А как раз означает что этому входу дана способность считывать аналоговый сигнал, поэтому мы и используем этот вход.

Теперь откроем пример 03.Analog >> AnalogInOutSerial и загрузим его в контроллер (разбираться будем потом!).

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

Arduino POT-Screwdriver.jpg

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

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

Затем определяются две переменные (я исхожу из того что Вы когда-нибудь что-то программировали и уже знаете что такое переменная):

int sensorValue = 0;        // Число, получаемое на аналоговом входе
int outputValue = 0;        // Число, которое мы выдаем на ШИМ-выход

В общем, мы отводим ячейки памяти, чтобы хранить там эти замечательные числа, даем ячейкам имена и записываем туда на всякий случай нули. На какой такой случай? Когда микроконтроллеры включаются, в некоторых ячейках могут оказаться числа, взятые, как говорится, "от балды", которые могут привести к странным результатам в последующих вычислениях. Записав туда ноль, мы можем не беспокоиться о подобных вещах.

В функции void setup() мы видим следующую интересную команду:

Serial.begin(9600);

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

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

 sensorValue = analogRead(analogInPin);            // Считываем сигнал в переменную sensorValue:
 outputValue = map(sensorValue, 0, 1023, 0, 255);  // Отображаем его из переменной sensorValue в переменную outputValue:
 analogWrite(analogOutPin, outputValue);           // Устанавливаем значение сигнала на выходе согласно переменной outputValue:

Отображение нам понадобилось потому, что полученный (при помощи встроенного в вывод А0 АЦП) аналоговый сигнал имеет диапазон от 0 до 1023, а ШИМ-выходы имеют диапазон сигнала от 0 до 255. Функция отображения решает эту проблему, масштабируя сигнал.

Следующие 4 строки "печатают" что-то прямо в последовательный порт компьютера.

 Serial.print("sensor = " );   //вывод того что в кавычках                     
 Serial.print(sensorValue);    //вывод значения sensorValue
 Serial.print("\t output = "); //вывод того что в кавычках (\t автоматически заменяется на знак табуляции(отступ))
 Serial.println(outputValue);  //вывод значения outputValue и символа "конец строки" (потому что написано не print, а println)

Таким образом, по идее, в каждом цикле программа должна выводить в порт строку вроде того: sensor = 553 output= 123

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

 delay(2);                     

Давайте проверим, поступают в компьютер сигналы или нет. Выберем Сервис >> Монитор порта. На экране побегут искомые строки, цифры в которых меняются в зависимости от угла поворота винтика переменного резистора.

Монитор порта.png

Покрутите винтик, наблюдая за цифрами. Установите минимум, максимум, понаблюдайте за тем как функция отображения map изменяет значение output в зависимости от значения sensor.

Баловство с датчиками

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

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

Давайте установим в качестве датчика освещенности фототранзистор. Длинная ножка его должна быть подключена к нулю, то есть синей перемычке, а короткая к оранжевому проводу. Кроме того, установим резистор сопротивлением 10 кОм между 5В (желтая перемычка) и оранжевым выходным проводом. Почему так, станет ясно в последующих экспериментах, а пока мы просто тестируем систему.

Arduino Phototransistor.jpg

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

Arduino Photosensor.jpg

Теперь давайте заменим это на термистор и резистор 1 кОм, установленные как показано на рисунке.

Arduino Thermistor.jpg

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

Arduino Flame.jpg

Что бы еще такое подключить? Возьмите датчик Холла. Его внешний вид и назначение выводов можно найти справа на внутренней стороне крышки конструктора. Обратим внимание, что у него выход не посередине, а справа. Чтобы подключение датчика было правильным, поменяем местами положение синей перемычки и оранжевого провода. Это надо делать, отключив схему от компьютера (или, если лень, отключив перемычку, соединяющую вывод 5В с красной линией отверстий). Иначе, случайно устроив замыкание переставляемыми проводами, вы рискуете спалить контроллер или USB-порт компьютера, что я минутой ранее чуть не сделал :)

Arduino Hall.jpg

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

Arduino magnet.jpg

Далее: Знакомство с микросхемами

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты