遠隔消臭装置をつくって「気の利くナイスガイ」になろう!〜基本実装編〜

どうもこんにちは。dotstudioでモノづくりをしているたくろーどんです。

最近はモノづくりの敷居が下がり、インターネット上の様々な情報を活用して、子供から大人まで幅広くモノづくりを楽しめるようになってきました。とはいっても、まったくの初心者がモノづくりのハードウェアやソフトウェアをどこから学べばよいのか……。よくわからないことも多いかと思います。

僕もその一人で、工業高等専門学校を出たのにもかかわらず、長い間試行錯誤していました。その後、大学編入後、学内コンテストで子供を見守るIoTデバイスを製作してみて「モノづくりって大変なことが多いけど、意外とできる!楽しい!」と思った次第です。

なので今回は「モノづくりってよくわからないけど、何かつくってみたい!」方のヒントになるような、実用的で楽しく作れるIoTデバイスのレシピを紹介します。

IoTデバイスづくりに挑戦! 遠隔消臭装置をつくろう!

さて、僕は一人暮らしをしていて、6畳1Kの部屋に住んでいます。しかもユニットバスです。

別に不便はしていないのですが、不満があります。それは、ユニットバスだとトイレの後やお風呂のあと臭いがこもってしまうことです(夏場は特に)。

しかし困ったことに一人暮らしをしていると、いつ友人が来るのかわかりません。

学校帰りに突如、友人に

今日、飲もうよ!家、行っていい!?

と言われたり、

ちょっと気がある女の子を

今日、家に寄ってきなよ

と誘ったり、なんて経験があるかと思います(工学系の僕にとって後者は神話です)。

そんな時、自分の部屋やトイレがくさいとどうでしょう。「身の回りの整理ができない不潔なやつ」というレッテルがはられしまうかもしれません。そうすると、その後の交友関係の破綻なんてことも考えられます。

そんな事態を防ぐために、出かけ先から遠隔で空間を消臭できたら便利ではないでしょうか?

しかも消臭の匂いを何パターンか用意して、訪ねてくる人や自分の気分に応じて消臭できれば、「気の利くナイスガイ」と思われるでしょう!

そんな便利な遠隔消臭装置をつくっていきましょう。前後編に分けて作り方を紹介します。

8,568通り、あなたはどのタイプ?

部品や必要なモノ

必要なのは主に以下の3つです。

Nefry BT

今回はNefry BTというマイコンボードを使います。主な特徴は以下の通りです。

▶ Arduino互換でArduinoと同じように開発できる
▶ Wi-Fi・BLE通信モジュールを標準装備
▶ Groveセンサが利用でき、複雑な回路の用意やはんだ付けをしなくいい

つまり、「ちょっとIoTのデバイスづくりやってみたい!」という人にうってつけのマイコンボードです!

ArduinoをWi-Fiモジュールで拡張すれば、今回の手順とほぼ同内容で作成することもできます。

サーボモータ

サーボモータは、普通のモータとは違い回転角度・速度を細かく調整することができ、ラジコンの翼の制御やロボットのアームの制御などに使われます。今回はスプレーを噴射させる部分にサーボモータを使います。

ただしスプレーを押し込むためにはそれなりの力が必要なので、適切なトルク(どれくらいの力で動かせるか)をもつサーボモータを選ぶ必要があります。

少し実験してみましょう。やり方は簡単です。

まず、キッチンにあるような調味料や材料をはかるキッチンスケール(はかり)とスプレーを用意しましょう。スプレーをキッチンスケールの上に置き、キッチンスケールの目盛を0に校正します。そのあとスプレーを押してみます。そしてスプレーが噴射されたときの目盛の最大値を見ます。

https://gyazo.com/e41e8b0d7246fae772e7abf31656b50c

そうすると約2kgと表示されました。なのでそれ以上の押す力が出るように、今回はトルクが3[kgf・cm]以上のサーボモータを使います。

SG-5010(トルク:5.5kgf・cm(4.8V)、6.5kgf・cm(6V))

今回は香りの違う2つのスプレーを制御したいので、サーボモータは2つ用意します。

8,568通り、あなたはどのタイプ?

消臭装置をつくってみる

サーボモータを制御する方法

サーボモータの制御にはPWM(Pulse Width Modulation)制御という方法を使います。PWM制御とは「電圧のonとoffを一定間隔で繰り返し(パルス)、そのパルスの幅を変化せることで動き方を変化させる」というものです。

詳しい説明は長くなるので、こちらの「PWM制御」の説明を参考にしていただくとより正確です。

回路図

サーボモータには電源・GND・制御ピンの3つのピンがあります。

3つのピンは下記の図にあるようにそれぞれの色で決まっています(例えば、赤:電源、黒:GND、黄:制御ピン)。これはサーボモータによって異なるので、サーボモータを使う前にデータシートをよく確認しましょう。

Nefry BTにはピンが何を示しているのか丁寧に書かれているので、その通りに繋ぎます。

  • サーボモータ:赤(電源) → Nefry BT:5V
  • サーボモータ:黒(GND) → Nefry BT:GND
  • サーボモータ:黄色(制御ピン) → アナログ出力ピン(例えばA2)

といった具合につなぎます。簡単ですよね?

ただし、注意点です!

サーボモータには動作電圧があります。トルクの大きなものになれば、それだけ必要な電圧も大きくなるので、Nefry BTの電源・GNDにつなぐだけではうまく動作しないこともあります。

しかし、その時は慌てずに別の電源を用意しましょう。先ほどと同じように電源・GNDピンを繋ぎ、制御ピンだけNefry BTにつなげば同じように使うことができます。

サーボモータに限らず、電子部品の仕様は必ずチェックしましょう!

プログラム

Nefry BTでサーボモータを動かすプログラムを考えていきます。

まずNefry BTについているスイッチをonにすることでサーボモータが0度から90度に回転するプログラムをつくります。

#include<Nefry.h>
#include"esp32-hal-ledc.h"
#define PWM_BITWIDTH 16

void setup() {
  ledcSetup(1,50,PWM_BITWIDTH);;
  ledcAttachPin(A2,1);
  Nefry.enableSW();
}

void loop() {
  ledcWrite(1,deg2pw(0, PWM_BITWIDTH));

  if((Nefry.readSW())){
   for(int i=0; i<=90; i++){
      ledcWrite(1,deg2pw(i, PWM_BITWIDTH));
   }
  }
  delay(5000);
}

int deg2pw(int deg, int bit){
    double ms = ((double) deg - 90.0) * 0.95 / 90.0 + 1.45;
    return (int) (ms / 20.0 * pow(2, bit));
}

少し中身を見てみましょう。

まず下記のプログラムですが、これはNefry BTやPWM制御をするために必要なおまじないです。おまじないなら唱えられずにはいられませんよね、とりあえず唱えておきましょう。

#include<Nefry.h>
#include"esp32-hal-ledc.h"
#define PWM_BITWIDTH 16

1行目ではNefry BTの関数を使うためのライブラリを、2行目ではNefry BTに搭載されているESP-WROOM-32というモジュールでPWM制御を行うのに必要なライブラリを読み込んでいます。

3行目ではPWM制御をする際に必要な分解能(どれだけ細かく制御するかどうか)をあらかじめ定義しています。このプログラムでは分解能を16ビットとしています。

プログラム内では、ライブラリ「esp32-hal-ledc.h」の以下の関数を利用します。

ledcSetup(チャンネル,周波数,分解能)
ledcAttachPin(ピン番号,チャンネル)
ledcWrite(チャンネル,パルス幅)
deg2pw(角度,分解能)▶ 設定した角度になるように与えるべきパルス幅を算出する関数

void setup()の中にはサーボモータを使う下準備を記述します。

void setup() {
  ledcSetup(1,50,PWM_BITWIDTH);
  ledcAttachPin(A2,1);
  Nefry.enableSW(); // スイッチのonとoffでサーボモータを動作
}

そしてvoid loop()の中は下記のようにします。この部分が、スイッチが押されたときにサーボモータが0度から90度に回転するプログラムとなります。ここで、ledcWrite関数を使います。

void loop() {
  ledcWrite(1,deg2pw(0, PWM_BITWIDTH));

  if((Nefry.readSW())){
   for(int i=0; i<=90; i++){
      ledcWrite(1,deg2pw(i, PWM_BITWIDTH));
   }
  }
  delay(5000);
}

最後に、もう1つおまじないを唱えておきましょう。このdeg2pw関数で設定した角度からパルス幅を求めることができ、PWM制御できます。

int deg2pw(int deg, int bit){
    double ms = ((double) deg - 90.0) * 0.95 / 90.0 + 1.45;
    return (int) (ms / 20.0 * pow(2, bit));
}

消臭装置をスマホで操作する

基本の制御プログラムが書けたら、遠隔消臭装置を動かすためにスマートフォンからサーボモータを動かせるようにしてみます。2本のスプレーで消臭したいので、サーボモータを2つに増やしたプログラムも考えていきます。

今回は、Blynkというアプリを使ってみます。Blynkは、Wi-Fi接続したハードウェアデバイスをスマートフォンから簡単に制御することができるアプリです。

Blynkアプリを使った制御イメージ

スマートフォン側

まず、スマートフォン側からサーボモータを動かす設定をBlynkでしていきます。

①Blynkに登録し「New Project」をクリック
②「ESP8266」と設定(今回はこれでうまくいきました)
③登録したメールに届くメールを確認

③のメールに書かれているリンクをPCから開き、Arduino IDEに「BlynkSimpleEsp32.h」というライブラリを入れておきましょう。また、メールに書かれている「Auth Token」はNefry BT側のプログラムで使います。

④赤丸の「+」部分を押す
⑤パーツをメイン画面に追加(今回は「Button」)
⑥2つのButtonを配置

⑦ButtonをタップしてSettingを開き、赤丸部分をタップ
「Select pin」と表示されるので「Virtual」を選び「V0」と設定
⑧⑦と同様に「V1」と設定
⑨赤丸の「▷」部分をタップすると実行(この時点ではサーボはまだ動きません)

それぞれのButtonでスプレーを1つずつ制御します。

Nefry BT側

Nefry BT側のプログラムはこのようになります。下記で詳細を説明していきます。

#include<Nefry.h>
#include<WiFi.h>
#include<WiFiClient.h>
#include<BlynkSimpleEsp32.h>
#include"esp32-hal-ledc.h"
#define PWM_BITWIDTH 16

char auth[] = "Your PATH";
char ssid[] = "Your SSID";
char pass[] = "Your PASSWARD";

void setup() {
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);

  ledcSetup(1,50,PWM_BITWIDTH);
  ledcAttachPin(A3,0);
  ledcAttachPin(A2,1);
}

int deg2pw(int deg, int bit){
    double ms = ((double) deg - 90.0) * 0.95 / 90.0 + 1.45;
    return (int) (ms / 20.0 * pow(2, bit));
}

BLYNK_WRITE(V0){
   for(int i=0; i<=90; i++){
   ledcWrite(0,deg2pw(i, PWM_BITWIDTH));
   }
  delay(1000);
   ledcWrite(0,deg2pw(0, PWM_BITWIDTH));
}

BLYNK_WRITE(V1){
   for(int i=0; i<=90; i++){
   ledcWrite(1,deg2pw(i, PWM_BITWIDTH));
   }
  delay(1000);
   ledcWrite(1,deg2pw(0, PWM_BITWIDTH));
}

void loop() {
 Blynk.run();
}

まず、BlynkでNew Projectをつくったときに送られてきた「Auth Token」を「Your PATH」へ、そして、使用しているWi-Fiの「SSID」と「PASSWARD」をそれぞれ入力します。

char auth[] = "Your PATH";
char ssid[] = "Your SSID";
char pass[] = "Your PASSWARD";

void setup()を以下のように記述します。サーボモータを2つ使うので、ledcSetup関数内のチャンネル数を1とします(「0」と「1」の2つのチャンネルが使える)。そして、ledcAttachPin関数にそれぞれピン番号とチャンネルを割り当てます。

void setup() {
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);

  ledcSetup(1,50,PWM_BITWIDTH);
  ledcAttachPin(A3,0);
  ledcAttachPin(A2,1);
}

サーボモータを動かすためのプログラムは以下のように記述します。BLYNK_WRITE(Virtualピンの番号)として、その中にプログラムを書くことでBlynk上でButtonがonになったときに、サーボモータが動きます。

BLYNK_WRITE(V0){
   for(int i=0; i<=90; i++){
   ledcWrite(0,deg2pw(i, PWM_BITWIDTH));
   }
   delay(1000);//5秒待つ
   ledcWrite(0,deg2pw(0, PWM_BITWIDTH));
}

BLYNK_WRITE(V1){
   for(int i=0; i<=90; i++){
   ledcWrite(1,deg2pw(i, PWM_BITWIDTH));
   }
   delay(1000);
   ledcWrite(1,deg2pw(0, PWM_BITWIDTH));
}

そして逐次実行できるようvoid loop()にBlynk.run()を記述しておきます。

void loop() {
 Blynk.run();
}

※モジュールの仕様により、Nefry BTから発せられるWi-Fiが見えなくなる可能性があります。その場合、空のプログラムを書き込むと直ります。

実際の動作

Nefry BTでプログラムを動かし、Blynkから操作するとこのように動作します!

gif.gif

まとめ

今回は、遠隔でサーボモータを制御してスプレーを押す、という動作ができるプログラムを考えてみました。Nefry BTとBlynkを使うと、難しい配線やスマホ側のアプリ開発なしでかなりお手軽につくることができました。

次回は、この遠隔消臭装置を遠隔消臭装置らしくするために外装を考えていきたいと思います。そしていよいよ遠隔消臭装置を完成させていきます!

●著者プロフィール

たくろーどん
高専を卒業したのち、大学に編入し航空宇宙工学を学んでいる。研究テーマは人工衛星の推進機について。受け身に学ぶだけでなく何かアウトプットしてみたいと思い、dotstudioに参加し、ものづくりをしている。
Twitter: @takudooon / dotstudio, inc.

※本記事は「CodeIQ MAGAZINE」掲載の記事を転載しております。

PC_goodpoint_banner2

Pagetop