Arduino 101とtinyTILE BLEでスマートマッチングサングラスを作る
必要な部品と用品
| 部品 | 数量 | 備考 |
|---|---|---|
| Intel tinyTILE | 2 | または他のBLEモジュール |
| Arduino 101 | 2 | オプション |
| Adafruit液晶ライトバルブ - LCD制御遮光パネル | 2 | |
| リチウムイオン電池 100mAh | 2 | |
| Adafruit JST-PH 2ピンSMT右角コネクタ | 4 | |
| Adafruit JST-PHバッテリー延長ケーブル | 2 | |
| スライドスイッチ | 2 | |
| 抵抗 10kΩ | 3 | |
| SparkFunプッシュボタンスイッチ 12mm | 1 | |
| LED(汎用) | 2 | 開発段階で使用。最終プロトタイプでは不要 |
| ブレッドボード(汎用) | 1 | 開発段階で使用。最終プロトタイプでは不要 |
| ジャンパーワイヤ(汎用) | 1 | 開発段階で使用。最終プロトタイプでは不要 |
必要な工具と機械
- 3Dプリンター(汎用)
- ハンダごて(汎用)
使用アプリとオンラインサービス
- Arduino IDE
- Arduino Web Editor
このプロジェクトについて
アプリを使わずに、社交の場で遠くからでも、話しかけたい相手にアイコンタクトの合図を送れるとしたら? 私は新しいデートの仕方を提案しているわけではありません。人間関係の分野におけるBluetoothの新しい活用法を探求しています。
Intel CurieモジュールがCentral(セントラル)とPeripheral(ペリフェラル)のBLEデバイスとして動作できると知った時、すぐにこのサングラスを作りたいと思いました(CurieBLEの詳細はこちら)。Adafruitのチュートリアルのおかげで、3DプリントされたLCDグラスの参照フレームワークがすぐに手に入りました。私がAdafruitのチュートリアルに追加したのは、スイッチ制御の代わりにBLE制御で2つのグラスを同時に操作できること(一方がマスター、もう一方がスレーブ)、そして再設計された3Dプリントフレームです。
このプロジェクトは最初にArduino 101で開発し、tinyTILEでプロトタイピングしました。両方ともIntel Curieモジュールを搭載しています。将来的にIntel Curieモジュールが入手できなくなっても、ここでの方法論が役立つことを願っています。BluetoothのCentral/Peripheral機能には様々な応用が想像でき、このトピックについての議論を楽しみにしています。
ステップ1 - 開発
2つのArduino 101と2つのLEDを使って回路を開発し、コードをテストしました。最終回路が複雑なため、ハンダ付けの前にブレッドボードで始めるのが賢明です。

ペリフェラル側には、CurieBLEの例「Peripheral」→「LED」のコードを使用し、HIGHとLOWを入れ替えています(理由は最後のステップで説明)。Central側のコードはプロジェクト末尾にあります。CurieBLEの例「Central」→「LEDcontrol」とほぼ同じですが、LCD用に数行追加しています。


TinyTILEはArduino 101のほぼミニチュア版です。中央の長方形がIntel Curieモジュールです。同じコードで書き込み可能です。Arduino 101のピンは使いやすいですが、tinyTILEのサイズはウェアラブルに魅力的です。私はArduino 101で開発し、全てをtinyTILEに移植するのが好きです。フォームファクタが問題でなければArduino 101を使っても構いません(例はこちら)。

Arduino 101をtinyTILEに、LEDをLCDに変更する際、各コンポーネントを段階的にテストしました。
ステップ2 - 3Dプリント
Adafruit提供のデザインをベースに、SolidWorksでフレームを再設計しました。基本デザインはこちらからダウンロードでき、お好みのソフトで修正可能です。私のデザインと全く同じ見た目が良ければ、添付ファイルから入手できます。なぜハート型とユニバース型なのかは、動画で説明しています。想像力を働かせてください。
デザインは顔にフィットするよう修正可能です。私の小さな鼻では少し保持が難しいと感じました。最近は顔の3Dスキャンでメガネをカスタマイズしてくれる会社もあり、素晴らしいですね。

AdafruitのRuiz兄弟が使った3Dプリンターは私のより良いのかもしれません。私のプリンターは、取り出しが非常に困難な場所に大量のサポート材を出力しました。UXデザイナーとして、私の3Dプリンターの不便さについては語り尽くせません。水溶性サポート材、サポート材不要のプリンター、液体/光硬化式3Dプリンターが欲しいです。
ステップ3 - 組み立て
Adafruitのチュートリアルの配線、ハンダ付け、取り付けに関するアドバイスは非常に参考になります。ぜひチェックしてください。私はtinyTILEとボタンを追加しただけです。ワイヤーを適切な長さにカットするよう注意してください。

ステップ4 - 完成、楽しもう!
電源を入れると、LCDに電圧がかかりサングラスとして暗くなります。マスター側のボタンを押すと、マスター側の電圧がオフになり、同時にBluetooth経由でスレーブ側の電圧もオフになり、両方のグラスが透明になります。



2つのグラスは、BLE範囲内であればかなり離れていても制御可能です。自宅でテストしました。ハート(マスター)はユニバース(スレーブ)の注意を、少なくとも15歩離れていても引けます。
ボタンではなく、ジェスチャー、うなずき、心拍の同期で制御できたらどうでしょう!
Heart (master=central): "I like your sophisticated mind <3"
Universe (slave=peripheral): "I see you. Let's talk."
コード
Central側のボタン制御 (Arduino)
これはCurieBLEの例とほぼ同じです。
/* * Copyright (c) 2016 Intel Corporation. All rights reserved. * See the bottom of this file for the license terms. */ /* * Sketch: LedControl.ino * * Description: * 特定のServiceとCharacteristicを持つPeripheralを探すCentralスケッチ。 * 発見成功時、ボタンの状態を読み取り、その値をPeripheralのCharacteristicに書き込む。 * * Notes: * - 期待されるPeripheral Service: 19b10000-e8f2-537e-4f6c-d104768a1214 * - 期待されるPeripheral Characteristic: 19b10001-e8f2-537e-4f6c-d104768a1214 * - 期待されるPeripheralスケッチ: */ #include// ボタン用変数 const int buttonPin = 3; int oldButtonState = LOW; const int ledPin = 5; // LED用ピン void setup() { Serial.begin(9600); pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); // BLEハードウェア初期化 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; } // LED characteristicを取得 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"); // ボタン押下時、0x01を書き込んでLEDオン ledCharacteristic.writeByte(0x01); digitalWrite(ledPin, LOW); } else { Serial.println("button released"); // ボタン離した時、0x00を書き込んでLEDオフ ledCharacteristic.writeByte(0x00); 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... */
カスタムパーツとエンクロージャ
3Dプリント用パーツファイルはThingiverse等で公開予定
回路図
Central:ピン3をボタン用、ピン5をLCD用に使用。Peripheral:ピン6をLCD用に使用。

製造プロセス
- サングラス:デザイン、材料、眼保護基準
- 電池の歴史:ボルタの電柱から現代リチウム電池まで
- UnifiedWater v1 - 完全なArduino水質センサーキット
- Arduinoプロジェクトのための最適化電源ソリューション
- 3DプリンターとArduinoで作るアイアンマン ヘルメット&アークリアクター完全ガイド
- GSM接続対応ポータブル投票システム「Mobile Vote Box」
- Arduino 101 BLE + Blynk:スマホで操作するBluetooth戦車ロボット
- Arduino Portenta H7で作る高性能エッジAIカメラ:OpenMV + TensorFlow Lite
- 自動車バッテリーの役割と仕組み:種類・構造・メンテナンス完全ガイド
- オルタネーター診断完全ガイド:電圧計・マルチメーター・ドライバー・バッテリー切離し4つのテスト方法
- オルタネーター故障の7つの明確なサイン|見逃せない警告症状