在不在情報を視覚的に提供する電子機器の実装~ボスおりゅ?~

ブロックチェーン事業部の小寺です。よろしくお願いします。

普段はブロックチェーン事業部と言いながらほぼwebプログラマやってますが、趣味で電子工作もしてます。

ある日の社内

A「B取締役の席がモニタやらが壁になっていて居るのかどうかわからない」

B取締役「カメラとか取り付けて居るのわかるようにする?」

私(鏡でよくね?)

我(必要な機能を分解するのです!必要なのはそこに居るかどうかの情報だけ!)

自分(センサ取り付ければよかです)

拙(対物センサってどんな仕組みですか?)

やつがれ(座ってるんだし体重計でいいんでない?)

あっし(重さまでわかる必要ないからスイッチで十分っす)

猫(圧力センサでやればArduinoで制御できる!ヨシ!)

等と、漏れ聞こえた内容から脳内会議した結果、出来上がったのが「スマート座布団」です。

参考URL

圧力センサの使い方はこちらを参考に jkoba.net 今回使用したOLEDのデータシート等はこちらに www.waveshare.com OLEDの制御に使用したライブラリはこちらに github.com

完成品

f:id:teco_kodera:20200413122741j:plain
スマート座布団実物

この圧力センサを座布団の下に置いておきます。 以下が回路図になります。

f:id:teco_kodera:20200414115411p:plain
スマート座布団回路図

Arduinoに書き込むソースは以下の通り。 OLEDの制御にU8glibを使用してます。

#include <U8glib.h>

U8GLIB_SSD1351_128X128_332 u8g(13, 11, 8, 9, 7); // Arduino UNO: SW SPI Com: SCK = 13, MOSI = 11, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)

// OLEDのサイズに合わせる
const int width = 128;
const int height = 128;

// 圧力センサの入力A1ピン
const int vol_pin = 1;

// 圧力センサの値を受け取る変数
int vol_value = 0;

// 描画処理の共通前処理
void u8g_prepare(void) {
  u8g.setFont(u8g_font_6x10);
  u8g.setFontRefHeightExtendedText();
  u8g.setDefaultForegroundColor();
  u8g.setFontPosTop();
}

// ×の描画
void u8g_cross(void) {
  // 背景を赤に
  u8g.setRGB(255, 0, 0);
  u8g.drawBox(0, 0, width, height);
  // ×を白で描画
  u8g.setRGB(255, 255, 255);
  const int startX = 10;
  const int endX = width - 10;
  const int startY = 10;
  const int endY = height - 10;
  for (int w = -5; w <= 5; w++) { 
    u8g.drawLine(startX + w, startY - w, endX + w, endY - w);
    u8g.drawLine(endX + w, startY + w, startX + w, endY + w);
  }
}

// 〇の描画
void u8g_circle(void) {
  // 背景を緑に
  u8g.setRGB(0, 255, 0);
  u8g.drawBox(0, 0, width, height);
  // 〇を白で描画
  u8g.setRGB(255, 255, 255);
  u8g.drawDisc(width / 2, height / 2, width / 2 - 10);
  u8g.setRGB(0, 255, 0);
  u8g.drawDisc(width / 2, height / 2, width / 2 - 30);
}

// 描画の振り分け処理
void draw(bool b) {
  u8g_prepare();
  if (b) {
    u8g_circle();
  } else {
    u8g_cross();
  }
}

void setup() {
//OLEDの制御に必要な初期化処理
#if defined(ARDUINO)
  pinMode(13, OUTPUT);           
  digitalWrite(13, HIGH);  
#endif
}

void loop() {
  // A1の電圧読み取り
  vol_value = analogRead(vol_pin);
  // OLEDの描画準備
  u8g.firstPage();
  // 電圧が閾値を超えているかどうかで〇×の描画
  do {
    bool b = (vol_value < 500);
    draw(b);
  } while( u8g.nextPage() );

  // 一秒間に一度処理
  delay(1000);
  
}

毎秒圧力センサの値を読み取り、 圧がかかっていたらOLEDディスプレイに〇を、

f:id:teco_kodera:20200413122850j:plain
スマート座布団〇
そうでなければ×を表示します。
f:id:teco_kodera:20200413122928j:plain
スマート座布団×

そして問題発生

B取締役「なんかしばらく使ってたら〇にならなくなったんだけど」

ウチ「マジですかいな」

調べてみると圧力センサから伸びているコードに断線がありました。 よくよく考えると移動するキャスター付きの椅子からケーブルが伸びているのはナンセンスでした。 そりゃあ切れるわ。

改善すべき点

表示部(固定する部分)と検知部(移動する部分)の分離

改善策

座っているかどうかの信号を、座布団(検知部)からBluetoothで飛ばして、 タブレット(表示部)でそれを受けて〇×を表示する。

次回

Bluetooth LEとの死闘

ねこはいます。

PR

tecotec.co.jp

よろしくお願いします。