Опубликовано

Платформа node.js

Большинство программ для веб-сервера в этой книге написаны на основе платформы (фреймворка) node.js, позволяющей программировать в операционной системе на языке JavaScript. Первоначально язык JavaScript предназначался для использования в веб-браузерах, чтобы предоставить пользователям возможности взаимодействия с веб-страницами, которые не обеспечивались средствами HTML[1]. Вскоре он стал стандартным языком программирования приложений для веб-браузеров. В 2009 году Райан Даль (Ryan Dahl) с группой программистов из компании Joyent решили использовать язык JavaScript при создании серверных программ, для чего они и разработали платформу node.js. Впоследствии эта платформа приобрела большую популярность для программирования серверных приложений, а также нашла много других применений.

Весьма примечательно, что созданные созданные с использованием платформы node.js программы могут исполняться на локальном или встроенном компьютере, не требуя для этого установки веб-сервера[2]. Это дает возможность протестировать на локальном компьютере свеженаписанные программы, прежде чем загружать их на веб-сайт. Платформа node.js также позволяет создавать клиент-серверные приложения для использования в домашней сети без необходимости подключения к Интернету. Чтобы упростить выполнение примеров этой книги, в большинстве случаев в качестве сервера в ней задействуется локальный компьютер.

В отличие от среды Processing, для платформы node.js не существует стандартного графического интерфейса пользователя. Работа с ней выполняется с помощью командной строки. Загрузите программу установщика node.js с сайта https://nodejs.org/en/ и установите ее на свой компьютер. Затем откройте окно программы терминала, как описано в предыдущем разделе, и выполните команду:

$ node –v

В ответ на экран должно быть выведено сообщение наподобие следующего:

v6.9.5

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

Установка набора средств разработки

Для создания программ в node.js требуется также ряд других программных средств разработки, которые могут отсутствовать у начинающих программистов. Такой набор состоит из компиляторов, текстовых редакторов и отладчиков и иногда называется цепочкой инструментов[3] (что подразумевает последовательное их использование). Для компьютеров под Windows большинство этих инструментов доступны в пакете интегрированной среды разработки Microsoft Visual Studio, а под macOS — в интегрированной среде разработки XCode.

Пакет Visual Studio платный, но также существует его бесплатная версия Community Edition. Загрузить любую версию пакета, включая бесплатную, можно по адресу: www.visualstudio.com/downloads/.

Пакет XCode можно загрузить из магазина приложений Mac App Store. После установки этого пакета нужно будет также установить средства XCode для работы в командной строке. Это можно сделать, выполнив следующую команду:

$ xcode-select --install

После установки необходимых программных средств можно устанавливать и node.js.

Пишем код

Итак, создадим в node.js первую программу. Запустите свой текстовый редактор, введите в него следующий код:

console.log("Hello world!");

и сохраните файл под именем hello.js на своем компьютере.

Затем запустите программу терминала и перейдите в каталог, в котором вы сохранили программу. Запустите программу на исполнение, выполнив команду:

$ node hello.js

В результате исполнения этой команды на экран будет выведен следующий текст:

Hello world!

Примерно так же захватывающе, как ваш первый скетч на Processing[4], не так ли?

Веб-сервер на node.js

Платформа node.js первоначально предназначалась для написания веб-серверов, и именно с ее помощью большинство пользователей создают такие программы.

Сервер — это программа, которая предоставляет в сети сервисы другим программам, которые называются клиентами. Клиенты посылают веб-серверу запросы по протоколу HTTP[5]. В ответ на эти запросы сервер отсылает клиенту файлы HTML, изображений, аудио и других элементов веб-сайта. Например, ваш веб-браузер, выполняющий роль клиента, устанавливает подключение к серверу и запрашивает веб-страницу. Серверная программа принимает подключение и доставляет клиентской программе (т. е. браузеру) файлы, представляющие эту веб-страницу.

Протокол HTTP, серверы и клиенты рассматриваются более подробно в главе 3, однако мы и сейчас можем написать простой сервер на node.js.

Пишем код

Создайте в своем домашнем каталоге каталог под названием simpleServer. Затем откройте текстовый редактор, введите в него представленную далее программу и сохраните ее в файле server.js в каталоге simpleServer.

Рассмотрим ее код подробнее, чтобы выяснить, как выглядит общая структура программ node.js:

  1. Подключаются библиотеки:
// подключаем библиотеки и объявляем глобальные переменные:
 
var express = require('express'); // Подключаем библиотеку express
  1. Определяются глобальные переменные:
var server = express(); // создаем объект server,
 
// используя библиотеку express
  1. Определяются функции обратного вызова:
// определяем функцию, которая вызывается
 
// при поступления запроса от клиента:
 
function respondToClient(request, response) {
 
console.log("got a request"); // выводим сообщение
 
//в консоли командной строки
 
//отправляем сообщение клиенту:
 
response.writeHead(200, {"Content-Type": "text/html"});
 
response.write("Hello, client!");
 
response.end();
 
}
  1. Исполняется основной код:
// Запускаем сервер:
 
server.listen (8080);
 
// определяем, что делать при получении запроса клиента:
 
server.get('/*', respondToClient);
 
console.log("Server is listening on port 8080");

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

$ npm install express

Эта команда дает указание npm — диспетчеру пакетов node (node package manager) установить библиотеку express.js, которая необходима для работы сервера. В процессе исполнения команды отображается индикатор выполнения, выводятся несколько предупреждений, и по завершении исполнения снова возвращается командная строка. Теперь выполните следующую команду:

$ node server.js

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

Server is listening on port 8080 (Сервер прослушивает порт 8080)

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

$ node server.js
http://localhost:8080

В результате должна открыться страница, наподобие показанной на рис. 1.5.

Рис. 1.5. Результат исполнения программы сервера node.js браузере

При этом в консоли командной строки должно отобразиться сообщение типа следующего:

Got a request! (Получен запрос!)

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

Чтобы завершить работу программы веб-сервера, нажмите на клавиатуре комбинацию клавиш <Ctrl>+<C>.

Структура программ node.js

Структура программ node.js (которые иногда называются скриптами или сценариями) иная, чем у скетчей Processing. Рассмотрим некоторые из этих различий.

Прежде всего, JavaScript (и, соответственно, node.js) является языком со слабым контролем типов данных. Это означает, что при объявлении переменных объявлять тип их данных не нужно — достаточно объявить их с помощью ключевого слова var. А JavaScript сам попытается определить тип данных переменной в зависимости от способа ее применения.

Второе, JavaScript является функциональным языком программирования. То есть переменные в нем могут содержать не только значения, но и функции. Все станет вам более понятным, когда вы увидите реализацию этого принципа на практике. Посмотрите на программу веб-сервера из предыдущего раздела. В первой строке программы создается копия (которая называется экземпляром) библиотеки node.js express, которая сохраняется в переменной express. Функции этой библиотеки будут затем вызываться из переменной http. Во второй строке кода функция express() создает экземпляр всей библиотеки express, который сохраняется в переменной server. Далее, в конце программы, вызывается функция listen() объекта server, которая прослушивает порт 8080 на наличие новых запросов от клиентов.

Третье, программы JavaScript исполняются асинхронно. Это означает, что каждая команда начинает исполняться сразу же после запуска предыдущей, не дожидаясь завершения ее исполнения. При вызове функции ей часто передается функция обратного вызова, которая исполняется, когда она готова выдать какие-либо результаты. Пример использования такой функции можно увидеть во второй строке основного кода программы server.js — функция server.get() содержит функцию обратного вызова respondToClient(), которая исполняется при каждом поступлении запроса от нового клиента. Благодаря свойству асинхронности программ JavaScript, сервер может одновременно отвечать на несколько запросов, без необходимости завершить ответ на один, чтобы начать отвечать на другой.

В языке JavaScript используется синтаксис в стиле языков С и Java. В частности, операторы (инструкции) заканчиваются точкой с запятой, а блоки кода заключаются в фигурные скобки. Синтаксис в стиле языка С используется и для условных операторов if-then и операторов цикла for.

Сценарии серверов на node.js обычно имеют такую структуру:

  1. С помощью функции require() подключаются все необходимые библиотеки.
  2. Объявляются переменные, область действия которых охватывает всю программу (глобальные переменные).
  3. Объявляются функции обратного вызова, которые будут использоваться в основном коде.
  4. Исполняется основной код.

В соответствии с этой структурой и создана программа server.js.

Дополнительную информацию по синтаксису node.js вы найдете в руководстве, которое можно загрузить с веб-сайта www.nodejs.org. Более подробно программирование с использованием node.js описано в книге Шелли Пауэрс (Shelley Powers) «Learning Node: Moving to the Server-Side» (издательство O’Reilly). А книга Этана Брауна (Ethan Brown) «Learning JavaScript» (издательство O’Reily) поможет вам в изучении языка JavaScript.

  1. HTML, HyperText Markup Language — язык разметки гипертекстовых документов.
  2. Значимость этого обстоятельства становится понятной в свете того факта, что для исполнения на локальном или удаленном компьютере программ, написанных на другом популярном языке для серверных программ — PHP, требуется наличие веб-сервера — например, Apache.
  3. От англ. toolchain.
  4. К сожалению, русские буквы с консольном режиме в среде node.js не отображаются, поэтому получить здесь «Здравствуй, мир!» у нас не получится.
  5. HTTP, Hypertext Transfer [Transport] Protocol — протокол передачи гипертекста.
Опубликовано

Интерфейсы командной строки и удаленные серверы

Интерфейсы командной строки и удаленные серверы

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

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

Наиболее распространенная версия интерфейса командной строки используется в операционных системах на основе UNIX, включая такие операционные системы, как BSD, Linux, macOS и прочие. Операционные системы, интерфейс командной строки в которых организован таким образом, называются операционными системами в стиле POSIX[1]. Все встречающиеся в этой книге инструкции командной строки предполагают использование интерфейса командной строки именно в этом стиле.

Доступ к интерфейсу командной строки

Доступ к  интерфейсу командной строки на компьютере реализуется через программу эмуляции терминала.

В macOS и Linux

В macOS эта программа называется Terminal и находится в подкаталоге Utilities каталога Applications. В Linux эмулятор командной строки может называться xterm, rxvt, Terminal или Konsole.

 В Windows

Интерфейс командной строки Windows основан на DOS и отличается от интерфейсов командной строки, используемых в операционных системах в стиле POSIX. Найти программу командной строки в Windows можно, набрав cmd в поле поиска меню Пуск. Пока готовилась эта книга, компания Microsoft выпустила интерфейс командной строки в стиле POSIX для Windows 10 (выполните поиск по фразе: bash для Windows 10) — в настоящее время он доступен только в режиме разработчика, но уже выглядит многообещающе. Получить полноценный интерпретатор команд (именно так еще называется интерфейс командной строки) в стиле POSIX на Windows можно, установив программу Cygwin (www.cygwin.com). По мере возможности, примеры этой книги с использованием командной строки для Windows были протестированы под Cygwin и доказали свою работоспособность. В процессе установки Cygwin в обязательном порядке выберите опцию установки пакета Net (входит в список экрана Packages установщика)  тогда будут установлены многие полезные сетевые инструменты, использующие стиль POSIX.

Виртуальные частные серверы

Многие рассматриваемые в этой книге программы представляют собой веб-серверы, для работы с которыми требуется веб-хост. Современные веб-серверы очень просто устанавливать и обслуживать. И если у вас нет своего веб-хоста, можно обратиться к поставщикам услуг веб-хостинга, предоставляющим услуги виртуального частного сервера (ВЧС). У них можно будет создать виртуальный веб-сервер, доступ к которому будет только у вас. Виртуальный веб-сервер позволит вам разобраться с конфигурированием веб-сервера и управлением им, а если вы что-либо наконфигурируете до невозможности восстановления нормальной работы веб-сервера, его можно будет просто удалить нажатием кнопки на веб-панели и создать другой веб-сервер с исходной конфигурацией. Существует ряд поставщиков услуг веб-хостинга, предоставляющих услуги виртуального частного сервера по низкой цене или вообще бесплатно — при условии ограниченного веб-трафика на ваш сервер. Например, такие поставщики услуг веб-хостинга как Digital Ocean (www.digitalocean.com), Amazon Web Services (aws.amazon.com), BlueHost (www.bluehost.com) и DreamHost (www.dreamhost.com) предоставляют услуги ВЧС по вполне доступным расценкам. Некоторые поставщики услуг веб-хостинга также предоставляют скидки для преподавателей и/или студентов, так что уточните у них и эту возможность.

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

Подключение к удаленному веб-хосту

Хотя интерфейс командной строки можно использовать для работы на локальном компьютере, в этой книге он также часто задействуется для доступа к удаленным компьютерам: или к веб-хосту или ко встроенному микропроцессору. Большинство поставщиков веб-хостинга используют Linux, BSD, Solaris или другую UNIX-подобную операционную систему.

Для компьютеров Windows существует несколько программ удаленного доступа, но мы будем пользоваться программой PuTTY, которую можно загрузить по адресу www.puttyssh.org. Процедура установки несложная — с веб-сайта программы загрузите установщик Windows для нее и запустите его на исполнение. На компьютерах под macOS и Linux для удаленного доступа можно использовать программу OpenSSH, которая входит в состав обеих этих операционных систем. Запустить ее на исполнение можно в программе Terminal с помощью команды ssh.

В macOS и Linux

Откройте программу терминала. Обычно терминал предоставляет простое текстовое окно с приветствием наподобие следующего:

Last login: Wed Feb 22 07:20:34 on ttyp1

ComputerName:~ username$

В системах POSIX символ $ называется приглашением командной строки. Когда за этим символом следует мигающий курсор, это означает, что система ожидает ввода команды. Во всех случаях, рассмотренных в этой книге, в командную строку следует ввести все, что следует за этим символом.

Чтобы подключиться к требуемому веб-серверу, выполните в командной строке команду:

ssh имя_пользователя@имя_хоста.com

Разумеется, вместо параметров имя_пользователя и имя_хоста.com введите свои имя пользователя (имя_пользователя) и адрес веб-сервера (имя_хоста.com) соответственно. Введите пароль, который затем потребует удаленный веб-сервер, и вы должны к нему подключиться.

В Windows

Запустите программу PuTTY (рис. 1.3).

Рис. 1.3. Главное окно программы PuTTY

Введите адрес своего веб-сервера (имя_хоста.com) в поле Host Name, установите в разделе Connection type переключатель SSH и нажмите кнопку Open. Затем выполните вход на сервер, введя в соответствующие поля открывшейся панели свои имя пользователя и пароль.

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

Работа с командной строкой

Установив соединение с удаленным веб-сервером, вы увидите примерно такое сообщение:

Last login: Wed Feb 22 08:50:04 2016 from 216.157.45.215

[userid@myhost ~]$

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

$ pwd

Эта команда состоит из первых букв фразы print working directory, которая означает «распечатать рабочий каталог». Она указывает компьютеру отобразить имя и путь текущего каталога. (Многие команды POSIX весьма кратки — чтобы их было легче вводить. С другой стороны, аббревиатурные команды труднее запомнить.) В ответ сервер выведет путь и имя текущего каталога — в моем случае:

/home/igoe

Это рабочий (домашний) каталог учетной записи на сервере. Для вывода списка файлов каталога используется команда ls (list):

$ ls -l .

Точки в конце команды

Точка в конце команды означает «текущий каталог», а две точки — «родительский каталог текущего каталога».

Параметр –l при команде ls означает list long — требование выводить подробный список. В результате исполнения этой команды выводится примерно такой ответ:

total 44

drwxr-xr-x 13 igoe users 4096 Apr 14 11:42 public_html

drwxr-xr-x 3 igoe users 4096 Nov 25 2005 share

Это список всех файлов и вложенных каталогов, содержащихся в текущем каталоге, с указанием их атрибутов:

  • в первом элементе строки (например: drwxr-xr-x) указываются разрешения для действий с этим объектом: чтение, изменение или исполнение;
  • во втором элементе (13) указывается количество ссылок на этот файл из других областей системы;
  • в третьем элементе (igoe) указывается владелец объекта, а в четвертом (users) — группа владельцев;
  • в пятом элементе (4096) указывается размер объекта, а в шестом (Apr 14 11:42) — дата и время последнего изменения;
  • наконец, в последнем элементе (public_html) указывается имя объекта.

В среде POSIX все файлы, имена которых начинаются с точки, в общем случае не отображаются. Это требуется для некоторых особых файлов — таких, например, как файлы паролей или конфигурационные файлы. Чтобы просмотреть содержимое каталога, включая его скрытые файлы, с командой ls нужно использовать параметр: ‑la:

$ ls -la

Для создания нового каталога служит команда: mkdir (make directory):

$ mkdir directoryname

Эта команда создает новый каталог в текущем каталоге. Команда ls –l, выполненная после создания нового каталога, отобразит этот каталог на новой строке в списке объектов текущего каталога. При просмотре содержимого пустого каталога (каким будет вновь созданный каталог) с помощью команды ls -la выводится только две строчки:

drwxr-xr-x 2 tqi6023 users 4096 Feb 17 10:19 .

drwxr-xr-x 4 tqi6023 users 4096 Feb 17 10:19 ..

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

Чтобы удалить каталог, служит команда rm (remove directory) с указанием каталога, подлежащего удалению:

$ rmdir directoryname

Удалить можно только пустой каталог, поэтому перед удалением каталога нужно удалить все его содержимое — как файлы, так и вложенные каталоги. Команда rmdir выполняется немедленно, без запроса на подтверждение удаления, поэтому нужно быть осторожным в ее использовании. Не следует также удалять какие бы то ни было каталоги или файлы, которые создавали не вы.

В большинстве веб-хостингов для веб-сайтов пользователей автоматически создается домашний каталог, которая называется html или public_html, — для размещения в нем файлов HTML для общего доступа. Если на вашем веб-сервере такого каталога нет, создайте его с помощью команды mkdir:

$ mkdir html

Для перемещения из одного каталога в другой служит команда cd (change directory) — изменить каталог. Например, перейти из корневого каталога в каталог html можно, выполнив следующую команду:

$ cd html

Чтобы переместиться на один уровень выше в иерархии каталогов, выполняется команда:

$ cd ..

Для возврата в домашний (корневой) каталог к команде cd добавляется параметр ~ (тильда):

$ cd ~

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

Для перехода во вложенный каталог этот каталог указывается после родительского каталога через косую черту / (слэш). Например, чтобы перейти в каталог html в домашнем каталоге, выполняется команда cd~/html. Чтобы указать абсолютный путь из главного каталога сервера (который называется root — корневой), в начале пути файла ставится такая же косая черта — /. Пути без косой черты в их начале называются относительными.

Управление доступом к файлам

Выполните команду ls –l, чтобы вывести список файлов текущего каталога, и рассмотрите поближе разрешения для файлов.

Например, обозначение:

drwx ——

означает, что объект является каталогом (d — directory), и создавший его пользователь (который также называется владельцем) может просматривать или читать его (r — read), записывать в него (w — write), а также исполнять его (x — execute). Рассмотрим другой пример разрешения:

-rw-rw-rw

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

$ chmod go-w имя_файла

Параметры этой команды указывают пользователей, которых она затрагивает, и изменяемые разрешения. В приведенном примере мы удаляем разрешения на запись (-w) для группы (g — group) владельцев файла и всех других (o — others), кроме владельца файла. А в следующем примере мы присваиваем права записи и исполнения для группы и других пользователей:

$ chmod go+wx имя_файла

Как вы уже поняли, в параметрах команды chmod буква u означает пользователя (user), g — группу (group), а o — прочих (others). Мы также знаем, что буква r означает разрешения чтения (read), w — записи (write), а x — исполнения (execute). Знак + (плюс) означает присвоение разрешений, а знак – (минус) — лишение их. Будьте осторожны, чтобы случайно не лишить разрешений самого себя (пользователя). Кроме того, выработайте привычку не предоставлять доступа к файлам для групп и прочих, если только в этом нет необходимости, — на крупных поставщиках услуг веб-хостинга иметь соседями по серверу сотни других пользователей — обычное дело.

Создание, просмотр и удаление файлов

Для работы с файлами вам пригодятся еще две программы командной строки: nano и less. Программа nano — это текстовый редактор, и очень простой редактор, поэтому для объемных работ лучше редактировать текст на своем компьютере с помощью какого-либо другого, более удобного, редактора, а затем загружать готовый текст на сервер. Но для небольших правок прямо на сервере программа nano незаменима. Чтобы создать с помощью nano новый файл, выполните следующую команду:

$ nano имя_файла.txt

Откроется окно редактора (рис. 1.4).

Рис. 1.4. Окно текстового редактора nano. В нижней части окна имеется список доступных команд, которые исполняются по нажатию клавиши <Ctrl> совместно с клавишей буквы английского алфавита, указанной слева от соответствующей команды. Например, нажатие комбинации клавиш <Ctrl>+<K> выполняет операцию вырезания (kut) выделенного фрагмента текста

Все команды для работы в nano вводятся с клавиатуры совместно с клавишей <Ctrl>. Например, для выхода из программы нужно нажать комбинацию клавиш <Ctrl>+<X>. Наиболее часто употребляемые команды указаны в нижней части окна редактора.

Удалить любой файл можно с помощью команды rm (remove):

$ rm filename

Подобно команде rmdir, команда rm не выводит запроса на подтверждение удаления файла, поэтому нужно быть осторожным в ее использовании.

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

$ less имя_файла.txt

В результате содержимое файла выводится поэкранно, с приглашением в виде двоеточия (:) в конце экрана. Нажатие клавиши пробела выводит следующий экран текста. Чтобы завершить работу программы, нажмите клавишу <q>. Определенно, похвастаться никакими крутыми наворотами less не может, но со своей основной задачей — просмотром длинных файлов — он справляется «на отлично».

Для просмотра файлов также могут быть полезными команды cat, head и tail.

Команда cat вываливает на экран все содержимое файла без разбиения на его страницы:

$ cat имя_файла.txt

А команды head и tail используются для просмотра начала и конца длинных файлов, соответственно. Количество строк файла для просмотра указывается в параметре, следующем за командой:

$ head -5 имя_файла.txt

В этом случае будут отображены первые пять строк файла имя_файла.txt. Подобным образом команда:

$ tail -10 filename.txt

выводит на экран последние десять строк файла имя_файла.txt.

Команды cat, head и tail очень полезны, когда нужно объединить несколько программ в одну. Эти процедуры рассматриваются в следующем разделе.

Объединение нескольких программ в одну

Операционная система UNIX разрабатывалась по философии «набора малых компонентов со слабыми связями». Иными словами, каждая запускаемая из командной строки программа (такие программы часто называются процессами, хотя одна программа может иногда запускать множественные процессы) должна выполнять только одну задачу, но выполнять ее хорошо. Кроме того, каждая такая программа должна обладать гибкой возможностью автоматического объединения с другими подобными программами. Поскольку результатом работы любой программы командной строки является текстовый вывод, вывод одной программы легко использовать в качестве ввода для другой. Например, при выполнении программы ls для каталога с большим количеством объектов, объекты в начале списка вытесняются с экрана последующими объектами. Но вывод программы ls можно передать программе less, которая уже будет выводить список объектов, помещающихся на экране. Делается это следующим образом:

$ ls -la . | less

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

Вместо вывода на экран выходные данные программы можно также перенаправлять в какое-либо другое место — например, в файл. Так, список объектов каталога можно сохранить в файл, выполнив следующую команду:

$ ls -la . > список_файлов.txt

Эта команда создает файл список_файлов.txt и сохраняет в нем вывод команды ls. Если файл с таким именем уже существует, его содержимое заменяется выводом команды ls. Вместо замены содержимого существующего файла, новые данные можно добавить к нему в конец:

$ ls -la . >> список_файлов.txt

Одна из причин, по которой такие операции являются возможными, заключается в том, что POSIX-системы рассматривают многие объекты как потоки данных, каждый из которых может заменяться любым другим. Например, выводимый на экран текст называется стандартным потоком выходных данных — standard out, или stdout. А выдаваемые клавиатурой данные являются стандартным потоком входных данных — standard in, или stdin. Файл также является потоком данных, в результате чего с помощью операторов канала и перенаправления можно осуществлять запись байтов в файл (stdin) и чтение из него (stdout).

Поток данных можно представить в виде трубы, в которую байты входят с одного конце, а выходят из другого. Таким образом, первый входящий в такую трубу байт первым же и выходит из нее. Такая организация входа/выхода называется FIFO[2]: первый на входе — первый на выходе. Эти команды совместно с рядом рассмотренных ранее команд и понятий позволяют выполнять довольно-таки хитроумные операции. Мы увидим некоторые примеры таких операций далее в этой главе и в книге.

Кроме рассмотренных, существует много других команд командной оболочки[3]. Список наиболее употребляемых можно получить, выполнив в терминале команду help, а информацию об определенной команде — выполнив команду:

man имя_команды

Чтобы закрыть подключение к серверу или завершить сеанс работы с терминалом на локальном компьютере, выполните команду logout. В некоторых вариантах Linux для этого вместо команды loguot используется команда exit.

На машинах с операционной системой в стиле POSIX — будь то машина под macOS, Linux или одноплатный компьютер — все только что рассмотренные команды должны работать в программе терминала локальной машины так же, как они работают на удаленном сервере через подключение ssh. Большинство этих команд работают и в среде Cygwin на машинах под Windows. Их также можно использовать и на одноплатных компьютерах, как мы увидим далее в этой главе.

Дополнительную информацию о работе с интерфейсом командной строки операционных систем UNIX и Linux вы сможете найти, например, в книге Аарона Ньюкомба (Aaron Newcomb) «Linux for Makers» (издательство Maker Media).

  1. POSIX, Portable Operating System Interface — интерфейс переносимой операционной системы.
  2. FIFO, First In, First Out — первым вошел, первым вышел.
  3. От англ. command shell — программа, которая обрабатывает команды интерфейса командной строки.
Опубликовано

Среда Processing

Одним из программных средств, с которым нам придется иметь дело в этой книге, является многоцелевая программная среда, именуемая Processing. Это бесплатный инструмент с открытым исходным кодом, и его можно загрузить с веб-сайта www.processing.org. Среда Processing основана на платформе Java и предназначена для тех пользователей, которые хотят реализовывать свои проекты без необходимости глубоко вникать в программирование. Тем не менее, Processing — весьма полезный инструмент для знакомства с принципами программирования, поскольку для осуществления серьезных действий: создания сетевого соединения, подключения к внешнему устройству через последовательный порт, управления камерой — требуется сравнительно небольшой объем кода Processing. Поскольку, как уже отмечалось, среда Processing основана на Java, в программы Processing можно включать классы и методы языка Java. Среда может исполняться под macOS, Windows и Linux. Существует также версия Processing для Android. Если по какой-либо причине вам не нравится работать в среде Processing, вы можете использовать приведенные в этой книге примеры ее кода и комментарии к ним в качестве исходных для создания таких примеров в любой среде, которой вы отдаете предпочтение.

Загрузив и установив среду Processing на своем компьютере, запустите ее на выполнение. Откроется окно, наподобие показанного на рис. 1.2.

Рис. 1.2. Окно редактора кода среды Processing

Пишем код

Теперь давайте создадим нашу первую программу в Processing. Введите в окно редактора следующий текст:

1
println("Здравствуй, мир!");

а затем нажмите кнопку Run (Исполнить) — самую левую кнопку на панели инструментов Processing

Не ахти какая программа, но это классическая первая программа на любом языке программирования. Исполнение этой программы выводит текст: Здравствуй, мир! в текстовом поле в нижней области окна редактора. Как видим, ничего сложного.

Программы Processing называются скетчами (sketch), и все данные скетча по умолчанию сохраняются на компьютере в каталоге с именем скетча подкаталога Processing каталога Документы. Впрочем, вы можете сохранять их в любом каталоге на свое усмотрение. Редактор Processing весьма прост и не содержит каких-либо «примочек», отвлекающих внимание. Панель инструментов редактора состоит из кнопок для запуска и остановки исполнения скетчей, открытия существующих скетчей, сохранения скетчей и экспортирования скетчей в апплеты Java. Кроме того, скетчи можно экспортировать в виде автономных приложений.

Пишем код

Рассмотрим теперь более сложную программу, которая демонстрирует некоторые основные структуры программирования Processing.

Контекст использования кода

Все примеры кода в этой книге сопровождаются комментариями, указывающими контекст, в котором они должны использоваться: Processing, Arduino, node.js и т. п.

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
Программа рисования треугольников
Контекст: Processing
Рисует треугольник при отпущенной левой кнопке мыши. Очищает окно рисования при нажатии левой кнопки мыши.
*/
 
// объявляем переменные:
float redValue = 0; // переменная для красного цвета
float greenValue = 0; // переменная для зеленого цвета
float blueValue = 0; // переменная для синего цвета
// метод setup() исполняется один раз в начале программы:
void setup() {
size(320, 240); // устанавливаем размер окна рисования
background(0); // устанавливаем черный фон окна рисования
fill(0); // задаем цвет для заполнения фигур (0 = черный)
smooth(); // рисуем фигуры со сглаженными кромками
}
 
// Метод draw() исполняется непрерывно, пока открыто окно рисования.
// Он обновляет окно, а также выполняет любые запрограммированные в нем действия:
void draw() {
// Выбираем произвольные значения красной, зеленой и синей составляющих цвета:
 
redValue = random(255);
 
greenValue = random(255);
blueValue = random(255);
// задаем цвет линии:
stroke(redValue, greenValue, blueValue);
// рисуем при отпущенной левой кнопке мыши (игнорируя все обычные правила):
if (mousePressed == false) {
// рисуем треугольник
triangle(mouseX, mouseY, width/2, height/2, pmouseX, pmouseY);
}
// очищаем окно рисования при нажатии левой кнопки мыши:
else {
background(0);
fill(0);
}
}

Любая программа Processing должна содержать два основных метода (процедуры): setup() и draw(). Метод setup() исполняется один раз в начале программы, устанавливая все начальные условия, — такие как размер окна апплета, начальные значения переменных и т. п. А метод draw() — основной цикл программы, исполняющийся непрерывно, пока окно апплета открыто.
Для переменных Processing нужно задавать тип их данных. В приведенной здесь программе переменные redValue, greenValue и blueValue — плавающего типа (float), т. е. они могут содержать числа с плавающей запятой. Другие распространенные типы данных переменных, с которыми нам придется работать, это:

  1. int — целочисленные значения;
  2. char — однобайтовые значения символов ASCII;
  3. boolean — значения true (истина) или false (ложь);
  4. string — текст;
  5. byte — байт.

Язык программирования Java, а, следовательно, и производный от него язык Processing, являются языками программирования со строгим контролем типов данных. Иными словами, это означает, что переменные должны быть объявлены, прежде чем их можно будет использовать в программе. При этом для каждой объявленной переменной резервируется определенный объем памяти. Например, для переменной типа byte требуется один байт памяти, типа int — четыре байта и т. д. Каждый язык, с которым вам придется иметь дело в этой книге, обрабатывает переменные своим способом, который слегка отличается от способов других языков, поэтому при объявлении и использовании переменных в каждом языке следует быть осторожным.

Подобно языкам Java и JavaScript, синтаксис программ в среде Processing близок по стилю к синтаксису языка С. Как и переменные, все функции в нем также имеют тип данных (и у многих из них тип данных void — т. е. они не возвращают никаких значений в результате исполнения). Все строки кода должны заканчиваться точкой с запятой, а блоки кода заключаются в фигурные скобки. Условные операторы (if-then), операторы цикла (for-next) комментарии также используют синтаксис языка С. За исключением цикла for-next, все эти операторы вы могли видеть в приведенной ранее программе рисования треугольников.

А пример цикла for-next демонстрируется в следующем фрагменте кода:

1
2
for (int myCounter = 0; myCounter &lt;=10; myCounter++) {
println(myCounter);

Попробуйте создать свой скетч с использованием этого цикла. Для создания нового скетча выполните команду New в меню File среды Processing.

Пользователям BASIC и Python

Если вы никогда не использовали цикл for-next в стиле С, этот пример может показаться вам чем-то страшным. В действительности, ничего сложного в нем нет. Все, что приведенный здесь код делает, это сначала устанавливает значение переменной myCounter, а затем исполняет заключенные в фигурные скобки инструкции до тех пор, пока это значение остается меньшим или равным 10. Инструкция myCounter++ указывает программе добавить единицу к значению myCounter при каждом прохождении цикла. Эквивалентный код в BASIC выглядит следующим образом:

1
2
3
for myCounter = 0 to 10
Print myCounter
next

А на языке Python этот же код будет выглядеть так:

1
2
for myCounter in range (0, 10):
print myCounter

Processing — удобный язык для экспериментирования, так позволяет очень быстро создавать интерактивную графику. Он также может служить в качестве введения в программирование на языке Java для начинающих. Если вы уже знакомы с Java, то можете вставлять код Java непосредственно в программы Processing. Возможности Processing также можно расширять с помощью многочисленных библиотек кода, которые несложно найти в Интернете.

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

Дополнительную информацию по синтаксису Processing легко найти в руководстве, которое можно загрузить с веб-сайта www.processing.org. Узнать больше о программировании в Processing можно также из книги «Processing: A Programming Handbook for Visual Designers and Artists» (издательство MIT Press), написанной создателями этого языка Кэйси Ризом и Беном Фрайем, или из их более короткой книги «Getting Started with Processing» (издательство O’Reilly). Также можно воспользоваться отличной книгой для начинающих «Learning Processing» (издательство Morgan Kaufmann), написанной Даниэлем Шифманом (Daniel Shiffman).

Опубликовано

Термостатический охладитель напитков на модуле Пельтье

Раздел гл. 12 книги “Мейкерство. Arduino и Raspberry Pi” (автор Саймон Монк)

В этом проекте мы добавим термостатическое регулирование к проекту из разд. «Проект: охладитель напитков» главы 11, чтобы напитки могли более точно охлаждаться до нужной температуры (рис. 12.17). В главе 14 проект получит свое дальнейшее развитие — к нему будет добавлен дисплей, показывающий заданную и фактическую температуры.

Термостатический охладитель напитков в сбореРис. 12.17. Термостатический охладитель напитков в сборе

Как уже было сказано, этот проект реализуется с использованием Arduino, но учитывая, что вы уже научились использовать Raspberry Pi совместно с микросхемой DS18B20, у вас не должно возникнуть проблем и по изменению проекта под работу с Raspberry Pi.

Оборудование

Этот проект основывается на проекте из разд. «Проект: охладитель напитков» главы 11, но с добавлением в рабочий цикл платы Arduino и датчика температуры DS18B20, поэтому, если вы еще не проработали тот проект, следуйте инструкциям по его реализации, имеющимся в главе 11.

Комплектующие

В этом проекте для работы с Arduino понадобятся следующие комплектующие (табл. 12.2).

Таблица 12.2. Комплектующие для работы с Arduino в проекте по управлению термостатическим охладителем напитков

Обозначение Компонент схемы Источники
R1 Резистор 4,7 кОм Mouser: 291-4.7k-RC
R2 Резистор 1 кОм Mouser: 291-1k-RC
R3 Резистор 270 Ом Mouser: 291-270-RC
R4 Подстроечный резистор на 10 кОм Adafruit: 356

Sparkfun: COM-09806

Герметичный температурный датчик DS18B20 Adafruit: 381

eBay

Q1 МОП-транзистор FQP30N06L Mouser: 512-FQP30N06L
LED1 Зеленый светодиод Adafruit: 298

Sparkfun: COM-09650

Термоэлектрическое охлаждающее устройство на элементах Пельтье с двумя вентиляторами и с током потребления не более 4 А eBay
Переходник с круглым гнездом и винтовыми зажимами Adafruit: 368
Источник питания (12 В 5 A) Adafruit: 352
Двунаправленная клеммная колодка Магазин строительных или электротоваров
Большая емкость из-под молока или сока Б/у

Герметичный температурный датчик DS18B20 содержит точно такую же микросхему, что использовалась в экспериментах из разд. «Эксперимент: насколько хорош терморегулятор, основанный на включении и выключении?» и из разд. «Эксперимент: термостатический ПИД-регулятор», за исключением того, что он поставляется в удобной водонепроницаемой капсуле с длинными проводами, которые могут быть подключены непосредственно к макетной плате.

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

Схема проекта

Принципиальная схема этого проекта показана на рис. 12.18. В левой части схемы показан подстроечный резистор R4, который также называют потенциометром (см. далее врезку «Потенциометры»). Подвижный контакт потенциометра подключен к контакту A0, представляющему собой аналоговый вход Arduino (см. разд. «Аналоговые входы» главы 2). Положением ручки потенциометра на контакте A0 устанавливается напряжение, которое замеряется Arduino, а затем используется для установки нужной температуры охладителя.

Потенциометры

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

Область на рис. 12.18 вокруг R4, показывает, как потенциометр используется в качестве устройства ввода данных в Arduino: верхний контакт потенциометра подключен к линии 5 В, а нижний — к заземлению, при этом на среднем контакте потенциометра напряжение в зависимости от положения ручки будет изменяться в диапазоне от 0 до 5 В.

Правая часть схемы на рис. 12.18 очень похожа на схему эксперимента из разд. «Эксперимент: насколько хорош терморегулятор, основанный на включении и выключении?», за исключением того, что вместо маломощного транзистора MPSA14 используется мощный МОП-транзистор FQP30N06L. Этот транзистор способен коммутировать подводимый к охладителю ток силой 4 А и более, при этом степень его нагрева позволяет обойтись без радиатора.

Принципиальная схема термостатического охладителяРис. 12.18. Принципиальная схема термостатического охладителя

Сборка проекта

Предполагая, что вы уже реализовали проект из разд. «Проект: охладитель напитков» главы 11, для реализации этого проекта нужно выполнить лишь следующие дополнительные действия.

Шаг 1. Добавление температурного датчика

Физическая конструкция охладителя остается точно такой же, что и в проекте из разд. «Проект: охладитель напитков» главы 11, но теперь к ней добавляется температурный датчик, который следует разместить на дне контейнера — под ставящиеся на него охлаждаемые стаканы или бутылки (рис. 12.19). В данном случае я просто прикрепил датчик ко дну контейнера клейкой лентой, но лучше его все же основательно приклеить.

Добавление температурного датчикаРис. 12.19. Добавление температурного датчика

Шаг 2. Сборка схемы на макетной плате

На рис. 12.20 показана собранная на макетной плате схема, используемая для проекта, а также показаны соединения различных деталей проекта.

Схема проекта, собранная на макетной платеРис. 12.20. Схема проекта, собранная на макетной плате

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

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

Шаг 3. Подключение охладителя

У охладителя имеются три пары проводов: две — для вентиляторов, и одна — для самого элемента Пельтье. Чтобы упростить подключение охладителя, используется двунаправленная клеммная колодка, позволяющая подключить охладитель к макетной плате всего двумя проводами (рис. 12.21).

Подключение охладителяРис. 12.21. Подключение охладителя

Шаг 4. Подключение блока питания

Переходник с круглым гнездом и винтовыми зажимами, конечно, может быть подключен к макетной плате перемычками «папа-папа». С этим вариантом можно согласиться в случае использования высококачественных проводов-перемычек относительно большого поперечного сечения, однако многие соединительные провода содержат слишком тонкие проводники, которые могут сильно нагреваться от проходящего по ним тока силой в несколько ампер. Само по себе это не создает проблем до тех пор, пока эти провода не станут сильно греться, вместо того, чтобы быть просто теплыми. Но это означает, что из 12 В на элемент Пельтье станет попадать не все напряжение, и на то, чтобы войти в рабочий режим, охладителю потребуется больше времени.

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

Программа для Arduino

Использование ПИД-регулятора для охладителя напитков можно посчитать излишеством. Но вопрос в данном случае упирается только в программу, поэтому на использование «крутого» алгоритма поддержки напитков в охлажденном состоянии дополнительных затрат не предвидится.

Программа этого проекта во многом похожа на ту, что использовалась в экспериментах из разд. «Эксперимент: насколько хорош терморегулятор, основанный на включении и выключении?» и из разд. «Эксперимент: термостатический ПИД-регулятор», включая весь код для создания интерфейса с температурным датчиком DS18B20, поэтому, чтобы разобраться в этом коде, следует вернуться к описанию упомянутых экспериментов:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include &lt;OneWire.h&gt;
#include &lt;DallasTemperature.h&gt;
#include &lt;PID_v1.h&gt;
const double minTemp = 0.0; //<strong> 1</strong>
const double maxTemp = 20.0;
const float tempOKMargin = 0.5;
double kp = 1500; //<strong> 2</strong>
double ki = 50.0;
double kd = 0.0;
const int tempPin = 2;
const int coolPin = 9;
const int ledPin = 10; //<strong> 3</strong>
const int potPin = A0;
const long period = 1000; // &gt;750
OneWire oneWire(tempPin);
DallasTemperature sensors(&amp;oneWire);
double setTemp = 0.0;
double measuredTemp = 0.0;
double outputPower = 0.0;
long lastSampleTime = 0;
PID myPID(&amp;measuredTemp, &amp;outputPower,
&amp;setTemp, kp, ki, kd, REVERSE); //<strong> 4</strong>
 
void setup() {
pinMode(coolPin, OUTPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
sensors.begin();
myPID.SetSampleTime(1000);
myPID.SetMode(AUTOMATIC);
}
 
void loop() { //<strong> 5</strong>
long now = millis();
if (now &gt; lastSampleTime + period) {
checkTemperature();
lastSampleTime = now;
}
setTemp = readSetTempFromPot(); //<strong> 6</strong>
}
 
void checkTemperature() { //<strong> 7</strong>
measuredTemp = readTemp();
Serial.print(measuredTemp);
Serial.print(", ");
Serial.print(setTemp);
Serial.print(", ");
Serial.println(outputPower);
myPID.Compute();
analogWrite(coolPin, outputPower);
float error = setTemp - measuredTemp; //<strong> 8</strong>
if (abs(error) &lt; tempOKMargin) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}
double readSetTempFromPot() { //<strong> 9</strong>
int raw = analogRead(potPin);
double temp = map(raw, 0, 1023, minTemp, maxTemp);
return temp;
}
double readTemp() {
sensors.requestTemperatures();
return sensors.getTempCByIndex(0);
}

Уточним некоторые моменты программы по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:

  1. Диапазон температур, задаваемых с помощью потенциометра, устанавливается двумя константами: minTemp и maxTemp. Переменная tempOKMargin определяет значение выше или ниже заданной температуры, которое может иметь фактическая температура до того, как погаснет зеленый светодиод.
  2. Для kp установлено довольно высокое значение, чтобы включение и выключение охладителя происходило более четко. Сделано это в основном с тем, чтобы избавиться от унылого звучания моторов вентиляторов, когда они питаются в режиме низкого уровня выходной мощности. Вместо этого вентиляторы можно запитать отдельно, чтобы они постоянно работали, и заниматься только регулировкой мощности на элементе Пельтье.
  3. Определение дополнительных контактов для светодиода и потенциометра.
  4. ПИД-регулятор инициализируется в режиме REVERSE, а не DIRECT (как ранее), поскольку добавление выходной мощности будет снижать, а не повышать температуру.
  5. В основном цикле проверяется истечение секундного интервала, после чего для включения и выключения охладителя по мере надобности вызывается функция checkTemperature.
  6. При каждом прохождении цикла (которое должно осуществляться несколько раз в секунду), для установки значения переменной setTemp на основании позиции ручки потенциометра вызывается функция readSetTempFromPot.
  7. Функция checkTemperature производит измерение температуры, считывает полученные данные, а затем производит обновление ПИД-контроллера. Эта функция также записывает прочитанные данные в окно монитора порта, позволяя настроить охладитель или отследить его работу. Arduino не нуждается в подключении через порт USB, поскольку получает электропитание через свой контакт Vin, но если его подключить через порт USB, выводимые данные можно будет увидеть на экране в окне монитора порта.
  8. Остальная часть этой функции включает светодиод, если измеренная температура находится в пределах допустимого отклонения от заданной температуры, определяемого с помощью константы tempOKMargin. Функция abs (абсолютное значение) удаляет знак минуса перед числом.
  9. Код превращения позиции потенциометра в значение между minTemp и maxTemp. Необработанное аналоговое считывание (значения в диапазоне от 0 до 1023) производится в переменную raw. Затем для преобразования считанного значения в желаемый диапазон температур вызывается функция map (см. далее врезку «Функция map, используемая в Arduino»).

Функция map, используемая в Arduino

При управлении какими-либо устройствами с помощью Arduino или Raspberry Pi часто возникает проблема преобразования числа, имеющего один диапазон значений, в число в каком-нибудь другом диапазоне значений.

Например, на аналоговом входе Arduino установлен диапазон значений от 0 до 1023, и если нужно отобразить этот диапазон на температуру, например, между 0 и 20, можно просто разделить число на 51,15 (то есть, на 1023 / 20). Тогда 1023 превратится в 1023 / 51,15 = 20.

Задача усложняется, если оба диапазона начинаются не с нуля. И тут может пригодиться имеющаяся в Arduino функция map. Как далее показано, она получает пять параметров, которые преобразуют число в диапазоне от 0 до 1023 в число в диапазоне от 20 до 40:

map(value, 0, 1023, 20, 40);

Первый параметр представлен здесь значением, которое нужно преобразовать, второй и третий параметры задают диапазон имеющегося значения, а четвертый и пятый — диапазон, в котором нужно получить соответствующее значение (в данном случае, это диапазон от 20 до 40).

В языке Python отсутствует встроенная функция диапазона, но ее довольно просто создать, а затем использовать в своей программе. Она должна выглядеть примерно так:

1
2
3
4
5
6
7
8
def map(value, from_low, from_high,
to_low, to_high):
from_range = from_high -
from_low
to_range = to_high - to_low
scale_factor = from_range / to_range
return to_low + (value /
scale_factor)

Затем эту функцию на языке Python можно будет вызвать с такими же параметрами, что и у ее двойника в Arduino. Например:

map(510, 0, 1023, 20, 40)

В результате будет возвращено значение 30, которое является средним значением для диапазона от 20 до 40, точно так же, как и значение 510, которое расположено примерно посредине между значениями в диапазоне от 0 до 1023.

Опубликовано

Охладитель напитков на элементе Пельтье

Глава из книги “Мейкерство. Arduino и Raspberry Pi” (автор Саймон Монк)

Элементы Пельтье

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

Чтобы это произошло, пропускаемый ток должен иметь солидную величину (обычно от 2 до 6 А при 12 В), т. е. для использования элемента Пельтье вам понадобится достаточно мощный блок питания. Такие элементы можно часто обнаружить в переносных холодильниках и в охладителях напитков. Элементы Пельтье в ряде случаев предпочтительнее обычных холодильников, поскольку у них нет движущихся частей, которые могут сломаться.

mkac_1105

Рис. 11.5. Элемент Пельтье

Как работают элементы Пельтье?

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

Термоэлектрический эффект относительно мал, и чтобы сделать его нам полезным, — например, для охлаждения напитков, его нужно многократно усилить. Это достигается за счет размещения групп переходов друг за другом — тогда при прохождении тока каждый переход вносит свой вклад в общий эффект. Обычные недорогие элементы Пельтье имеют, как правило, около 12 переходов (рис. 11.6). По обеим сторонам элемента Пельтье расположен базовый материал, образующий основу для блока групп переходов.

Устройство элемента Пельтье

Рис. 11.6. Устройство элемента Пельтье

Материалы, образующие стыки (переходы) элемента Пельтье, — это полупроводники двух типов, аналогичные тем, что используются при производстве транзисторов и микросхем, но оптимизированные для термоэлектрического эффекта. Они известны как полупроводники N-типа и P-типа — от слов Negative (отрицательный) и Positive (положительный).

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

Особенности практического применения

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

Решением такой проблемы может может служить применение теплоотводящего радиатора (рис. 11.7). Такой радиатор представляет собой алюминиевую пластину с ребрами, увеличивающими площадь охлаждаемой поверхности, что способствует лучшему отводу тепла. Холодная сторона элемента сконструирована в виде блока, вдающегося внутрь теплоотводящего радиатора.

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

mkac_1107

Рис. 11.7. Элемент Пельтье на теплоотводящем радиаторе

mkac_1108

Рис. 11.8. Охлаждение элемента Пельтье двумя вентиляторами

Проект: охладитель напитков

В этом проекте не используется ни Raspberry Pi, ни Arduino. Проект просто демонстрирует, как нужно подключать элемент Пельтье, и как можно самому собрать простой охладитель напитков (рис. 11.9). Этот базовый проект мы дополним в главе 12, добавив в него контроль за температурой и термостабилизацию. Затем, в главе 14, в него будет добавлен OLED-дисплей для отображения температуры.

mkac_1109

Рис. 11.9. Охладитель напитков в сборе

Комплектующие

В этом проекте нам понадобятся следующие комплектующие (табл. 11.3).

Таблица 11.3. Комплектующие для работы с проектом охладителя напитков

Компонент схемы Источники
Элемент Пельтье с двумя охлаждающими вентиляторами (ток 4 А или меньше) eBay
Переходник с круглым гнездом и винтовыми зажимами Adafruit: 368
Источник питания (12 В 5 A) Adafruit: 352
Большая емкость из-под молока или сока Б/у
Освежающий напиток

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

Конструкция

Рассмотрев провода, идущие к блоку охлаждения, можно выделить три пары проводов: одна пара идет к элементу Пельтье, и по паре проводов — к каждому из вентиляторов. Им всем требуется 12 В от источника питания, и самый простой способ подключения состоит в использовании винтового зажима на разъеме, идущем к блоку питания. Проще говоря, все три красных провода от охлаждающего устройства нужно зафиксировать в винтовой клемме с маркировкой (+), а все три черных провода — в винтовой клемме с маркировкой (–), как показано на рис. 11.10.

mkac_1110

Рис. 11.10. Подключение проводов в проекте охладителя напитков

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

mkac_1111

Рис. 11.11. Подготовка пластикового контейнера

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

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

Использование охладителя

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

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

Этот проект также несколько неэкономичен, на сохранять прохладным небольшого количества напитка расходует 50 Вт электрической энергии. В главе 12 мы сделаем наш проект несколько эффективней, добавив в него режим термостатирования.

Заключение

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

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

Опубликовано

Модуль реле в системе автополива

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

Реле позволяет электрическому сигналу или импульсу включать (или выключать) электрический ток. Для управления реле используется низкое напряжение или слабый ток, чтобы с его помощью управлять высоким напряжением и/или сильным током.

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

Внешний вид, назначение контактов

Для удобства управления и подключения к Arduino реле устанавливаются на платы, где, кроме самого реле, расположены контакты для подключения нагрузки и другие элементы (рис. M3.1). На одной плате могут размещаться несколько реле.

3-03-1-relay

Рис. M3.1. Назначение контактов одноканальных модулей реле

Основные характеристики

Наименование Значение
Рабочее напряжение, В 5
Потребляемый ток при переключении контактов, мА 5
Потребляемый ток в состоянии ожидания, мА 10 ÷ 13
Рабочая частота, МГц 13,56
Размеры (L×W×H), мм 50×26×18,5
Максимальная нагрузка AC 250 В/10 A
DC 30 В/10 A

 


Предупреждение

Модуль реле, входящий в набор, рассчитан на коммутирование небольших нагрузок. Вы можете подключать к нему бытовые приборы с рабочим напряжением 220 В, но нагрузка не должна превышать 3-х ампер (мощность до 660 Вт).
Имейте в виду, что мощность утюга составляет 1000÷1500 Вт, и поэтому такое реле не годится для создания устройства для включения/выключения утюга. Cуществуют специальные модули реле, рассчитанные на большие мощности.


Схема подключения

3-03-2-relay

Рис. M3.2. Схема подключения реле

Программный код

Тестовая программа для включения и выключения лампочки через каждые 2 секунды приведена в листинге M3.1.

Листинг M3.1. Включение лампочки с помощью реле

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define relayPin 2 //номер пина для управления реле
 
void setup() {
 
pinMode(relayPin, OUTPUT); //настройка пина реле на выход
 
}
 
void loop() {
 
digitalWrite(relayPin, HIGH);// замыкаем реле
 
delay(3000); // ждем 3 секунды
 
digitalWrite(relayPin, LOW); // размыкаем реле
 
delay(3000); // ждем 3 секунды
 
}

«Умный горшок»

С помощь модуля реле можно создать систему автоматического полива растений в цветочном горшке. Для этого, кроме модуля реле, мы задействуем микронасос, помещенный в банку с водой, и датчик влажности почвы (рис. M3.3). Как только влажность почвы опускается ниже заданных значений, Arduino включает микронасос и выключает его, когда почва становится снова достаточно влажной.

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

Схема подключения

3-03-3-relay

Рис. M3.3. Система автоматического полива цветочного горшка

Программный код

Листинг M3.2. Система автоматического полива цветочного горшка

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//определения
 
// пин аналогового выхода датчика уровня воды
 
#define pinWaterLevel A0
 
//пин аналогового выхода датчик влажности почвы
 
#define pinSoilMoisture A1
 
//пин реле для управление насосом
 
#define pinRelayPump 12
 
 
 
//константы
 
const int delayPumpBefore=2; //время полива (в секундах)
 
const int delayPumpAfter=30; //время после полива, чтобы
 
//земля пропиталась (в секундах)
 
const int minMoisture=600; //минимальный порог влажности почвы
 
 
 
// переменные
 
int aLevel = 0; // значение датчика уровня воды
 
int aMoisture = 0; // состояние датчика влажности почвы
 
int levels[3]={600,500,400}; //массив значений уровней воды
 
 
 
//установки
 
void setup() {
 
//объявляем пин реле для включения насоса как выход:
 
pinMode(pinRelayPump, OUTPUT);
 
//объявляем пины датчиков глубины и влажности почвы как входы:
 
pinMode(pinWaterLevel, INPUT);
 
pinMode(pinSoilMoisture, INPUT);
 
Serial.begin(9600);
 
}
 
 
 
void loop() {
 
// считываем значение датчика уровня воды
 
aLevel=analogRead(pinWaterLevel);
 
// считываем состояния датчика влажности почвы
 
aMoisture = analogRead (pinSoilMoisture);
 
Serial.println(aMoisture); //выводим для тестирования
 
delay(100);
 
// если почва сухая, и вода в банке есть, то включаем полив
 
if ((aMoisture &gt;minMoisture)&amp;&amp;(aLevel&gt;levels[2])) {
 
digitalWrite(pinRelayPump, HIGH); //включаем насос
 
delay(delayPumpBefore*1000); //задержка на полив
 
digitalWrite(pinRelayPump, LOW); //выключаем насос
 
delay(delayPumpAfter*1000); //задержка на слив воды из
 
//шланга после выключения насоса
 
}
 
else {
 
digitalWrite(pinRelayPump, LOW);
 
}
 
}

Для адаптации программы к конкретному цветочному горшку надо произвести небольшую «тонкую настройку» системы:

  • во-первых, следует правильно установить время полива (delayPumpBefore), которое определяется паузой между включением и выключением насоса. Чем больше горшок, тем больше должна быть пауза и, как следствие, время полива;
  • во-вторых, надо установить правильное время после полива (delayPumpAfter), чтобы земля успела пропитаться, и система не включила повторный полив. Трубку подачи воды при этом удобно разместить рядом с датчиком влажности почвы, чтобы земля в районе датчика сразу пропитывалась.
Опубликовано

Модуль BLE Bluetooth HM-10/11

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

Модули Bluetooth оснащены последовательным портом, способным взаимодействовать с платой Arduino через контакты RX (прием) и TX (передача), и приемопередатчиком, использующим протокол беспроводной связи Bluetooth для взаимодействия «по воздуху» с другими устройствами, который понимают этот протокол (например, со смартфонами). Такой приемопередатчик функционирует как модем, преобразовывая сигналы протокола Bluetooth в обычный асинхронный последовательный протокол и обратно.

Существуют различные протоколы Bluetooth. Модули HM-10 и HM-11 поддерживают протокол Bluetooth 4.0, что дает возможность их подключения к смартфонам и на ОС Android, и на iOS (iPhone) — в отличие от популярных модулей HC-05 и HC-06, которые могут взаимодействовать только с ОС Android. HM-10/11 нельзя соединить с модулями HC-06 и HC-05, т. к. последние поддерживают протокол Bluetooth 2/2.1.

Наиболее существенным достоинством модулей Bluetooth BLE (Bluetooth Low Energy, Bluetooth LE) является их сверхмалое пиковое энергопотребление, среднее энергопотребление и энергопотребление в режиме простоя, что весьма важно для устройств с автономным питанием.


Примечание

Модуль HM-11, по своим эксплуатационным характеристикам аналогичен HM-10, но занимает меньшую площадь и имеет меньшее количество контактов.


Внешний вид, назначение контактов

bluetooth-hm-10

Рис. M5.1. Внещний вид и назначение контактов Bluetooth HM-10

Технические характеристики

Наименование Значение
Чип Bluetooth CC2540 или CC2541
Протокол связи Bluetooth 4.0 BLE
Радиус действия до 100 метров
Объем flash-памяти (для хранения прошивки и настроек), Мбит 8
Частота радиосигнала, ГГц 2,40 ÷ 2,48
Ток
  • в режиме установки связи — до 50 мА
  • после установки связи 9 мА
  • в режиме сна — 50 ÷ 200 µA
Напряжение питания, В + 2,5 В до + 3,3 В
Пароль по умолчанию 000000
Имя Bluetooth устройства по умолчанию HMSoft, BT05-A

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

Схема подключения

3-05-2-bluetooth

Рис. M5.2. Подключение Bluetooth HM-10

Тестируем подключение Bluetooth

  1. Установим терминальное приложение для смартфона. Их достаточно много, и функциональные возможности их примерно одинаковы. Предлагаем для смартфонов с OC Android популярное бесплатное приложение Serial Bluetooth Terminal, ориентированное на работу как с «классическими» модулями Bluetooth, так и с модулями, которые поддерживают протокол Bluetooth 4.0 BLE (рис. M5., а). Для iPhone и iPad можно использовать приложение HM10 Bluetooth Serial Lite (рис. M5.3, б).
3-05-3-bluetootch
а б

Рис. M5.3. а — окно установки Serial Bluetooth Terminal на Google Play; б — установка приложение HM10 Bluetooth Serial Lite для iOS

  1. Установив приложение на смартфон, откройте его. При этом Bluetooth на смартфоне должен быть включен.
  2. Подключите Bluetooth, как показано на рис. M5.2, а. Индикатор, расположенный на модуле Bluetooth, начнет мигать в ожидании соединения.
  3. Выберите в меню команду Device, а затем нажмите кнопку SCAN в правом верхнем углу окна (рис. M5.2, б).
а б

Рис. M5.4. Поиск устройств Bluetooth BLE в радиусе действия вашего телефона

  1. После недолгого поиска на экране появится список обнаруженых модулей Bluetooth (рис. M5.5, а). Ваш модуль может быть обозначен в списке на вкладке BLUETOOTH LE как HM-10 или BT05-A (в зависимости от производителя).
  2. Щелкните двойным щелчком на имени вашего модуля Bluetooth, и произойдет соединение модуля с платой Arduino через последовательный порт. При этом светодиодный индикатор на модуле перестанет мигать, а на экране смартфона появится надпись Connected (рис. M5.5, б).
а б

Рис. M5.5. Подключение к Bluetooth BLE

Совет

В зависимость от производителя конкретного устройства Android и версии операционной системы (для Android она должна быть выше 4.3) вы можете увидеть или не увидеть HM-10 среди устройств, обнаруженных Bluetooth (Bluetooth devices). Если ваш Android не находит HM-10 в своих настройках Bluetooth, попробуйте использовать приложение BLE Scanner app.

Взаимодействие смартфона и Arduino через Bluetooth BLE

Теперь, когда соединение Arduino и модуля Bluetooth установлено, осуществим обмен информацией между устройствами. Для этого:

  1. Временно отсоедините провода, подключенные к контактам D0 (RX) и D1(TX) платы Arduino, и загрузите код, приведенный в листинге M5.1.

Листинг M5.1. Обмен информацией между Arduino и модулем Bluetooth

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void setup() {
 
Serial.begin(9600);
 
Serial.println("poexali!");
 
}
 
void loop() {
 
if (Serial.available()) {
 
char c = Serial.read(); // читаем из software-порта
 
Serial.print(c); // пишем в hardware-порт
 
}
 
}

Если при загрузке скетча на Arduino не отключать эти провода, то компилятор выдаст ошибку, показанную на рис. M5.6. Конфликт связан с тем, что пины D0 и D1 также используются для связи с компьютером посредством USB.

Рис. M5.6. Ошибки загрузки скетча в Arduino

  1. Снова подключите провода к контактам D0 (RX) и D1(TX) и выполните сопряжение смартфона с модулем Bluetooth, как было показано на рис. M5.5.
  2. Выполнив сопряжение, можно поздороваться с хостом на другом конце Bluetooth-канала (рис. M5.7). Как можно видеть, приветствие прошло успешно!
3-05-7a-bluetootch 3-05-7b-bluetootch
а б

Рис. M5.7. Привет Arduino! — вводим на смартфоне (а) и получаем в Мониторе порта (б)

При отладке скетча вам придется многократно отключать провода от контактов D0 и D1 во время загрузки скетча в Arduino. Кроме того, одного порта вам может быть недостаточно. В этом случае целесообразно использовать библиотеку SoftwareSerial, которая предустановлена в Arduino IDE. Библиотека SoftwareSerial позволяет реализовать последовательный интерфейс не только на D0 и D1, но и на любых других цифровых выводах Arduino с помощью программных средств, дублирующих функциональность UART (отсюда и название «SoftwareSerial»). Кроме того, она дает возможность программно создавать несколько последовательных портов, работающих на скорости до 115200 бод.

  1. Подключите контакты TX и RX модуля Bluetooth к выводам D2 и D3 (RXD3, TXD2) платы Arduino (а не к D0 и D1, как вы делали ранее!).
  2. Загрузите код, приведенный в листинге M5.2.

Листинг M5.2. Сопряжение платы Arduino и модуля Bluetooth

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
27
28
29
30
31
32
33
34
35
36
37
#include &lt;SoftwareSerial.h&gt;
 
SoftwareSerial mySerial(2,3);//указываем пины RX и TX соответственно
 
void setup() {
 
pinMode(2,INPUT);
 
pinMode(3,OUTPUT);
 
Serial.begin(9600);
 
mySerial.begin(9600);
 
Serial.println("poexali!");
 
}
 
void loop() {
 
if (mySerial.available()) {
 
char c = mySerial.read(); // читаем из software-порта
 
Serial.print(c); // пишем в hardware-порт
 
}
 
if (Serial.available()) {
 
char c = Serial.read(); // читаем из hardware-порта
 
mySerial.write(c); // пишем в software-порт
 
}
 
}
  1. Введите в Мониторе порта любой текст (рис. M5.8, а) и нажмите кнопку Отправить — текст появится в окне терминала смартфона (рис. M5.8, б).
3-05-8a-bluetootch 3-05-8b-bluetootch
а б

Рис. M5.8. Привет Android! вводим в Мониторе порта (а) и получаем на смартфоне (б)

Управление светодиодом RGB по Bluetooth

Теперь осуществим на практике управление электронным прибором со смартфона по каналу Bluetooth.

1. Соберите схему, представленную на рис. M5.9.

3-05-9

Рис. M5.9. Управление RGB-светодиодом через Bluetooth

2. Загрузите скетч, приведенный в листинге M5.3.

Листинг M5.3. Управление светодиодом RGB через Bluetooth

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include &lt;SoftwareSerial.h&gt;
 
// Константы для хранения номеров контактов вывода:
 
const int greenPin = 9; //"зеленый" контакт LED RGB
 
const int bluePin = 10; //"синий" контакт LED RGB
 
const int redPin = 11; //"красный" контакт LED RGB
 
const int pinRX = 2; //RX – вход для приема данных -&gt; к TX bluetooth
 
const int pinTX = 3; //TX – выход для передачи данных -&gt; к RX bluetooth
 
int currentPin = 0; // текущий контакт для задания яркости
 
SoftwareSerial mySerial(pinRX,pinTX); // указываем пины rx и tx
 
void setup() {
 
pinMode(pinRX,INPUT);
 
pinMode(pinTX,OUTPUT);
 
pinMode(redPin, OUTPUT);
 
pinMode(greenPin, OUTPUT);
 
pinMode(bluePin, OUTPUT);
 
 
 
Serial.begin(9600);
 
mySerial.begin(9600);
 
Serial.println("poexali!");
 
}
 
void loop() {
 
if (mySerial.available()) {
 
char inByte = mySerial.read(); // читаем из software-порта
 
Serial.print(inByte); // пишем в hardware-порт
 
rgb(inByte); //включаем светодиод «цветом» inByte
 
}
 
 
 
if (Serial.available()) {
 
char c = Serial.read(); // читаем из hardware-порта
 
mySerial.write(c); // пишем в software-порт
 
rgb(c); //включаем светодиод «цветом» с
 
}
 
}
 
//функция для включения светодиода RGB
 
void rgb(byte cByte){
 
digitalWrite(currentPin,LOW);
 
// игнорируем любые другие значения:
 
if (cByte == 'r') {
 
currentPin = redPin;
 
}
 
if (cByte == 'g') {
 
currentPin = greenPin;
 
}
 
if (cByte == 'b') {
 
currentPin = bluePin;
 
}
 
digitalWrite(currentPin,HIGH);
 
}

3. Теперь, вводя символы r, g и b в Мониторе порта или на смартфоне, подключенном через модуль Bluetooth с помощью терминальной программы, мы можем изменять цвет светодиода RGB.

Опубликовано

Пассивный пьезоэлектрический зуммер 5 В

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

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

Существуют активные и пассивные зуммеры. Главное различие их состоит в том, что активный можно только включить и выключить, подав напряжение на его контакты. Для пассивного зуммера (рис. M1.1) кроме питания требуется источник, который задаст параметры звукового сигнала. В качестве такого источника может выступать плата Ардуино. Для генерации мелодий следует подключать цифровой пин зуммера к пину Arduino, который поддерживает ШИМ (~D5, ~D6, ~D9, ~D10, ~D11).

Внешний вид, назначение контактов

3-01-1-зуммер

Рис. M1.1. Пассивный зуммер

Основные характеристики

Наименование Значение
Напряжение, В 5
Максимальный ток, мА 32
Минимальный уровень звука на расстоянии 10 см, дБ 85
Диапазон частот, Гц 2300 ± 300

Схема подключения

3-01-2-зуммер

Рис. M1.2. Подключение зуммера

Программный код

Листинг M1.1. Подключение зуммера

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#define SoundPin 5 // пин пьезоизлучателя
 
int DelaySound = 1000; //Пауза. 1000 миллисекунд=1 секунда
 
void setup(){
 
}
 
void loop(){
 
tone(SoundPin, 1915); //Воспроизводим сигнал с частотой тона
 
//1/(2*1915)=261 Гц (нота До)
 
delay(DelaySound); //Длительность воспроизведения сигнала 1 с
 
tone(SoundPin, 1700);
 
delay(DelaySound);
 
tone(SoundPin, 1519);
 
delay(DelaySound);
 
tone(SoundPin, 1432);
 
delay(DelaySound);
 
tone(SoundPin, 1275);
 
delay(DelaySound);
 
tone(SoundPin, 1136);
 
delay(DelaySound);
 
tone(SoundPin, 1014);
 
delay(DelaySound);
 
noTone(7); // Выключаем звук
 
}

Пояснение

Функция tone() генерирует на порту входа/выхода сигнал — прямоугольную «волну» заданной частоты и с 50%-ным рабочим циклом. Длительность может быть задана параметром delay, в противном случае сигнал генерируется, пока не будет вызвана функция noTone().

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


Примечание

Подробную информацию о соответствии частоты сигнала воспроизводимым музыкальным нотам, а также примеры программ, можно найти на сайте разработчика Arduino: http://www.arduino.cc/en/Tutorial/Melody.


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

Световой терменвокс

Соберем простейший имитатор музыкального инструмента терменвокса (рис. M1.3). Только играя на нашем терменвоксе, исполнитель будет подносить руки не к антенне (как при игре на классическом терменвоксе), а к фоторезистору.


Примечание

Cопротивление фоторезисторов уменьшается под воздействием света и увеличивается в темноте. Фоторезисторы просты в использовании, но слишком медленно реагируют на изменение уровня освещенности и имеют весьма низкую точность. Как правило, сопротивление фоторезисторов может варьироваться от 50 Ом при дневном освещении до более чем 10 МОм в темноте.


Схема подключения

3-01-3-терменвокс

Рис. M1.3. Световой терменвокс

Программный код

Листинг M1.2. Световой терменвокс

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#define buzzerPin 5 //номер пина зуммера
 
#define photoPin A3 //номер пина фоторезистора
 
int aVal; //Значение на фоторезисторе
 
int sMax=1023; //максимальное значение фоторезистора
 
int buzzerFreq; //частота звука
 
const long BUZZ_FREQ_MAX = 2500; //задаем макс. частоту излучения
 
 
 
void setup(){
 
// Объявляем пин, к которому подключен зуммер как выход
 
pinMode(buzzerPin,OUTPUT);
 
Serial.begin(9600);
 
}
 
 
 
void loop(){
 
aVal=analogRead(photoPin); //считываем значение с фоторезистора
 
Serial.print("aVal:");
 
Serial.println(aVal);
 
// задаем частоту излучения // пьезоизлучателя
 
buzzerFreq = (aVal * BUZZ_FREQ_MAX)/sMax;
 
buzz(buzzerPin, buzzerFreq, 10);
 
}
 
//подпрограмма генерации звука buzz
 
void buzz(int targetPin, long frequency, long length) {
 
long delayValue = 1000000/frequency/2;
 
long numCycles = frequency * length/ 1000;
 
for (long i=0; i &lt; numCycles; i++){
 
digitalWrite(targetPin,HIGH);
 
delayMicroseconds(delayValue);
 
digitalWrite(targetPin,LOW);
 
delayMicroseconds(delayValue);
 
}
 
}

Все — простейший терменвокс готов! Теперь попробуйте, изменяя освещенность фоторезистора, создать звуковую композицию.

Опубликовано

RFID-модуль RC522

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

Радиочастотная идентификация RFID (от англ. Radio Frequency IDentification) представляет собой бесконтактную технологию, которая широко используется в системах контроля доступа, аутентификации персонала, в логистике, в розничной торговле и др. Для идентификации людей наиболее популярным является формат бесконтактной пластиковой карточки, по размеру совпадающей с банковской. Такую карточку для запроса доступа как правило нужно осознанно подносить к считывающему устройству на расстояние порядка 10 см.

Внешний вид, назначение контактов

Система RFID состоит из двух основных компонентов: RFID-метки (тега), которая находится у объекта, который мы хотим идентифицировать, и RFID-считывателя (рис. M2.1).

RFID

Рис. M2.1. RFID-модуль RC522

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

В проектах мы воспользуемся RFID-считывателем RC522 на базе популярной микросхемы MFRC522 производства фирмы NXP Semiconductors. В комплект поставки считывателя RC522 входят две RFID-метки типа Mifare Classic с памятью объемом 1 Кбайт: карточка и брелок. Каждая метка имеет уникальный идентификационный ключ (UID).

Основные характеристики

Наименование Значение
Напряжение, В 3,3
Потребляемый ток в активном состоянии, мА 13 ÷ 26
Потребляемый ток в состоянии ожидания мА 10 ÷ 13
Рабочая частота, МГц 13,56
Поддерживаемые типы карт MIFARE S50, MIFARE S70, MIFARE UltraLight, MIFARE Pro, MIFARE DESfire
Размеры, мм 40×60

Схема подключения

M2-2-RFID

Рис. M2.2. Схема подключения RFID-модуля RC522 к Arduino Uno


Примечание

Для подключения модуля RFID вы также можете использовать контактную группу ISCP на плате Arduino Uno, подключив туда контакты MISO (ICSP-1), SCK (ICSP-3) и MOSI (ICSP-4).


Получаем UID метки RFID

  1. Загрузите специализированную библиотеку MFRC522 (https://github.com/miguelbalboa/rfid/archive/master.zip).
  2. Подключите библиотеку в среду разработки Arduino IDE: Скетч | Подключить библиотеку | Добавить .ZIP библиотеку…
  3. Загрузите скетч DumpInfo из папки примеров библиотеки MFRC522: Файл | Примеры | MFRC522 | DumpInfo.
  4. Запустите монитор порта.

Программа считывает информацию с поднесенной RFID-метки и выводит ее в терминал. Для RFID-меток из комплекта RC522 она будет иметь примерно следующий вид:

Card UID: 7E 56 37 D5

Card SAK: 08

PICC type: MIFARE 1KB

  • первая строка — уникальный идентификатор RFID-метки (UID) для этого типа меток (4 байта);
  • вторая строка — поле SAK (Select Acknowledge), содержащее информацию о типе метки и производителе. Значение 08 означает, что это метка типа Mifare Classic 1K производства NXP;
  • третья строка — расшифровка типа метки, извлеченная из поля SAK: Mifare 1KB.

Внимание!

Запишите уникальный идентификатор (UID) вашей RFID-метки! Он понадобится вам в следующем примере.


Программный код

Загрузите скетч из листинга M2.1. При поднесении метки к считывателю на мониторе порта будет появляться надпись Access granted, а на плате загораться встроенный светодиод.

Листинг M2.1. Подключение модуля RFID

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include &lt;SPI.h&gt;
 
#include &lt;MFRC522.h&gt;
 
// Настраиваем пины SS и RST для нашей платы - Arduino Uno
 
#define SS_PIN 10
 
#define RST_PIN 9
 
#define LED13 13 //Встроенный светодиод.
 
//Зажигается когда доступ разрешен
 
MFRC522 mfrc522(SS_PIN, RST_PIN); // Создаем объект MFRC522
 
void setup() {
 
pinMode(LED13, OUTPUT);
 
Serial.begin(9600);
 
SPI.begin(); // Инициализируем интерфейс SPI
 
mfrc522.PCD_Init(); // Инициализируем MFRC522
 
Serial.println("Approximate your card to the reader...");
 
Serial.println();
 
}
 
void loop(){
 
if (!mfrc522.PICC_IsNewCardPresent()) // Ожидаем RFID-метку
 
return;
 
// При обнаружении RFID-метки пытаемся считать ее данные
 
if (!mfrc522.PICC_ReadCardSerial())
 
return;
 
// Извлекаем уникальный идентификатор RFID-метки (UID)
 
String content = "";
 
// Преобразуем поле UID в строку типа "XX XX XX XX"
 
for (byte i = 0; i &lt; mfrc522.uid.size; i++)
 
{
 
content.concat(String(mfrc522.uid.uidByte[i] &lt; 0x10 ? " 0" : " "));
 
content.concat(String(mfrc522.uid.uidByte[i], HEX));
 
}
 
content.toUpperCase();
 
// Выводим UID в терминал
 
Serial.print("Tag UID:");
 
Serial.println(content);
 
// Сравниваем UID с заданным
 
if (content.substring(1) == "<strong>7E 56 37 D5</strong>") // Укажите <strong>здесь</strong> UID
 
//RFID-метки, которой
 
//разрешен доступ
 
{
 
// Если UID совпал с заданным - доступ разрешен
 
Serial.println("Access granted");
 
Serial.println();
 
// Включаем встроенный на плате светодиод на 3 секунды
 
digitalWrite(LED13, HIGH);
 
delay(3000);
 
digitalWrite(LED13, LOW);
 
}
 
else // Если UID не совпал с заданным - доступ запрещен
 
{
 
Serial.println("Access denied");
 
Serial.println();
 
}
 
}
Опубликовано

8-разрядный расширитель портов PCF8574

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

Если вы исчерпали для подключения внешних устройств (датчиков, модулей, светодиодов и др.) все выводы Arduino (для Arduino UNO это 6 аналоговых и 14 цифровых), то модуль расширителя портов (рис. M4.1) поможет вам добавить дополнительно 8 контактов (P0 … P7). Эти контакты можно использовать как в качестве входов (например, для чтения сигнала с датчика), так и для выходов (например, для включения светодиодов). Модули расширителя портов работают на шине I2C, и, если подключить в проекте последовательно 8 таких устройств, вы соответственно получите дополнительно 8 × 8 = 64 контакта для ввода и вывода.

Внешний вид, назначение контактов

M4-1-PCF8574

Рис. M4.1. 8-разрядный расширитель портов PCF8574

Основные характеристики

Наименование Значение
Рабочий режим питания, В от 2,5 до 6 В
Низкий ток покоя, мА максимум 10 мА
Адресация на 3 вывода аппаратных адресов для использования до 8 устройств (до 16 устройств при использовании PCF8574A)

Схема подключения

M4-2-PCF8574

Рис. M4.2. Схема подключения кнопки и светодиода

Программный код

  1. Скачайте по ссылке https://github.com/skywodd/pcf8574_arduino_library библиотеку PCF8574/PCF8575 Arduino library для работы Arduino с расширителем PCF8574.
  2. Скачав библиотеку, выберите ее и установить с помощью команды Скетч | Подключить библиотеку | Добавить ZIP библиотеку…
  3. Загрузите скетч из листинга M4.1.

Листинг M4.1. Подключение расширителя портов PCF8574

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include &lt;Wire.h&gt;
 
#include "PCF8574.h" //Библиотека для расширителя портов.
 
 
 
PCF8574 expander; //создадим объект класса PCF8574 с расширителем
 
#define pinLed 0 //Номер пина светодиода на расширителе (P0)
 
#define pinButton 1 //Номер пина кнопки на расширителе (P1)
 
 
 
void setup(){
 
expander.begin(0x20); / Инициализация расширителя по адресу 0x20
 
 
 
expander.pinMode(pinLed,OUTPUT); //Настройка пина светодиода
 
//(на расширителе) на выход
 
expander.pinMode(pinButton,INPUT_PULLUP); // Настройка пина кнопки
 
//(на расширителе) на вход
 
}
 
 
 
void loop(){
 
if (expander.digitalRead(pinButton)==HIGH)
 
expander.digitalWrite(pinLed, HIGH);
 
else
 
expander.digitalWrite(pinLed,LOW);
 
}

Примечание

Если вы используете для управления проектом со смартфона платформу RemoteXY, закомментируйте в файле PCF8574.h библиотеки PCF8574 строку:

1
#define PCF8574_INTERRUPT_SUPPORT

Это строка номер 36. Тем самым вы отключите у расширителя поддержку прерываний, но зато предотвратите конфликт приложения RemoteXY и расширителя PCF8574, которые используют одинаковый вектор прерываний.