ラズパイその他工作

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

第3回:Google Driveと連携して縄跳び結果を保存・チェック

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

運動不足解消のための縄跳びデバイスを作るこの連載。第3回となる今回は、加速度センサから跳んだ回数をカウントする事ができたら、それをGoogle Sheetsに保存、加工する手順を紹介します。今まで跳んだ回数、時間や、総カロリ量などが分かると、今後の運動のモチベーションアップにつながるかもしれません。それでは早速やってみましょう!

raspberrypi-iot-jumprope-device-03-01

raspberrypi-iot-jumprope-device-03-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

 

今回の記事の流れ

  1. Google Sheetsの設定
  2. ラズパイからGoogleへのアップロード
  3. 縄跳び結果を保存、表示
  4. まとめ

 

1. Google Sheetsの設定

縄跳びを跳んだ回数をカウントできるようになったら、それを保存したり、これまでどれだけ跳んだか確認したくなりますよね。

そのために毎回跳んだ回数などを、Googleのクラウドのスプレッドシートに保存するようにしましょう。Googleのクラウドサービスはある一定までは無料で使えますので、気軽に始めることができます。

まず、以下のGoogleコンソールにアクセスします。Googleアカウントや最初に使い始める登録などはこちらで行って下さい。 
https://console.developers.google.com/

Googleアカウントの初期設定が済んだら、コンソール上からSheetsというAPIを検索します。そこにGoogle Sheets APIが出てくるので、これを選びます。

raspberrypi-iot-jumprope-device-03-03

 

ここで左側の青いボタンの「有効化」を押してSheets APIを使えるようにします。

raspberrypi-iot-jumprope-device-03-04

 

次に左側メニューの「認証情報」に移動します。

raspberrypi-iot-jumprope-device-03-05

 

認証画面上部の「認証情報を作成」から、「サービスアカウント」を選択します。

raspberrypi-iot-jumprope-device-03-06

 

サービスアカウントの作成画面で、適当なアカウント名やIDをつけて「作成」を押します。

raspberrypi-iot-jumprope-device-03-08

 

「アクセスの許可」でもプロジェクトオーナーなどの権限を付けて「続行」します。

raspberrypi-iot-jumprope-device-03-07

 

こうするとサービスアカウントが作成されます。ここで、以下のような秘密鍵の作成ボタンを押して、JSON形式のファイルをダウンロードしておきます。

raspberrypi-iot-jumprope-device-03-09

 

raspberrypi-iot-jumprope-device-03-10

 

JSONファイルをダウンロードしたらそれを開いて、mail情報にあたる xxx@yyy.iam.gserviceaccount.com のアドレスを保存しておきます。また、このJSONファイルをラズパイに転送しておきます。

raspberrypi-iot-jumprope-device-03-11

 

事前の設定が済んだら、Google Sheetsにアクセスして、スプレッドシートを作ってみます。Google Driveにアクセスするか、以下のリンクを使います。
https://docs.google.com/spreadsheets/create

Google Sheetsの新規シートが立ち上がったら、左上の名前の所に適当なシート名を入力します。(この時は”Jump_Count”としました)

さらに、右側の「共有」ボタンを押して、先ほど保存したアカウント情報( xxx@yyy.iam.gserviceaccount.com )を入力して、完了します。

raspberrypi-iot-jumprope-device-03-12

 

2. ラズパイからGoogleへのアップロード

さあ、ここまででGoogle側の設定は終わったので、早速ラズパイから使えるようにしましょう。ラズパイを立ち上げて、ターミナルを開きます。

Google Sheetsを使うために、各種認証とgspreadというライブラリを使うので、それらを以下のようにインストールします。

pi@raspizero:~/Programs $ sudo pip3 install oauth2client
pi@raspizero:~/Programs $ sudo pip3 install httplib2
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting httplib2
Downloading     100% |████████████████████████████████| 102kB
Installing collected packages: httplib2

pi@raspizero:~/Programs $ sudo pip3 install gspread

これでSheetsにデータを保存できるようになりました。ここで以下のように、簡単なラズパイからデータを入力できるプログラムを作ります。

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

---------
 
#!/usr/bin/python
# -*- coding: utf-8 -*-
import gspread
from oauth2client.service_account import ServiceAccountCredentials

key_name = ‘xxx.json’ # Use your own information
sheet_name = 'jump_count'

# Use sheets API
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)

# Enter TEST to Sell A1
cell_number = 'A1'
input_value = 'Total Jump'
wks = gc.open(sheet_name).sheet1
wks.update_acell(cell_number, input_value)

 

このプログラムを流してみると、ラズパイからクラウドのシートに”Jump Data”のデータが挿入されました。

raspberrypi-iot-jumprope-device-03-13

 

3. 縄跳び&保存、表示!

それでは縄跳びプログラムを改変して、跳んだ回数をGoogleにアップロードできるようにします。

raspberrypi-iot-jumprope-device-03-14

 

まず自分のシートのsheet_id(以下URLの赤枠の部分)を記録しておきます。

raspberrypi-iot-jumprope-device-03-15

 

スプレッドシート上では、A列・B列に日付・時間、C列に跳んだ回数、D列に実施時間(秒)、E列はカロリ量を保存していきます。シート上のC1、D1、E1に合計の式を入れておくと、跳んだトータルの回数や総消費カロリ量などを自動で計算してくれます。

raspberrypi-iot-jumprope-device-03-16

 

次に、ble_jump_4d.pyプログラムに追記する形で、ble_jump_4d_sheets.pyを作ります。跳んだ回数をGoogle Sheetsに保存するため、以下の部分を追加しています。

  • 9〜42行目
  • 49〜50行目
  • 57〜69行目
  • 76〜77行目
pi@raspizero:~/Programs $ sudo cp ble_jump_4d.py ble_jump_4d_sheets.py

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

---

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 JSON file name
sheet_name= “jump_count” # Sheet name 
sheet_id      = “zzz” # Sheet Id

class SpreadSheet(object):
  def __init__(self, sheet_id):
    self.sheetId = sheet_id
    scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
    credentials = ServiceAccountCredentials.from_json_keyfile_name(key_name, scope)
    http_auth = credentials.authorize(httplib2.Http())
    discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?''version=v4')
    self.service = discovery.build('sheets', 'v4', http=http_auth, discoveryServiceUrl=discoveryUrl)

  def append(self, values): # Append data in Google Sheets
    assert np.array(values).shape==(5,) , "The shape of value %s must be 5" % (np.array(values).shape)
    value_range_body = {'values':[values]}
    result = self.service.spreadsheets().values().append(spreadsheetId=self.sheetId, 
        range=APPEND_RANGE, valueInputOption='USER_ENTERED', body=value_range_body).execute()
    print(result)

spread_sheet = SpreadSheet(sheet_id) 
APPEND_RANGE = 'sheet1!A1:E1'
start_time= datetime.now()
last_time = datetime.now()
last_cnt  = 0
last_cal  = 0
last_dur  = 0

scanner = btle.Scanner()
while True:

---

    fourletterphat.print_str("JUMP")
    fourletterphat.show()

---
                SEQ = sensors['SEQ']
                jump_cnt = sensors['Steps']
                if SEQ in [255,0,1] and jump_cnt == 0:
                    start_seq+= 1
                    start_time= datetime.now()
                    print(start_time.strftime('%H:%M:%S')+" Start Jumping!")
                    if last_cnt!=0:
                        spread_sheet.append([last_time.strftime('%Y/%m/%d'), last_time.strftime('%H:%M:%S'), 
                            last_cnt, last_dur, last_cal])
                else:
                    last_time= start_time
                    last_cnt = jump_cnt

                cur_time= datetime.now()
                if start_seq >= 1:
                    dur_time= cur_time - start_time
                    dur_seconds = dur_time.seconds 
                    cur_cnt = jump_cnt
                    cur_cal = round(cur_cnt*0.1,1)
                    jump_text= str(cur_cnt)+" Jump "+str(cur_cal)+" Cal "+str(dur_seconds)+" s"
                    print(jump_text)
                    fourletterphat.print_number_str(cur_cnt)
                    fourletterphat.show()
                    last_dur = dur_seconds
                    last_cal = cur_cal

                '''
                for key, value in sorted(sensors.items(), key=lambda x:x[0]):
                    print('    ',key,'=',value)
                '''

 

このプログラムを流して、センサメダルのボタンを押した後、何回か跳んでみましょう。

raspberrypi-iot-jumprope-device-03-17

 

インターネットがつながる所で、ボタンを押して縄跳びを跳ぶたびに、回数を保存してくれるようになります。このような形でシートに跳んだ回数が保存されたと思います。

 

4. まとめ

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

第3回の今回は、跳んだ回数をカウントするだけでなく、その度に回数などをGoogle Sheetsにアップロードして結果を残せるようにしました。Google Sheetsは、合計値を出したり、グラフにしたりするのも簡単なので、縄跳び結果を手軽に見るのにピッタリです。

最終回となる次回は、跳んだ回数と今回保存させたデータを使って、縄跳びをさらに楽しく、モチベーション高くやれるような仕組みを作ります。

次回もお楽しみに!

Arduinoでスマートウォッチを作ろう
ヨシケン(吉田 顕一)

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

http://blog.ktrips.net