ラズパイその他工作

ラズパイとセンサメダルで作るIoT縄跳びデバイス

第4回(最終回):デバイスにディスプレイを付けてモチベーションアップ!

こんにちは、ヨシケンです!

運動不足解消のための縄跳びデバイスを作っているこの連載も、今回でいよいよ最終回です。縄跳びのカウントやその保存ができたら、今度はスクリーンを付けて、モチベーションが上がるような楽しい表示をできるようにして、継続的に運動に挑戦するようにしましょう。

raspberrypi-iot-jumprope-device-04-01

raspberrypi-iot-jumprope-device-04-02

 

今回の記事で必要な物一覧

縄跳びジャンプロープ

raspberrypi-iot-jumprope-device-01-03

 

ロームセンサメダル(SensorMedal-EVK-002

raspberrypi-iot-jumprope-device-01-04

 

ラズパイ・ゼロ(Raspberry Pi Zero W

raspberrypi-iot-jumprope-device-01-05

 

4文字LEDハット

raspberrypi-iot-jumprope-device-01-06

 

Raspberry Pi4

raspberrypi-iot-jumprope-device-04-03

 

7インチ・タッチ・ディスプレイ

raspberrypi-iot-jumprope-device-04-04

 

今回の記事の流れ

  1. ラズパイ用スクリーンの設置
  2. 画面に縄跳び情報を表示
  3. 縄跳び回数を楽しく表示してモチベーションアップ!
  4. まとめ

 

1. ラズパイ用スクリーンの設置

ラズパイ用のスクリーンとしては、7インチの大きな画面でタッチスクリーンになるこのようなものがあります。ラズパイとはHDMI(ラズパイ4だとMicroHDMI)でつなぐことによって、大きな画面で表示できます。

raspberrypi-iot-jumprope-device-04-05

 

この画面にラズパイでアプリを作って表示できるようにします。これにはデスクトップアプリが作れるTkinterを使います。まずTkinterのインストールをおこないます。

$ sudo apt-get install python3-tk

現在の時間を表示するようなプログラムdisplay.pyを作ってみます。

pi@raspizero:~/Programs $ sudo vi display.py

--------- 
#!/usr/bin/python
# -*- coding: utf-8 -*-
from tkinter import *
from datetime import datetime
from time import sleep

# メインウィンドウ作成
root = Tk()
# メインウィンドウサイズ
root.geometry("720x480")
# メインウィンドウタイトル
root.title("Clock")

# Canvas 作成
c = Canvas(root, bg="#FFFFFF", width=500, height=480)
c.pack(expand=True, fill='x', padx=5, side='left')

# 文字列作成
cd = c.create_text(350, 180, font=('', 40, 'bold'), fill='black')
ct = c.create_text(350, 280, font=('', 80), fill='black')

# メインウィンドウの最大化
root.attributes("-zoomed", "1")
# 常に最前面に表示
root.attributes("-topmost", False)

def cupdate():

    # 現在時刻を表示
    now = datetime.now()
    d = '{0:0>4d}年{1:0>2d}月{2:0>2d}日 ({3})'.format(now.year, now.month, now.day, now.strftime('%a'))
    t = '{0:0>2d}:{1:0>2d}:{2:0>2d}'.format(now.hour, now.minute, now.second)
    c.itemconfigure(cd, text=d)
    c.itemconfigure(ct, text=t)
    c.update()
    # 1秒間隔で繰り返す
    root.after(1000, cupdate)

# コールバック関数を登録
root.after(1000, cupdate)
# メインループ
root.mainloop()

このプログラムをsudo python3 display.pyのように実行すると、現在時刻を表示するデスクトップアプリができました。

raspberrypi-iot-jumprope-device-04-06

時刻を表示するデスクトップアプリ

 

2. 画面に縄跳び情報表示

ラズパイに画面が付いたところで、ここに前回Google Sheetsに記録した縄跳びの回数を表示させてみましょう。

デスクトップアプリ上に、Google Sheetsからデータを取ってこれるようにします。シートから跳んだ時間、回数、カロリを表示します。先ほどのdisplay.pyプログラムにGoogle sheetsから読み取るプログラムを追記します(黄色で記述部分を追加)。

pi@raspizero:~/Programs $ sudo cp display.py  jump_display.py

--- 以下、変更・追記部分を黄色表示 ---
#!/usr/bin/env python3
# coding: utf-8
from tkinter import *

---

import gspread
from apiclient import discovery
from oauth2client.service_account import ServiceAccountCredentials
import httplib2
import numpy as np
from datetime import datetime

key_name   = "xxx.json" # Use your own information
sheet_id      = “yyy” # sheet_id
sheet_name= “zzz”

class SpreadSheet(object):
  def __init__(self, sheet_id):
    self.sheetId = sheet_id
  def search(searchKey):
    scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
    credentials = ServiceAccountCredentials.from_json_keyfile_name(key_name, scope)
    gc = gspread.authorize(credentials)     # JSONキーファイルで認証
    wks = gc.open(sheet_name).sheet1        # sheetをオープン
    records = wks.get_all_values()          # 中身を取り出して配列に保存
    for i in range(1, len(records)):        # sheetの行数分だけ繰り返す
        if records[i][0] == searchKey:     # 1列目がTerminalIDと一致するま>で
            gdate=records[i][0]
            gtime=records[i][1]
            gjump=records[i][2]
            gdur =records[i][3]
            gcal =records[i][4]
            print(gdate, gtime, gjump, gdur, gcal) 
    return gdate, gtime, gjump, gdur, gcal
spread_sheet = SpreadSheet(sheet_id) 

---

# 文字列作成
cd = c.create_text(100, 60, font=('', 80,), fill='blue')
ct = c.create_text(100, 120, font=('', 80), fill='red')

---

def cupdate():

    totals = spread_sheet.search("Total")
    total_count= totals[2]
    total_time = totals[3]
    jump_text  = str(total_count)+"回 "
    c.itemconfigure(cd, text="Total Jump")
    c.itemconfigure(ct, text=jump_text)
    c.update()

---

このプログラムを流してみると、Google Sheetsからトータルの縄跳び回数が取得でき、それをスクリーンに表示できたと思います。

raspberrypi-iot-jumprope-device-04-07

 

3. 縄跳び回数を楽しく表示してモチベーションアップ!

最後にこのスクリーン付きラズパイをタブレットのように作ってみます。また、擬似的に1回跳んだら1m歩いたとみなして、東海道五十三次に見立てて、どこまで進んだかを競えるようにします。

それでは外装から作っていってみましょう。

まず、B5くらいの大きさのケースを用意します。ケースに画面の大きさの穴を開けます。

raspberrypi-iot-jumprope-device-04-08

 

液晶、ラズパイとモバイルバッテリをケースに入れ込みます。

電源を入れて画面を確認します。

raspberrypi-iot-jumprope-device-04-09

 

外装ができたので、もう少し面白く表示できるようなプログラムを作ってみました。ここでは以下のGithubにサンプル・プログラムを置いています。使ってみて下さい。

https://github.com/ktrips/jump/blob/master/jump.py

さあこれで、跳んでみましょう。

raspberrypi-iot-jumprope-device-04-10

 

縄跳びを跳んでみて、数値が更新されるか、表示が変わるかを確かめます。

raspberrypi-iot-jumprope-device-04-11

raspberrypi-iot-jumprope-device-04-12

 

これを使ってモチベーションを維持しながら、手軽に縄跳びが続けられるようになったのではないでしょうか!?

 

4. まとめ

今回の連載ではラズパイとセンサメダルを使って、縄跳びをデジタル化、IoTデバイスにしました。

まず、持ち手部分に4桁ディスプレイを付けて、センサメダルの加速度センサから縄跳びを跳んだ回数を計測し、それを表示できるようにしました。

次に、跳んだ結果をGoogle Sheetsに送って、履歴として残せるようにしました。合計の時間や回数、カロリも補足できます。

最後にディスプレイ付きラズパイに様々な情報を表示して、縄跳びや運動のモチベーションをアップするようにしました。今回は跳んだ回数の1回分を1m歩いたことに見立てて、いわゆる「東海道五十三次」でどこまで行ったのかに見立てて楽しめるようにしています。また、カロリ量をおにぎりなどで示してこちらもおもしろおかしく表示できるようにしました。

誰でも手軽に楽しめる縄跳びで、運動不足を解消の手助けをするデバイスが作れたのではないかと思います。家にこもりがちな中、少しでも運動をするキッカケになればと思います!

電子工作マニュアル Vol.3
ヨシケン(吉田 顕一)

普通の会社に勤めるサラリーマンですが、モノ作りが好きな週末メイカーで、電子書籍MESHBOOKを出したり、ブログを書いたりしています!

http://blog.ktrips.net