2018年5月27日日曜日

Arduinoのシリアル通信で、カンマ区切りの文字列を読ませる

突然ですが、今回はArduinoのシリアル通信でカンマ区切りの文字列を扱う話です。

パラメータの送信とかで使いたくなるカンマ区切りのデータですが、意外とお手軽に実装できたので紹介したいと思います。





1.解読の流れ
解読の流れとしてはこんな感じ
①シリアル入力をバッファに突っ込む
②strtok関数でトークンに分解して、各変数に読み込む
③atoi関数で数値に変換


2.実装
int angle = 0, mot_sta = 0, power = 0, i = 0;
char buff[30];

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    buff[i] = Serial.read();
    if (buff[i] == 'e') {
      buff[i] == '\0';
      angle = atoi(strtok(buff, ","));
      mot_sta = atoi(strtok(NULL, ","));
      power = atoi(strtok(NULL, ","));

      Serial.println(angle);
      Serial.println(mot_sta);
      Serial.println(power);
      i = 0;
    } else {
      i += 1;
    }
  }
}

今回のプログラムはangle、mot_sta、powerの3つの変数に値を代入するモノです。
Arduino側に送られてくるフォーマットはこんな感じ

10,20,30,e

末尾の"e"はデータの終端を表す信号で、こいつが出るまでバッファに送られてきたデータを書き出します。
そのあと、strtok関数でバッファの中身を解読します。この関数は一回文字列に対して実行するごとに1つずつトークン(のポインタ)を返します。また2回目以降は対象の文字列を"NULL"にしてあげる必要があります。
それと並行してトークン(のポインタ)をatoi関数に入れることでint型の数値が得られます。atofを使えばfloat型として数値が得られるようです。



今回はここを参考にしました。
http://www9.plala.or.jp/sgwr-t/lib/strtok.html


©2018 shts All Right Reserved.

2018年5月23日水曜日

draw.ioで数式を打ち込む

れぽーよ地獄にサヨナラしたい中の人です。
今回はれぽーよで図を描くときによく使っているdraw.ioの話。

2018/5/23 22時 追記





0.draw.ioとは
多種多様な図を書くことができるオンライン上のツールです。
(e.g.回路図、フローチャート、家の図面的なもの)

1.何がしたいか
今回のれぽーよ課題で図を描いたのですが、同時に数式を入れないといけなくなりました。というわけで、draw.io内での数式の書き方を書いていきます。

2.やり方
1)draw.ioを開く
    とりあえず、ここからdraw.ioを開きましょう。

    最初にこんな画面が出ると思うので、"新規ファイルを作成する"を選択。

    次にこの画面になるはずです。いくつかのテンプレートが用意されていますが、
    今回は"白紙ファイル"で行きます。
    名前はここで決めても、後からxmlファイルで出力するときに決めてもよいので、
    とりあえず"名称未設定ファイル"行きます。
    そして、右下の作成するボタンを押してください。

2)数式入力を有効にする

    多分こんな画面になったはずです。
    そうしたらどこでもいいので右クリックしてメニューを出しましょう。

    メニューの一番下のオプションから数式組版にチェックを入れることで数式入力ができるようになります。

3)数式を書く
    実際に数式を書いてみます。上の"図形"のボタンをクリックするとテキストボックスがあるのでそれを使います。

    draw.ioで数式を書くには、数式を"`"(バッククオート)で囲む必要があります。
    また書き方はTeXと同じものを使用します。


    そしてこんな感じになるはずです。
4)追記:保存方法
    draw.ioで作ったものはxml形式のほか種々の画像ファイルなどで保存できます。
 
    この画像の左上のほう、"ダイアグラム"をクリックするとこんなのが出てくるはず。
    ここで"保存"を選ぶと、xmlファイルで保存できます。
    このxmlがあればdraw.ioから開いて修正などもできます。
    "形式を指定してエクスポート"を選ぶと、pngなどの各種ファイルで出力できます。



©2018 shts All Right Reserved.

2018年5月20日日曜日

SH7125でsqrtを動かしたかったけどできなかった話

れぽーよに追われ、何もできてない中の人です。(テストが迫ってきたぁぁぁぁぁあああ)

少し前にSH7125でsqrt関数を動かそうとして詰まったのでその話をします。





0.要約
SH7125上でsqrt関数を動かすことは、
とてつもなく重い(中の人の感想です。個人差があります。)

1.何がしたかったか
今となってはよくわからないが、とりあえず何かの距離とか速度を算出したかったらしい。

2.どこに実装したか
最初は1[ms]の割り込み関数の内部で、次は車体を動かす距離を決める関数で。

3.結果
どちらも計算が追い付かず、モータは正常に動作しませんでした。
割り込み内部で実行したときは1[ms]以内に計算が出来なかったのであっさり轟沈しました。もう一つの時は、車体速度が上がるとうまくモータが回らなくなっていきました。

4.もしsqrtを使いたくなってしまったら
どうしてもsqrtを使いたいそこのあなたにこんな情報を差し上げます。
車体速度を上げた時のパルス周期から、SH7125だとsqrtの実行には3[ms]ぐらいを見積もったほうが良いことが判明しました。
(CPUのクロック数を50[MHz]した時の値。1[ms]で割り込みを走らせ、迷路探索アルゴリズムを走らせながら実行する条件だったので、単純な実行時間ではないことにご注意。)
本当にsqrtが必要かどうか、もう一度検討しましょう。後戻りできるうちに...


©2018 shts All Right Reserved.

2018年5月7日月曜日

加速テーブルを使わずにステッピングモータで台形加速する

Mice入って早1年たった中の人です。

ステッピングモーターを回すのに加速テーブルを使う例は多々ありますが、テーブルなしで回す例は意外とないのでメモ。





まずはステッピングモーター(のドライバIC)送るパルス周期を出してみましょう。

①1ステップで動く距離を出す
 ステッピングモータは励磁する磁石を次々に変えながら回します。そのため1ステップで回る角度が定義できます。オリエンタルモーター様の無償提供モーターPKE-243A-Lの場合、1相励磁でのステップ角は1.8°で、1-2相励磁はその半分で0.9°となります。
 ここからタイヤ直径51[mm]の場合、1ステップで"車体"が進む距離d[mm]は
となります。

②単位時間に何ステップ進めるかを決める
 1ステップでどれぐらい"車体"が進むかがわかったところで、モーターを単位時間に何ステップ分回すか、つまりステップ速度を決めましょう。
 単位ステップ距離が出ているので、これを使って求めることを考えます。1ステップで進む"車体"の距離が出ているので、"車体"の動きを記述するパラメータであり、かつ単位時間が絡むものが良いですね。例えば車体が単位時間に進む距離とか...








そう、車体速度です!
具体的には、"車体"速度をステップ距離で割るだけです。まあ、単位時間に進む距離を1ステップで進む距離で割れば、距離が消えて単位時間当たりのステップ数が出るって落ちです。
③ステップ周期を出す
 単位時間に何ステップ出すかが決まったので、1ステップにかかる時間を求めます。まあ、1[s]で何ステップ出すかが決まっているので、逆数を取れば1ステップにかかる秒数がわかります。
 では何故ステップ周期を出すかといえば、マイコンのタイマを使うためです。タイマで半周期と1周期を計って出力のHIGH-LOWを切り替えます。

④回転を加減速させる
 加減速するとき、ステップ周期を変更しながら回すのですが、ステッピングモータ特有の問題として、"脱調"があります。
 脱調とは、入力パルス周波数が大きすぎたり、小さすぎたり、変化が大きすぎるためにうまく回らなくなることです。僕の場合、200[mm/s]-1000[mm/s]、2000[mm/s^2]くらいで今のところやっています。
 
 最初に回すのなら、現在速度と目標速度の差分を取り、目標速度より速かったら、(割り込み時間x設定した加速度)を現在速度から差し引き、目標速度より遅かったら(割り込み時間x設定した加速度)を現在速度に加算するやり方で十分かと思います。


今回はこの辺を参考にしました

JASALMAのプログラム解読Part1 走行系1



それでは良きマウスライフを!
 

©2018 shts All Right Reserved.

2018年5月3日木曜日

matplotlibって使いやすいよねって話

実験も始まり、レポーヨに追われまくってる中の人です。

この前大学の課題でレポートが出たのですが、グラフの作成に戸惑っている人たちにいろいろ質問されたので僕がやってる方法を少し公開します。





1.グラフ作成に使う言語
 個人的によくPythonを使っています。最近はPython3.6をVS2017環境で動かしています。ライブラリの管理が意外とやりやすいことには驚きました。Pythonはいいゾ

2.ライブラリ
 ライブラリはnumpyで計算を行い、matplotlibでグラフの描画を行います。matplotlibは最新版(2.2.2)がおすすめ。

3.使い方
 とりあえずsinカーブを作ってみましょう。
①numpyとmatplotlibをimportする。
import numpy as np
import matplotlib.pyplot as plt
②numpyで独立変数の配列を作る。
x = np.linespace(-3.14,3.14,0.01)
③numpyのsin関数にさっきの配列を入れる。
y=np.sin(x)
④matplotlibで関数の出力と独立変数の配列を組みにして表示する。
plt.plot(x,y)
⑤表示
plt.show()
4.総論
 ここまで書いたのをまとめると
#-*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

x = np.linespace(-3.14,3.14,0.01)
y=np.sin(x)

plt.plot(x,y)
plt.show()
これでサインカーブが表示できたはず。できない場合は頑張って調べてネ。そして...













































Pythonはいいゾ
異論は認める。



©2018 shts All Right Reserved.