Принципиальные(схемы

Понятие(электричества(
Поведение(электрической(цепи(можно(сравнить(с(гидравлической(системой(
Гидравлическая-система-
(
Под(действием(давления)насоса,(
Паскаль(
по(трубам(и(клапанам(разного(сечения,(
1/см2(
из(области(высокого(давления(в(область(низкого(давления(переносится(объём)жидкости,(
формируя(поток)определённой(силы,(
м3/сек(
который(совершает(полезную(работу,(
Джоуль(
передавая(энергию(турбине(с(некой(скоростью.(
м 3(
Ватт(
Электрическая-цепь-
Под(действием(напряжения)источника(питания,(
(
U(
Вольт(
по(проводникам(и(компонентам(разного(сопротивления,(
от(высокого)потенциала,(
R(
+(
Ом(
«плюс»(
к(низкому)потенциалу(
O(
«минус»(
переносится(заряд,(
Q(
Кулон(
формируя(электрический(ток)определённой(силы,(
I(
Ампер(
который(совершает(полезную(работу,(
W( Джоуль(
превращаясь(в(другую(энергию)с(некой(скоростью.(
Р(
Ватт(
Принципиальные(схемы(
Чтобы(изобразить(на(бумаге(как(должна(выглядеть(та(или(иная(электрическая(цепь(используют(схемы.)Схемы(
бывают(разных(видов(со(своими(преимуществами(и(недостатками.(
Ниже(приведена(одна(и(та(же(электрическая(схема,(изображённая(поOразному,(в(четырёх(вариациях.(
Рисованная-схемаКрасиво,(но(громоздко(и(непрактично:(
(
Принципиальная-схемаКомпактно(и(наглядно:(
•
•
(
То,(что(соединено(линией,(в(реальности(должно(быть(
соединено(проводником(
то,(что(не(соединено(линией,(в(реальности(должно(быть(
электрически(изолировано(
Принципиальная-схема-без-явногоисточника-питанияИсточник(питания(зачастую(не(рисуют(в(явном(
виде,(а(используют(отдельные(символы(для(
плюса(и(минуса.(Такая(схема(ещё(более(
компактна.((
(
Принципиальная-схема-с-отдельнымиконтурами--
(
Часто(для(удобства(одну(цепь(на(схемах(разбивают(на(
отдельные(части.(В(сложных(проектах(так(добиваются(
наглядности(и(делят(зоны(ответственности(между(
несколькими(инженерамиOразработчиками.(
Основные(законы(электричества(
Закон-Ома-
-
Мощность-
Мощность(—(мера(скорости(трансформации(электрической(энергии(в(другую(форму(
(
Зная(закон(Ома,(можно(заметить,(что(мощность(можно(рассчитать(иначе:(
(
(
Мир(не(идеален(и(часть(электроэнергии(непременно(трансформируется(в(тепло.(ИзOза(этого(и(греются(компьютеры,(
телефоны,(телевизоры(и(другая(электроника.( (
(
Короткое-замыкание(
Соединение(плюса(с(минусом(напрямую,(по(закону(Ома,(приводит(к(очень(большому(току,(
следовательно(к(очень(большой(мощности(нагрева,(что(в(итоге(приводит(к(возгоранию.(
Это(называется(коротким)замыканием)или)в(просторечии(просто(«козой».(Никогда(не(
допускайте(его,(ни(при(каких(обстоятельствах!(
Последовательное-подключениеПри(последовательном(подключении(сила(тока(в(каждом(
потребителе(—(одна(и(та(же,(различается(напряжение:(в(каждом(
компоненте(падает)его(часть.(
(
Параллельное-подключениеПри(параллельном(подключении(напряжение(вокруг(каждого(потребителя(—(
одно(и(то(же,(различается(сила(тока:(каждый(потребляет(ток(в(соответствии(с(
собственным(сопротивлением.(
(
Управление(электричеством(
Если(постоянно(и(монотонно(трансформировать(электроэнергию(в(другую(форму,(область(применения(
электричества(будет(сильно(ограничена.(Огромный(мир(разнообразных(полезных(устройств(открывается,(если(
научиться(контролировать(и(взаимодействовать(с(электричеством.(Для(этого(существует(несколько(способов.(
Управление-вручную-
(
Автоматическое-управлениеЗамыкать(и(размыкать(цепь,(измерять(напряжение(также(можно,(не(вручную,(а(автоматически,(по(заданному(
алгоритму(при(помощи(запрограммированного(микроконтроллера.(
Существуют(«сырые»(микроконтроллеры,(выполненные(в(виде(одной(микросхемы.(Они(дёшевы(при(массовом(
производстве,(но(их(программирование(и(правильное(подключение(—(нетривиальная(задача(для(новичка.(
Чтобы(решить(эту(проблему,(существуют(готовые(платы(или,(как(ещё(говорят,(вычислительные(платформы.(Они(
делают(процесс(взаимодействия(с(микроконтроллером(очень(простым.(Типичным(представителем(этого(семейства(
являются(платы(Arduino.(
(
(
Быстрая(сборка(схем(
Для(надёжной(сборки(устройств(создаются(индивидуальные(печатные(платы.(Если(делать(их(самостоятельно,(это(
займёт(много(времени(и(заставит(повозиться(с(химикатами(и(паяльником.(Индивидуальные(платы(с(промышленным(
монтажом(на(заказ(крайне(дороги(при(малом(тираже.(
Для(быстрой(сборки(электрических(схем(без(пайки(и(без(проблем(существует(макетная)плата.)Её(же(называют(
макетной(доской,(макеткой(или(breadboard'ом.(
Принцип-работыПод(слоем(пластика(скрываются(медные(пластиныOрельсы,(выложенные(по(незамысловатому(принципу:(
(
Пример-использованияОдну(и(ту(же(схему(на(макетной(доске(можно(собрать(множеством(способов.(Пример(одной(из(конфигураций(
разберём(для(такой(схемы:(
(
(
На(макетной(доске(её(физическое(воплощение(может(быть(сделано(таким(способом:(
На(что(стоит(обратить(внимание:(
• Цвета(проводов,(конечно(же,(значения(не(имеют.(Однако(хорошим(тоном(является(использование(красных(
проводов(для(линии(питания(и(чёрных(или(синих(для(линии(земли(
• Мы(подключили(источник(питания(к(длинным(боковым(рельсам.(Это(позволяет(не(тянуть(к(нему(самому(
большое(количество(проводов(с(разных(участков(схемы,(а(задача(по(его(замене(или(перемещению(сильно(
упрощается(
• Положение(всей(схемы(на(макетной(доске(не(так(важно.(Важно(взаимное)положение)компонентов(друг(
относительно(друга(
• Схема(по(горизонтали(побита(на(отдельные(участки,(которые(легко(воспринимать(и(изменять(по(отдельности(
Резистор(
Резистор(—(искусственное(«препятствие»(для(тока.(Сопротивление)в(чистом(виде.(Резистор(ограничивает(силу(тока,(
переводя(часть(электроэнергии(в(тепло.(
(
Основные-характеристикиСопротивление(номинал)( R( Ом(
Точность((допуск)(
±( %(
Мощность(
Р( Ватт(
Цветовая-кодировка-резисторовНаносить(номинал(резистора(на(корпус(числами(—(дорого(и(непрактично:(они(получаются(очень(мелкими.(Поэтому(
номинал(и(допуск(кодируют(цветными(полосками.(
(
Разные(серии(резисторов(содержат(разное(количество(полос,(но(принцип(расшифровки(одинаков.(
Цвет(корпуса(резистора(может(быть(бежевым,(голубым,(белым.(Это(не(играет(роли.(
Если(не(уверены(в(том,(что(правильно(прочитали(полосы,(можете(проверить(себя(с(помощью(мульти(метра.(
Типовые-номиналы-для-уроков(
Практикум•
•
•
Токоограничительный(резистор(в(уроке(«Маячок»(
Резистор(в(делителе(напряжения(и(фоторезистор(в(уроке(«Терменвокс»(
Подтягивающий(резистор(в(уроке(«Мерзкое1пианино»(
Диод(
Диод(—(это(электрический(«ниппель».(У(него(есть(2(полюса:(анод(и(катод.(Ток(
пропускается(только(от(анода(к(катоду.(
(
Основные-характеристикиПадение(прямого(напряжения(
vF( Вольт(
Максимальное(сдерживаемое(обратное(
напряжение(
Максимальный(прямой(ток(
VDC( Вольт(
IF( Ампер(
ВольтIампернаяхарактеристикаПосле(того,(как(напряжение(в(прямом(направлении(превысит(
небольшой(порог(Vp(диод(открывается)и(начинает(практически(
беспрепятственно(пропускать(ток,(который(создаётся(оставшимся(
напряжением.(
Если(напряжение(подаётся(в(обратном(направлении,(диод(
сдерживает(ток(вплоть(до(некоторго(большого(напряжения(VQQ)
после(чего(пробивается)и(работает(также,(как(в(прямом(
направлении.((
Виды-диодовВыпрямительный(диод(
(
Также(известен(как(защитный,(кремниевый(
• VF(=(0,7(В(
• VQC(—(сотни(или(тысячи(вольт(
• Открывается(медлено(
• Восстанавливается(после(пробоя(обратным(током(
Диод(Шоттки(
(
Шоттки(—(фамилия(его(изобретателя.(Также(известен(как(сигнальный,(германиевый.(
• VF(=(0,3(В(
• VQC(—(десятки(вольт(
• Открывается(быстро(
• Сгорает(после(пробоя(обратным(током(
Диод(Зеннера(
(
Зеннер(—(фамилия(его(изобретателя.(Также(известен(как(стабилитрон.(
•
•
•
VF(=(1(В(
VQC(—(фиксированное(значение(на(выбор(
Умышленно(используется(в(обратном(направлении(как(источник(фиксированного(напряжения(
Практикум•
Защитный(диод(в(уроке(«Миксер»(
Светодиод(
Светодиод((англ.(Light(Emitting(Diode(или(просто(LED)(—(
энергоэффективная,(надёжная,(долговечная(«лампочка»(
Светодиод(—(вид(диода,(который(светится,(когда(через(него(проходит(
ток(от(анода((+)(к(катоду((O).(
Основные-характеристикиПадение(напряжения(
vF( Вольт(
Номинальный(ток(
1( Ампер(
Интенсивность((яркость)( lv( Кандела(
Длина(волны((цвет)(
Л( Нанометр(
Восприятие-световых-волн-человеком-
(
Типовая-схема-включения-
(
Собственное(сопротивление(светодиода(после(насыщения(очень(мало,(и(без(резистора,(ограничивающего(ток(через(
светодиод,(он(перегорит(Порядок:(«резистор(до»(или(«резистор(после»(—(не(важен(
Поиск-подходящего-резистораРассчитаем(какой(резистор(R)в(приведённой(схеме(нам(нужно(взять,(чтобы(получить(оптимальный(результат.(
Предположим,(что(у(нас(такой(светодиод(и(источник(питания:(VF)=)2.3(В;(I)=(20(мА;(Vcc)=(5В(
Найдём(оптимальное(сопротивление(R)и(минимально(допустимую(мощность(резистора(РR.(
Сначала(поймём(какое(напряжение(должен(взять(на(себя(резистор:(UR)=)Vcc)W)VF)=(5В(O(2.3В(O(2.7В(
По(закону(Ома(найдём(значение(сопротивления,(которое(обеспечит(такое(падение:(
(
Таким(образом:(
• при(сопротивлении(более(135(Ом(яркость(будет(ниже(заявленной(
• при(сопротивлении(менее(135(Ом(срок(жизни(светодиода(будет(меньше(
Теперь(найдём(мощность,(которую(при(этом(резистору(придётся(рассеивать:(
РR)=)I2)x)R)=)0.022(А(х(135(0м(=(0.054(Вт(
Это(означает,(что(при(мощности(резистора(менее(54(мВт(резистор(перегорит.(
Простое-правилоЧтобы(не(заниматься(расчётами(резистора(каждый(раз(во(время(проведения(уроков,(можно(просто(запомнить(
правило(для(самого(типичного(сценария.(
Для(питания(1(светодиода(на(20(мА(от(5(В(используйте(резистор(от(150(до(360(Ом.(
Практикум•
Светодиод(в(уроке(«Маячок»(
Кнопка(
Тактовая(кнопка(—(простой,(всем(известный(механизм,(замыкающий(
цепь(пока(есть(давление(на(толкатель.(
При(замыкании(и(размыкании(между(пластинами(кнопки(возникают(
микроискры,(провоцирующие(до(десятка(переключений(за(несколько(
миллисекунд.(Явление(называется(дребезгом((англ.(bounce).(Это(нужно(
учитывать,(если(необходимо(фиксировать(«клики».((
Схема-подключенияНапрашивается(подключение(напрямую.(Но(это(наивный,(неверный(способ.(
Пока(кнопка(нажата,(выходное(напряжение(Vout(=(Vcc,(но(пока(она(отпущена,(Vout=0.(
Кнопка(и(провода(в(этом(случае(работают(как(антенна,(и(Vout(будет(«шуметь»,(
принимая(случайные(значения(«из(воздуха».(
Пока(соединения(нет,(необходимо(дать(резервный,(слабый(путь,(делающий(
напряжение(определённым.(Для(этого(используют(один(из(двух(вариантов.(
Эффект-дребезга-
(
Схема-со-стягивающим-резисторомКнопки(с(4(контактами(стоит(рассматривать,(как(2(пары(рельс,(которые(
соединяются(при(нажатии.(
(
• Есть(нажатие:(Vout(=(Vcc(
• Нет(нажатия:(Vout(=(0(
Схема-с-подтягивающимрезистором(
•
•
Есть(нажатие:(Vout(=(0(
Нет(нажатия:(Vout(=(Vcc(
Практикум•
•
•
Кнопки(в(«Мерзком1пианино»(
Кнопки(в(уроке(«Миксер»(
Кнопки(в(игре(«Кнопочные1ковбои»(
Светодиодные(сборки(
Многие(компоненты,(используемые(для(индикации,(представляют(собой(несколько(отдельных(светодиодов(в(одном(
корпусе.(
Светодиодная-шкалаСветодиодная(шкала(—(это(десяток(отдельных(светодиодов,(каждый(
со(своим(анодом(и(катодом.(
Семисегментный-индикаторСемисегментный(индикатор(—(это(восемь(светодиодов(в(одном(корпусе:(7(сегментов(+(точка.(Анод(у(каждого(
светодиода(отдельный,(а(катод(у(всех(общий,(на(ноге(3(или(8.(
(
Установка-на-макетную-платуДля(подключения(на(breadboard'е(используйте(канавку(в(центре,(чтобы(не(замкнуть(ноги(на(противоположных(
сторонах.(
(
Токоограничивающие-резисторыИспользуйте(отдельный)резистор(для(каждого(светодиода,(иначе(при(разном(количестве(включенных(сегментов(их(
яркость(будет(«скакать».(
Даже(в(случае,(когда(все(светодиоды(включаются(и(выключаются(синхронно,(лучше(придерживаться(этого(правила.(
Светодиоды(могут(чуть(отличаться(своей(вольтOамперной(характеристикой(друг(от(друга.(Первый(открывшийся(
пропустит(через(себя(ток,(предназначенный(для(всех.(ИзOза(чего(он(может(выйти(из(строя(и(«эстафета»(перейдёт(к(
следующему.(
(
Практикум•
•
•
Светодиодная(шкала(в(уроке(«Пульсар»(
Светодиодная(шкала(в(уроке(«Бегущий1огонёк»(
Семисегментный(индикатор(в(уроке(«Секундомер»(
ШиротноEимпульсная(модуляция(
•
•
Микроконтроллеры(обычно(не(могут(выдавать(
произвольное(напряжение.(Они(могут(выдать(либо(
напряжение(питания((например,(5В),(либо(землю(
(т.е.(0В)(
Но(уровнем(напряжения(управляется(многое:(
например,(яркость(светодиода(или(скорость(
вращения(мотора.(Для(симуляции(неполного(
напряжения(используется(ШИМ(ШиротноO
Импульсная(Модуляция,(англ.(Pulse(Width(
Modulation(или(просто(PWM)(
ПрименениеВыход(микроконтроллера(переключается(между(землёй(и(Vcc(тысячи(раз(в(секунду.(Или,(как(ещё(говорят,(имеет(
частоту(в(тысячи(герц.(Глаз(не(замечает(мерцания(более(50(Гц,(поэтому(нам(кажется,(что(светодиод(не(мерцает,(а(
горит(вполсилы.(
Аналогично,(разогнанный(мотор(не(может(остановить(вал(за(миллисекунды,(поэтому(ШИМOсигнал(заставит(
вращаться(его(в(неполную(силу.(
СкважностьОтношение(времени(включения(и(выключения(называют(скважностью)(англ.(duty(cycle).(Рассмотрим(несколько(
сценариев(при(напряжении(питания(Vcc)равным(5(вольтам.(
50%(—(эквивалент(2,5(В(
(
10%(—(эквивалент(0,5(В(
(
90%(—(эквивалент(4,5(В(
(
Практикум•
•
Управление(яркостью(светодиода(с(помощью(ШИМ(в(уроке(«Маячок1с1нарастающей1ЯРКОСТЬЮ»(
Управление(большим(током(с(помощью(ШИМ(и(транзистора(в(уроке(«Пульсар»(
Делитель(напряжения(
Последовательно(подключённые(резисторы(делят(поступающее(на(них(напряжение(в(
определённой(пропорции.(
Расчёт-пропорцииСила(тока,(протекающая(через(резисторы(одинакова,(т.к.(они(соединены(
последовательно,(и(по(закону(Ома(может(быть(рассчитана(как:(
(
По(тому(же(закону(Ома(можно(вычислить(напряжение(Vout,)которое(падает(на(резисторе(R2.(
(
Из(полученной(формулы(видно,(что(чем(больше(R2(относительно(R1,)тем(большее(напряжение(падает(на(нём.(
Считывание-резистивных-сенсоровЕсли(вместо(R2 использовать(не(постоянный(резистор,(а(датчик,(который(меняет(своё(сопротивление,(Vout)будет(
зависеть(от(измеряемого(значения.(
Микроконтроллер(умеет(измерять(напряжение.(Таким(образом,(мы(можем(использовать(свойства(делителя(
напряжения(для(получения(показаний(от(сенсора.(
Примеры-резистивных-датчиковТермистор(
Термистор(изменяет(своё(сопротивление(в(зависимости(от(собственной(температуры(
Фоторезистор(
Фоторезистор((англ.(Light(Dependent(Resistor(или(сокращённо(LDR)(изменяет(своё(
сопротивление(в(зависимости(от(силы(света,(попадающего(на(его(керамическую(
«змейку»(
Потенциометр(
Потенциометр(ещё(называют(переменным(резистором,(триммером.(Это(делитель(из(
двух(резисторов(в(одном(корпусе.(Поэтому(у(него(3(ноги:(питание,(выход,(земля.(
Соотношение(R1)и(R2 (меняется(поворотом(ручки.(От(100%(в(пользу(R1)до(100%(в(пользу(
R 2(
Практикум•
•
Потенциометр(в(качестве(делителя(напряжения(в(уроке(«Светильник1с1
управляемой1ЯРКОСТЬЮ»(
Делитель(напряжения(в(уроке(«Терменвокс»(
Биполярный(транзистор(
Транзистор(—(это(электронная(кнопка.(На(кнопку(нажимают(пальцем,(а(на(
биполярный(транзистор(током.(
Транзисторы(используют(для(управления(мощными(нагрузками(при(помощи(слабых(
сигналов(с(микроконтроллера.(
• Нога,(выполняющая(роль(«кнопки»(называется(база)(англ.(base)(
• Пока(через(базу(течёт(небольшой(ток,(транзистор(открыт:(
o Большой(ток(может(втекать(в(коллектор)(англ.(collector)(
o и(вытекать(из(эмиттера)(англ.(emitter)(
(
Основные-характеристикиМакс,(напряжение(коллекторOэмиттер(
VCE(
Вольт(
Максимальный(ток(через(коллектор(
I с(
Ампер(
Коэффициент(усиления(
hfe(
(
Типовая-схема-подключения-
(
Транзистор(усиливает(максимально(допустимый(ток(в(hfe)раз:(
(
Пример-расчётаЕсли(управляющий(сигнал(на(базе(транзистора(с(hfe)и(резистором(номиналом(1(кОм(составляет(5(вольт:((
• Какой(максимальный(ток(сможет(пропустить(через(себя(транзистор?(
• Каким(по(величине(будет(управляющий(ток?(
Дано(
(
Найти(
(
Решение(
(
Вывод(
Если(на(базу(подаётся(5(В(через(резистор(в(1(кОм,(транзистор(откроется(настолько,(что(будет(способен(пропустить(до(
250(мА.(При(этом(управляющий(ток(составит(всего(5(мА(
Практикум•
Биполярный(транзистор(в(уроке(«Пульсар»(
Полевой(транзистор(
Полевой(MOSFETOтранзистор(—(ключ(для(управления(большими(токами(при(
помощи(небольшого(напряжения.(
• «Кнопка»(называется(затвором)(англ.(gate)(
• Пока(на(затворе(есть(небольшое(напряжение,(транзистор(открыт:(
o Большой(ток(может(втекать(в(сгсж(англ.(drain)(
o и(вытекать(из(истока)(англ.(source)(
В(отличие(от(биполярного(транзистора(полевой(контролируется(именно(напряжением,(а(не(током.(Т.е.(в(открытом(
состоянии(ток(через(затвор(не(идёт.(
Используйте(MOSFET(для(управления(большими(токами,(от(сотен(миллиампер,(когда(дешёвого(биполярного(
транзистора(уже(не(достаточно.(
(
Основные-характеристикиМаксимальное(напряжение(стокOисток(
VDS( Вольт(
Максимальный(ток(через(сток(
Сопротивление(стокOисток(
I D(
DSon(
Ом(
P D(
Ватт(
R
Рассеиваемая(мощность(
Ампер(
Типовая-схема-подключения-
(
Рассеивание-теплаТранзистор(не(идеален(и(часть(пропускаемой(мощности(превращается(в(тепло.(
(
Если(PH)превысит(PD,)без(помощи(дополнительного(охлаждения(транзистор(сгорит.(
Практикум•
Полевой(транзистор(в(уроке(«Миксер»(
Пьезодинамик(
Пьезоизлучатель(звука((англ.(buzzer)(переводит(переменное)напряжение)в(
колебание(мембраны,(которая(в(свою(очередь(создаёт(звуковую(волну.(
Иначе(говоря,(пьезодинамик(—(это(конденсатор,(который(звучит(при(зарядке(и(
разрядке.(
Основные-характеристикиРекомендуемое((номинальное)(
напряжение(
Громкость((на(заданном(расстоянии)(
V(
Вольт(
Р(
Децибелл(
Пиковая(частота(
f P(
Герц(
Ёмкость(
С(
Фарад(
АмплитудноIчастотная-характеристикаАмплитудноOчастотная(характеристика((АЧХ)(определяет(громкость(звука(в(зависимости(от(частоты(управляющего(
сигнала,(который(и(определяет(высоту(звучащей(ноты.(
(
Идеальная(АЧХ(—(это(прямая,(т.е.(одинаковая(громкость(вне(зависимости(от(частоты.(Но(мир(не(идеален(и(разные(
виды(излучателей(имеют(разные(отклонения(от(идеала.(
Подключение-напрямуюПьезодинамик(потребляет(всего(пару(мА,(поэтому(можно(смело(
подключать(его(прямо(к(микроконтроллеру(
Для(звучания(нужно(подавать(на(динамик(квадратную(волну.(
Какой(частоты(будет(волна,(такой(частоты(будет(и(звук(
(
Подключение-с-регулировкой-громкости-
•
•
Пьезодинамик(в(«Мерзком1пианино»(
Пьезодинамик(в(игре(«Кнопочные1ковбои»(
Практикум•
Пьезодинамик(в(уроке(«Терменвокс»(
(
Мотор(
Мотор(переводит(электрическую(энергию(в(механическую(энергию(вращения.((
Самый(простой(вид(мотора(—(коллекторный.(При(подаче(напряжения(в(одном(
направлении(вал(крутится(по(часовой(стрелке,(в(обратном(направлении(—(
против(часовой(
Основные-характеристикиРекомендуемое((номинальное)(
напряжение(
Потребляемый(ток(без(нагрузки(
V(
Вольт(
IF (
Ампер(
Потребляемый(ток(при(блокировке(
I s(
Ампер(
Скорость(вращения(без(нагрузки(
ω(
сO1(
Максимальный(крутящий(момент(
T(
Нхм(
Крутящий(момент(
• Крутящий(момент(определяет(какая(сила(воздействует(на(точку(рычага(на(заданном(
расстоянии(от(оси(вращения.(
(
• Силу(иногда(упрощённо(измеряют(в(килограммах(против(гравитации(Земли.(А(
крутящий(момент(—(в(кгхсм.(Американцы(любят(измерять(крутящий(момент(в(унциях(на(
дюйм((англ.(ozxin).(
Схема-подключения-без-возможности-реверсаМоторы(—(мощные(потребители(с(рядом(побочных(эффектов.(Для(управления(ими(необходимы(дополнительные(
компоненты.(
(
Предельные-характеристикиIs)всегда(много(больше(IF)и(для(хоббиOмоторов(составляет(до(2(А.(Выбирайте(транзистор(и(диод,(способные(
выдержать(этот(ток(или(не(допускайте(блокировки(мотора.(
Практикум•
Мотор(в(уроке(«Миксер»(
Начало(работы(с(Arduino(
1. Скачайте(Arduino(IDE(с(официального(сайта([http://arduino.cc/en/Main/Software](
2. Если(у(вас(Windows(и(Arduino(IDE(из(zipOфайла,(установите(драйверы(из(папки(drivers(
3. Подключите(Arduino(к(компьютеру(через(USB(
4. Запустите(Arduino(IDE(
5. В(«Tools(O>(Board»(выберите(модель(вашей(платы(
6. В(«Tools(O>(Serial(Port»(выберите(порт,(куда(она(подключена(
7. Пишите(программу(или(загружайте(готовый(пример(из(«File(O>(Examples»(
8. Жмите(«Upload»(на(панели(инструментов(для(прошивки(платы!(
Перепрошивать(плату(можно(сколько(угодно(раз.(Программа(сохраняется(после(обесточивания(платы.(
Внешний-вид-Arduino-IDE-
(
Если-прошивка-не-удаётсяПроверьте,(что:(
• Плата(получает(питание,(горит(светодиод(«ON»(
• Драйверы(под(Windows(установились(корректно,(и(в(диспетчере(устройств(вы(видите(устройство(«Arduino(
Uno»(
• Вы(выбрали(правильную(модель(платы(и(правильный(порт((пункты(5(и(6)(
• USBOкабель(исправен(
(
Урок%1.%Маячок%
В этом уроке мы просто мигаем светодиодом.
Список'деталей'для'урока'
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
1 светодиод
1 резистор номиналом 220 Ом
2 провода «папа-папа»
Принципиальная'схема'
Схема'на'макетке'
Обратите'внимание'
•
•
•
•
•
Не забудьте, как соединены рельсы в беспаечной макетной плате. Если на вашей макетке красная и
синяя линии вдоль длинных рельс прерываются в середине, значит проводник внутри макетки тоже
прерывается!
Катод («минус») светодиода — короткая ножка, именно её нужно соединять с землёй (GND)
Не пренебрегайте резистором, иначе светодиод выйдет из строя
Выбрать резистор нужного номинала можно с помощью таблицы маркировки или с помощью
мультиметра в режиме измерения сопротивления
Плата Arduino имеет три пина GND, используйте любой из них
Скетч'
p010_blink.ino
Пояснения'к'коду'
Процедура setup выполняется один раз при запуске микроконтроллера. Обычно она используется для
конфигурации портов микроконтроллера и других настроек После выполнения setup запускается процедура
loop, которая выполняется в бесконечном цикле. Именно этим мы пользуемся в данном примере, чтобы маячок
мигал постоянно Процедуры setup и loop должны присутствовать в любой программе (скетче), даже если вам
не нужно ничего выполнять в них — пусть они будут пустые, просто не пишите ничего между фигурными
скобками. Например:
•
•
•
•
•
Запомните, что каждой открывающей фигурной скобке { всегда соответствует закрывающая }. Они
обозначают границы некого логически завершенного фрагмента кода. Следите за вложенностью
фигурных скобок. Для этого удобно после каждой открывающей скобки увеличивать отступ на каждой
новой строке на один символ табуляции (клавиша Tab)
Обращайте внимание на ; в концах строк. Не стирайте их там, где они есть, и не добавляйте лишних.
Вскоре вы будете понимать, где они нужны, а где нет.
Функция digitalWrite(pin, value) не возвращает никакого значения и принимает два параметра:
1. pin — номер цифрового порта, на который мы отправляем сигнал
2. value — значение, которое мы отправляем на порт. Для цифровых портов значением может быть
HIGH (высокое, единица) или LOW (низкое, ноль)
Если в качестве второго параметра вы передадите функции digitalWrite значение, отличное от HIGH,
LOW, 1 или 0, компилятор может не выдать ошибку, но считать, что передано HIGH. Будьте
внимательны
Обратите внимание, что использованные нами константы: INPUT, OUTPUT, LOW, HIGH, пишутся
заглавными буквами, иначе компилятор их не распознает и выдаст ошибку. Когда ключевое слово
распознано, оно подсвечивается синим цветом в Arduino IDE
Вопросы'для'проверки'себя'
1.
2.
3.
4.
5.
6.
7.
Что будет, если подключить к земле анод светодиода вместо катода?
Что будет, если подключить светодиод с резистором большого номинала (например, 10 кОм)?
Что будет, если подключить светодиод без резистора?
Зачем нужна встроенная функция pinMode? Какие параметры она принимает?
Зачем нужна встроенная функция digitalWrite? Какие параметры она принимает?
С помощью какой встроенной функции можно заставить микроконтроллер ничего не делать?
В каких единицах задается длительность паузы для этой функции?
Задания'для'самостоятельного'решения'
1.
2.
Сделайте так, чтобы маячок светился полсекунды, а пауза между вспышками была равна одной
секунде
Измените код примера так, чтобы маячок включался на три секунды после запуска устройства, а затем
мигал в стандартном режиме
Урок%2.%Маячок%с%нарастающей%яркостью%
В этом уроке мы задаем различные уровни яркости светодиода.
Список'деталей'для'урока'
• 1 плата Arduino Uno
• 1 беспаечная макетная плата
• 1 светодиод
• 1 резистор номиналом 220 Ом
• 2 провода «папа-папа»
Для дополнительного задания
• еще 1 светодиод
• еще 1 резистор номиналом 220 Ом
• еще 2 провода
Принципиальная'схема'
Схема'на'макетке'
Обратите'внимание'
Не любой порт Arduino поддерживает широтно-импульсную модуляцию, если вы хотите регулировать
напряжение, вам подойдут пины, помеченные символом тильда «~». Для Arduino Uno это пины 3, 5, 6, 9, 10, 11
Скетч'
p020_pulse_light.ino
Пояснения'к'коду'
•
•
•
•
•
•
•
Идентификаторы переменных, констант, функций (в этом примере идентификатор LED_PIN) являются
одним словом (т.е. нельзя создать идентификатор LED PIN).
Идентификаторы могут состоять из латинских букв, цифр и символов подчеркивания _. При этом
идентификатор не может начинаться с цифры.
Регистр букв в идентификаторе имеет значение. Т.е. LED_PIN, LED_pin и led_pin с точки зрения
компилятора — различные идентификаторы
Идентификаторы, создаваемые пользователем, не должны совпадать с предопределенными
идентификаторами и стандартными конструкциями языка; если среда разработки подсветила введенный
идентификтор каким-либо цветом, замените его на другой
Директива #define просто говорит компилятору заменить все вхождения заданного идентификатора на
значение, заданное после пробела (здесь 9), эти директивы помещают в начало кода. В конце данной
директивы точка с запятой ; не допустима
Названия идентификаторов всегда нужно делать осмысленными, чтобы при возвращении к ранее
написанному коду вам было ясно, зачем нужен каждый из них
Также полезно снабжать код программы комментариями: в примерах мы видим однострочные
комментарии, которые начинаются с двух прямых слэшей / / и многострочные, заключённые между / * * /
комментарии игнорируются компилятором, зато полезны людям при чтении давно написанного, а особенно
чужого, кода
• Функция analogWrite(pin, value) не возвращает никакого значения и принимает два параметра:
1. pin — номер порта, на который мы отправляем сигнал
2. value — значение скважности ШИМ, которое мы отправляем на порт. Он может принимать целочисленное
значение от 0 до 2 5 5 , где 0 — это 0%, а 255 — это 100%
Вопросы'для'проверки'себя'
1. Какие из следующих идентификаторов корректны и не вызовут ошибку?
o 13pin
o MOTOR_l
o контакт светодиода
o sensor value
o leftServo
o my-var
o distance_eval2
2. Что произойдет, если создать директиву #define HIGH LOW?
3. Почему мы не сможем регулировать яркость светодиода, подключенного к порту 7?
4. Какое усреднённое напряжение мы получим на пине 6, если вызовем функцию analogWrite(6, 153)?
5. Какое значение параметра value нужно передать функции analogWrite, чтобы получить усреднённое
напряжение 2 В?
Задания'для'самостоятельного'решения'
1.
2.
3.
Отключите питание, отключите светодиод от 9-го порта и подключите к 11-му. Измените программу так,
чтобы схема снова заработала
Измените код программы так, чтобы в течение секунды на светодиод последовательно подавалось
усреднённое напряжение О, 1, 2, 3, 4, 5 В
Возьмите еще один светодиод, резистор на 220 Ом и соберите аналогичную схему на этой же макетке,
подключив светодиод к пину номер 3 и другому входу GND, измените программу так, чтобы светодиоды
мигали в противофазу: первый выключен, второй горит максимально ярко и до противоположного
состояния
Урок%3.%Светильник%с%управляемой%яркостью%
В этом уроке мы меняем яркость светодиода, вращая ручку переменного резистора.
Список'деталей'для'урока'
• 1 плата Arduino Uno
• 1 беспаечная макетная плата
• 1 светодиод
• 1 резистор номиналом 220 Ом
• 6 проводов «папа-папа»
• 1 потенциометр
Для дополнительного задания
• еще 1 светодиод
• еще 1 резистор номиналом 220 Ом
• еще 2 провода
Принципиальная'схема'
Схема'на'макетке'
Обратите'внимание'
Мы подключили «землю» светодиода и переменного резистора (потенциометра) к длинной рельсе «-» макетной
платы, и уже ее соединили с входом GND микроконтроллера. Таким образом мы использовали меньше входов и
от макетки к контроллеру тянется меньше проводов.
Подписи «+» и «-» на макетке не обязывают вас использовать их строго для питания, просто чаще всего они
используются именно так и маркировка нам помогает
Не важно, какая из крайних ножек потенциометра будет подключена к 5 В, а какая к GND, поменяется только
направление, в котором нужно крутить ручку для увеличения напряжения.
Запомните, что сигнал мы считываем со средней ножки
Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, как
цифровой, подходят только порты, помеченные на плате как «ANALOG IN» и пронумерованные с префиксом А.
Для Arduino Uno — это А0-А5.
Скетч'
p030_pot_light.ino
Пояснения'к'коду'
С помощью директивы #define мы сказали компилятору заменять идентификатор POT_PIN на АО — номер
аналогового входа. Вы можете встретить код, где обращение к аналоговому порту будет по номеру без индекса А.
Такой код будет работать, но во избежание путаницы с цифровыми портами используйте индекс.
Переменным принято давать названия, начинающиеся со строчной буквы.
Чтобы использовать переменную, необходимо ее объявить, что мы и делаем инструкцией:
Для объявления переменной необходимо указать ее тип, здесь — int (от англ. integer) — целочисленное значение
в диапазоне от -32 768 до 32 767, с другими типами мы познакомимся позднее
Переменные одного типа можно объявить в одной инструкции, перечислив их через запятую, что мы и сделали
Функция analogRead(pinA) возвращает целочисленное значение в диапазоне от 0 до 1023, пропорциональное
напряжению, поданному на аналоговый вход, номер которого мы передаем функции в качестве параметра pinA
Обратите внимание, как мы получили значение, возвращенное функцией analogRead( ): мы просто поместили его
в переменную rotation с помощью оператора присваивания =, который записывает то, что находится справа от
него в ту переменную, которая стоит слева
Вопросы'для'проверки'себя'
1.
2.
3.
4.
Можем ли мы при сборке схемы подключить светодиод и потенциометр напрямую к разным входам GND
микроконтроллера?
В какую сторону нужно крутить переменный резистор для увеличения яркости светодиода?
Что будет, если стереть из программы строчку pinMode (LED_PIN, OUTPUT)? строчку pinMode(POT_PIN,
INPUT)?
Зачем мы делим значение, полученное с аналогового входа перед тем, как задать яркость светодиода?
что будет, если этого не сделать?
Задания'для'самостоятельного'решения'
1. Отключите питание платы, подключите к порту 5 еще один светодиод. Измените код таким образом,
чтобы второй светодиод светился на 1/8 от яркости первого
Урок%4.%Терменвокс%
В этом уроке мы имитируем действие музыкального инструмента терменвокс: изменяем высоту звучания
бесконтактным путем, больше или меньше закрывая от света фоторезистор.
Список%деталей%для%урока%
•
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
1 пьезопищалка
6 проводов «папа-папа»
1 резистор номиналом 10 кОм
1 фоторезистор
Принципиальная%схема%
Схема%на%макетке%
Обратите%внимание%
•
•
•
•
•
•
В данной схеме мы используем резистор нового номинала, посмотрите таблицу маркировки, чтобы найти
резистор на 10 кОм или воспользуйтесь мультиметром
Полярность фоторезистора, как и обычного резистора, не играет роли. Его можно устанавливать любой
стороной
В данном упражнении мы собираем простой вариант схемы включения пьезодинамика
Полярность пьезопищалки роли не играет: вы можете подключать любую из ее ножек к земле, любую к
порту микроконтроллера
На Arduino Uno использование функции tone мешает использованию ШИМ на 3-м и 11-м портах. Зато
можно подключить ее к одному из них
Вспомните как устроен делитель напряжения: фоторезистор помещается в позицию R2 — между
аналоговым входом и землей. Так мы получаем резистивный фотосенсор.
Скетч%
p040_thermenvox.ino
Пояснения%к%коду%
•
•
•
•
•
•
•
•
•
Функция map (value, fromLow, fromHigh, toLow, toHigh) возвращает целочисленное значение из
интервала [toLow, toHigh], которое является пропорциональным отображением содержимого value из
интервала [fromLow, fromHigh]
Верхние границы тар не обязательно должны быть больше нижних и могут быть отрицательными. К
примеру, значение из интервала [1, 10] можно отобразить в интервал [10,-5]
Если при вычислении значения тар образуется дробное значение, оно будет отброшено, а не округлено
Функция тарне будет отбрасывать значения за пределами указанных диапазонов, а также масштабирует
их по заданному правилу.
Если вам нужно ограничить множество допустимых значений, используйте функцию constrain (value,
from, to), которая вернет:
o value, если это значение попадает в диапазон [from, to]
o from, если value меньше него
o to, если value больше него
Функция tone (pin, frequency, duration) заставляет пьезопищалку, подключенную к порту pin, издавать
звук высотой frequency герц на протяжении duration миллисекунд
Параметр duration не является обязательным. Если его не передать, звук включится навсегда. Чтобы его
выключить, вам понадобится функция noTone(pin). Ей нужно передать номер порта с пищалкой, которую
нужно выключить
Одновременно можно управлять только одной пищалкой. Если во время звучания вызвать tone для
другого порта, ничего не произойдет.
Вызов tone для уже звучащего порта обновит частоту и длительность звучания
Вопросы%для%проверки%себя%
1.
2.
3.
4.
5.
6.
Каким сопротивлением должен обладать фоторезистор, чтобы на аналоговый вход было подано
напряжение 1 В?
Можем ли мы регулировать яркость светодиода, подключенного к 11-му порту, во время звучания
пьезопищалки?
Что изменится в работе терменвокса, если заменить резистор на 10 кОм резистором на 100кОм?
Попробуйте ответить без урока. Затем отключите питание, замените резистор и проверьте.
Каков будет результат вызова тар( 3 0 , 0 , 9 0 , 9 0 , - 9 0 ) ?
Как будет работать вызов tone без указания длительности звучания?
Можно ли устроить полифоническое звучание с помощью функции tone?
Задания%для%самостоятельного%решения%
1.
2.
3.
Уберите из программы чтение датчика освещенности и пропищите азбукой Морзе позывной SOS: три
точки, три тире, три точки
Измените код программы так, чтобы с падением освещенности звук становился ниже (например, падал от
5 кГц до 2,5 кГц)
Измените код программы так, чтобы звук терменвокса раздавался не непрерывно, а 10 раз в секунду с
различимыми паузами
Урок%5.%Ночной%светильник%
В"этом"уроке"светодиод"должен"включаться"при"падении"уровня"освещенности"ниже"порога,"заданного"
потенциометром."
Список%деталей%для%урока%%
•
•
•
•
•
•
•
•
Для%дополнительного%задания%
1"плата"Arduino"Uno"
1"беспаечная"макетная"плата"
1"светодиод""
1"фоторезистор"
1"резистор"номиналом"220"Ом"
1"резистор"номиналом"10"кОм"
1"переменный"резистор"(потенциометр)"
10"проводов"«папаQпапа»"
Принципиальная%схема%
еще"1"светодиод"
еще"1"резистор"номиналом"220"Ом"
еще"2"провода"
Схема%на%макетке%
"""""
"
Обратите%внимание%
•
•
В"этом"уроке"мы"устанавливаем"фоторезистор"между"питанием"и"аналоговым"входом,"т.е."в"позицию"R1"в"
схеме"делителя"напряжения."Это"нам"нужно"для"того,"чтобы"при"уменьшении"освещенности"мы"получали"
меньшее"напряжение"на"аналоговом"входе."
Постарайтесь"разместить"компоненты"так,"чтобы"светодиод"не"засвечивал"фоторезистор."
Скетч%
p050_night_light.ino"
"
"
Пояснения%к%коду%
Мы"используем"новый"тип"переменных"—"boolean,"которые"хранят"только"значения"true"(истина,"1)"или"false"(ложь,"
0)."Эти"значения"являются"результатом"вычисления"логических"выражений."В"данном"примере"логическое"
выражение"—"это"lightness""<"""threshold."На"человеческом"языке"это"звучит"как:"«освещенность"ниже"порогового"
уровня»."Такое"высказывание"будет"истинным,"когда"освещенность"ниже"порогового"уровня."Микроконтроллер"
может"сравнить"значения"переменных"lightness"и"threshold,"которые,"в"свою"очередь,"являются"результатами"
измерений,"и"вычислить"истинность"логического"выражения."
Мы"взяли"это"логическое"выражение"в"скобки"только"для"наглядности."Всегда"лучше"писать"читабельный"код."В"
других"случаях"скобки"могут"влиять"на"порядок"действий,"как"в"обычной"арифметике."
В"нашем"уроке"логическое"выражение"будет"истинным,"когда"значение"lightness"меньше"значения"threshold,"потому"
что"мы"использовали"оператор"<."Мы"можем"использовать"операторы">,"<=,">=,"==,"!=,"которые"значат"«больше»,"
«меньше"или"равно»,"«больше"или"равно»,"«равно»,"«не"равно»"соответственно."
Будьте"особенно"внимательны"с"логическим"оператором"=="и"не"путайте"его"с"оператором"присваивания"=."В"первом"
случае"мы"сравниваем"значения"выражений"и"получаем"логическое"значение"(истина"или"ложь),"а"во"втором"случае"
присваиваем"левому"операнду"значение"правого."Компилятор"не"знает"наших"намерений"и"ошибку"не"выдаст,"а"мы"
можем"нечаянно"изменить"значение"какойQнибудь"переменной"и"затем"долго"разыскивать"ошибку."
Условный"оператор"if"(«если»)"—"один"из"ключевых"в"большинстве"языков"программирования."С"его"помощью"мы"
можем"выполнять"не"только"жестко"заданную"последовательность"действий,"но"принимать"решения,"по"какой"ветви"
алгоритма"идти,"в"зависимости"от"неких"условий."
У"логического"выражения"lightness"""<"""threshold"есть"значение:"true"или"false."Мы"вычислили"его"и"поместили"в"
булеву"переменную"tooDark"(«слишком"темно»)."Таким"образом"мы"как"бы"говорим"«если"слишком"темно,"то"
включить"светодиод»"
С"таким"же"успехом"мы"могли"бы"сказать"«если"освещенность"меньше"порогового"уровня,"то"включить"светодиод»,"
т.е."передать"в"if"всё"логическое"выражение:"
•
•
•
"
За"условным"оператором"if"обязательно"следует"блок"кода,"который"выполняется"в"случае"истинности"
логического"выражения."Не"забывайте"про"обе"фигурные"скобки"{}!"
Если"в"случае"истинности"выражения"нам"нужно"выполнить"только"одну%инструкцию,"ее"можно"написать"
сразу"после"if"""(...)"без"фигурных"скобок:"
"
Оператор"if"может"быть"расширен"конструкцией"else"(«иначе»)."Блок"кода"или"единственная"инструкция,"
следующий"за"ней,"будет"выполнен"только"если"логическое"выражение"в"if"имеет"значение"false,"«ложь»."
Правила,"касающиеся"фигурных"скобок,"такие"же."В"нашем"уроке"мы"написали"«если"слишком"темно,"
включить"светодиод,"иначе"выключить"светодиод»."
Вопросы%для%проверки%себя%
•
•
•
•
•
•
•
•
Если"мы"установим"фоторезистор"между"аналоговым"входом"и"землей,"наше"устройство"будет"работать"
наоборот:"светодиод"будет"включаться"при"увеличении"количества"света."Почему?"
Какой"результат"работы"устройства"мы"получим,"если"свет"от"светодиода"будет"падать"на"фоторезистор?"
Если"мы"все"же"установили"фоторезистор"так,"как"сказано"в"предыдущем"вопросе,"как"нам"нужно"изменить"
программу,"чтобы"устройство"работало"верно?"
Допустим,"у"нас"есть"код"if"""(условие)""""{дейсвие;"}."В"каких"случаях"будет"выполнено"действие?"
При"каких"значениях"у"выражение"х""+""у"">"""0"будет"истинным,"если"х"">"""О?"
Обязательно"ли"указывать,"какие"инструкции"выполнять,"если"условие"в"операторе"if"ложно?"
Чем"отличается"оператор"=="от"оператора"=?"
Если"мы"используем"конструкцию"if"""(условие)"""деЙСТВИе1;"""else""деЙСТВИе2;,"может"ли"быть"ситуация,"
когда"ни"одно"из"действий"не"выполнится?"Почему?"
Задания%для%самостоятельного%решения%
•
•
•
Перепишите"программу"без"использования"переменной"tooDark"с"сохранением"функционала"устройства."
Добавьте"в"схему"еще"один"светодиод."Дополните"программу"так,"чтобы"при"падении"освещенности"ниже"
порогового"значения"включался"один"светодиод,"а"при"падении"освещенности"ниже"половины"от"порогового"
значения"включались"оба"светодиода."
Измените"схему"и"программу"так,"чтобы"светодиоды"включались"по"прежнему"принципу,"но"светились"тем"
сильнее,"чем"меньше"света"падает"на"фоторезистор."
Эксперимент+6.+Пульсар+
В этом эксперименте мы плавно наращиваем яркость светодиодной шкалы, управляя большой нагрузкой через
транзистор.
Список+деталей+для+эксперимента+
•
•
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
1 биполярный транзистор
1 светодиодная шкала
1 резистор номиналом 1 кОм
10 резисторов номиналом 220 Ом
13 проводов «папа-папа»
Принципиальная+схема++
Схема+на+макетке+
Обратите+внимание+
•
•
•
•
•
Светодиодная шкала — это несколько светодиодов в одном корпусе. Нам нужно чтобы питание шло к
их анодам, а катоды направлялись к земле. Скорее всего на вашей шкале аноды находятся со стороны
маркировки. Если шкала не светится, когда должна, попробуйте перевернуть ее.
База биполярного транзистора — это его средняя ножка. Если повернуть транзистор плоской стороной
к себе, ножками вниз, то левая ножка это коллектор, а правая — эмиттер.
Если эту схему собрать без резистора между базой транзистора и портом Arduino, мы практически
устроим короткое замыкание порта на землю. Рано или поздно это выведет из строя транзистор или
ножку микроконтроллера.
Зачем здесь вообще транзистор? Без него такое количество светодиодов будет потреблять больше
тока, чем 40 мА, которые может себе позволить цифровой пин платы. Поэтому мы берем питание из
порта 5V, рассчитанного на ток до 500 мА, а на цифровой порт ставим транзистор, чтобы с помощью
малого тока управлять большим.
В данном случае мы включили 10 светодиодов параллельно, каждый через отдельный резистор.
Включать их через один резистор неправильно: даже светодиоды из одной партии имеют минимальный
разброс вольт-амперных характеристик, вследствие чего они:
1. Светились бы с различной яркостью
2. Из-за минимальной разницы во времени включения, больший ток, прошедший через первый
включившийся светодиод, мог бы вывести его из строя. И так по цепочке.
Скетч+
p060_pulse_bar.ino
Пояснения к коду
Как мы уже знаем, analogWrite(pin, value) в качестве value принимает значения от О до 255. Если передать
значение из-за пределов этого диапазона, функция сработает, но в общем случае вы получите неожиданный
результат.
Оператор X % Y дает остаток от деления X на Y. Если X меньше Y, т.е. целая часть результата деления
равна 0, оператор % будет возвращать X. Таким образом:
■ Пока brightness + 1 меньше 256, в brightness записывается значение brightness + 1
■ Как только brightness + 1 принимает значение 256, результатом (brightness + 1) % 2 56
становится 0 и на следующей итерации 1оор( ) всё начинается сначала.
Оператор % работает только с целыми операндами.
В выражении (brightness + 1) % 2 5 6 скобки используются для назначения порядка
действий. Операция % имеет больший приоритет, чем +, а сложение нам нужно выполнять
раньше. С операциями умножения и деления оператор взятия остатка имеет одинаковый
приоритет.
Вопросы+для+проверки+себя+
1.
2.
3.
4.
Почему у светодиодной шкалы на 10 сегментов 20 ножек?
Зачем в схеме биполярный транзистор?
За счет чего увеличивается яркость шкалы?
Почему после достижения значения 2 5 5 переменная brightness обнуляется?
Задания+для+самостоятельного+решения+
1. Измените программу так, чтобы яркость шкалы росла только до половины от максимальной.
2. Измените программу так, чтобы шкала становилась максимально яркой в три раза быстрее, без
изменения функции delay.
3. Измените исходную программу так, чтобы такой же результат был получен без использования
операции %, но с применением условного оператора if.
Урок%7.%Бегущий%огонёк%
В этом уроке мы заставляем огонёк бежать по светодиодной шкале.
Список%деталей%для%урока%
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
1 светодиодная шкала
10 резисторов номиналом 220 Ом
11 проводов «папа-папа»
Принципиальная%схема%%
Схема%на%макетке%
Обратите%внимание%
Обратите внимание, что в данном уроке резисторы установлены между катодами и землей в отличие от урока пульсар.
Мы подключаем светодиоды к цифровым портам, начиная с порта 2. Мы можем использовать порты 0 и 1, но они являются
каналами передачи данных последовательного порта и для каждой перепрошивки платы придется отключать устройства,
подключенные к ним.
Скетч%
p070_running_bar.ino
Пояснения%к%коду%
■ С помощью выражения for мы организуем цикл со счетчиком. В данном случае для настройки портов на выход.
Чтобы сделать такой цикл, нужно:
■
■
■
Инициализировать переменную-счетчик, присвоив ей первоначальное значение. В нашем случае: int pin =
FIRST_LED_PIN
Указать условие, до достижения которого будет повторяться цикл. В нашем случае: pin <= LAST_LED_PIN
Определить правило, по которому будет изменяться счетчик. В нашем случае ++pin (см. ниже об операторе ++).
■ Например, можно сделать цикл for (int i = 10; i>0; i = i- 1). В этом случае:
■
■
■
■
■
■
■
■
Переменной i присваивается значение 10
Это значение удовлетворяет условию i > 0
Поэтому блок кода, помещенный в цикл, выполняется первый раз
Значение i уменьшается на единицу, согласно заданному правилу, и принимает значение 9
Блок кода выполняется второй раз.
Всё повторяется снова и снова вплоть до значения i равного 0
Когда i станет равна 0, условие i > 0 не выполнится, и выполнение цикла закончится
Контроллер перейдет к коду, следующему за циклом for
■ Помещайте код, который нужно зациклить, между парой фигурных скобок {}, если в нем больше одной
инструкции.
■ Переменная-счетчик, объявляемая в операторе for, может использоваться внутри цикла. Например, в данном
уроке pin последовательно принимает значения от 2 до 11 и, будучи переданной в pinMode, позволяет
настроить 10 портов одной строкой, помещенной в цикл.
■ Переменные-счетчики видны только внутри цикла. Т.е. если обратиться к pin до или после цикла, компилятор
выдаст ошибку о необъявленной переменной.
■ Конструкция i = i - 1 в пояснении выше не является уравнением! Мы используем оператор присваивания = для
того, чтобы в переменную i поместить значение, равное текущему значению i, уменьшенному на 1.
■ Выражение ++pin — это т.н. оператор инкремента, примененный к переменной pin. Эта инструкция даст тот же
результат, что pin = pin + 1
■ Аналогично инкременту работает оператор декремента —, уменьшающий значение на единицу. Подробнее об
этом в статье про арифметические операции.
■ Тип данных unsigned int используют для хранения целых чисел без знака, т.е. только неотрицательных. За
счет лишнего бита, который теперь не используется для хранения знака, мы можем хранить в переменной
такого типа значения до 65 535.
■ Функция millis возвращает количество миллисекунд, прошедших с момента включения или
■ перезагрузки микроконтроллера. Здесь мы используем ее для отсчета времени между переключениями
светодиодов.
■ С помощью выражения (ms / 120) % 10 мы определяем, который из 10 светодиодов должен гореть сейчас.
Перефразируя, мы определяем какой отрезок длиной в 120 мс идет сейчас и каков его номер внутри текущего
десятка. Мы добавляем порядковый номер отрезка к номеру того порта, который в текущем наборе выступает
первым.
■ То, что мы гасим светодиод с помощью digitalWrite(pin, LOW) всего через 10 мс после включения не заметно
глазу, т.к. очень скоро будет вновь вычислено, какой из светодиодов включать, и он будет включен — только
что погашенный или следующий.
Вопросы%для%проверки%себя%
1.
2.
3.
4.
5.
6.
Почему в данном уроке мы подключаем светодиодную шкалу, не используя транзистор?
Если бы мы включали светодиоды только на портах 5, 6, 7, 8, 9, что нужно было бы изменить в программе?
С помощью какой другой инструкции можно выполнить действие, эквивалентное ++pin?
В чем разница между переменными типов int и unsigned int?
Что возвращает функция millis ( )?
Как в данном уроке мы вычисляем номер порта, на котором нужно включить светодиод?
Задания%для%самостоятельного%решения%
1.
2.
3.
4.
Измените код так, чтобы светодиоды переключались раз в секунду.
Не выключая порты, сделайте так, чтобы огонёк бежал только по средним четырем делениям шкалы.
Переделайте программу так, чтобы вместо int pin = FIRST_LED_PIN + (ms / 120) % 10
перемещением огонька управлял цикл for
Не меняя местами провода, измените программу так, чтобы огонёк бегал в обратном направлении.
Урок%8.%Мерзкое%пианино%
В этом уроке мы создаем маленькую клавиатуру, на которой можно сыграть несколько нот.
Список%деталей%для%урока%%
•
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
1 пьезопищалка
3 тактовых кнопки
3 резистора номиналом 10 кОм
10 проводов «папа-папа»
Принципиальная%схема%%
Для%дополнительного%задания%
еще 2 кнопки
еще 2 резистора номиналом 10 кОм
еще 2 провода
Схема%на%макетке%
Обратите%внимание%
•
•
•
Ножки тактовой кнопки, расположенные с одной стороны, разомкнуты, когда кнопка не нажата. Ножки,
расположенные друг напротив друга на противоположных сторонах макетки находятся на одной «рельсе».
Воспользовавшись этим, мы можем расположить резистор с одной стороны макетки, а провод,
подключаемый к порту Arduino, с другой стороны.
В данном уроке мы подключаем кнопки по схеме с подтягивающим резистором.
Для того, чтобы данный вариант программы работал, важно, чтобы кнопки были подключены к портам,
находящимся рядом друг с другом, т.е. имеющим соседние номера.
Скетч%
p080_dumb_piano.ino
Пояснения%к%коду%
■ Благодаря тому, что в начале программы мы определили FIRST_KEY_PIN и KEY_COUNT, мы можем
подключать произвольное количество кнопок к любым идущим друг за другом цифровым пинам, и для
корректировки программы нам не придется менять параметры цикла for. Изменить понадобится лишь эти
константы:
■ цикл в любом случае пробегает от 0 до KEY_COUNT;
■ перед считыванием порта мы задаем смещение на номер первого используемого порта —
FIRST_KEY_PIN.
■ Функция digitalRead(pin) возвращает состояние порта, номер которого передан ей параметром pin. Это может
быть состояние HIGH или LOW. Или, выражаясь иначе: высокое напряжение или низкое, 1 или 0, true или false
■ Поскольку мы получаем с порта одно из двух состояний, мы сохраняем его в переменную уже знакомого нам
типа boolean, и можем работать с ней как с логическим значением.
■ Мы используем логический оператор отрицания «не» !. Если keyUp имеет значение 0, выражение ! keyUp
будет иметь значение 1 и наоборот.
■ Поскольку мы собрали схему с подтягивающим резистором, при нажатии кнопки мы будем получать на
соответствующем порте 0.
■ Действия, описанные в условном выражении if, выполняются, когда его условие имеет значение «истина»
(единица). Поэтому для выполнения действия по нажатию, мы инвертируем сигнал с кнопки.
Вопросы%для%проверки%себя%
1.
2.
3.
4.
Почему мы не настраивали порты, к которым подключены кнопки, как INPUT, но устройство работает?
Каким образом мы избежали написания отдельного когда для чтения каждой кнопки?
Почему разные «ноты», издаваемые пищалкой, звучат с разной громкостью?
Для чего мы использовали оператор логического отрицания !?
Задания%для%самостоятельного%решения%
1.
2.
3.
Сделайте так, чтобы наше пианино звучало в диапазоне от 2 кГц до 5 кГц.
Добавьте еще 2 кнопки и измените программу так, чтобы можно было извлечь 5 различных нот.
Подключите кнопки по схеме со стягивающим резистором и измените программу так, чтобы она
продолжала работать.
Урок%9.%Миксер%
В этом уроке мы создаем модель миксера с двумя скоростями работы.
Список%деталей%для%урока%%
•
•
•
•
•
•
•
•
Для%дополнительного%задания%
1 плата Arduino Uno
еще 1 кнопка
беспаечная макетная плата
еще 2 провода
3 тактовых кнопки
1 коллекторный двигатель
1 выпрямительный диод
1 полевой MOSFET-транзистор
15 проводов «папа-папа»
1 клеммник, если вы используете мотор с проводами, которые плохо втыкаются в макетку
Принципиальная%схема%%
Схема%на%макетке%
Обратите%внимание%
•
•
•
•
Защитный диод нам нужен для того, чтобы ток обратного направления, который начнет создавать
двигатель, вращаясь по инерции, не вывел из строя транзистор.
Не перепутайте полярность диода, иначе, открыв транзистор, вы устроите короткое замыкание!
Причину отсутствия подтягивающих/стягивающих резисторов в схеме вы поймете, ознакомившись с
программой.
Мы подключили питание схемы к выходу Vin платы микроконтроллера, потому что, в отличие выхода 5V,
отсюда можно получить напряжение, подключенное к плате, без изменений и без ограничений по
величине тока.
Скетч%
p090_mixer.ino
Пояснения%к%коду%
•
•
Мы использовали новый режим работы портов: INPUT_PULLUP. На цифровых портах Arduino есть
встроенные подтягивающие резисторы, которые можно включить указанным образом одновременно с
настройкой порта на вход. Именно поэтому мы не использовали резисторы при сборке схемы.
На каждой итерации цикла мы задаем мотору скорость вращения, пропорциональную текущему значению
счетчика. Но выполнение инструкций не дойдет до назначения новой скорости, если при проверке
нажатия кнопки она окажется отпущенной. Инструкция continue, которая выполнится в этом случае,
отменит продолжение данной итерации цикла и выполнение программы продолжится со следующей. А
мотор будет крутиться со скоростью, заданной при последнем нажатии на какую-то из кнопок.
Вопросы%для%проверки%себя%
1.
2.
3.
4.
Зачем в схеме использован диод?
Почему мы использовали полевой MOSFET-транзистор, а не биполярный?
Почему мы не использовали резистор между портом Arduino и затвором транзистора?
Как работает инструкция continue, использованная в цикле for?
Задания%для%самостоятельного%решения%
1.
2.
3.
Внесите единственное изменение в программу, после которого максимальной скоростью вращения
мотора составит половину от возможной.
Перепишите программу без использования инструкции continue.
Добавьте в схему еще одну кнопку, чтобы у миксера стало три режима. Понадобилось ли изменять чтолибо в программе?
Урок%10.%Кнопочный%переключатель%
В этом уроке мы делаем из тактовой кнопки триггер, борясь с «дребезгом».
Список%деталей%для%урока%%
•
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
1 тактовая кнопка
1 резистор номиналом 220 Ом
1 светодиод
5 проводов «папа-папа»
Принципиальная%схема%
Для%дополнительного%задания%
еще 1 кнопка
еще 2 провода
Схема%на%макетке%
Обратите%внимание%
Мы могли бы один из контактов кнопки соединить проводом напрямую с одним из входов GND, но мы сначала
«раздали» «землю» на длинную рельсу макетки. Если мы работаем с макетной платой, так поступать удобнее,
т.к. в схеме могут появляться новые участки, которые тоже нужно будет соединить с «землей»
Также полезно руководствоваться соображениями аккуратности изделия, поэтому катод светодиода мы
соединяем с другим входом GND отдельным проводом, который не мешает нам работать в середине макетки.
Скетч%
plOO_led_toggle.ino
Пояснения%к%коду%
•
•
Поскольку мы сконфигурировали вход кнопки как INPUT_PULLUP, при нажатии на кнопку на данном
входе мы будем получать 0. Поэтому мы получим значение true («истина») в булевой переменной
buttonlsUp («кнопка отпущена»), когда кнопка отпущена.
Логический оператор && («и») возвращает значение «истина» только в случае истинности обоих его
операндов. Взглянем на так называемую таблицу истинности для выражения buttonWasUp &&
!buttonlsUp («кнопка была отпущена и кнопка не отпущена»):
buttonWasUp buttonlsUp !buttonlsUp
buttonWasUp && !buttonlsUp
0
0
1
0
0
1
0
0
1
0
1
1
1
1
0
0
Здесь рассмотрены все возможные сочетания предыдущего и текущего состояний кнопки и мы видим, что наш
условный оператор if сработает только в случае, когда кнопка нажата только что: предыдущее состояние 1
(«была отпущена»), а текущее 0 («не отпущена»).
• Через 10 миллисекунд мы проверяем еще раз, нажата ли кнопка: этот интервал больше, чем
длительность «дребезга», но меньше, чем время, за которое человек успел бы дважды нажать на
кнопку. Если кнопка всё еще нажата, значит, это был не дребезг.
• Мы передаем в digitalWrite не конкретное значение HIGH или LOW, а просто булеву переменную
ledEnabled. В зависимости от того, какое значение было для нее вычислено, светодиод будет
зажигаться или гаситься.
• Последняя инструкция в buttonWasUp = buttonlsUp сохраняет текущее состояние кнопки в переменную
предыдущего состояния, ведь на следующей итерации loop текущее состояние уже станет историей.
Вопросы%для%проверки%себя%
1.
2.
3.
4.
В каком случае оператор && возвращает значение «истина»?
Что такое «дребезг»?
Как мы с ним боремся в программе?
Как можно избежать явного указания значения уровня напряжения при вызове digitalWrite?
Задания%для%самостоятельного%решения%
1.
2.
Измените код так, чтобы светодиод переключался только после отпускания кнопки.
Добавьте в схему еще одну кнопку и доработайте код, чтобы светодиод зажигался только при нажатии
обеих кнопок.
Урок%11.%Светильник%с%кнопочным%управлением%
В этом уроке мы добавляем порцию яркости светодиоду одной кнопкой и убавляем другой.
Список%деталей%для%урока%
•
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
2 тактовых кнопки
1 резистор номиналом 220 Ом
1 светодиод
7 проводов «папа-папа»
Принципиальная%схема%%
Схема%на%макетке%
Обратите%внимание%
Если вы переделываете схему из схемы предыдущего урока, обратите внимание, что на этот раз нам нужно
подключить светодиод к порту, поддерживающему ШИМ.
Скетч%
pllO_plus_minus_light.ino
Пояснения%к%коду%
•
•
•
•
•
•
•
•
Мы можем пользоваться не только встроенными функциями, но и создавать собственные. Это
обоснованно, когда нам нужно повторять одни и те же действия в разных местах кода или, например,
нужно выполнять одни и те же действия над разными данными, как в данном случае: обработать сигнал с
цифровых портов 2 и 3.
Определять собственные функции можно в любом месте кода вне кода других функций. В нашем
примере, мы определили функцию после loop.
Чтобы определить собственную функцию, нам нужно:
o Объявить, какой тип данных она будет возвращать. В нашем случае это boolean. Если функция
только выполняет какие-то действия и не возвращает никакого значения, используйте ключевое
слово void
o Назначить функции имя — идентификатор. Здесь действуют те же правила, что при именовании
переменных и констант. Называть функции принято в том же стиле как Переменные.
o В круглых скобках перечислить передаваемые в функцию параметры, указав тип каждого. Это
является объявлением переменных, видимых внутри вновь создаваемой функции, и только внутри
нее. Например, если в данном уроке мы попробуем обратиться KwasUp или isUp из lоор( )
получим от компилятора сообщение об ошибке. Точно так же, переменные, объявленные в loop,
другим функциям не видны, но их значения можно передать в качестве параметров.
o Между парой фигурных скобой написать код, выполняемый функцией
o Если функция должна вернуть какое-то значение, с помощью ключевого слова return указать,
какое значение возвращать. Это значение должно быть того типа, который мы объявили
Так называемые глобальные переменные, т.е. переменные, к которым можно обратиться из любой
функции, обычно объявляются в начале программы. В нашем случае — это brightness.
Внутри созданной нами функции handleClick происходит всё то же самое, что в уроке «Кнопочный
переключатель».
Поскольку при шаге прироста яркости 35 не более чем через восемь нажатий подряд на одну из кнопок
значение выражения brightness + delta выйдет за пределы интервала [0, 255]. С помощью функции
constrain мы ограничиваем допустимые значения для переменной brightness указанными границами
интервала.
В выражении plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +35) мы обращаемся к переменной plusUp
дважды. Поскольку = помещает значение правого операнда в левый, сначала вычисляется, что вернет
handleClick. Поэтому когда мы передаем ей plusUp в качестве параметра, она имеет еще старое значение,
вычисленное при прошлом вызове handleClick.
Внутри handleClick мы вычисляем новое значение яркости светодиода и записываем его в глобальную
переменную brightness, которая на каждой итерации loop просто передается в analogWrite.
Вопросы%для%проверки%себя%
1.
2.
3.
Что необходимо для определения собственной функции?
Что означает ключевое слово void?
Как ведет себя программа при упоминании одной переменной с разных сторон от оператора
присваивания =?
Задания%для%самостоятельного%решения%
•
•
Доработайте код таким образом, чтобы шаг изменения яркости настраивался в одном месте.
Создайте еще одну функцию и переделайте код так, чтобы одна функция отвечала за отслеживание
нажатий, а другая — за вычисление яркости светодиода и возвращала его в analogWrite.
Урок%12.%Кнопочные%ковбои%
В этом уроке мы создаем игрушку на реакцию: кто быстрее нажмет кнопку по сигналу.
Список%деталей%для%урока%
•
•
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
2 тактовых кнопки
2 резистора номиналом 220 Ом
2 светодиода
1 пьезопищалка
10 проводов «папа-папа»
Принципиальная%схема%% Схема%на%макетке%
Скетч%
pl20_button_cowboys.ino
Пояснения%к%коду%
•
•
Массив состоит из элементов одного типа, в нашем случае int.
Объявить массив можно следующими способами:
•
Когда мы объявляем массив с указанием количества его элементов п, это число всегда на 1 больше, чем
номер последнего элемента (п-1), т.к. индекс первого элемента — 0.
Считать или записать значение элемента массива можно, обратившись к нему по индексу, например
firstArray [ 2 ] или buttonState [ counter ], где counter — переменная, такая как счетчик цикла
В переменных типа long можно хранить значения до 2 147 483 647. unsigned int в этом случае нам будет
недостаточно, потому что 65 535 миллисекунд пройдут чуть больше чем за минуту!
Функция random(min, max) возвращает целое псевдослучайное число в интервале [min, max]. Для
драматичности каждая игра начинается с паузы случайной длины.
Благодаря массивам в этом уроке мы настраиваем порты, считываем кнопки и включаем светодиоды в
циклах со счетчиком, который используется как индекс элемента.
Мы используем цикл for без условия его завершения, поэтому пока мы явно того не потребуем, цикл будет
крутиться до бесконечности.
Мы использовали выражение player = (player+1) % PLAYER_COUNT для счётчика цикла, чтобы не только
увеличивать его на единицу каждый раз, но и обнулять при достижении последнего игрока.
Инструкция break прекращает работу цикла и выполнение программы продолжается с инструкции после
его конца.
•
•
•
•
•
•
•
Вопросы%для%проверки%себя%
1.
2.
3.
4.
5.
6.
Можно ли поместить в один массив элементы типа boolean и int?
Обязательно ли при объявлении массива заполнять его значениями?
Чем удобно использование массива?
Как обратиться к элементу массива, чтобы прочитать его значение?
Почему для хранения времени прошлого сигнала мы используем переменную типа long?
Чем отличаются инструкции continue и break?
Задания%для%самостоятельного%решения%
1.
2.
3.
Сделайте напряженный вариант игры: пусть интервал между сигналами будет в диапазоне от 10 до 15
секунд.
В игре есть лазейка: кнопку можно зажать до сигнала «пли!» и таким образом сразу же выиграть.
Дополните программу так, чтобы так выиграть было нельзя.
Добавьте в игру еще двух ковбоев!
Урок%13.%Секундомер%
В этом уроке мы создаем секундомер, который считает до 10.
Список%деталей%для%урока%
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
1 семисегментный индикатор
7 резисторов номиналом 220 Ом
9 проводов «папа-папа»
Принципиальная%схема%%
Схема%на%макетке%
Обратите%внимание%
•
•
•
•
Выводы 3 и 8 семисегментного индикатора оба являются катодами, к земле можете подключать любой из
них.
Внимательно рассмотрите схему, сопоставьте сегменты индикатора с номерами его ножек, а те, в свою
очередь, с пинами Arduino, к которым мы их подключаем.
Вывод 5 индикатора — это точка. Мы не используем её в этом уроке
Сегменты индикатора — просто светодиоды, поэтому мы используем резистор с каждым из них.
Скетч%
pl30_seven_segment_counter.ino
Пояснения%к%коду%
•
•
•
•
•
Мы создали массив типа byte: каждый его элемент это 1 байт, 8 бит, может принимать значения от 0 до
255.
Символы арабских цифр закодированы состоянием пинов, которые соединены с выводами
соответствующих сегментов: 0, если сегмент должен быть выключен, и 1, если включен.
В переменную mask мы помещаем тот элемент массива numberSegments, который соответствует текущей
секунде, вычисленной в предыдущей инструкции.
В цикле for мы пробегаем по всем сегментам, извлекая с помощью встроенной функции bitRead нужное
состояние для текущего пина, в которое его и приводим с помощью digitalWrite и переменной
enableSegment
bitRead(x, п) возвращает boolean значение: n-ный бит справа в байте х
Вопросы%для%проверки%себя%
1.
2.
3.
К которой ножке нашего семисегментного индикатора нужно подключать землю?
Как мы храним закодированные символы цифр?
Каким образом мы выводим символ на индикатор?
Задания%для%самостоятельного%решения%
1.
2.
3.
Измените код, чтобы индикатор отсчитывал десятые секунды.
Поменяйте программу так, чтобы вместо символа «О» отображался символ «А».
Дополните схему и программу таким образом, чтобы сегмент-точка включался при прохождении четных
чисел и выключался на нечетных
Урок%14.%Счётчик%нажатий%
В этом уроке мы выводим на семисегментный индикатор количество нажатий на кнопку (единицы).
Список%деталей%для%урока%%
•
•
•
•
•
•
•
1 плата Arduino Uno1
1 беспаечная макетная плата
1 тактовая кнопка
1 выходной сдвиговый регистр 74НС595
1 семисегментный индикатор
7 резисторов номиналом 220 Ом
24 провода «папа-папа»
Принципиальная%схема%%
Для%дополнительного%задания%
фоторезистор
1 резистор номиналом 10 кОм
еще 1 провод
Схема%на%макетке%
Обратите%внимание%
•
•
•
•
•
В этом уроке мы впервые используем микросхему, в данном случае — выходной сдвиговый регистр
74НС595. Микросхемы полезны тем, что позволяют решать определенную задачу, не собирая каждый раз
стандартную схему.
Выходной сдвиговый регистр дает нам возможность «сэкономить» цифровые выходы, использовав всего
3 вместо 8. Каскад регистров позволил бы давать 16 и т.д. сигналов через те же три пина.
Перед использованием микросхемы нужно внимательно изучить схему ее подключения в datasheet'e. Для
того, чтобы понять, откуда считать ножки микросхемы, на них с одной стороны есть полукруглая выемка.
Если мы расположим нашу 74НС595 выемкой влево, то в нижнем ряду будут ножки 1—8, а в верхнем 16—
9.
На принципиальной схеме нашего урока ножки расположены в другом порядке, чтобы не вышло путаницы
в соединениях. Назначения выводов согласно datasheet'y подписаны внутри изображения микросхемы,
номера ножек — снаружи.
Напомним, что на изображении семисегментного индикатора подписаны номера его ножек и их
соответствие сегментам.
Скетч%
pl40_seven_segment_clicker.ino
Пояснения%к%коду%
■ Обратите внимание, что в этом уроке кодировки символов отличаются от кодировок из урока
«Секундомер».
■ Для того, чтобы передать порцию данных, которые будут отправлены через сдвиговый регистр далее, нам
нужно подать LOW на latch pin (вход STcp микросхемы), затем передать данные, а затем отправить HIGH на
latch pin, после чего на соответствующих выходах 74НС595 появится переданная комбинация высоких и
низких уровней сигнала.
■ Для передачи данных мы использовали функцию shif tOut (dataPin, clockPin, bitOrder, value). Функция
ничего не возвращает, а в качестве параметров ей нужно сообщить
! пин Arduino, который подключен ко входу DS микросхемы (data pin),
! пин Arduino, соединенный со входом SHcp (clock pin),
! порядок записи битов: LSBFIRST (least significant bit first) — начиная с младшего, или MSBFIRST
(most significant bit first) — начиная со старшего,
! байт данных, который нужно передать. Функция работает с порциями данных в один байт, так что
если вам нужно передать больше, придется вызывать ее несколько раз.
Вопросы%для%проверки%себя%
1.
2.
3.
4.
Для чего нужны микросхемы? Для чего нужен выходной сдвиговый регистр?
Как найти ножку микросхемы, на которую отправляются данные?
Что нужно сделать до и после отправки собственно данных на 74HC595?
Сколько данных можно передать с помощью shiftOut( ) и как управлять порядком их передачи?
Задания%для%самостоятельного%решения%
1.
2.
Заставьте shiftOut( ) отправлять биты, начиная со старшего, и измените код так, чтобы счетчик попрежнему показывал арабские цифры.
Замените кнопку на датчик света (фоторезистор в схеме делителя напряжения) и переделайте программу
так, чтобы индикатор цифрой показывал уровень освещенности.
Эксперимент+15.+Комнатный+термометр+
В этом эксперименте мы измеряем температуру окружающей устройство среды и с помощью шкалы показываем,
на сколько она превышает заданный порог.
Список+деталей+для+эксперимента++
•
•
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
1 светодиодная шкала
1 резистор номиналом 10 кОм
1 термистор
10 резисторов номиналом 220 Ом
14 проводов «папа-папа»
Для+дополнительного+задания+
1 пьезопищалка
еще 2 провода
Принципиальная+схема++ Схема+на+макетке+
Обратите+внимание+
Термистор мы включили в известную нам схему делителя напряжения.
Скетч+
pl50_bar_thermometer.ino
Пояснения+к+коду+
•
•
•
•
•
Директивы для подключения библиотек #include включаются в начало программы.
В этом эксперименте мы подключаем библиотеку math. h для того, чтобы использовать функцию взятия
натурального логарифма х l o g ( x ) .
В переменных типа float можно хранить дробные числа, числа с плавающей точкой.
При использовании переменных данного типа имейте в виду:
o при операциях с их использованием, указывайте нулевую дробную часть у целых констант, как в
примере
o они могут принимать значения от -3.4028235х1038 до 3.4028235х1038,
o при этом количество значащих цифр может быть 6-7: всех цифр, не только после запятой!
o точность вычислений с такими данными невелика, у вас могут возникнуть неожиданные ошибки,
например, при использовании float в условном операторе. Не полагайтесь на точность!
o вычисления с float происходят медленнее, чем с целыми числами
Показания термистора связаны с температурой нелинейно, поэтому нам приходится использовать такую
громоздкую формулу.
Вопросы+для+проверки+себя+
1.
2.
3.
4.
Как нужно подключить термистор, чтобы получать на Arduino данные о температуре?
Каким образом можно воспользоваться ранее разработанными функциями, не переписывая их в
программный код?
Чем неудобно использование чисел с плавающей точкой на Arduino?
Что за выражение стоит справа от = при объявлении булевой переменной enableSegment?
Задания+для+самостоятельного+решения+
1.
2.
Измените код программы таким образом, чтобы индикатор включался при 0 градусов и его показания
прирастали на одно деление каждые 5 градусов.
Добавьте в схему пьезопищалку и доработайте программу так, чтобы срабатывала звуковая сигнализация
при достижении температуры, например, 25 градусов.
Урок%16.%Метеостанция%
В этом уроке мы передаем данные об измерениях температуры на компьютер (например, для последующей
обработки).
Список'деталей'для'урока'
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
1 резистор номиналом 10 кОм
1 термистор
3 провода «папа-папа»
Принципиальная'схема''
Скетч'
pl60_meteostation.ino
Схема'на'макетке'
Пояснения'к'коду'
Очень часто бывает полезно обмениваться данными, например, с компьютером. В частности, для отладки
работы устройства: можно, например, смотреть, какие значения принимают переменные.
• В данном уроке мы знакомимся со стандартным объектом Serial, который предназначен для работы с
последовательным портом (UART) Arduino, и его методами (функциями, созданными для работы с
данным объектом) begin ( ), print ( ) и println ( ), которые вызываются после точки, идущей за именем
объекта:
o чтобы обмениваться данными, нужно начать соединение, поэтому Serial.begin(baudrate)
вызывается в setup( )
o Serial .print (data) отправляет содержимое data. Если мы хотим отправить текст, можно просто
заключить его в пару двойных кавычек: " ". Кириллица, скорее всего, будет отображаться
некорректно.
o Serial. println (data) делает то же самое, только добавляет в конце невидимый символ новой
строки.
• В print ( ) и println ( ) можно использовать второй необязательный параметр: выбор
системы счисления, в которой выводить число (это может быть DEC, BIN, HEX, ОСТ для
десятичной, двоичной, шестнадцатеричной и восьмеричной систем счисления соответственно)
или количество знаков после запятой для дробных чисел.
Например,
•
в мониторе порта даст результат
•
•
•
•
•
Монитор порта, входящий в Arduino IDE, открывается через меню Сервис или сочетанием клавиш
Ctrl+Shift+M. Следите за тем, чтобы в мониторе и в скетче была указана одинаковая скорость обмена
данными, baudrate. Скорости 9600 бит в секунду обычно достаточно. Другие стандартные значения
можете посмотреть в выпадающем меню справа внизу окна монитора порта.
Вам не удастся использовать цифровые порты 0 и 1 одновременно с передачей данных по
последовательному порту, потому что по ним также идет передача данных, как и через USB-порт платы.
При запуске монитора порта скетч в микроконтроллере перезагружается и начинает работать с начала.
Это удобно, если вам нельзя упустить какие-то данные, которые начинаю передаваться сразу же. Но в
других ситуациях это может мешать, помните об этом нюансе!
Если вы хотите читать какие-то данные в реальном времени, не забывайте делать delay ( ) хотя бы на 100
миллисекунд, иначе бегущие числа в мониторе будет невозможно разобрать. Вы можете отправлять
данные и без задержки, а затем, к примеру, скопировать их для обработки в стороннем приложении.
Последовательность \t выводится как символ табуляции (8 пробелов с выравниванием). Также вы можете
использовать, например, последовательность \п для перевода строки. Если вы хотите использовать
обратный слеш, его нужно экранировать вторым таким же: \\.
Вопросы'для'проверки'себя'
1.
2.
3.
Какие действия нужно предпринять, чтобы читать на компьютере данные с Arduino?
О каких ограничениях не следует забывать при работе с последовательным портом?
Как избежать ошибки в передаче данных, содержащих обратный слэш (\)?
Задания'для'самостоятельного'решения'
1.
2.
Перед таблицей данных о температуре добавьте заголовок (например, "Meteostation").
Добавьте столбец, содержащий количество секунд, прошедших с момента запуска микроконтроллера.
Можно уменьшить интервал передачи данных.
Урок%17.%Пантограф%
В этом уроке мы вращаем сервопривод на угол, задаваемый потенциометром.
Список'деталей'для'урока'
1.
2.
3.
4.
5.
6.
1 плата Arduino Uno
1 беспаечная макетная плата
1 сервопривод
1 конденсатор емкостью 220 мкФ
1 потенциометр
11 проводов «папа-папа»
Принципиальная'схема''
Схема'на'макетке'
Обратите'внимание'
•
•
•
•
Конденсатор в данной схеме нам нужен для того, чтобы при включении сервопривода избежать просадки
питания платы.
Не забывайте про то, что нужно соблюдать полярность элетролитического конденсатора. Короткая ножка
(со стороны белой полосы на корпусе) — «минус».
Вы можете соединить провод сервопривода с макетной платой проводами «папа-папа»: коричневый это
земля, красный — питание, оранжевый — сигнал.
В данном уроке мы подключаем питние сервопривода к 5\/-выходу Arduino. С одним сервоприводом плата
справится, но если в каком-либо проекте вам нужно больше серв, используйте специальные платыдрайвера с отдельным источником питания для серв.
Скетч'
pl70_servo.ino
Пояснения'к'коду'
•
•
•
•
В данном уроке мы также имеем дело с объектом, на этот раз он нужен для простого управления
сервоприводом. Как отмечено в комментариях, в отличие от объекта Serial, объекты типа Servo нам нужно
явно создать: Servo myServo, предварительно подключив библиотеку <Servo. h>.
Далее мы используем два метода для работы с ним:
o myServo. attach (pin) — сначала «подключаем» серву к порту, с которым физически соединен его
сигнальный провод. pinMode( ) не нужна, метод attach ( ) займется этим.
o myServo.write (angle) — задаем угол, т.е. позицию, которую должен принять вал сервопривода.
Обычно это 0—180°.
myServo здесь это имя объекта, идентификатор, который мы придумываем также, как названия
переменных. Например, если вы хотите управлять двумя захватами, у вас могут быть объекты leftGrip и
rightGrip.
Мы использовали функцию int( ) для явного преобразования числа с плавающей точкой в целочисленное
значение. Она принимает в качестве параметра значение любого типа, а возвращает целое число. Когда
в одном выражении мы имеем дело с различными типами данных, нужно позаботиться о том, чтобы не
получить непредсказуемый ошибочный результат.
Вопросы'для'проверки'себя'
1.
2.
3.
4.
Зачем нужен конденсатор при включении в схему сервопривода?
Каким образом библиотека <Servo.h> позволяет нам работать с сервоприводом?
Зачем мы ограничиваем область допустимых значений для angle?
Как быть уверенным в том, что в переменную типа int после вычислений попадет корректное значение?
Задания'для'самостоятельного'решения'
1.
2.
Измените программу так, чтобы по мере поворота ручки потенциометра, сервопривод последовательно
занимал 8 положений: 45, 135, 87, 0, 65, 90, 180, 150°.
Предположим, что сервопривод управляет шторкой, и нам нужно поддерживать постоянное количество
света в помещении. Создайте такой механизм.
Урок!18.!Тестер!батареек!
В этом уроке мы выводим на жидкокристаллический дисплей данные о напряжении, измеренном на батарейке.
Список!деталей!для!урока!
•
•
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
2 резистора номиналом 10 кОм
1 выпрямительный диод
1 текстовый экран
16 проводов «папа-папа»
1 клеммник
Принципиальная!схема!!
Схема!на!макетке!
Обратите!внимание!
•
•
•
•
Мы подключаем «плюс» батарейки через делитель напряжения с равными плечами (Rl = R2 = 10 кОм),
таким образом деля подаваемое напряжение пополам. Поскольку в аналоговый вход Arduino мы можем
подавать до 5В, мы можем измерять напряжение до 10В. Не пробуйте измерять большее напряжение, вы
можете повредить плату!
На принципиальной схеме внутри изображения дисплея подписаны названия его выводов согласно
datasheet, а снаружи — номера его ножек.
Ножки нашего ЖК-дисплея нумеруются не подряд: 15 и 16 ножки находятся перед 1.
Диод пригодится, если пользователь тестера перепутает «+» и «-» батарейки, главное нам самим не
забыть про направление, в котором через диод может течь ток, и установить его верно!
Скетч!
pl80_lcd.ino
Пояснения!к!коду!
•
•
•
Если вы используете диод, падение напряжения на котором происходит на другую величину, не забудьте
исправить макроопределение DIODE_DROP.
В этом уроке мы снова пользуемся готовой библиотекой <LiquidCrystal. h> для создания объекта led и
использования его методов
o led. begin (cols, rows ) с помощью которого мы задаем количество колонок и строк нашего дисплея
o led. print (data) для вывода данных. У него есть второй необязательный параметр BASE, передав
который, можно выбрать систему счисления, так же, как в примере с Serial.print().
o led. setCursor (col, row) устанавливает курсор в переданную колонку и строку. Последующий вывод
будет осуществляться с этого места.
При создании led мы передали параметрами пины, к которым подключены выводы дисплея, через
которые мы будем им управлять и передавать данные.
Вопросы!для!проверки!себя!
1.
2.
3.
4.
Из-за чего измерения напряжения в этом уроке могут быть неточными (на что мы можем повлиять)?
Какая библиотека облегчает работу с нашим текстовым экраном? Какие шаги нужно предпринять до начала вывода
текста на него?
Каким образом мы задаем позицию, с которой на экран выводится текст?
Можем ли мы писать на экране кириллицей? Как?
Задания!для!самостоятельного!решения!
Возможно, вы захотите воспользоваться еще одним методом вашего объекта led — clear ( ): он очищает экран и
устанавливает курсор в левую колонку верхней строчки.
1. Создайте секундомер, который будет отсчитывать время, прошедшее с начала работы Arduino и выводить секунды
и сотые секунд на экран.
2. Совместите отсчет времени и измерение напряжения. Отобразите все данные на дисплее. Отправляйте их раз в 10
секунд на компьютер.
Теперь вы можете выводить без компьютера и проводов любые данные, с которыми работаете, и использовать это как в
режиме эксплуатации вашего устройства, так и во время отладки!
Урок%19.%Светильник,%управляемый%по%USB%
В этом уроке мы отправляем устройству команды, как ему светить.
Список%деталей%для%урока%
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
1 светодиод
1 резистор номиналом 220 Ом
2 провода «папа-папа»
Принципиальная%схема%
Скетч%
Схема%на%макетке%
Пояснения%к%коду%
■ В этой программе мы создаем объект класса String. Это встроенный класс, предназначенный для
работы со строками, т.е. с текстом.
■ Не путайте его с типом данных string, который является просто массивом символов. String же
позволяет использовать ряд методов для удобной работы со строками.
■ Мы знакомимся с новым видом циклов: цикл с условием while. В отличие от цикла со счетчиком for,
цикл while (expression) выполняется до тех пор, пока логическое выражение expression истинно.
■ Метод available ( ) объекта Serial возвращает количество байт, полученных через последовательный
порт.
■ В данном уроке цикл while работает до тех пор, пока available ( ) возвращает ненулевое значение,
любое из которых приводится к true.
■ Переменные типа char могут хранить один символ.
■ В этом примере символ мы получаем методом Serial .read( ), который возвращает первый байт,
пришедший на последовательный порт, или -1, если ничего не пришло.
■ Обратите внимание, что в if мы сравниваем не пришедший символ с 0 и 9, но их коды. Если пришел
какой-то символ, который не является цифрой, мы не будем его добавлять к нашей строке message.
■ Объекты типа String позволяют производить конкатенацию, т.е. объединение строк. Это можно сделать
так: message = message + incomingChar, но можно записать в сокращенной форме: message +=
incomingChar.
■ В этой программе мы дополняем if конструкцией else if. Это еще один условный оператор, который
проверяется только в случае ложности выражения, данного первому оператору. Несколько else if могут
следовать друг за другом, при этом каждое следующее условие будет проверяться только в случае
невыполнения всех предыдущих. Если в конце разместить else, он выполнится только если ни одно из
условий не выполнено.
■ Напомним, что последовательностью \п кодируется символ переноса строки. Если он был передан
устройству, мы передаем полученные ранее символы как параметр для analogWrite( ), которая включает
светодиод.
■ Мы используем один из методов String, toInt( ), который заставляет считать строку не набором цифр,
но числом. Он возвращает значение типа long, при этом, если строка начинается с символа, не
являющегося цифрой, будет возвращен 0. Если после цифр, идущих в начале строки, будут символы нецифры, на них конверсия остновится.
■ Обратите внимание на выпадающее меню внизу монитора порта: чтобы наше устройство получало
символ перевода строки, там должно быть выбрано «Новая строка (NL)»
■ Пустая строка обозначается так: " ". Опустошив ее, мы готовы собирать новую последовательность
символов.
Вопросы%для%проверки%себя%
1.
2.
3.
4.
5.
6.
Какие объекты позволяют легко манипулировать текстовыми данными?
Что возвращают методы Serial.available( ) и Serial.read( )?
Чем отличаются конструкции for и while?
Каким образом можно организовать более сложное ветвление, чем if ... else?
Как можно объединить текстовые строки?
Как можно привести текстовую строку, содержащую цифры, к числовому типу?
Задания%для%самостоятельного%решения%
1.
Проверьте, попадает ли переданное число в диапазон значений, которые нужно передавать в
analogWrite(). Передайте на компьютер сообщение об ошибке, если нет.
2. Переделайте программу так, чтобы устройство распознавало текстовые команды, например, «on» и «off»,
и соответственно включало и выключало светодиод.
Вам может пригодиться один из методов String: toLowerCase(yourString) или toUpperCase(yourString), которые
возвращают переданную строку yourString, приведенную к нижнему или верхнему регистру соответственно.
Урок%20.%Перетягивание%каната%
В этом уроке мы создаем еще одну игру, на этот раз нужно быстрее соперника нажать кнопку 20 раз.
Список%деталей%для%урока%%
•
•
•
•
•
•
•
•
•
•
1 плата Arduino Uno
1 беспаечная макетная плата
1 светодиодная шкала
10 резисторов номиналом 220 Ом
4 резисторов номиналом 100 кОм
2 тактовых кнопки
2 керамических конденсатора номиналом 100 нФ
1 пьезопищалка
1 инвертирующий триггер Шмитта
24 провода «папа-папа»
Принципиальная%схема%%
Для%дополнительного%задания%
1 сервопривод
1 конденсатор 220 мкФ
Схема%на%макетке%
Обратите%внимание%
•
•
Скетч%
Схема подключения кнопок с использованием конденсаторов, резисторов и микросхемы 74НС17, которая
называется инвертирующий триггер Шмитта, нужна для аппаратного подавления дребезга.
В этом уроке нам нужно очень много цифровых портов, поэтому нам пришлось использовать порт 0.
Пользоваться им неудобно из-за того, что он соединен с одним из каналов последовательного порта,
поэтому перед прошивкой микроконтроллера нам придется отключать провод, идущий к пьезопищалке, а
после прошивки подключать его обратно.
Пояснения%к%коду%
■ Код нашей обычной программы исполняется инструкция за инструкцией и если мы, например,
проверяем состояние датчика, мы к нему обратимся только в те моменты, когда очередь
дойдет до соответствующей инструкции. Однако мы можем использовать прерывания:
■ по наступлении определенного события
■ на определенном портуход, программы будет приостанавливаться для выполнения
■ определенной функции, а затем программа продолжит исполняться с того места, где была
приостановлена.
■ Arduino Uno позволяет делать прерывания на портах 2 и 3.
■ В setup () прописывается инструкция attachlnterrupt ( interrupt, action, event), где
■ interrupt может принимать значения INTO или INT1 для портов 2 и 3 соответственно
■ action — имя функции, которая будет вызываться при наступлении события
■ event — событие, которое мы отслеживаем. Может принимать значение RISING (изменение от
низкого уровня сигнала к высокому, от 0 к 1), FALLING (от высокого уровня к низкому, от 1 к 0),
CHANGE (от 0 к 1 или от 1 к 0), LOW (при низком уровне сигнала).
■ Глобальные переменные, к которым мы обращаемся из функции, обрабатывающей прерывания,
должны объявляться с использованием ключевого слова volatile, как в данном уроке volatile int score =
0.
■ Внутри функции, вызываемой по прерыванию, нельзя использовать delay ( ).
■ Функция abs (value) возвращает абсолютное значение value (значение по модулю). Обратите внимание,
что функция может сработать некорректно, если передавать ей выражение, которое еще не вычислено,
например abs(++a), лучше передавать ей просто переменную.
■ Функция min(vail, val2 ) вернет меньшее из vail и val2.
■ Функция max (vail, val2 ) вернет большее из vail и val2.
■ В данном уроке мы вычисляем значение, которое записывается на светодиоды, прямо в digitalWrite()
■ Мы уже знакомы с логическим «и» (&&). Нередко нужен оператор «логическое «или»: | |. Он возвращает
«истину», если хотя бы один из операндов имеет значение «истина», false | | false вернет false, a true |
| true, true | | false и false | | true вернут true.
■ Мы использовали while (true) {} для того, чтобы 1оор( ) остановился после того, как кто-то выиграл: у
while всегда истинное условие и он бесконечно ничего не выполняет!
Вопросы%для%проверки%себя%
1.
2.
3.
4.
5.
6.
7.
Каким образом мы подавляем дребезг аппаратно?
Для чего используются прерывания?
Каким образом можно включить обработку внешних прерываний?
О каких нюансах работы с уже известными нам вещами следует помнить при работе с прерываниями?
Как выбрать максимальное из двух значений? Минимальное?
Как получить абсолютное значение переменной? Чего следует избегать при использовании этой
функции?
Когда оператор логическое «или» возвращает «ложь»?
Задания%для%самостоятельного%решения%
1. Вместо светодиодной шкалы подключите сервопривод и измените код таким образом, чтобы
перетягивание демонстрировалось путем отклонения сервопривода от среднего положения.
Урок 21. Драйвер двигателя L298N
С этого урока начинается раздел курса в котором придется подключать и программировать уже не отдельные элементы, а
модули и датчики. Вот – первый из них.
Микросхема L298N представляет собой сдвоенный мостовой драйвер двигателей и предназначена для управления DC и
шаговыми двигателями. Данная микросхема находит очень широкое применение в роботостроительстве. Одна микросхема
L298N способна управлять двумя двигателями и обеспечивает максимальную нагрузку до 2А на каждый двигатель, а если
задействовать параллельное включение для одного двигателя, то можно поднять максимальный ток до 4А.
Сами модули на микросхемах L298N выглядят так:
Принципиальная схема такого модуля выглядит следующим образом:
Шилд имеет следующие пины подключения: Vcc - подключение внешнего питания двигателей +5 - питание логики GND общий IN1, IN2, IN3, IN4 (разъем P4 на схеме) - входы управления двигателями OUT1, OUT2 (разъем P2 на схеме) - выход
первого двигателя OUT3, OUT4 (разъем P3 на схеме) - выход второго двигателя Выключатель S1 служит для переключения
питания логической части микросхемы. Т.е. при включенном S1 питание логической части берется от внутреннего
преобразователя модуля. При выключенном S1 питание берется от внешнего источника. На модулях также присутствуют
перемычки ENA и ENB для разрешения включения двигателей. Если необходимо, их можно также подключить к Arduino и
задействовать, но это лишние 2 провода и в этих входах нет особого смысла.
ШИМ управление позволяет плавно изменять скорость вращение двигателя. Если нам не нужно ШИМ управление, то на
соответствующий вход нужно просто подать логическую 1. На какой именно вход IN1 или IN2 вы подадите сигнал ШИМ, либо
направление вращения - разницы не имеет. Тоже самое справедливо и для входов IN3, IN4.
Схема подключения шилда L298N к контроллеру Arduino:
Для питания логической части схемы необходимо нажать кнопку или вставить перемычку (зависит от типа модуля). Если же на
вашем модуле не предусмотрен преобразователь 5В, то дополнительно, необходимо соединить вывод 5V от Arduino к входу
+5 шилда. Как видно из схемы выше, 2 и 4 вывод используются для установки направления движения, а 3 и 5 для ШИМ
управления выводами.
Напишем тестовую программу, в которой мы будем в цикле изменять скорость вращения, а также направление вращения
двигателей:!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#define D1 2
#define M1 3
#define D2 4
#define M2 5
// Направление вращение двигателя 1
// ШИМ вывод для управления двигателем 1
// Направление вращение двигателя 2
// ШИМ вывод для управления двигателем 2
bool direction = 0; // Текущее направление вращения
int value;
// Текущее значение ШИМ
void setup()
{
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
}
void loop()
{
for(value = 0; value <= 255; value+=1)
{
digitalWrite(D1, direction); // Задаем направление вращения
digitalWrite(D2, direction);
analogWrite(M1, value);
// Задаем скорость вращения
analogWrite(M2, value);
delay(20);
}
direction = direction ^ 1;
// Инвертируем значение, чтобы в след. цикле вращаться в другую сторону
}
Arduino(блокнот(программиста(
Структура'
Базовая'структура'программы'для'Arduino'довольно'проста'и'состоит,'по'меньшей'мере,'из'двух'
частей.'В'этих'двух'обязательных'частях,'или'функциях,'заключён'выполняемый'код.'
'
Где'setup()'—'это'подготовка,'а'lоор()'—'выполнение.'Обе'функции'требуются'для'работы'
программы.'
Перед'функцией'setup'V'в'самом'начале'программы,'обычно,'идёт,'объявление'всех'переменных,'
setup'V'это'первая'функция,'выполняемая'программой,'и'выполняемая'только'один'раз,'поэтому'она'
используется'для'установки'режима'работы'портов'(pinMode())'или'инициализации'
последовательного'соединения.'
Следующая'функция'loop'содержит'код,'который'выполняется'постоянно'—'читаются'входы,'
переключаются'выходы'и'т.д.'Эта'функция'—'ядро'всех'программ'Arduino'и'выполняет'основную'
работу.'
setup()(
Функция'setup()'вызывается'один'раз,'когда'программа'стартует.'Используйте'её'для'установки'
режима'выводов'или'инициализации'последовательного'соединения.'Она'должна'быть'включена'
в'программу,'даже'если'в'ней'нет'никакого'содержания.'
'
loop()(
После'вызова'функции'setup()'V'управление'переходит'к'функции'1оор()','которая'делает'в'
точности'то,'что'означает'её'имя'—'непрерывно'выполняется,'позволяя'программе'чтоVто'
изменять,'отвечать'и'управлять'платой'Arduino.'
'
Функции'
Функция'—'это'блок'кода,'имеющего'имя,'которое'указывает'на'исполняемый'код,'который'
выполняется'при'вызове'функции.'Функции'void'setup()'и'void'1оор()'уже'обсуждались,'а'другие'
встроенные'функции'будут'рассмотрены'позже.'
Могут'быть'написаны'различные'пользовательские'функции,'для'выполнения'повторяющихся'
задач'и'уменьшения'беспорядка'в'программе.'При'создании'функции,'первым'делом,'указывается'
тип'функции.'Это'тип'значения,'возвращаемого'функцией,'такой'как''int''для'целого'(integer)'типа'
функции.'Если'функция'не'возвращает'значения,'её'тип'должен'быть'void.'За'типом'функции'следует'
её'имя,'а'в'скобках'параметры,'передаваемые'в'функцию.'
'
Следующая'функция'целого'типа'delayVal()'используется'для'задания'значения'паузы'в'
программе'чтением'значения'с'потенциометра.'Вначале'объявляется'локальная'переменная'v,'затем'
v'устанавливается'в'значение'потенциометра,'определяемое'числом'между'0'—'1023,'затем'это'
значение'делится'на'4,'чтобы'результирующее'значение'было'между'0'и'255,'а'затем'это'
значение'возвращается'в'основную'программу.'
'
{}'фигурные'скобки'
Фигурные'скобки'(также'упоминаются'как'просто'«скобки»)'определяют'начало'и'конец'блока'
функции'или'блока'выражений,'таких'как'функция'void'1оор()'или'выражений'(statements)'типа'
for'и'if.'
'
За'открывающейся'фигурной'скобкой'{'всегда'должна'следовать'закрывающаяся'фигурная'скобка'}.'
Об'этом'часто'упоминают,'как'о'том,'что'скобки'должны'быть'«сбалансированы».'
Несбалансированные'скобки'могут'приводить'к'критическим,'неясным'ошибкам'компиляции,'
вдобавок'иногда'и'трудно'выявляемым'в'больших'программах.'
Среда'разработки'Arduino,'включает'возможность'удобной'проверки'баланса'фигурных'скобок.'
Достаточно'выделить'скобку,'или'даже'щёлкнуть'по'точке'вставки'сразу'за'скобкой,'чтобы'её'
пара'была'подсвечена.'
;'точка'с'запятой'
Точка'с'запятой'должна'использоваться'в'конце'выражения'и'разделять'элементы'программы.'
Также'точка'с'запятой'используется'для'разделения'элементов'цикла'for.'
'
Примечание:*Если'забыть'завершить'стоку'точкой'с'запятой,'то'это'приведёт'к'возникновению'
ошибки'компиляции.'Текст'ошибки'может'быть'очевиден'и'указывать'на'пропущенную'точку'с'
запятой,'но'может'быть'и'не'таким'очевидным.'Если'появляется'маловразумительная'или'
нелогичная'ошибка'компилятора,'первое,'что'следует'проверить'—'не'пропущена'ли'точка'с'
запятой'вблизи'строки,'где'компилятор'выразил'своё'недовольство.'
/*...'*/'блок'комментария'
Блок'комментария'или'однострочный'комментарий'—'это'область'текста,'которая'игнорируется'
программой'и'используется'для'добавления'текста'с'описанием'кода'или'примечаний.'Комментарий'
помогают'другим'понять'эту'часть'программы.'Он'начинается'с'/*'и'заканчивается'*/'и'может'
содержать'множество'строк.'
/*'это'«огороженный»'блок'комментария,'и'не'забудьте'«закрыть»'комментарий'–'он'должен'быть'
сбалансирован!'*/'
Поскольку'комментарии'игнорируются'программой,'а,'следовательно,'не'занимают'места'в'
памяти,'они'могут'быть'достаточно'ёмкими,'но'кроме'того,'они'могут'использоваться'для'
«пометки»'блоков'кода'с'отладочной'целью.'
Примечание:*Хотя'допускается'вставка'однострочного'комментария'в'блоке'комментария,'
второй'блок'комментария'не'допускается.'
//'однострочный'комментарий'
Однострочный'комментарий'начинается'с'//'и'заканчивается'(внутренним)'кодом'перехода'на'
другую'строку.'Как'и'блок'комментария,'он'игнорируется'программой'и'не'занимает'места'в'
памяти.'
//'вот'так'выглядит'однострочный'комментарий'
Однострочный'комментарий'часто'используется'после'действенного'выражения,'чтобы'дать'больше'
информации'о'том,'что'выражение'выполняет'или'в'качестве'напоминания'на'будущее.'
Переменные'
Переменные'—'это'способ'именовать'и'хранить'числовые'значения'для'последующего'
использования'программой.'Само'название'V'переменные,'говорит'о'том,'что'переменные'V'это'
числа,'которые'могут'последовательно'меняться,'в'отличие'от'констант,'чьё'значение'никогда'не'
меняется.'Переменные'нужно'декларировать'(объявлять),'и,'что'очень'важно'V'им'можно'присваивать'
значения,'которые'нужно'сохранить.'Следующий'код'объявляет'переменную'inputVariable,'а'затем'
присваивает'ей'значение,'полученное'от'2Vго'аналогового'порта:'
'
'inputVariable''—'это'наша'переменная.'Первая'строка'декларирует,'что'она'будет'содержать'int,'
короткое'целое.'Вторая'строка'присваивает'ей'значение'аналогового'вывода'2.'Это'делает'
значение'на'выводе'2'доступным'в'любом'месте'программы.'
Когда'переменной'присвоено'значение,'или'переVприсвоено,'вы'можете'проверить'это'значение,'
если'оно'встречается'в'некотором'условии,'или'использовать'его'непосредственно.'Рассмотрим'
пример,'иллюстрирующий'три'операции'с'переменными.'Следующий'код'проверяет,'не'меньше'
ли'100'значение'переменной,'а'если'так,'переменной'inputVariable'присваивается'значение'100,'а'
затем'задаётся'пауза,'определяемая'переменной'inputVariable,'которая'теперь,'как'минимум,'равна'
100:'
'
Примечание:*Переменные'должны'иметь'наглядные'имена,'чтобы'код'был'удобочитаемый.'
Имена'переменных'как'tiltSensor'или'pushButton'помогают'программисту'при'последующем'
чтении'кода'понять,'что'содержит'эта'переменная.'Имена'переменных'как'var'или'value,'с'другой'
стороны,'мало'делают'для'понимания'кода,'и'здесь'используются'только'в'качестве'примера.'
Переменные'могут'быть'названы'любыми'именами,'которые'не'являются'ключевыми'словами'
языка'программирования'Arduino.'
объявление'переменных'
Все'переменные'должны'быть'задекларированы'до'того,'как'они'могут'использоваться.'
Объявление'переменной'означает'определение'типа'её'значения:'int,'long,'float'и'т.д.,'задание'
уникального'имени'переменной,'и'дополнительно'ей'можно'присвоить'начальное'значение.'Всё'это'
следует'делать'только'один'раз'в'программе,'но'значение'может'меняться'в'любое'время'при'
использовании'арифметических'или'других'разных'операций.'
Следующий'пример'показывает,'что'объявленная'переменная'inputVariable'имеет'тип'int,'и'её'
начальное'значение'равно'нулю.'Это'называется'простым'присваиванием.'
'
Переменная'может'быть'объявлена'в'разных'местах'программы,'и'то,'где'это'сделано,'определяет,'
какие'части'программы'могут'использовать'переменную.'
границы'переменных'
Переменные'могут'быть'объявлены'в'начале'программы'перед'void'setup(),'локально'внутри'
функций,'и'иногда'в'блоке'выражений'таком,'как'цикл'for.'То,'где'объявлена'переменная,'
определяет'её'границы'(область'видимости),'или'возможность'некоторых'частей'программы'её'
использовать.'
Глобальные*переменные'таковы,'что'их'могут'видеть'и'использовать'любые'функции'и'выражения'
программы.'Такие'переменные'декларируются'в'начале'программы'перед'функцией'setup().'
Локальные*переменные'определяются'внутри'функций'или'таких'частей,'как'цикл'for.'Они'видимы'и'
могут'использоваться'только'внутри'функции,'в'которой'объявлены.'Таким'образом,'могут'
существовать'несколько'переменных'с'одинаковыми'именами'в'разных'частях'одной'программы,'
которые'содержат'разные'значения.'Уверенность,'что'только'одна'функция'имеет'доступ'к'её'
переменной,'упрощает'программу'и'уменьшает'потенциальную'опасность'возникновения'ошибок.'
Следующий'пример'показывает,'как'декларировать'несколько'разных'типов'переменных,'и'
демонстрирует'видимость'каждой'переменной:'
'
byte(
Байт'хранит'8Vбитовое'числовое'значение'без'десятичной'точки.''Он''имеет'диапазон'от'0'до'255.'
'
int(
Целое'—'это'первый'тип'данных'для'хранения'чисел'без'десятичной'точки,'и'хранит'16Vбитовое'
значение'в'диапазоне'от'32767'до'V32768.'
'
Примечание:*Целые'переменные'будут'переполняться,'если'форсировать'их'переход'через'
максимум'или'минимум'при'присваивании'или'сравнении.'Например,'если'х'='32767'и'следующее'
выражение'добавляет'1'к'х,'х'='х'+1'или'х++,'в'этом'случае'х'переполняется'и'будет'равен'V32678.'
long(
Тип'данных'увеличенного'размера'для'больших'целых,'без'десятичной'точки,'сохраняемый'в'32V
битовом'значении'с'диапазоном'от'2147383647'до'V2147383648.'
'
float(
Тип'данных'для'чисел'с'плавающей'точкой'или'чисел,'имеющих'десятичную'точку.'Числа'с'
плавающей'точкой'имеют'большее'разрешение,'чем'целые'и'сохраняются'как'32Vбитовые'
значения'в'диапазоне'от'3.4028235Е+38'до'V3.4028235Е+38.'
'
Примечание:*Числа'с'плавающей'точкой'не'точные,'и'могут'выдавать'странные'результаты'при'
сравнении.'Вычисления'с'плавающей'точкой'медленнее,'чем'вычисления'целых'при'выполнении'
расчётов,'так'что,'без'нужды,'их'следует'избегать.'
Массивы'
'
Массив'—'это'набор'значений,'к'которым'есть'доступ'через'значение'индекса.'Любое'значение'в'
массиве'может'быть'вызвано'через'вызов'имени'массива'и'индекса'значения.'Индексы'в'массиве'
начинаются'с'нуля'с'первым'значением,'имеющим'индекс'0.'Массив'нуждается'в'объявлении,'а'
дополнительно'может'заполняться'значениями'до'того,'как'будет'использоваться.'
Схожим'образом'можно'объявлять'массив,'указав'его'тип'и'размер,'а'позже'присваивать'
значения'по'позиции'индекса:'
'
Чтобы'извлечь'значение'из'массива,'присвоим'переменной'значение'по'индексу'массива:'
'
Массивы'часто'используются'в'цикле'for,'где'увеличивающийся'счётчик'применяется'для'
индексации'позиции'каждого'значения.'Следующий'пример'использует'массив'для'мерцания'
светодиода.'Используемый'цикл'for'со'счётчиком,'начинающимся'с'0,'записывает'значение'из'
позиции'с'индексом'0'массива'flicker[],'в'данном'случае'180,'на'PWMVвывод'(широтноVимпульсная'
модуляция)'10;'затем'пауза'в'200'ms,'а'затем'переход'к'следующей'позиции'индекса.'
'
Арифметика'
Арифметические'операции'включают'сложение,'вычитание,'умножение'и'деление.'Они'
возвращают'сумму,'разность,'произведение'или'частное'(соответственно)'двух'операндов.'
'
Операция'управляется'используемым'типом'данных'операндов,'так'что,'например,'9/4'даёт'2'
вместо'2.25,'поскольку'9'и'4'имеют'тип'int'и'не'могут'использовать'десятичную'точку.'Это'также'
означает,'что'операция'может'вызвать'переполнение,'если'результат'больше,'чем'может'
храниться'в'данном'типе.'
Если'используются'операнды'разного'типа,'то'для'расчётов'используется'больший'тип.'
Например,'если'одно'из'чисел'(операндов)'типа'float,'а'второе'целое,'то'для'вычислений'
используется'тип'с'плавающей'точкой.'
Выбирайте'типы'переменных'достаточные'для'хранения'результатов'ваших'вычислений.'Прикиньте,'
в'какой'точке'ваша'переменная'переполнится,'а'также,'что'случится'в'другом'направлении,'то'есть,'
(0V1)'или'(0V'V32768).'Для'вычислений,'требующих'дробей,'используйте'переменные'типа'float,'но'
остерегайтесь'их'недостатков:'большой'размер'и'маленькая'скорость'вычислений.'
Примечание:*Используйте'оператор'приведения'типа'(название'типа)'для'округления,'то'есть,'
(int)myFloat'V'для'преобразования'переменной'одного'типа'в'другой'«на'лету».'Например,'i'='
(int)3.6'V'поместит'в'i'значение'3.'
Смешанное'присваивание'
Примечание:*Например,'х'*='3'утроит'старое'значение'х'и'присвоит'полученный'результат'х.'
Смешанное'присваивание'сочетает'арифметические'операции'с'операциями'присваивания.'Чаще'
всего'встречается'в'цикле'for,'который'описан'ниже.'Наиболее'общее'смешанное'присваивание'
включает:'
'
Операторы'сравнения'
Сравнения'одной'переменной'или'константы'с'другой'используются'в'выражении'для'if,'чтобы'
проверить'истинность'заданного'условия.'В'примерах'на'следующих'страницах'??'используется'
для'обозначения'любого'из'следующих'условий:'
'
Логические'операторы'
Логические'операторы,'чаще'всего,'это'способ'сравнить'два'выражения'и'вернуть'ИСТИНА'или'
ЛОЖЬ,'в'зависимости'от'оператора.'Есть'три'логических'оператора:'AND,'OR'и'NOT,'часто'
используемые'в'конструкциях'if:'
'
'
'
Константы'
Язык'Arduino'имеет'несколько'предопределённых'величин,'называемых'константами.'Они'
используются,'чтобы'сделать'программу'удобной'для'чтения.'Константы'собраны'в'группы.'
true/false'
Это'Булевы'константы,'определяющие'логические'уровни.'FALSE'легко'определяется'как'О'
(ноль),'a'TRUE,'как'1,'но'может'быть'и'чемVто'другим,'отличным'от'нуля.'Так'что'в'Булевом'смысле'
V1,'2'и'200'—'это'всё'тоже'определяется'как'TRUE.'
'
high/low(
Эти'константы'определяют'уровень'выводов'как'HIGH'или'LOW'и'используются'при'чтении'или'
записи'на'логические'выводы.'HIGH'определяется'как'логический'уровень'1,'ON'или'5'вольт(3V5),'
тогда'как'LOW'—'0,'OFF'или'0'вольт(0V2).'
'
input/output(
Константы'используются'с'функцией'pinMode()'для'задания'режима'работы'цифровых'выводов:'
либо'как'INPUT'(вход),'либо'как'OUTPUT'(выход).'
'
Управление'программой'
if(
Конструкция'if'проверяет,'будет'ли'выполнено'некое'условие,'такое,'как,'например,'будет'ли'
аналоговое'значение'больше'заданного'числа,'и'выполняет'какоеVто'выражение'в'скобках,'если'это'
условие'true'(истинно).'Если'нет,'то'выражение'в'скобках'будет'пропущено.'Формат'для'if'
следующий:'
'
Пример'выше'сравнивает'someVariable'со'значением'(value),'которое'может'быть'и'переменной,'и'
константой.'Если'выражение'или'условие'в'скобках'истинно,'выполняется'выражение'в'фигурных'
скобках.'Если'нет,'выражение'в'фигурных'скобках'пропускается,'и'программа'выполняется'с'
оператора,'следующего'за'скобками.'
Примечание:*Остерегайтесь'случайного'использования'«=»,'как'в'if'(х'='10),'что'технически'
правильно,'определяя'х'равным'10,'но'результат'этого'всегда'true.'Вместо'этого'используйте'«==»,'
как'в'if'(х'=='10),'что'осуществляет'проверку'значения'х'—'равно'ли'оно'10'или'нет.'Запомните'«=»'
V'равно,'а'«==»'V'равно'ли?'
if...else(
Конструкция'if...else'позволяет'сделать'выбор'«либо,'либо».'Например,'если'вы'хотите'проверить'
цифровой'вход'и'выполнить'чтоVто,'если'он'HIGH,'или'выполнить'чтоVто'другое,'если'он'был'LOW,'
вы'должны'записать'следующее:'
'
else'может'также'предшествовать'другой'проверке'if'так,'что'эти'множественные,'
взаимоисключающие'проверки'могут'запускаться'одновременно.'И'возможно'даже'неограниченное'
количество'подобных'else'переходов.'Хотя'следует'помнить,'что'только'один'набор'выражений'
будет'выполнен'в'зависимости'от'результата'проверки:'
'
Примечание:*Конструкция'if'просто'проверяет,'будет'ли'выражение'в'круглых'скобках'истинно'или'
ложно.'Это'выражение'может'быть'любым'правильным,'относительно'языка'Си,'выражением,'как'в'
первом'примере'if'(inputPin'=='HIGH).'В'этом'примере'if'проверяет'только'то,'что'означенный'вход'в'
состоянии'высокого'логического'уровня'или'действительно'ли'напряжение'на'нём'5'вольт.'
for(
Конструкция'for'используется'для'повторения'блока'выражений,'заключённых'в'фигурные'скобки'
заданное'число'раз.'Наращиваемый'счётчик'часто'используется'для'увеличения'и'прекращения'
цикла.'Есть'три'части,'разделённые'точкой'с'запятой,'в'заголовке'цикла'for:'
«Инициализация»'локальной'переменной,'или'счётчика,'имеет'место'в'самом'начале'и'происходит'
только'один'раз.'При'каждом'проходе'цикла'проверяется'«условие».'Если'условие'остаётся'
истинным,'то'следующее'выражение'и'блок'выполняются,'а'условие'проверяется'вновь.'Когда'
условие'становится'ложным,'цикл'завершается.'
Следующий'пример'начинается'с'целого'i'равного'0,'проверяет,'остаётся'ли'i'ещё'меньше'20,'и,'
если'так,'увеличивает'i'на'1'и'выполняет'блок'в'фигурных'скобках:'
'
Примечание:*В'Си'цикл'for'более'гибок,'чем'это'можно'обнаружить'в'других'языках'
программирования,'включая'Basic.'Любые'или'все'три'элемента'заголовка'могут'быть'опущены,'
хотя'точка'с'запятой'требуется.'Также'выражения'для'инициализации,'условия'и'выражения'могут'
быть'любыми'правильными'выражениями'Си'с'несвязанными'переменными.'Такие'необычные'
типы'выражений'могут'помочь'в'решении'некоторых'редких'программных'проблем.'
while(
Цикл'while'продолжается,'и'может'продолжаться'бесконечно,'пока'выражение'в'скобках'не'станет'
false'(ложно).'ЧтоVто'должно'менять'проверяемую'переменную,'иначе'из'цикла'никогда'не'выйти.'И'
это'должно'быть'в'вашем'коде,'как,'скажем,'увеличение'переменной,'или'внешнее'условие,'как,'
например,'проверяемый'сенсор.'
'
Следующий'пример'проверяет,'будет'ли'someVariable'меньше'200,'и'если'да,'то'выполняются'
выражения'в'фигурных'скобках,'и'цикл'продолжается,'пока'someVariable'остаётся'меньше'200.'
'
do...(while(
Цикл'do'управляемый'«снизу»'цикл,'работающий'на'манер'цикла'while,'с'тем'отличием,'что'условие'
проверки'расположено'в'конце'цикла,'таким'образом,'цикл'выполнится'хотя'бы'один'раз.'
'
Следующий'пример'присваивает'readSensor'переменной'х,'делает'паузу'на'50'миллисекунд,'затем'
цикл'выполняется,'пока'х'меньше,'чем'100.'
'
Цифровой'ввод/вывод'
pinMode((pin,(mode)(
Используется'в'void'setup'()'для'конфигурации'заданного'вывода,''чтобы'он'работал'на'вход'
(INPUT)'или'на'выход'(OUTPUT).'
'
Цифровые'выводы'в'Arduino'предустановлены'на'вход,'так'что'их'нет'нужды'явно'объявлять'как'
INPUT'с'помощью'pinMode'().'Выводы,'сконфигурированные'как'INPUT,'подразумеваются'в'
состоянии'с'высоким'импедансом'(сопротивлением).'
В'микроконтроллере'Atmega,'есть'также'удобные,'программно'доступные'подтягивающие'
резисторы'20'кОм.'Эти'встроенные'подтягивающие'резисторы'доступны'следующим'образом:'
'
Подтягивающие'резисторы,'как'правило,'используются'при'соединении'входов'с'
переключателями.'Заметьте,'что'в'примере'выше'нет'преобразования'pin'на'выход,'это'просто'
метод'активизации'встроенных'подтягивающих'резисторов.'
Выводы,'сконфигурированные'как'OUTPUT,'находятся'в'низкоимпедансном'состоянии'и'могут'
отдавать'40'мА'в'нагрузку'(цепь,'другое'устройство).'Это'достаточный'ток'для'яркого'включения'
светодиода'(не'забудьте'последовательный'токоограничительный'резистор!),'но'не'достаточный'
для'включения'реле,'соленоидов'или'моторов.'
Короткое'замыкание'выводов'Arduino'или'слишком'большой'ток'могут'повредить'выходы'или'
даже'всю'микросхему'Atmega.'Порой,'не'плохая'идея'—'соединять'OUTPUT'вывод'через'
последовательно'включённый'резистор'в'470'Ом'или'1'кОм.'
digitalRead((pin)(
Считывает'значение'заданного'цифрового'вывода'(pin)'и'возвращает'результат'HIGH'или'LOW.'
Вывод'должен'быть'задан'либо'как'переменная,'либо'как'константа'(0V13).'
'
digital(Write((pin,(value)(
Выводит'либо'логический'уровень'HIGH,'либо'LOW'(включает'или'выключает)'на'заданном'
цифровом'выводе'pin.'Вывод'может'быть'задан'либо'как'переменная,'либо'как'константа'(0V13).'
'
Следующий'пример'читает'состояние'кнопки,'соединённой'с'цифровым'входом,'и'включает'LED'
(светодиод),'подключённый'к'цифровому'выходу,'когда'кнопка'нажата:'
'
'
'
analogRead((pin)(
Считывает'значение'из'заданного'аналогового'входа'(pin)'с'10Vбитовым'разрешением.'Эта'
функция'работает'только'на'аналоговых'портах'(0V5).'Результирующее'целое'значение'находится'в'
диапазоне'от'0'до'1023.'
'
Примечание:*Аналоговые'выводы'не'похожи'на'цифровые,'и'нет'необходимости'
предварительно'объявлять'их'как'INPUT'или'OUTPUT'(если'только'вы'не'планируете'
использовать'их'в'качестве'цифровых'портов'14V18).'
analogWtite((pin,(value)(
Записывает'псевдоVаналоговое'значение,'используя'схему'с'широтноVимпульсной'модуляцией'(PWM),'на'
выходной'вывод,'помеченный'как'PWM.'На'новом'модуле'Arduino'с'ATmega168'(328),'эта'функция'
работает'на'выводах'3,'5,'6,'9,'10'и'11.'Старый'модуль'Arduino'с'ATmega8'поддерживает'только'
выводы'9,'10'и'11.'Значение'может'быть'задано'как'переменная'или'константа'в'диапазоне'0V255.'
'
Значение'0'генерирует'устойчивое'напряжение'0'вольт'на'выходе'заданного'вывода;'значение'
255'генерирует'5'вольт'на'выходе'заданного'вывода.'Для'значений'между'0'и'255'вывод'быстро'
переходит'от'0'к'5'вольтам'—'чем'больше'значение,'тем'чаще'вывод'в'состоянии'HIGH'(5'вольт).'
Например,'при'значении'64'вывод'будет'в'0'три'четверти'времени,'а'в'состоянии'5'вольт'одну'четверть;'
при'значении'128'половину'времени'будет'вывод'будет'в'0,'а'половину'в'5'вольт;'при'значении'192'
четверть'времени'вывод'будет'в'0'и'три'четверти'в'5'вольт.'
Поскольку'эта'функция'схемная'(встроенного'модуля),'вывод'будет'генерировать'устойчивый'сигнал'
после'вызова'analogWrite'в'фоновом'режиме,'пока'не'будет'следующего'вызова'analogWrite'(или'
вызова'digital'Read'или'digitalWrite'на'тот'же'вывод).'
Примечание:*Аналоговые'выводы,'не'такие'как'цифровые,'и'не'требуют'предварительной'
декларации'их'как'INPUT'или'OUTPUT.'
Следующий'пример'читает'аналоговое'значение'с'входного'аналогового'вывода,'конвертирует'
значение'делением'на'4'и'выводит'PWM'сигнал'на'PWM'вывод:'
'
Время'и'математика'
delay((ms)(
Приостанавливает'вашу'программу'на'заданное'время'(в'миллисекундах),'где'1000'равно'1'
секунде.'
'
millisQ(
Возвращает'число'миллисекунд,'как'unsigned'long,'с'момента'старта'программы'в'модуле'Arduino.'
'
Примечание:*Это'число'будет'переполняться'(сбрасываться'в'ноль),''после,'примерно,'9'часов.'
min((х,(у)(
Вычисляется'минимум'двух'чисел'любого'типа'данных'и'возвращает'меньшее'число.'
'
max((х,(у)(
Вычисляется'максимум'двух'чисел'любого'типа'данных'и'возвращает'большее'число.'
'
Случайные'числа'
randomSeed((seed)(
Устанавливает'значение,'или'начальное'число,'в'качестве'начальной'точки'функции'randomQ.'
'
Поскольку'Arduino'не'может'создавать'действительно'случайных'чисел,'randomSeed'позволяет'
вам'поместить'переменную,'константу'или'другую'функцию'в'функцию'random,'что'помогает'
генерировать'более'случайные'«random»'числа.'Есть'множество'разных'начальных'чисел,'или'
функций,'которые'могут'быть'использованы'в'этой'функции,'включая'millis(),'или'даже'
analogRead()'для'чтения'электрических'шумов'через'аналоговый'вывод.'
random((max)(random((mm,(max)(
Функция'random'позволяет'вам'вернуть'псевдослучайное'число'в'диапазоне,'заданном'
значениями'min'и'max.'
'
Примечание:*Используйте'это'после'использования'функции'randomSeed().'
Следующий'пример'создаёт'случайное'число'между'0'и'255'и'выводит'PWM'сигнал'на'PWM'
вывод,'равный'случайному'значению:'
'
Последовательный'обмен'
Serial.begin((rate)(
Открывает'последовательный'порт'и'задаёт'скорость'для'последовательной'передачи'данных.'
Типичная'скорость'обмена'для'компьютерной'коммуникации'—'9600,'хотя'поддерживаются'и'
другие'скорости.'
'
Примечание:*При'использовании'последовательного'обмена,'выводы'0'(RX)'и'1'(ТХ)'не'могут'
использоваться'одновременно'как'цифровые.'
Serial.println((data)(
Передаёт'данные'в'последовательный'порт,'сопровождая'автоматическим'возвратом'каретки'и'
переходом'на'новую'строку.'Команда'такая'же,'что'и'Serial.printQ,'но'легче'для'последующего'чтения'
на'данных'в'терминале.'
'
Следующий'простой'пример'читает'аналоговый'вывод'0'и'отсылает'эти'данные'на'компьютер'
каждую'секунду.'
'
Типовые'примеры'
Цифровой(выход(
'
Это'базовая'программа'«hello'world»,'используемая'для'включения'и'выключения'чегоVнибудь.'В'
этом'примере'светодиод'подключён'к'выводу'13'и'мигает'каждую'секунду.'Резистор'в'данном'
случае'может'быть'опущен,'поскольку'на'13Vм'порту'Arduino'уже'есть'встроенный'резистор.'
'
Цифровой(ввод(
'
Это'простейшая'форма'ввода'с'двумя'возможными'состояниями:'включено'или'выключено.'В'
примере'считывается'простой'переключатель'или'кнопка,'подключённая'к'выводу'2.'Когда'
выключатель'замкнут,'входной'вывод'читается'как'HIGH'и'включает'светодиод.'
'
Сильноточный(выход(
'
Иногда'возникает'необходимость'в'управлении'более,'чем'40'мА'от'Arduino.'В'этом'случае'может'
использоваться'транзистор'MOSFET'для'коммутации'сильноточной'нагрузки.'В'следующем'примере'
MOSFET'быстро'включается'и'выключается'5'раз'в'секунду.'
Примечание:*Схема'показывает'мотор'и'диод'защиты,'но'другие,'не'индуктивные,'нагрузки'
могут'включаться'без'диода.'
'
PWM(выход(
'
ШиротноVимпульсная'модуляция'(PWM)'—'это'способ'имитировать'аналоговый'выход'с'помощью'
импульсного'сигнала.'Это'можно'использовать'для'гашения'и'увеличения'яркости'светодиода'
или'позже'для'управления'сервомотором.'Следующий'пример'медленно'увеличивает'яркость'и'
гасит'LED,'используя'цикл'for.'
'
Вход(с(потенциометра(
'
Использование'потенциометра'и'одного'из'аналоговых'портов'Arduino'(аналогоVцифрового'
преобразователя'(ADC))'позволяет'читать'аналоговые'значения'в'диапазоне'0V1023.'Следующий'
пример'показывает'использование'потенциометра'для'управления'временем'мигания'светодиода'
LED.'
'
Вход(от(переменного(резистора(
'
Переменные'резисторы'включают'фотоприёмники,'термисторы,'тензодатчики'и'т.д.'Данный'пример'
использует'функцию'чтения'аналогового'значения'и'задаёт'время'паузы.'Этим'управляется'
скорость,'с'которой'меняется'яркость'светодиода'LED.'
'
Серво(вывод(
'
Любительские'сервомашинки'—'это'разновидность'полуVавтономного'моторVредуктора,'который'
может'поворачиваться'на'180°.'Всё,'что'нужно'—'это'отправлять'импульсы'каждые'20'мС.'В'данном'
примере'используется'функция'servoPulse'для'поворота'мотора'от'10°'до'170°'и'обратно.'
'