Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Article information
RevisionsShow article in Markdown
Report article
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

This post is Private. Only a writer or those who know its URL can access this post.

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

1. はじめに

どうもこんにちは.いつの間にかdotstudioでモノづくりをしている宇宙エンジニアのたくろーどんです.初めて記事を記事を書くので,緊張しています.

さて最近はモノづくりの敷居が下がり,そして,インターネット上には様々な情報がありますなので,子供から大人まで幅広くモノづくりを楽しめるようになってきました.とは言っても,まったくの初心者がモノづくりのハードウェアやソフトウェアをどこから学べばよいのか…よくわからないことも多いかと思います.
私もその1人で,工業高等専門学校を出たのにもかかわらず長い間試行錯誤していました.
その後,大学編入後,学内コンテストでIotデバイスを製作してみて「モノづくりって大変なことが多いけど,意外とできる!楽しい!」と思った次第です.

なので,今回は「モノづくりってよくわからないけど,何かつくってみたい!」という方へのヒントに少しでもなれば幸いです.

2. Iotデバイスに挑戦! 遠隔消臭装置をつくろう!

さて,今回はIotデバイスに挑戦してみようと思います.私は,一人暮らしをしていて6畳1Kの部屋に暮らしています.しかもユニットバスです.
別に不便はしていないのですが,不満があります.
それは,ユニットバスだとトイレの後やお風呂のあと臭いがこもってしまうのです(夏場は特に).

なので,トイレやお風呂の後の消臭は欠かせません.

ただ困ったことに一人暮らしをしていると,いつ友人が来るのかわかりません.
学校帰りに突如,友人
「今日,飲もうよ!家,行っていい!?」
と言われたり,ちょっと気がある女の子
「今日,家によってきなよ」
なんて経験があるかと思います(工学系の私には後者は神話だと思ってます).

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

そんな事態を防ぐために,出かけ先から遠隔で空間を消臭出来たら便利ではないでしょうか?
しかも消臭の匂いを何パターンか用意して,訪ねてくる人や自分の気分に応じて消臭出来れば,「気の利くナイスガイ」なんて風に思われるでしょう!

そんな遠隔消臭装置をつくっていきましょう!

3. 部品や必要なモノ

電子部品として必要なのは主に以下の3つです.

Nefry BT

今回,dotstudioから出ているNefry BTという便利なマイコンを使います.
主な特徴は以下の通りです.
▶Wi-Fi・BLE通信モジュールを標準装備
▶Groveセンサが利用でき,複雑な回路の用意やはんだ付けをしなく良い
つまり,「ちょっとモノづくりやってみたい!」という人にうってつけのマイコンです!

サーボモータ

サーボモータは普通のモータとは違い回転角度・速度を調整することができます.
なので,スプレーを噴射させるのに使いやすいので,サーボモータを使います.

ただ,スプレーを押し込むためにはそれなりの力が必要なので,適切なトルク(どれくらいの力で動かせるか)をもつサーボモータを選ぶ必要があります.
今回はこれを参考にしました(小学生が製作した「自動虫シュッシュ」).
これによると,この製品に使われたスプレーの押す力は3kg必要であると書かれています.

少し実験してみましょう.

やり方は簡単です.
まず,キッチンにあるような調味料や材料をはかるキッチンスケール(はかり)とスプレーを用意しましょう.スプレーをキッチンスケールの上に置き,キッチンスケールの目盛を0に校正します.そのあとスプレーを押してみます.そして,スプレーが噴射されたときの目盛の最大値を見ます.そうすると約2kgと表示されました.
https://gyazo.com/e41e8b0d7246fae772e7abf31656b50c

なので,それ以上の押す力が出るように,今回はトルクが3[kgf・cm]以上のサーボモータを使います.
SG-5010(トルク:5.5kgf・cm(4.8V),6.5kgf・cm(6V))

4. Nefry BT×サーボモーター

サーボモータって何それ?

まず,サーボモータは電源・GND(グラウンド)・制御ピンの3つのピンで制御することができます.また,角度を細かく正確に制御することが可能です.なのでサーボモータは,例えばラジコンの翼の制御なんかに使われています.

そこで,サーボモータの制御にはPWM(Pulse Width Modulation)制御というものを使います.このPWM制御について簡単にお話ししたいと思います(「とりあえずプログラムが使えれば良い!」という方は飛ばしてもらってもかまいません).
まず,PWM制御とは「電圧のonとoffを一定間隔で繰り返し(パルス),そのパルスの幅を変化せることで動き方を変化させる」というものです.

詳しい説明ですが,ここで書くより先人の知恵がネットの海にはたくさんあります.なので,そちらを参考にしていただくとより正確です.

回路図

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

Nefry BTにはピンが何を示しているのか丁寧に書かれています.
例えば,赤(電源)→5V,黒(GND)→GND,黄色(制御ピン)→アナログ出力ピン(例えばA2)といった具合につなぎます.簡単ですよね?

ただし,注意点です!
サーボモータには動作電圧があります.トルクの大きなものになれば,それだけ必要な電圧も大きくなるので,Nefry BTの電源・GNDにつなぐだけではうまく動作しないこともあります.しかし,その時は慌てずに別の電源を用意しましょう.そして,先ほどと同じように電源・GNDピンを繋ぎ,制御ピンだけNefry BTにつなげば同じように使うことができます.

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

配線.png

プログラム

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制御をするために必要なおまじないです.おまじないなら唱えられずにはいられませんよね,とりあえず唱えておきましょう.

ちなみに,Nefry BTはESP-WROOM-32が搭載されています.なので2行目のライブラリ「esp32-hal-ledc.h」ですが,これはESP-WROOM-32でPWM制御を行うのに必要なライブラリとなっています.
また3行目にはPWM制御をする際に必要な分解能をあらかじめ定義しています.このプログラムでは分解能を16ビットとしています.

#include<Nefry.h>
#include"esp32-hal-ledc.h"
#define PWM_BITWIDTH 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));
}

5. 遠隔消臭装置をスマホで操作

次に遠隔消臭装置を動かすため,スマートフォンからサーボモータを動かしてみます.
2本の消臭スプレーで消臭したいので,サーボモータを2つに増やしてプログラムを考えていきます.

スマートフォン側

今回は,Blynkというアプリをつかってお手軽に操作してみました.まず,スマートフォン側からサーボモータを動かす設定をBlynkでしていきます.
①Blynkに登録し,「New Project」をクリック
②「ESP8266」と設定(今回はこれでうまくいきました).
③登録したメールにBlynkからメールが届きます.このメールに書かれているリンクからArduino IDEに「BlynkSimpleEsp32.h」というライブラリーを入れておきましょう.
また,メールに書かれている「Auth Token」はNefry BT側のプログラムで使います.

手順1.png
④赤丸部分をおします
⑤パーツをメイン画面に追加していきます.今回は「Button」を使います.
⑥メイン画面に配置して,そのButtonをクリック
手順2.png
⑦⑧Button Setting内で赤丸部分をクリックします.そして,Select pinからVirtualピンからそれぞれのボタンに「V0」,「V1」と設定します.
⑨設定が終わりNefry BT側のプログラムが完成したら,赤丸部分をおしてBlynkを実行します.そして,V0,V1を押すとNefry BT側で設定したサーボモータが動き始めます.

手順3.png

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」へ,そして,使用しているWiFiの「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でプログラムを動かし,Blynkから操作するとこのように動作します!
gif.gif

6. まとめ

今回は主に,サーボモータを制御してスプレーを押す,という動作ができるようなプログラムを考えてみました.そして,Nefry BTとBlynkをつかってかなりお手軽につくることができました.

次回は,この遠隔消臭装置を遠隔消臭装置らしくするために外装を考えていきたいと思います.そして,今回作成したプログラムをつかって遠隔消臭装置を完成させていきます!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Article information
RevisionsShow article in Markdown
Report article
Help us understand the problem. What are the problem?