http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:%D0%90%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9_%D1%85%D0%B0%D0%BA%D0%B8%D0%BD%D0%B3&feed=atom&action=historyLXF107:Аппаратный хакинг - История изменений2024-03-29T13:57:35ZИстория изменений этой страницы в викиMediaWiki 1.19.20+dfsg-0+deb7u3http://wiki.linuxformat.ru/wiki/index.php?title=LXF107:%D0%90%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9_%D1%85%D0%B0%D0%BA%D0%B8%D0%BD%D0%B3&diff=8473&oldid=prevCrazy Rebel в 08:29, 19 августа 20092009-08-19T08:29:23Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">← Предыдущая</td>
<td colspan='2' style="background-color: white; color:black;">Версия 08:29, 19 августа 2009</td>
</tr><tr><td colspan="2" class="diff-lineno">Строка 1:</td>
<td colspan="2" class="diff-lineno">Строка 1:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>: '''Arduino''' Аппаратный хакинг для любителей гаражной электроники</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>: '''Arduino''' Аппаратный хакинг для любителей гаражной электроники</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>[[Категория:<del class="diffchange diffchange-inline">Обзоры</del>]]{{Цикл/Arduino}}</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div>[[Категория:<ins class="diffchange diffchange-inline">Учебники</ins>]]{{Цикл/Arduino}}</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>==Arduino: Светодиодный светометр==</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>==Arduino: Светодиодный светометр==</div></td></tr>
</table>Crazy Rebelhttp://wiki.linuxformat.ru/wiki/index.php?title=LXF107:%D0%90%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9_%D1%85%D0%B0%D0%BA%D0%B8%D0%BD%D0%B3&diff=8469&oldid=prevCrazy Rebel: /* Шаг 2: Программируем */2009-08-19T08:24:07Z<p><span dir="auto"><span class="autocomment">Шаг 2: Программируем</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">← Предыдущая</td>
<td colspan='2' style="background-color: white; color:black;">Версия 08:24, 19 августа 2009</td>
</tr><tr><td colspan="2" class="diff-lineno">Строка 82:</td>
<td colspan="2" class="diff-lineno">Строка 82:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>{{Врезка|left|Заголовок=Скорая помощь|Содержание=Если вы попытаетесь установить или обновить ''IDE Arduino'' и он начнет</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>{{Врезка|left|Заголовок=Скорая помощь|Содержание=Если вы попытаетесь установить или обновить ''IDE Arduino'' и он начнет</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>генерировать длинные и странные сообщения об ошибке компиляции, убедитесь, что у вас также установлен пакет '''avr-libc''.}}</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div>генерировать длинные и странные сообщения об ошибке компиляции, убедитесь, что у вас также установлен пакет '''avr-libc''.<ins class="diffchange diffchange-inline">|Ширина=200px</ins>}}</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>{{Врезка|Содержание=[[Изображение:LXF107_71_1.jpg|300px]]Принципиальная схема.|Ширина=300px}}</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>{{Врезка|Содержание=[[Изображение:LXF107_71_1.jpg|300px]]Принципиальная схема.|Ширина=300px}}</div></td></tr>
</table>Crazy Rebelhttp://wiki.linuxformat.ru/wiki/index.php?title=LXF107:%D0%90%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9_%D1%85%D0%B0%D0%BA%D0%B8%D0%BD%D0%B3&diff=8468&oldid=prevCrazy Rebel: викификация, оформление, иллюстрация2009-08-19T08:23:29Z<p>викификация, оформление, иллюстрация</p>
<p><b>Новая страница</b></p><div>: '''Arduino''' Аппаратный хакинг для любителей гаражной электроники<br />
<br />
[[Категория:Обзоры]]{{Цикл/Arduino}}<br />
<br />
==Arduino: Светодиодный светометр==<br />
<br />
: В завершение нашей серии '''Грэм Моррисон''' соберет датчик освещенности.<br />
<br />
{{Врезка|left|Заголовок=Что нам надо|Содержание= <br />
* Arduino<br />
* Макетная плата<br />
* Пять резисторов по 1 кОм<br />
* Датчик освещенности|Ширина=100px}}<br />
<br />
Это последний учебник по Arduino в нашей серии. Прибавим проекту жизни: вставим датчик освещенности. Из названия ясно, что он должен как-то реагировать на свет, но эти датчики не так умны, как кажутся. По сути, датчик освещенности – это<br />
переменный резистор, и его также часто называют «фоторезистором»<br />
[light dependent resistor, LDR], что прекрасно описывает принцип действия. Фоторезистор можно использовать в самых разных задачах, от измерения освещенности помещения до построения сети защитных<br />
датчиков и лазеров вокруг короны Св. Эдуарда в Лондонском Тауэре<br />
['''используемой при коронации британских монархов, – прим. ред.''']. А<br />
главное, датчик освещенности обычно имеется в стартовом наборе Arduino, и для построения чего-то полезного вам больше почти ничего<br />
не нужно.<br />
<br />
===Шаг 1: Сборка===<br />
<br />
{{Врезка|Содержание=[[Изображение:LXF107_70_1.jpg|300px]] На вид сложновато, но этот проект датчика освещенности очень легко реализуется и пригодится в различных видах приложений.|Ширина=300px}}<br />
<br />
Если вы, например, прикрутите датчик освещенности к простой цепи со светодиодом, то обнаружите, что яркость последнего меняется в<br />
зависимости от количества прямого света, падающего на датчик, Вы также обнаружите, что эта яркость немного колеблется, независимо<br />
от освещенности датчика, потому что цепь «плывет», и возникающая небольшая электрическая интерференция влияет на сопротивление.<br />
Решением будет добавить резистор в 1 кОм между источником энергии<br />
и датчиком освещенности. Это стабилизирует цепь, остановив интерференцию, влияющую на сопротивление датчика.<br />
<br />
Вы можете попытаться сделать это сами. Поместите датчик освещенности на вашу макетную плату – так, чтобы два его контакта были<br />
по обе стороны центральной канавки. Соедините одну сторону через<br />
резистор с 5-В выходом Arduino и соедините проводом ту же линию с<br />
'''Аналоговым входом 0'''. Другую сторону канавки макетной платы просто подключите к '''GND''' (Земля) на Arduino. Наконец, вставьте длинную ножку светодиода прямо в '''Цифровой порт 13''' на Arduino, а короткую<br />
ножку – в ближайший разъем '''GND'''. Вот код, делающий рабочей эту<br />
конструкцию:<br />
<br />
int ledPin = 13;<br />
int analogInput = 0;<br />
int aInput;<br />
void setup(){<br />
pinMode(ledPin, OUTPUT);<br />
pinMode(analogInput, INPUT);<br />
beginSerial(9600);<br />
}<br />
void loop(){<br />
aInput = analogRead(analogInput);<br />
digitalWrite(ledPin, HIGH);<br />
delay(aInput);<br />
digitalWrite(ledPin, LOW);<br />
delay(aInput);<br />
printInteger(aInput);<br />
printByte(10);<br />
}<br />
<br />
Вы должны бы уже привыкнуть к синтаксису, и понять, что при этом<br />
происходит, несложно. Мы считываем аналоговые данные с датчика<br />
освещенности и используем их как задержку мигания светодиода на<br />
плате. Чем ярче свет, падающий на датчик, тем меньше задержка между вспышками светодиода. Как мы изучили в прошлом месяце, анало-<br />
говые значения варьируются в диапазоне от '''0''' до '''1023''', что может дать<br />
задержку вспышек от более одной секунды до практически нулевой. Но<br />
вы найдете, что большинству датчиков нужен прямой солнечный свет,<br />
чтобы задержки стали меньше '''150''' миллисекунд (единицы измерения,<br />
используемые командой ‘delay’), и при искусственном освещении различия заметить труднее. Значит, нам нужен способ увидеть значения, считываемые с датчика освещенности, чтобы мы могли улучшить нашу<br />
программу для работы с меньшими значениями. Вот это и делают строки '''beginSerial(9600)''', '''printInteger(aInput)''' и '''printByte(10)'''. Они открывают последовательное соединение с компьютером и начинают передавать<br />
значения с датчика освещенности. Чтобы увидеть значение, нужно просто открыть '''Serial Monitor''' в ''IDE Arduino'' на вашем компьютере. Вы будете видеть каждое значение в новой строке (результат работы команды<br />
'''printByte'''), и сможете отслеживать читаемые с датчика освещенности<br />
числа, отражающие количество света. В условиях светлого офиса наш<br />
датчик показывал около '''800''' и сбрасывался до '''960''', когда мы закрывали его пальцем. Учтите, датчик редко имеет линейную зависимость отклика, и при уменьшении освещенности вдвое вы не должны ожидать такого же уменьшения сопротивления.<br />
<br />
Разобравшись с выводом с датчика, мы можем применить сенсор еще где-нибудь. Используем массив светодиодов как столбик графика,<br />
где число горящих светодиодов представляет значение освещенности,<br />
попадающей на датчик. Можете использовать до 13 отдельных светодиодов – столько, сколько позволяют цифровые входы Arduino, но<br />
для демонстрации основных принципов нам хватит четырех. Каждый<br />
светодиод требует присоединения его длинной ножки к отдельному<br />
цифровому входу, в большинстве случаев через 1-кОм резистор (это<br />
зависит от типа используемых светодиодов). Короткая ножка подключается к «земле». Используем различные контакты для каждого светодиода, с общей шиной, присоединенной к '''GND''', и проводом к цифровому входу Arduino.<br />
<br />
===Шаг 2: Программируем===<br />
<br />
{{Врезка|left|Заголовок=Скорая помощь|Содержание=Если вы попытаетесь установить или обновить ''IDE Arduino'' и он начнет<br />
генерировать длинные и странные сообщения об ошибке компиляции, убедитесь, что у вас также установлен пакет '''avr-libc''.}}<br />
<br />
{{Врезка|Содержание=[[Изображение:LXF107_71_1.jpg|300px]]Принципиальная схема.|Ширина=300px}}<br />
<br />
Вот и все нужные нам дополнительные подключения. Но исходный<br />
код программы требует чуть больше работы. Начнем с верхней части<br />
кода, добавив следующие определения ‘'''define'''’ и изменив переменную<br />
'''ledPin''':<br />
<br />
#define MAX_LED 4<br />
int ledPin[MAX_LED]={12, 11,10,9};<br />
<br />
Вместо того, чтобы вручную инициализировать и обрабатывать каждый подключенный к Arduino светодиод, мы создали простой массив, куда записали выходной контакт для каждого соединения ('''ledPin''').<br />
Мы не только сэкономили место на данной странице, но и облегчили<br />
легкое перемещение по данным. Это решение также более гибкое.<br />
Если вы захотите добавить или удалить светодиоды с Arduino, вам<br />
будет только нужно изменить значение '''MAX_LED''' и удалить назначенные контакты из массива. Но перед тем, как мы сможем их зажечь, сперва необходимо инициализировать каждый используемый контакт, в функции '''setup''' заменив строку '''pinMode(ledPin, OUTPUT)''' на следующую:<br />
<br />
for (int i=0; i<MAX_LED; i++){<br />
pinMode(ledPin[i], OUTPUT);<br />
}<br />
<br />
Этот простой цикл '''for''' показывает вам, как легко сконфигурировать<br />
каждый светодиод в массиве, и мы в дальнейшем применим эту технику еще дважды в новой функции с именем '''barGraph'''. Она выполняет работу по зажиганию требуемого числа светодиодов, в зависимости от<br />
переданного функции входного значения. Например, если оно равно<br />
3, будут задействованы первые три светодиода в нашем массиве.<br />
Используем эту функцию для показа освещенности, определяемой<br />
датчиком:<br />
<br />
void barGraph(int count) {<br />
for (int i=0; i<MAX_LED; i++){<br />
digitalWrite(ledPin[i], LOW);<br />
}<br />
for (int i=0; i<count; i++){<br />
digitalWrite(ledPin[i], HIGH);<br />
}<br />
}<br />
<br />
Тут сперва выключаются все светодиоды, а потом они по очереди<br />
включаются, в зависимости от значения переменной ‘'''count'''’. Наконец,<br />
в логику программы осталось добавить команду, ответственную за<br />
вызов функции '''barGraph''' с различными значениями. Мы используем<br />
серию условий '''if''' для снятия различных пороговых значений освещенности. Следующие значения работали у нас, но вам может потребоваться использовать '''Serial Console''' в ''IDE Arduino'' для подбора значений, более подходящих к вашей установке. Если значения, читаемые с<br />
датчика освещенности, менее чем '''840''', мы зажигаем все четыре светодиода. Это значение освещенности в нашем офисе. Если вам повезет испытывать установку на природе летним солнечным днем, то более<br />
подходящим значением будет '''150'''. Каждый последующий диапазон<br />
для 3-х, 2-х, 1-го и 0 светодиодов является произвольным отклонением от стартового значения. Вы можете использовать более чем четыре светодиода, для этого вам нужно будет добавить соответствующие диапазоны в условия ‘'''if'''’.<br />
<br />
aInput = analogRead(analogInput);<br />
if (aInput < 840)<br />
barGraph(4);<br />
else if (aInput < 900)<br />
barGraph(3);<br />
else if (aInput < 940)<br />
barGraph(2);<br />
else if (aInput < 980)<br />
barGraph(1);<br />
else<br />
barGraph(0);<br />
delay (10);<br />
<br />
Скомпилировав и послав эту программу на ваш Arduino, вы должны<br />
увидеть набор светодиодов, откликающихся в зависимости от уровня<br />
света, попадающего на сенсор. Темнота все их выключит, а прямое<br />
освещение все зажжет. Проект готов. Потом вы сможете много чего<br />
добавить, чтобы извлечь из него пользу. Можно применить его в системах домашней автоматизации – например, включения или выключения устройств при наступлении темноты. Лучшей стартовой площадкой будет Arduino Sketchbook – онлайн-репозиторий всех вещей Arduino, а также полезный форум, полных энтузиастов вроде вас. Все это можно<br />
найти на главном сайте Arduino: http://www.arduino.cc. Сообщите нам, если изваяете что-нибудь клевое. '''LXF'''</div>Crazy Rebel