kanaza_kiのアイコン画像
kanaza_ki 2021年02月28日作成
製作品 製作品 閲覧数 878
kanaza_ki 2021年02月28日作成 製作品 製作品 閲覧数 878

コロナ禍を乗り越えろ!サイコーな消毒奨励機を作る

コロナ禍を乗り越えろ!サイコーな消毒奨励機を作る

はじめに

2019年末から人類を襲った未曾有の災禍、新型コロナウイルス感染症「COVID-19」。緊急事態宣言が解除され、県内の警戒レベルも下がり始めたこの時期。自分を含めた世間において、感染症対策の基本のキである「手指の消毒」が疎かなっているのではないか?

この意識の低下を防ごうと、我々は人間の承認欲求を逆手にとることにした。

褒める消毒液スタンド “3150 sanitizer” 誕生の瞬間である。

UXを決める

褒める消毒液スタンドとは言ったものの、具体的なUXを決めねば話にならない。試行錯誤の結果、以下の3つに焦点を絞ることにした。

  • 思わず立ち止まらせる(ユーザーの目に嫌でも入る)
  • 消毒液をプッシュしたら褒めてくれる
  • 認知度が限りなく低い本校第二校歌が聞ける

とにかく呼びかけること、目を引くことが消毒への第一歩である。

システム

したいこと

使った電子部品・モジュール

  • Raspberry Pi 3B(3.5mmジャックが欲しいの)
  • 感圧センサ(四角形):ALPHA-MF02-N-221-A01
  • 10bit 2ch ADコンバータ:MCP3002-I/P
  • Φ3.5mm入力のスピーカー

いざ配線

感圧センサとADコンバータの接続はこちらを参考にした。
ブレッドボード実装図
実装写真

コーディング

センサ値を読み取る

SPI通信を使うため、RaspberryPiのSPI driverを有効にする。RaspbeeryPiの/boot/config.txtを編集(#dtparam=spi=onのコメントを外す)するか、raspi-configで設定する。

作業後の再起動も忘れずに!

ここでSPIのPythonモジュールもインストールしておく。

$ git clone git://github.com/doceme/py-spidev $ cd py-spidev $ sudo python setup.py install

以上を満たしていれば、センサ値は次のコードで読み込める(参考)。

センサ値を取ろう

def main(): # SPI channel (0 or 1) SPI_CH = 0 # SPI speed (hz) SPI_SPEED = 1000000 # GPIO number LED_PIN = 25 # setup wp.wiringPiSPISetup(SPI_CH, SPI_SPEED) wp.wiringPiSetupGpio() wp.pinMode(LED_PIN, wp.GPIO.OUTPUT) THRESHOLD = 200 while True: buffer = 0x6800 buffer = buffer.to_bytes(2, byteorder='big') wp.wiringPiSPIDataRW(SPI_CH, buffer) # 値を取得 value = (buffer[0] * 256 + buffer[1]) & 0x3ff # print(value) """ ここで音を鳴らす条件と処理を書く """

WiringPi2 には MCP3002用の関数があるため、SPI通信を意識せずともアナログデータをそのまま参照可能らしい。

音声を鳴らす

Raspberry PiのPythonでは、Pygameという音声再生モジュールが存在する。pipからインストール可能。

$ pip install pygame

基本的な文法はこちら。

音声再生サンプル

import pygame.mixer import time # mixerモジュールの初期化 pygame.mixer.init() # 音楽ファイルの読み込み pygame.mixer.music.load("ファイル名.mp3") # 音楽再生、および再生回数の設定(-1はループ再生) pygame.mixer.music.play(-1) time.sleep(60) # 再生の終了 pygame.mixer.music.stop()

まとめる

上記のコードたちと流したい音声素材たちを集めて統合する。Main.pypy-spidev/などの位置関係は次の通り。

3150_sanitizer/ ├ audio_file | ├ 第2校歌.mp3 │ ├ 褒めるボイス1.mp3 │ └ 褒めるボイス2.mp3 │ : │ : ├ py-spidev/ ├ Main.py └ play_sound.py

消毒液ボトルを載せた圧力センサの値を差分でチェックし、押したと判断できる閾値を超えた場合に音声を流す。今回は3種類の音声を用意し、第2校歌はレア枠とした。

[音声ガチャの比率]
第2校歌:ほめるボイス1:ほめるボイス2 = 1:5:5

Main.py

import wiringpi2 as wp import time from play_sound import play_sound def main(): SPI_CH = 0 SPI_SPEED = 1000000 LED_PIN = 25 wp.wiringPiSPISetup(SPI_CH, SPI_SPEED) wp.wiringPiSetupGpio() wp.pinMode(LED_PIN, wp.GPIO.OUTPUT) previous_value = 0 THRESHOLD = 200 while True: buffer = 0x6800 buffer = buffer.to_bytes(2, byteorder='big') wp.wiringPiSPIDataRW(SPI_CH, buffer) value = (buffer[0] * 256 + buffer[1]) & 0x3ff # print(value, previous_value) if value - previous_value > THRESHOLD: play_sound() time.sleep(5) previous_value = value time.sleep(0.5) if __name__ == '__main__': main()

play_sound.py

import os import pygame.mixer import random def play_sound(): pygame.mixer.init() file_name = select_file() pygame.mixer.music.load(file_name) pygame.mixer.music.play(1) return True def select_file(): audio_dir = 'audio_file/' base_dir = os.path.join(os.path.dirname(__file__), audio_dir) file_name_list = os.listdir(audio_dir) file_key = random.randint(0, 10) if file_key == 0: # リスト内で最初に来るのは第2校歌なので。 # (ガバ設計注意) file_key = 0 elif file_key < 6: file_key = 1 else: file_key = 2 file_name = file_name_list[file_key] file_path = os.path.join(base_dir, file_name) print(file_path) return file_path # test用の処理 if __name__ == '__main__': a = play_sound() print(a)

合体!

実装イメージ

設置

学生課教務係長の協力を取り付け、正式に設置が可能となった。
消毒できる男は "3150"(最高)であるというコピー。第2校歌の歌詞カードも追加した(著作権の都合上、モザイクをかけています)。まさに完璧である。
キャプションを入力できます
この3150 Sanitizerが本校の感染症対策の一助となれば幸いである。

皆さんも、レッツ消毒啓蒙活動。

ログインしてコメントを投稿する