Skip to content

ラボ内の在庫管理を自動化してみる (WIP)

ラボ内では多くの電子パーツあり、在庫管理に非常に多くの時間を要するため、自動化することができないかどうか考えました。 在庫はスプレッドシートで管理しているため、各棚と対象のスプレッドシートの各パーツの在庫数が同期されるような仕組みを作り自動化することができたら作業が大幅に効率化されると考えました。

今回はラボ内の電子パーツが限られているため、第一段階目として、上記のように収納箱の前面に+ボタン、-ボタンを取り付け、使った分+,-のボタンを押すことでスプレッドシートに数を反映させるプロトタイプを作成します。

スプレッドシートをRaspberryPi&タクトスイッチを用いてpythonで操作する

Google Cloud Platformの設定

以下にGoogle Cloud Platformを用いてPythonでスプレッドシートを操作する詳細な設定方法を記載しております。

Spreadsheet設定

今回はプロトタイプのため、部品名とその個数を入力するシートを作成します。また対応する2つの収納箱を作成します。

電子回路

電子回路は以下の図のような構成にしております。RapsberrypiのGPIO2, 3, 4, 5を各タクトスイッチと接続しております。また、タクトスイッチはRaspberryPi内部のプルアップ抵抗とも接続しております。

配線接続

GPIO タクトスイッチ
2 タクトスイッチ1 (+ボタン)
3 タクトスイッチ2 (-ボタン)
4 タクトスイッチ3 (+ボタン)
5 タクトスイッチ4 (-ボタン)

実際の写真は以下のものになります。

RaspberryPiの公式ドキュメンテーションよりGPIOのピン番号が確認できます。 出典: Raspberry Pi Documentation

Python

Python環境構築

  • Raspberry Pi 3B
    • ディストリビューション: Raspbian GNU/Linux 11 (bullseye)
    • python version 3.9.2

対象のルートディレクトリに仮想環境を作成する。

$ python3 -m venv .env

venvをactivate

$ source .env/bin/activate

今回はpythonでスプレッドシートを操作するため、gspreadと、Oauth認証関連のoauth2clientを使用します。

$ pip install gspread oauth2client

Pythonプログラム

以下のPythonプログラムの解説に関してはこちらの記事に記載しております。

import gspread
import time
import RPi.GPIO as GPIO
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
c = ServiceAccountCredentials.from_json_keyfile_name('対象のjsonファイル', scope)

gs = gspread.authorize(c)

SPREADSHEET_KEY = 'スプレッドシートキー'
worksheet = gs.open_by_key(SPREADSHEET_KEY).worksheet("stock")

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP)

while True:
    val_1 = ""
    val_2 = ""
    if GPIO.input(2) == GPIO.LOW:
        val_1 = worksheet.acell("B2").value
        val1 = int(val_1) + 1
        worksheet.update('B2', val1)
        time.sleep(0.1)
    elif GPIO.input(3) == GPIO.LOW:
        val_1 = worksheet.acell("B2").value
        val1 = int(val_1) - 1
        worksheet.update('B2', val1)
        time.sleep(0.1)
    elif GPIO.input(4) == GPIO.LOW:
        val_2 = worksheet.acell("B3").value
        val2 = int(val_2) + 1
        worksheet.update('B3', val2)
        time.sleep(0.1)
    elif GPIO.input(5) == GPIO.LOW:
        val_2 = worksheet.acell("B3").value
        val2 = int(val_2) - 1
        worksheet.update('B3', val2)
        time.sleep(0.1)

ボディ設計

Fusion360で以下のように収納ケースを作成しました。

作成したデータはDXF形式で出力して、加工はMDF2.5mmを使用しレーザーカッターを用いて行いて行いました。

電子回路は以下のように半田付けして格納しております。

評価

以下の動画のように+,-ボタンを押した回数分、カウントアップ、カウントダウンし、値がリアルタイムでスプレッドシートに反映することができました。

チェックリスト

  • 本プロトタイプは電子パーツを収納するための十分な大きさである。
  • 本プロトタイプは実際の運用を考えた際のデータベースとしてスプレッドシートを使用できている。
  • 本プロトタイプの各収納箱に対象者が希望した増減のための+ボタン、ーボタンが実装されている。
  • +ボタン、ーボタンを押すと対応したスプレッドシートの対象のセルの値(部品の個数)が一度押すたびに±1ずつ更新できる。
  • 本プロトタイプはスケーラブルである。(2つの収納箱、合計4つのボタンを実装しているが収納箱の数を増やすことができ、現仕組みでプロジェクトを発展できる拡張できる。)

ここまでで第一段階のプロトタイプの作成を終了します。

データ

部品

部品 販売先 金額 必要個数 合計金額 リンク
RaspberryPi3B digikey 4804円 1個 4804円 Link
タクトスイッチ 共立エレショップ 55円 4個 220円 Link
ジャンパワイヤ(オス - メス) PRT-12794 digikey 288円 1セット 288円 Link
ブレッドボード digikey 542円 1個 542円 Link

参考資料