среда, 30 июля 2014 г.

Как я заводил Raspberry Pi

Помимо Arduino у меня уже некоторое время валяется на полке плата Raspberry Pi. Я давно уже хочу с ней поиграться, но всё как-то не доходили руки. Вот, наконец решил попробовать запустить "PC размером с банковскую карту". Собственно "запуск" заключается в заливке на карту памяти SD образа операционной системы (в основном одного из адаптированных дистрибутивов Linux). Некоторое неудобство доставило отсутствие отдельного монитора с HDMI выходом, но и в этом случае процедура установки системы для Raspberry очень стандартная.

Итак, имеем флеш-карту формата SD на 4Гб (согласно документации это минимально возможный объём). Есть два варианта установки системы в Raspberry Pi. Первый способ - залить на флешку NOOBS (New Out Of the Box Software). Это по сути "менеджер установки системы", который позволит установить систему из одного из популярных дистрибутивов по выбору. Второй способ - залить на флешку уже непосредственно образ готовой системы. Второй способ рекомендуется для "опытных пользователей", первый, как утверждают, годится для новичков. Что-ж, пойдём первым путём, надеясь, что он более простой.

Образ NOOBS можно скачать здесь. У меня на ноутбуке установлен Windows, так что инструкции черпаем в соответствующем разделе сайта Rapberry Pi. Так же в соответствии с инструкцией нам понадобится утилита SD formatter. С помощью этой утилиты сначала форматируем карту, куда будет установлена система. Выбираем при форматировании тип файловой системы  Fat32, а так же ставим настройку "FORMAT SIZE ADJUSTMENT" равной "ON". Распаковываем скачанный архив NOOBS. Внутри архива можно обнаружить директорию ./os . В этой директории необходимо стереть все поддиректории кроме Raspbian (там будут директории с именами Arch, Pidora, RISC_OS и.т.д. Все их надо удалить). Затем редактируем файл /os/Raspbian/flavours.json. Удаляем строки, отмеченные курсивом:

{
     "flavours": [
       {
         "name": "Raspbian - Boot to Scratch",
         "description": "A version of Raspbian that boots straight into Scratch"
       },

       {
         "name": "Raspbian",
         "description": "A Debian wheezy port, optimised for the Raspberry Pi"
       }
     ]
   }


Затем в корне распакованного архива стоит подредактировать файлик recovery.cmdline. Нужно добавить волшебное слово silentinstall в конец строки:
Было:

runinstaller quiet vt.cur_default=1 coherent_pool=6M elevator=deadline

Стало:

runinstaller quiet vt.cur_default=1 coherent_pool=6M elevator=deadline silentinstall

После этого копируем содержимое архива на флешку. При загрузке с получившейся карты Raspberry автоматически установит Raspbian. Установка может занять какое-то время и рекомендуется оставить устройство в покое на часик-другой, чтобы быть точно уверенным, что система полностью установлена. Я вставил флешку в Raspberry Pi и подключил её к роутеру Ethernet-кабелем. Включив питание и подождав какое-то время я стал пытаться получить доступ к установленной системе по SSH. Для этого сначала необходим определить IP-адрес Raspberry. Поискав в интернете я нашёл, что MAC-адрес Raspberry Pi должен начинаться с B8:27:EB. Где-то в глубинах веб-интерфейса своего домашнего роутера я нашел список MAC-адресов подключённых устройств вместе с соответствующими IP-адресами, что было весьма кстати, тем более что среди них действительно был MAC-адрес, начинающийся на B8:27:EB. IP-адрес Raspberry оказался равным 192.168.1.12. Теперь остаётся залогиниться туда по SSH, например, с помощью терминала PuTTY. Следует отметить, что мне встречаются сообщения, что SSH-сервер не включен по умолчанию в системе Raspbian установленной из NOOBS 1.3.7, и понадобятся дополнительные действия для того, чтобы получить доступ. Это противоречит моему опыту (правда с версией NOOBS 1.3.9), в моём случае SSH-сервер оказался включен в "свежей" системе. По умолчанию в системе создаётся пользователь pi с паролем raspberry:

Всё! После этого я увидел, что плата работает и у меня есть контроль над системой, установленной в ней через SSH. Остаётся придумать и сделать с ней что-нибудь полезное.

четверг, 24 июля 2014 г.

Как я подключал модуль Bluetooth к Ардуино

Хочу рассказать короткую историю о том, как я ходил по граблям, пытаясь подружить плату Arduino UNO и модуль Bluetooth HC 06.

Чтобы протестировать взаимодействие между PC/смартфоном и платой Arduino UNO я после недолгих поисков по интернету собрал вот такую нехитрую схему:

В общем-то всё просто: подаём напряжения +5В, +3.3В и "землю" (GND) с Ардуино на модуль Bluetooth, для передачи же данных модуль соединяется с аппаратным последовательным портом на Arduino. Выход (Tx) на Ардуино подключается к входу (Rx) модуля (по этой линии данные передаются из Ардуино в модуль Bluetooth) и наоборот, для передачи из модуля в Ардуино подключаем (Tx) на плате HC 06 к (Rx) Ардуино. Сигнал с Ардуино подаётся на модуль через делитель напряжения, так как Bluetooth-модуль ожидает уровень сигнала 3.3В, а Ардуино выдаёт 5В. R1 я взял равным примерно 5 кОм, R2, соответственно, 10 кОм (на самом деле 5.1 кОм и 11 кОм).

От прошивки в Ардуино в этом опыте требуется только лишь возможность проверить, что данные шлются в обе стороны. Я реализовал следующую логику: если Arduino получает через Bluetooth символ '1', то в ответ высылается строчка "Hello". Eсли Arduino получает через Bluetooth символ '2', то просто мигаем встроенным светодиодом, который подключен к пину 13 на плате Arduino UNO. В ответ на любой другой символ присылается знак вопроса.

Эта схема никак не хотела работать! Было похоже, что данные не пересылаются в Ардуино. Решил попробовать, шлются ли данные в обратном направлении. Переписал скетч таким образом, чтобы Ардуино просто постоянно слал тестовую строчку с данными в модуль, и смог без проблем прочитать их на своём ноутбуке (о том, как подключаться с PC под управлением Windows пойдёт речь ниже).

Потратив 2+ часа на проверки и поиски в интернете, я нашёл, что нельзя пользоваться Rx и Tx пинами на Ардуино когда он подключен к USB-порту компьютера (я использую USB кабель для питания всей схемы). Дело в том, что при подключении USB-кабеля к ардуино, выходы контроллера Rx и Tx используются для связи с компьютером через USB (правда, сигнал Tx продолжил работать и в этом случае, так как послать данные из Ардуино в PC всё-таки получилось). При связи с другими устройствами через аппаратный последовательный порт необходимо подавать питание через разъём внешнего питания (7-12 Вольт). Я полагаю, все это очевидные вещи для мало-мальски опытного пользователя Arduino (коим я пока не являюсь). Надеюсь этот пост поможет кому-то из начинающих сэкономить время и избежать похожих проблем в будущем.

С программной реализацией последовательного обмена разработчик волен выбирать любой пин цифрового ввода/вывода платы Ардуино. Я выбрал десятый пин для приёма информации через Bluetooth, и 11-й, соответственно, для отправки данных. Схема теперь выглядит так (на схеме ошибка, 10-й и 11-й выводы платы поменяны местами):


В реальном мире это выглядит так:



Код скетча почти не изменился, так как программная реализация последовательного обмена имеет очень похожее API:

Не буду останавливаться слишком подробно на на процедуре сопряжения PC с нашим новым "гаджетом". В случае Windows всё как обычно: подключается USB-донгл, осуществляется поиск Bluetooth устройств. В моём случае устройство называлось HC-06, но имя можно поменять с помощью соответствующей AT-команды. С точки зрения программ наше устройство видится как ещё один COM-порт в системе. В свойствах устройства можно увидеть, какой номер присвоен "виртуальному COM-порту" сопряженного устройства. В моём случае получился порт COM-28. Для того чтобы слать и принимать данные в COM-порт для Windows существует множество программ. Я использовал привычный мне терминал PuTTY. Последовательность действий такова: запускаем PuTTY, выбираем Connection type: Serial и идем в категорию "Serial"

'
Здесь выставляем вот такие параметры:

Номер COM-порта может отличаться, его необходимо смотреть в свойствах устройства. Нажимаем кнопку "Open" чтобы сразу соедениться с устройством, либо идём в категорию Session, там придумываем название сессии (у меня, например, ardu-bt) и печатаем его в поле Saved sessions, затем нажимаем кнопку "Save". Это сохранит настройки сессии и позволит не конфигурировать ком-порт при каждой последующей попытке приконнектится к устройству. Достаточно будет просто выбрать сохранённую сессию в списке. После того, как программа-терминал соеденится с устройством, светодиод на модуле Bluetooth должен перестать мигать и начать светить непрерывно. В окне с сессией можно слать команды устройству, нажимая на клавиши. При нажатии на клавишу 1 устройство должно вернуть строку "Hello", при нажатии ина колавишу 2 -- пять раз помигать светодиодом на Arduino. При нажатии на другие клавиши устройство отвечает знаком вопроса. Типичный пример сессии:


Итак, удалось научится сопрягать Ардуино с ПК через Bluetooth! Теперь остаётся придумать какой-нибудь более интересный проект.