arrow-righthamburgerlogo-marksocial-facebooksocial-githubsocial-twitter
2019.03.11

初めてのArduino〜トレーニングマシンを作る編〜

自給力

   このエントリーをはてなブックマークに追加  

初めまして、今月からdotstudioでお世話になる自給力です。

プログラミングスクール卒業後でフラフラしてたところを、のびすけしゃちょーから「記事を書いてみない?」と誘っていただきました。これから、バシバシ記事を書いていきますのでよろしくお願いします。

コードの書き方や手順で変なところあるかもしれませんが、許してください……!

僕はフィットネス業界での事業を考えています!せっかくなので、フィットネスに絡めて何か作って、記事にしていきたいと思います。プログラミングはかじってはいるのですが、IoTのコーディングや電子工作は初めてなので、初心者さん向けに自分の失敗の工程も含めてお伝えできればと思ってます。

そして、まず作ろうと決意したモノは……

「自宅でのトレーニングで回数を数えてくれるサービス」です!!パチパチ〜〜!!

意外とスクワットとかダンベルのトレーニングしている時って回数数えるの面倒なんですよね。

そこで、勝手に回数数えてくれるサービスがあればテレビ見ながらでも回数に気を取られずにトレーニングができる!そんな思いから、サービス作ってみようと思ったわけです。

のびすけしゃちょーに相談してみる

自給力
というわけで、ダンベルを上げ下げしてる時に回数数える物作りたいっす!
のびすけ
いいね。じゃあどうやって数えるか考えよう。カウントの仕方としては、赤外線センサ使うとか、腕の動きで変わる気圧を計測するってやりかたもあるよ、加速度センサでy軸方向に動いた回数を、、、(etc)
自給力
(おお、なんか凄そうなのが作れそうだ)
なるほど!!面白そうですね!!!!じゃあ加速度センサ使ってみたいです!!!
(理由:かっこいいから)
のびすけ
ま、それは難しいから最初はスイッチだな(バッサリ)
自給力
(え、なんで他の紹介したん……)

そんなこんなで、iot初心者の僕は「磁気スイッチ」を使ったカウントマシンを作ることに決まりました!!

まずは準備

今回使うのはArduino(写真左)と磁気スイッチ(写真真ん中と右)

1

まず、Arduinoにコードを書き込むためにArduino IDEをインストールしましょう。

こちらのドキュメントの通りにやれば簡単にインストールできます。

そして、磁気スイッチの使い方はこちらを参考にしました!

サイト内は英語で書かれていますが、ここでやることしてはArduinoのD2のピンに刺し、写真のように組み立てるのだそうです。

2

さぁ、数を数えよう

「数なんてすぐに数えられるわい」っと思ったのも束の間……。

「あれ?何を数えるんだ???」と、なんとも初歩的な壁にぶつかりました。

ダンベルを動かした回数を頭の中で数えるのは簡単ですが、機械に数えさせるのは訳が違う。まずは何を数えるか考えなければならないのです。

自給力
のびさん、オレは何を数えるんですか?(語彙力)
のびすけ
まずは、センサが反応してる時にフラグを立ててみたら?
フラグが立った状態からフラグが無くなったときにカウントできるようにしてみる方法があるよ。
自給力
なるほど!それですね!(フラグって何……?)

「フラグ」が何を指しているのかが分からなかったので、「Arduino フラグ」でググってみました。どうやらセンサの状態を変数に入れて管理することだということが分かりました。

(参考1)アイデア・ハック!! Arduinoで遊ぼう(2)

次に、「Arduino 数える」でググり、「変数でどう数えるのか」について、以下の記事を参考にしました。

(参考2)変数で回数を数える

やることとしては、

  1. センサの状態をフラグ(変数)として認識させる
  2. フラグがついてる状態から、なくなった状態に「+1」していく
  3. 1と2を繰り返す

なるほどなるほど。だいたい道筋が見えてきたので、作っていきます!

よし、作ろう

(参考1)アイデア・ハック!! Arduinoで遊ぼう(2)からスイッチのon/offで数を数えるためコードがあり、アレンジをしてみました。

3

必要なのは「グローバル変数の定義」「フラグの定義」「フラグからカウントする際のコード」の3つ

まずは「グローバル変数の定義」です。

int G_state = FLG_OFF;

簡単ですね。

次に「フラグの定義」

フラグ立っている時は「1」、立っていない時は「0」と教えてあげます。

const int FLG_ON = 1;
const int FLG_OFF = 0;

楽勝!

それでは、最後に「フラグからカウントする際のコード」を書いてみましょう。

Void setup()の中に、

Serial.begin(115200);

を書き、 void loop()の中に、

 int val = digitalRead(MAGNECTIC_SWITCH);

を書きます。

これはつまり、センサで取得した値を変数valに入れているわけです。

そして

if(G_state == FLG_OFF){
      count += 1;
    }
    Serial.println(count);

と書き、コンパイルして、書き込みをしていきます。

ちょっとここでケアレスミスがあり、書き込みの際にエラーが何回か出ましたが、難なく解消。

よし!これで動く!

ツールの中のシリアルモニタを見てみましょう。

4

な、なにーーー!!

なんか勝手に数が増えてる!!!!このままじゃ数字が止まらなくなる!!!(パニック状態)

自給力
助けて!のびさんんんんんんんん!!
のびすけ
ん??これ、if( G_state == FLG_OFF )で+1で書かないと、めっちゃ数えるよ。
自給力
あ、そうか……。

つまり、コードを日本語訳にすると、「G_stateの中のフラグがないときは、足していく」という意味。フラグが無い状態では+1され続けてしまうんです。そりゃうまくイカンわ!!!

のびすけ
if(G_state == FLG_OFF)の一文を消して、elseの中でフラグの判定した方がいいよ。

のびさんのご指摘の通り、elseの中にif文を書いてフラグがonだったら1カウントをするコードに書き換えました。

よし!これでどうだ!!!書き込み開始!!

5
自給力
あれ???なんで58から始まるんだ?わけわからん数字だ……。
のびすけ
デフォルトの数字は、setupで数字初期化されるから、setupの定義内でcount=0にすればいいんじゃない?
自給力
ほうほう。

実際に書き換えてみると、見事解決!

6

ちゃんと数えてくれるか検証

磁石をセンサに近づけて、、

7

離すと、、

8

そしてシリアルモニタを見ると

9

カウント「1」!!!!

見事成功です。

いやぁ、一口に数を数えるとは言っても奥が深いですね!今日のところはこの辺で終わりたいと思います。

続編をお楽しみに……!

   このエントリーをはてなブックマークに追加