J.A.R.V.I.S. - Arduino搭載スマートホーム仮想アシスタント
必要な部品と材料
![]() |
Arduino 101 | × | 1 |
![]() |
Arduino 4リレーシールド | × | 1 |
![]() |
Arduino GSMシールド V2 | × | 1 |
必要な工具と機器
![]() |
はんだごて |
![]() |
ホットグルーガン |
使用するアプリとオンラインサービス
![]() |
Unity |
![]() |
Android Studio |
| Vuforia | |
| Adobe Illustrator | |
![]() |
Arduino IDE |
プロジェクトについて
なぜスマートホーム問題に取り組むのか?
新しいポイントは?

なぜこのプロジェクトを作ることにしたのか?





動作原理
デジタル電力量計



AI仮想アシスタント
信号の流れ:
- Androidアプリへ音声入力
- Androidアプリで処理
- 暗号化データをBluetooth経由でArduinoへ送信
- Arduino 101で処理
- リレーへデジタル信号出力
ピン接続:
- Pin 8 → PulseIn [デジタル入力]
- Pin 6 → IN1 → ファン出力
- Pin 4 → IN2 → 照明出力
- Pin 5 → IN3 → コーヒーメーカー







電力量計の接続:
- メーターを電源に接続
- メーター内部のLDRが外光の影響を受けないよう黒テープで覆う
- 中性線を負荷に直接接続、相線をリレー経由で接続
- LDRからの配線をカウンター回路へ
- カウンター回路の出力をコードのPin 8 (pulsePin) へ
- Arduino 101のTX/RXをGSMモジュールのRX/TXへ接続
- コード書き込み後、ボードに電源投入
回路図

使用ハードウェアと機器
- 電力量計内部: LDR (光依存抵抗)
- GSMモジュール
- カウンター回路: ポテンショメータ、IC LM358N
- Arduino 101
- Bluetooth HC-05モジュール
- 4チャネル 12V 10A リレー制御ボード (フォトカプラ付き、PIC/AVR/ARM対応)
プログラミングプラットフォーム
- Arduino 101: Arduino IDE
- Androidアプリ: Android Studio (Java/XML)
- データベース: Google Firebase
- AR: Unity + Vuforia SDK
実装詳細
- 全コンポーネントの読み取り値をArduinoで文字コードに変換し、シリアルポート経由で効率的に送信。無限ループ内で各読み取り値を文字に対応付け
- PC側でシリアルポート受信プログラムを実行
- Androidアプリ開発: Android Studio、音声認識にGoogle標準APIを使用
- 音響音声パラメータによる話者非依存音声認識をAndroidアプリで実装
- AI仮想アシスタント: CNN(畳み込みニューラルネットワーク)等のディープラーニング手法で自然言語処理をPython実装
- ARアプリ: Unity IDE + Vuforia SDK (モバイル向けARアプリ開発SDK)
動画
(動画プレースホルダー)
参考リンク
(リンクプレースホルダー)
コード
Arduino電力量計測・コスト計算コード Arduino
Arduinoに接続された家電の消費電力量を計測するコードです。
手順:
1. 接続し、Arduinoコードに携帯番号を設定
2. Arduino 101にアップロード
3. 実行
4. 任意の携帯から #任意テキスト* 形式でSMS送信
5. 消費電力量とコストが返信される
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);
int led = 13;
#define pulsein 8
unsigned int pulse_count = 0;
float units = 0;
unsigned int rupees = 0;
unsigned int temp = 0, i = 0;
char str[70], flag1 = 0, flag2 = 0;
void setup() {
lcd.begin(16,2);
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(pulsein, INPUT);
digitalWrite(pulsein, HIGH);
lcd.setCursor(0,0);
lcd.print("Wireless Energy");
lcd.setCursor(0,1);
lcd.print(" Meter ");
delay(2000);
lcd.clear();
lcd.print("By ");
delay(2000);
lcd.clear();
lcd.print("GSM Initializing...");
gsm_init();
lcd.clear();
lcd.print("System Ready");
Serial.println("AT+CNMI=2,2,0,0,0");
init_sms();
send_data("System Ready");
send_sms();
delay(1000);
digitalWrite(led, LOW);
lcd.clear();
}
void loop() {
serialEvent();
units = rupees / 5.0;
lcd.setCursor(0,0);
lcd.print("Units:");
lcd.print(units);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Rupees:");
lcd.print(rupees);
lcd.print(" ");
read_pulse();
if (temp == 1) check();
}
void serialEvent() {
while (Serial.available()) {
if (Serial.find("#")) {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
while (Serial.available()) {
char inChar = Serial.read();
str[i++] = inChar;
if (inChar == '*') {
temp = 1;
return;
}
}
}
}
}
void init_sms() {
Serial.println("AT+CMGF=1");
delay(200);
Serial.println("AT+CMGS=\"INSERT MOBILE NUMBER HERE\"");
delay(200);
}
void send_data(String message) {
Serial.println(message);
delay(200);
}
void send_sms() {
Serial.write(26);
}
void read_pulse() {
if (!digitalRead(pulsein)) {
digitalWrite(led, HIGH);
units++;
rupees = units * 5;
while (!digitalRead(pulsein));
digitalWrite(led, LOW);
}
}
void check() {
if (!(strncmp(str, "units", 5))) {
Serial.println("AT+CMGF=1");
delay(200);
Serial.println("AT+CMGS=\"INSERT MOBILE NUMBER HERE\"");
delay(200);
lcd.setCursor(0,1);
send_data("Energy Meter Unit:");
Serial.println(units);
send_data("\nRupees:");
Serial.println(rupees);
delay(200);
Serial.write(26);
flag1 = 1;
flag2 = 1;
temp = 0;
}
}
void message_sent() {
lcd.clear();
lcd.print("Message Sent.");
delay(1000);
}
void gsm_init() {
lcd.clear();
lcd.print("Finding Module..");
boolean at_flag = 1;
while (at_flag) {
Serial.println("AT");
while (Serial.available() > 0) {
if (Serial.find("OK")) at_flag = 0;
}
delay(1000);
}
lcd.clear();
lcd.print("Module Connected..");
delay(1000);
lcd.clear();
lcd.print("Disabling ECHO");
boolean echo_flag = 1;
while (echo_flag) {
Serial.println("ATE0");
while (Serial.available() > 0) {
if (Serial.find("OK")) echo_flag = 0;
}
delay(1000);
}
lcd.clear();
lcd.print("Echo OFF");
delay(1000);
lcd.clear();
lcd.print("Finding Network..");
boolean net_flag = 1;
while (net_flag) {
Serial.println("AT+CPIN?");
while (Serial.available() > 0) {
if (Serial.find("+CPIN: READY")) net_flag = 0;
}
delay(1000);
}
lcd.clear();
lcd.print("Network Found..");
delay(1000);
lcd.clear();
}
Arduino JARVISリレー制御コード Arduino
AndroidアプリとArduino間のシリアルBluetooth文字転送を実装
#define CH3 7
#define CH4 4
#define CH5 5
#define CH6 6
void setup() {
Serial.begin(9600);
pinMode(CH3, OUTPUT);
pinMode(CH4, OUTPUT);
pinMode(CH5, OUTPUT);
pinMode(CH6, OUTPUT);
digitalWrite(CH3, HIGH);
digitalWrite(CH4, HIGH);
digitalWrite(CH5, HIGH);
digitalWrite(CH6, HIGH);
delay(2000);
}
void loop() {
delay(100);
if (Serial.available()) {
char c = Serial.read();
Serial.print(c);
if (c == 'b') { /* coffee off */ }
else if (c == 'c') { digitalWrite(CH4, LOW); delay(100); } // light on
else if (c == 'd') { digitalWrite(CH6, LOW); delay(100); } // fan on
else if (c == 'k') { digitalWrite(CH5, LOW); delay(100); } // coffee on
else if (c == 'g') { digitalWrite(CH5, HIGH); delay(100); } // coffee off
else if (c == 'e') { digitalWrite(CH4, HIGH); delay(100); } // light off
else if (c == 'f') { digitalWrite(CH6, HIGH); delay(100); } // fan off
else if (c == 'z') { // goodbye
digitalWrite(CH6, HIGH);
digitalWrite(CH4, HIGH);
digitalWrite(CH3, HIGH);
digitalWrite(CH5, HIGH);
delay(500);
digitalWrite(CH5, LOW);
delay(500);
digitalWrite(CH5, HIGH);
delay(500);
digitalWrite(CH5, LOW);
delay(500);
digitalWrite(CH5, HIGH);
delay(10000);
}
}
}
カスタムパーツとエンクロージャ
手順:
1. アプリをダウンロード・インストール
2. スマホがインターネット接続済みであることを確認
3. アプリ起動し、Vuforia設定済み家電にカメラを向ける (デフォルトVuforiaマーカー使用)
4. 家電が起動
5. 消す場合は、画面に表示されるバーチャルボタンをタップ
jarvisaugmented_I2zWAu2jGG.apk
回路図
注意: スマホのインターネット接続が常時必要です
手順:
1. Androidスマホにアプリインストール
2. ハードウェアセットアップ完了後、アプリ起動
3. 仮想アシスタント(音声)使用時: キーワード「Listen Up JARVIS」で起動
3.1 明確にコマンドを話す
3.2 エージェントが応答
4. ARアプリ起動: 「拡張」ボタンタップでブランク画面表示
4.1 別のスマホでJarvis Augmented App起動 (JARVISアプリとは別端末必要)
4.2 JarvisAugmentedの手順に従ってAR実装
注: 1. アプリがフリーズしたら再起動
2. 「マイクを開けません」エラー時は再起動
3. HC-05 Bluetoothモジュール使用推奨 (プロジェクト範囲拡大のため)
app-release_eo3LK2AsLV.apk
製造プロセス
- 家庭用の低コストワイヤレスセンサーネットワークを構築
- 自宅で作るDIY宿題自動筆記マシン:AxiDraw風ペンプロッターの自作ガイド
- Web制御DMX照明システム:Arduino Megaマスターコントローラー
- Bluetooth操作のArduinoスパイボットを自作する
- Arduino、Google Cardboard、Bluetoothで作るDIY VRスケートボード
- 自律型ホームアシスタントロボット「O'nine」の構築 – ROS、Alexa、ロボットアーム完全ガイド
- Alexa対応Arduinoホームコントローラー:音声でスマートホーム自動化
- ワイヤレスArduinoプログラミングシールド – HC-05 BluetoothでUSBケーブル不要に
- Arduino Nano用 高性能2.8インチTFTシールド - 320×240 SPIディスプレイ
- Arduino UNO/MEGA対応 ニキシー管クロックシールド NCS314 – IN-14/IN-12互換
- Arduino Mega と IoT センサによる高機能ホームモニタリングシステム







