Умные очки для знакомств на Arduino 101 и tinyTILE BLE
Компоненты и материалы
| Intel tinyTILE (или другие BLE-модули) | 2 |
| Arduino 101 (опционально) | 2 |
| Adafruit LCD Light Valve (управляемая панель затемнения) | 2 |
| Li-Ion аккумулятор 100 мАч | 2 |
| Adafruit JST-PH 2-pin SMT Right Angle Connector | 4 |
| Adafruit JST-PH Battery Extension Cable | 2 |
| Выключатель-ползунок | 2 |
| Резистор 10 кОм | 3 |
| Тактическая кнопка 12 мм | 1 |
| Светодиоды (для разработки) | 2 |
| Макетная плата (для разработки) | 1 |
| Перемычки (для разработки) | 1 набор |
Инструменты
- 3D-принтер
- Паяльная станция
Приложения и сервисы
- Arduino IDE
- Arduino Web Editor
О проекте
Вместо приложения — что если можно было бы послать сигнал человеку, который тебе нравится, в общественном месте, даже издалека? Я не предлагаю новый способ свиданий. Я исследую новое применение Bluetooth в человеческих взаимодействиях.
Узнав, что модули Intel Curie могут работать как центральные и периферийные BLE-устройства, сразу захотел сделать эти очки. (Подробнее о CurieBLE здесь). Благодаря уроку Adafruit, базовый каркас 3D-печатных очков с LCD уже есть. Я добавил BLE-управление двумя очками одновременно: одно — мастер (центральное), другое — слейв (периферийное), и переработал 3D-модели оправ.
Проект разрабатывался на Arduino 101 и прототипировался на tinyTILE — у обоих модули Intel Curie. Даже если Curie в будущем станут недоступны, методология может быть полезна. Представляю много способов применения BLE central/peripheral и жду обсуждений.
Шаг 1 — Разработка
Два Arduino 101 и два светодиода использовались для разработки схемы и тестирования кода. Из-за сложности итоговой схемы лучше начать с макетной платы перед пайкой.
Для периферийного устройства можно взять код из примеров CurieBLE → Peripheral → LED, поменяв HIGH и LOW местами (причина в последнем шаге). Код для центрального устройства приведен в конце проекта. Он почти такой же, как CurieBLE → Central → LEDcontrol, с парой строк для LCD.
TinyTILE — почти точная миниатюрная копия Arduino 101. Центральный прямоугольник — модуль Intel Curie. Их можно прошивать одинаковым кодом. Пины Arduino 101 удобнее, но размер tinyTILE привлекательнее для носимых устройств. Я разрабатываю на Arduino 101, потом переношу на tinyTILE. Если форм-фактор не важен — используйте Arduino 101.
Тестировал каждый компонент пошагово при переходе с Arduino 101 на tinyTILE и замене светодиодов на LCD.
Шаг 2 — 3D-печать
Оправы переработал в SolidWorks на базе дизайна Adafruit. Их базовый дизайн здесь, можно модифицировать в любом ПО для 3D-печати. Мои дизайны (сердечко и вселенная) в вложениях. Почему такие формы — смотрите видео.
Дизайн можно адаптировать под свое лицо. Мне было неудерживать на маленьком носу. Есть компании, делающие 3D-скан лица и кастомизирующие очки — отлично.
Думаю, 3D-принтер братьев Ruiz от Adafruit лучше моего. Мой напечатал много поддержек в труднодоступных местах. Как UX-дизайнер, много чего могу сказать о неудобстве моего принтера. Хотел бы водорастворимые поддержки или принтер без поддержек или фотополимерный.
Шаг 3 — Сборка
Советы Adafruit по проводке, пайке и монтажу отличны. Нужно только добавить tinyTILE и кнопку. Аккуратно подрезайте провода под нужную длину.
Шаг 4 — Готово и веселитесь!
При включении на LCD подается напряжение — очки темные. При нажатии кнопки на мастере напряжение на мастере отключается, а по Bluetooth посылается сигнал слейву отключить напряжение — оба очка становятся прозрачными.
Два очка управляются на большом расстоянии в пределах BLE. Дома проверял: Сердце привлекает внимание Вселенной хотя бы за 15 шагов.
Представьте не кнопку, а жест, кивок или совпадение ритма сердец!
Heart (master=central): "I like your sophisticated mind <3"
Universe (slave=peripheral): "I see you. Let's talk."
Код: Управление кнопкой для центрального устройства
/* * Copyright (c) 2016 Intel Corporation. All rights reserved. * License terms at the end of this file. */ /* * Sketch: LedControl.ino * Central sketch that looks for a particular Service with a * certain Characteristic from a Peripheral. Upon succesful discovery, * it reads the state of a button and write that value to the * Peripheral Characteristic. */ #includeconst int buttonPin = 3; int oldButtonState = LOW; const int ledPin = 5; // пин для LCD (был LED) void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); BLE.begin(); Serial.println("BLE Central - LED control"); BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214"); } void loop() { BLEDevice peripheral = BLE.available(); if (peripheral) { Serial.print("Found "); Serial.print(peripheral.address()); Serial.print(" '"); Serial.print(peripheral.localName()); Serial.print("' "); Serial.print(peripheral.advertisedServiceUuid()); Serial.println(); BLE.stopScan(); controlLed(peripheral); BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214"); } } void controlLed(BLEDevice peripheral) { Serial.println("Connecting ..."); if (peripheral.connect()) { Serial.println("Connected"); } else { Serial.println("Failed to connect!"); return; } Serial.println("Discovering attributes ..."); if (peripheral.discoverAttributes()) { Serial.println("Attributes discovered"); } else { Serial.println("Attribute discovery failed!"); peripheral.disconnect(); return; } BLECharacteristic ledCharacteristic = peripheral.characteristic("19b10001-e8f2-537e-4f6c-d104768a1214"); if (!ledCharacteristic) { Serial.println("Peripheral does not have LED characteristic!"); peripheral.disconnect(); return; } else if (!ledCharacteristic.canWrite()) { Serial.println("Peripheral does not have a writable LED characteristic!"); peripheral.disconnect(); return; } while (peripheral.connected()) { int buttonState = digitalRead(buttonPin); if (oldButtonState != buttonState) { oldButtonState = buttonState; if (buttonState) { Serial.println("button pressed"); ledCharacteristic.writeByte(0x01); // включить LCD (сделать прозрачным) digitalWrite(ledPin, LOW); } else { Serial.println("button released"); ledCharacteristic.writeByte(0x00); // выключить LCD (сделать темным) digitalWrite(ledPin, HIGH); } } } Serial.println("Peripheral disconnected"); } /* Arduino BLE Central LED Control example * Copyright (c) 2016 Arduino LLC. All right reserved. * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License... */
Схемы
Центральное устройство: пин 3 — кнопка, пин 5 — LCD. Периферийное: пин 6 — LCD.
Производственный процесс
- Солнцезащитные очки: дизайн, материалы и стандарты защиты глаз
- Батареи: от вольтовой стопки к современным литийным элементам
- UnifiedWater v1: полный набор датчиков качества воды на Arduino MKR GSM
- Оптимизированные решения питания для проектов на Arduino
- Собственный шлем Железного Человека и Арк-реактор на Arduino — пошаговое руководство
- Переносная система голосования с GSM-связью
- Arduino 101 BLE + Blynk: DIY танк с Bluetooth-управлением с телефона
- Автомобильный аккумулятор: устройство, типы, характеристики, обслуживание
- Как проверить генератор (альтернатор): экспертные методы для надежного результата
- 7 явных признаков неисправности генератора