LoginSignup
7
3

More than 5 years have passed since last update.

RaspberryPiとArduinoでミニ四駆ラップタイマー製作

Last updated at Posted at 2018-08-06

はじめに

ミニ四駆のコースである「ジャパンカップ ジュニアサーキット」を会社に設置してもらったが、私しか熱中していないため競争相手がいない
結果、自分のマシンが早くなったのかを確認する手段がなくモチベーションが保てないので、ラップタイムを測定し過去の自分と向き合うこにした

タミヤ公式から「タミヤ グレードアップ No.184 GP.184 ミニ四駆ラップタイマー 15184」が発売さていたが廃盤となっており、現在手に入れようと思うと高騰した中古を探すこととなるので諦めた

スマホアプリで無料で測定できるものがあるが、せっかくなので自作しようと考えた

「やらなきゃ意味ないよ」

失敗事例

過去に作った人感センサーを改造すれば楽勝と考えていたが、人感センサーが検知してから復帰するまでの時間が5秒以上かかるようで、1ラップ5秒以下だと正常に計測できないことがわかった
また、この記事でArduinoと測距センサーを使ってラップタイマーを作っていたので、RaspberryPiでもできるかと考えたが、測定間隔が長すぎてうまく測定できなかった(参考記事
これは工夫次第でできる気がするが、私の力では無理だった

実現したい機能

  • ミニ四駆のラップタイム計測
  • Webページでの操作(計測開始、停止)
  • Webページでのタイム表示

使うもの

  • セットアップ済RaspberryPi(LAN接続とIP固定)
  • Arduino互換機(What's Next Yellowを使用)
  • 測距センサー(HC-SR04
  • ジャンパピン(オス-メス)4本
  • USBケーブル(A-B)
  • パソコン(ArduinoIDEが動くやつならMacでもWinでもLinuxでも)

Arduino設定

Arduinoにプログラム(スケッチ)を送る?入れる?には、Arduino IDEが必要
Arduinoに触るのは初めてで、以下の記事を参考に環境設定した
Arduinoの最初の一歩

センサー接続、ソースについては、以下記事をそのまま使用させていただいた
nao-bambooの日記:ミニ四駆ラップタイマーを作った
本当にありがたいです助かりました

あと、Arduinoと接続するUSBケーブルは「A-B」
今時見かける機会がほとんどないので、これを勘違いして電気屋さんに走るのは悲しい

RaspberryPi設定(Arduinoからタイム取得)

Arduinoからシリアル経由で出力される文字列をPythonで取得する
調べたところ「pyserial」を使えば簡単にできる
参考記事1 参考記事2

pip install pyserial
lap.py
import serial
import time

def run():
    s = serial.Serial('/dev/ttyACM0', 9600)
    time.sleep(2)

    outStr = []
    while True:
        outVal = s.readline().rstrip("\n")
        outStr.append(outVal)
        if '[Lap5]' in outVal:
            outStr.append('Goal')
            return outStr

if __name__ == '__main__':
    run()

4行目は環境によって変わる可能性あり
また、Arduinoから5lap目のタイムが来たら画面表示するようにした
本当は1lap毎に画面表示したかったが、パッとはできなかった

RaspberryPi設定(Webアプリ)

WebアプリはFlaskを使って作成した
index.htmlはボタンをつけただけなので、後々オシャレにする

pip install flask
application.py
# coding: utf-8

from lap import run
from flask import Flask, render_template, request
app = Flask(__name__)

@app.route("/", methods=['GET', 'POST'])
def index():
     print request.method
    ret = []
    if request.method == 'POST':
        ret = run()
    return render_template('index.html', message=ret)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=3000)
templates/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset='UTF-8'>
    <title>lap time</title>
</head>
<body>
    <p>
    <form action="/" method="post">
        <button type="submit">ボタン</button>
    </form>
    </p>
    {% for lap in message %}
        <p>{{lap}}</p>
    {% endfor %}
</body>
</html>

起動は以下コマンド実施

python application.py

ブラウザからRaspberrPiの固定IP:3000にアクセスすればOK

コースに設置

適当な道具でセンサーをコースに設置
高さ調整しないと反応しないことがあるため、実際にミニ四駆を走らせて調整する

所感

Arduinoはこれまでなぜか敬遠していて、今回RaspberryPiでどうしてもできなかったので
しぶしぶ使ってみたが、とても便利でサイコー、もう手放せない

肝心のラップタイマーだが、Webアプリが全然思い通りにできなかった
とりあえず、1lap毎に画面更新されるようには絶対にしたい
あと見た目オシャレにする

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3