Mashup Awardsに出てきた

ブログに書くまでがハッカソン

という言葉を,今回のMashup Awardsで聞いたので,このブログ記事を書くことで今回のハッカソンを閉じることができそうです.

そもそも,Mashup Awardsってなに?

MashupAwardsとは、2006年にはじまった日本最大級の開発コンテスト。様々なデバイスAPI、ハードウェア、技術をMashupし、さらに人や企業もMashupしながら、作品を生み出すことを楽しむ「ものづくりの祭典」です。パートナー企業は60社を超えます。最優秀賞は100万円!賞の数が多いこと、全国でイベント開催していることも特徴です

*About MA 2017より引用.

そんな日本最大級の開発コンテストが,僕の今いる会津若松市で,2017年10月28/29日で開催されました.

Mashup Awardsについて

午前10時に開始ということで,9時30分ごろに会津大学に集合.ネームプレートのようなものが渡され,ニックネームと,自分が持っている技術を書かされる.

ハードウェア大好き人間(できるとは言っていない)なので,持っている技術として書くものはArduinoRaspberry pi,そしてPythonを書く.

今回作りたかったもの

今回僕が作りたかったものとしては, 自動で動く赤べこです.

何回か作っていますが,赤べこネタはこれで最後くらいかなと思いまして,けっこう頑張って行こうと思いました.

過去の赤べこたち

今回は,vivosmart HRJを使用して,心拍数と合わせて首の動きをリアルタイムにリンクさせようとしていました.

作ることになったもの

心拍数データを使用した,健康管理サービス(with 赤べこ

模式図としてはこんな感じ.

f:id:flying_hato_bus:20171030210340j:plain

スマートウォッチから得てきた心拍数のデータをRaspberry piで取得.サーバーに送信し,Raspberry piがデータを取得,赤べこに反映させる また,モバイルアプリやwebサービス共連携し,1日の心拍数データなどを取得することもできる.

こんな感じでした.

大学でよくつるんでいる3人と合流し,4人で開発がスタート.

4人の内訳として,ハードウェア(ぼく),サーバーサイド,webフロント,モバイルアプリと,バランスの取れたチームだと思いました.

ほかの3人も,同様にブログを書いてくれていると思うので,今回は僕が実装したところ,気づいたところを書きます.

最初にやったことは,スマートウォッチとRaspberry piの連携.

参考にしていたのは,ここ.わかりやすい上に,1時間と少しくらいで全部実装ができた.

それくらいの時間でだいたい3時ごろ,そのあとそのあとに迫っていた電子工作部門で必要な部品を調達したり,別に買い物をしたりしてから,ようやくステッピングモータに.

一番手間取ったのがこのステッピングモータの部分でした.

まともに使えるライブラリが存在しませんでした.

使用したモータードライバはこちら

上の動画で動いている赤べこはこちらのドライバをArduinoで使用していました.

今回はこれをRaspberry piで動かそうとしました.

とりあえず,githubやら,ブログ記事やらに書かれている奴を片っ端から動かしていってみましたが,一向に動きませんでした.

これで大学でできる時間の大半を使い果たし,動かないまま僕の家への開発へ.

ずーっと探して試行錯誤するのにも面倒だと思って,「一から実装するか!!」と一念発起したらなぜか30分もかからず動いたので,今回はこれを書こうと思います.

EasyDrive

今回使用した easydriverの模式図です.

f:id:flying_hato_bus:20171031114834p:plain

ピン名 用途
PWR IN (GND / M+) モータへ電源を供給する
STEP 立ち上がりエッジでモーターが動く,パルス幅1ms min.
DIR 回転方向を決定
MS1, MS2 マイクロステップの設定。デフォルトは共にプルアップされており、1/8ステップ。
ENABLE HIGHにすると出力が止まる.今回はずっとLOW
RST 全シーケンスをHome Stateに設定,出力は停止,Reset端子がHighになるまでStep入力は無視
PFD 次の出力電流が前回より少なくなる場合,PFDピンへの入力で電流の抜け方が変化.VCCにプルアップされているので slow decay modeになっている。とりあえず非接続でよい
SLP Sleep機能,非接続でよい
MOTOR モーターに接続する。A/Bがそれぞれ一組
5V 5V出力
APWR (SJ1) ここをショートさせると外部からA3967へVCCを給電できる
3V/5V (SJ2) VCC設定。ショートさせると3.3V, オープンだと5Vになる
TP1 電流調整
  • バイポーラステッピングモータ用
  • 入力電圧は8V~30V (5V系), 6.4V~30V(3.3V系)
  • 出力は最大30V, 150~750mA
  • 1/1, 1/2, 1/4, 1/8 マイクロステップ動作対応
  • 特別な電源シーケンスは不要
  • (チップの)貫通電流防止、加熱防止、低電圧保護

とまあ,今となって見ると実装が簡単そうなもの.

実装

配線としてはこんな感じ.Raspberry piに繋げるのはGPIO23,24,GNDの3ピンくらい

f:id:flying_hato_bus:20171031175949j:plain

import RPi.GPIO as GPIO
import time
import sys

GPIO.setmode(GPIO.BCM)

GPIO.setup(23,GPIO.OUT)
#23 is DIR pin
GPIO.setup(24,GPIO.OUT)
#24 is STEP pin

class stpmotor():
    def __init__(self):
        pass 

    def Drive(self, rpm):
        one_rot = 200
        l = rpm * one_rot
        delay = 30/(2*float(l))
        steps = l/6 #rotato to 5 sec
        for x in range(1,steps):
            GPIO.output(24,GPIO.HIGH)
            time.sleep(delay)
            GPIO.output(24,GPIO.LOW)
            time.sleep(delay)

    def inv_Direction(self):
        GPIO.output(23, not GPIO.input(23))

if __name__ == '__main__':
    Motor = stpmotor()
    Motor.Drive(YOUR_VALUE)
    GPIO.cleanup()

これで動きます.細かい話はgithubリポジトリを参考に.

github.com

実装した感想なのですが,DIRで回転方向を決めて,STEPピンに矩形波を入れてあげればとりあえず動く.

Drive関数で矩形波を作成して動かしている.

ステッピングモータを動かすために必要なのはステップ数と,ステップ角,そしてちょっとした計算能力です.

ステップ角は一回のステップ(矩形波)で動く角度です.大体は1.8度とかになってます.

ということなので モータの回転量[°] というのは

モータの回転量[°]= モータ固有のステップ角[°]× 指令パルス数

一回転するためには 360/1.8 = 200 回パルスを送ってあげればいいことになる.

それを指定回数分回すことになるので,rpmを設定して.回転数などを取得します.

あとはforの求めたdelayを使ってHIGH,LOWを入れ替えます.

そしたら多分こうやって動く

こんな感じで動いてました.

辛かったこと

webの知識が全くないです

pythonでろくにPOSTも投げられませんでした.のあくんにめちゃくちゃキレられました.

API叩くなりして,これからもうちょっとwebの知識を入れていきます.

できたもの

こんな感じです.5秒に一回サーバーにGETリクエストをして,取ってきた情報から赤べこの首を動かしています.

今回はここら辺で終わり.もうちょっとwebの知識を入れてからハッカソンに臨もうと思いました.