RubyエンジニアがArduinoで電子工作やってみた~超音波距離センサ編~


はじめに

皆様、こんにちは!
Toretaのサーバサイドエンジニア兼佐久間まゆちゃんのプロデューサーの@hiroki_tanakaです!
最近、ひょろんなことから電子工作を始めたので、作成したものを整理・紹介したく、記事を書きました。

「今更、IoTかよ…」や「ショボすぎ…」とまさかりを投げないで頂けると嬉しいです。___(; _ _)ノ`
逆に、もっとこうした方が良いよ!というコメントは大歓迎です。

自己紹介

  • 株式会社トレタのサーバサイドエンジニア。
  • 普段はRuby on Railsでプログラミングしている。
  • 電子工作は初めて。(はんだ付けの経験もなし。)

機器選定

電子工作の取っ掛かりは大きくArduinoRaspberry Piの2つありますが、2つとも小さなコンピュータという意味では同じです。

Arduinoの特徴

  • 元々のコンセプトは安い小型マイコン。
  • OSを持たない。
  • Arduino IDEという専用の統合開発環境があり、利用言語はProcessing固定。
  • Arduino専用のセンサが多数存在し、利用言語もProcessingのみなのでサンプルコードも豊富。
  • デバイスがオープンソースであるため、ハードウェア設計がCreative Commonsで公開されている。そのため、互換機が豊富にある。
  • OSを持たないマイコンのため、処理できるタスクは一度に一つ。

⇒複雑な処理を行うのに向いていないが、サンプルコードが豊富で対応センサが多く初心者向け

Raspberry Piの特徴

  • 元々のコンセプトは教育用コンピュータ。
  • OSはLinuxベースのRasbianなど。
  • 利用言語に制限なし。(C・PythonやmRubyなどが主。)
  • 対応するセンサは多数存在するが、利用言語に制限がないため、サンプルコードがあるかは言語によってまちまち。
  • 非OSSであり、互換機は多くない。(安価なOrange Pi Oneや産業用のREVOLUTION PIなど)
  • LinuxOSがあるため、複数のタスクを同時にこなせる。そのため、複雑な処理に向いている。

⇒複雑な処理を行うのに向いている、中級者以上向け。

今回は初めての電子工作なので、初心者向けのArduinoを選択しました!

Processingとは

Arduino向けのプログラムを作成する言語はProcessingという言語に限定されます。

言語の由来

  • 言語の設計思想はプログラミングによる視覚的な表現(イメージの生成やアニメーション・インタラクティブな画面表現)の技法を優しくするために生まれた。
  • 2001年に誕生したため、2020年現在では19歳。
  • Javaに似た言語なので、コンパイルや静的型付けを持つ。

言語の特徴

  • OSS( https://github.com/processing/processing )
  • 言語の設計思想から非プログラマ(アーティストやデザイナ)での扱いやすく出来ている。
  • 視覚的な表現に強いので、近年だと統計解析のモデリングに使われることもある。
  • 主な使い所は、プログラミング教育の一歩目教材やアニメーション・デザイン系の会社で使用。
  • JavaScriptに移植されたProcessing.jsを用いれば、デスクトップ・タブレット・モバイルと端末の種類を問わずにブラウザで動作させる事ができる。

Arduinoを購入

早速、AmazonでArduino UNO(の互換機)を購入しました!
互換機と言っても純正品のArduinoと出来ることは同じです

作ったもの

実物

超音波距離センサとアクティブブザー・黄色LEDを組み合わせて、超音波距離センサから10cm以内にモノがないとブザーがなり、黄色信号が灯るという装置を作りました。
使い道としては、ドアや冷蔵庫の扉などの開けっ放し防止に使えるかなと思いました。

ソースコード

const int TrigPin = 2;
const int EchoPin = 3;
float cm;
int buzzer = 5;
int led = 6;

void setup(){
  Serial.begin(9600);
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(led, OUTPUT);
}

void loop(){
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);

  cm = pulseIn(EchoPin, HIGH) / 58.0;
  cm = (int(cm * 100.0)) / 100.0;

  Serial.print("Distance\t=\t");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  delay(1000);

  if(cm > 10){
    digitalWrite(buzzer,HIGH);
    digitalWrite(led,HIGH);
  } else{
    digitalWrite(buzzer,LOW);
    digitalWrite(led,LOW);
  }

}

超音波距離センサの弱点

超音波距離センサは超音波の反射を受けて距離判定を行うため、衣類や人体といった反射しにくいもの距離はあまり正確には測定出来ません。。。
但し、表面がつるつるしているモノ(箱や扉など)は非常に正確な距離を算出することができます。

終わりに

より様々なセンサを使用して、実生活で使用できるハードウェアを作成したいです!
次回は水位センサの使用記事を書こうと思います。