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.

2018年4月9日月曜日

ChainerでFCNやってみた(完成版)


教習所地獄から生還した中の人です。
今日はこの前作ったFCNもどきを完成させたので、その報告。





この前作ったやつは、誤差関数を平均二乗誤差にして連続値をそのまま出力する形になっていました。(分類問題なのにね)

なんでこうなったかといえば、ChainerのSoftmaxCrossEntropyの仕様を理解せずに使おうとしていたからでして、最初から読んでいればこんなことにならなかった...。

とりあえず、こちらで公開しておきます。今後の開発としては、分類数をもっと増やして、より実践的なやつを作る予定です。(ハードについては今後公開予定)

2018年2月11日日曜日

Raspberry PiでFully Convolutional Networks(もどき)を走らせる

テストが終わったと思ったら教習所通いの中の人です。
今回はchainerを使用してFCNもどきを構築してみたので、少しご紹介。

1.目的
    今回これを作った理由は、この車の改良版を作成するためです。

2.改良手法
    Fully Convolutional Networks(FCN)を使って道路を見分け、道路の面積から操作角      を判断する。FCNについてはこちらから

    https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf

    そもそもFCNを使う理由としては、どのようにして道を判断したかがパッと見てわかり      やすいためです。(計算量は度外視)
3.結果
  3.1 精度
      こんな感じです。



    道(3段目の白い部分)がしっかり取れていました。(まだ荒いけど)
  3.2 処理速度

  想定より遅い...。大体10fpsは超えるぐらいですかね。もっと速くしたいです。

4.考察
    重かった原因として、①FCN自体が重い、②無駄な処理が走ってるといったことがあげ    られます。ここからさらに高速化しようと思ったら、この辺とか試してみたいですね。

5.その他
    今回のコードはこちらにあります。



©2018 shts All Right Reserved.

2017年12月10日日曜日

ビット演算の初歩の初歩の初歩

この記事はMice Advent Calendar 10日目の記事です。
========================================

東工大杯の準備は着々と進んでおらず、テスト対策もしていない中の人です。
Miceの先輩方からの有形無形の圧力により、Mice Advent Calendarなるものに参加しています。ほかの方々の有用な情報のほうがこの記事よりためになるので、どうぞご覧ください。

=========================================

話は変わりまして、ビット演算の話。
そもそもこんな記事を書いたのは趣味で少しかじったからであって、別段他人に見せるほどでもないんですが、とりあえず書いときます。

ビット演算とは何かという話は他の人に譲るとして、実際の演算子を紹介していきます。

1.NOT
Cでの記号(演算子): ~ (チルダ)
論理演算のNOTに相当。数字をビット毎に反転させる。
例:
a : 0101 0101
b ~= a : 1010 1010

2.AND
Cでの記号(演算子): &
論理演算のANDに相当。2つの数字のビット毎にANDをとる。
例:
a : 0101 0101
b : 1111 0000
a & b : 0101 0000

3.OR
Cでの記号(演算子): | (バーティカルバー)
論理演算のORに相当。2つの数字のビット毎にORをとる。
例:
a : 0101 0101
b : 1111 0000
a | b : 0101 0000

4.XOR
Cでの記号(演算子): ^ (キャレット)
論理演算のXORに相当。2つの数字のビット毎にXORをとる。
例:
a : 0101 0101
b : 1111 0000
a | b : 0101 0000

ちなみにXORは以下の通り
X Y | Z
----+--
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0


さてここからビット演算特有のビットシフトの話。ビットシフト自体はそこまで難しくはない(ずらすだけ)が、ビットシフトの種類で空いたところに何が入るかが変わるの(特に右シフト)で注意。

5.論理左シフト
Cでの記号(演算子): << ("Double less-than sign" とか言うらしい)
n-bit分左にずらし、空いたbitには"0"を入れる。
例:
a          : 0101 0101
a << 3 : 1010 1000

6.算術左シフト
記号も動作も5.論理左シフトと同じなので割愛

ここからがわけわからん右シフトの世界

7.論理右シフト
Cでの記号(演算子): >> ("Double greater-than sign" とか言うらしい)
n-bit分右にずらし、空いたbitには"0"を入れる。
例:
a          : 0101 0101
a >> 3 : 0001 0101


8.算術右シフト
Cでの記号(演算子): >>
n-bit分右にずらし、空いたbitには..."1"か"0"を入れる
例①:
a         : 0101 0101
a >> 3 : 0001 0101

例②:
b         : 1010 0101
b >> 3 : 1111 0100


さて算術右シフトの例が二つ出てきましたが、①では"0"、②では"1"が入っています。これは

"算術右シフトでは、操作する前の一番上のbitを空いたところに入れる"

というルールがあるためです。(理由はGoogle先生に聞いてみよう!!!!!!!)

ここまでで、Cで使えるすべてのビット演算が出てきました。
























全部の演算子が出てきたんだし、C言語だったらビット演算できる...なんて思ってませんよね?




ここである記号についてみてみましょう

5.論理左シフト
Cでの記号(演算子): <<

6.算術左シフト
Cでの記号(演算子): <<

5.論理右シフト
Cでの記号(演算子): >>

5.算術右シフト
Cでの記号(演算子): >>



あれ、記号が同じだ...。


そうです、C言語ではシフトの記号が論理と算術とで分けられていません!!!!!!!!!!!!!!!!!!

何たる失態。
ところでC言語の規格書(日本語で書かれたものだとJIS X 3010:2003)というものが世の中には存在しまして、こいつの中にはビットシフトについてこう書いてあります。

E1<<E2の結果は,E1 を E2 ビット分左にシフトした値とする。空いたビットには 0 を詰める。
E1 が符号無し整数型をもつ場合,結果の値は,E1×2^E2の,結果の型で表現可能な最大値より 1 大きい値を法とする剰余とする。
E1 が符号付き整数型と非負の値をもち,E1×2^E2が結果の型で表現可能である場合,それが結果の値となる。
それ以外の場合,その動作は未定義とする。

E1>>E2の結果は,E1 を E2 ビット分右にシフトした値とする。
E1 が符号無し整数型をもつ場合,又はE1が符号付き整数型と非負の値をもつ場合,結果の値は,E1/2^E2の商の整数部分とする。
E1 が符号付き整数型と負の値をもつ場合,結果の値は処理系定義とする


つまり左シフトは算術でも論理でも空いたビットには"0"が入るが、
右シフトは動作している環境で違うってこのらしい。







(´・ω・`)


環境依存である以上算術シフトと論理シフトについて議論してもあまり意味がないのですが、例えばGCCだとビットシフトする方の型をunsignedにしておくと論理シフトで、signedにしておくと算術シフトになったりします。



こんな感じで最後にトラップがありましたが、とりあえずビット演算の初歩の初歩の初歩はクリアできそうですね!












©2017 shts All Right Reserved.

2017年12月9日土曜日

PiZeroのOTGモードでネットにつなぐ(Windows10)

Raspberry Pi ZeroのOTGモードでのネットワーク接続に手間取ったのでメモ。

前提としてOTGモードでログインできている状態である必要があります。



①Pi Zeroと母艦とを接続し、コントロールパネル→ネットワークとインターネット→ネットワーク接続を開く

②ネットワークにつながっているアダプタを右クリックし、プロパティを開く

③共有タブを開いて、"ネットワークのほかのユーザーに、このコンピュータのインターネット接続をとおしての接続を許可する(N)"の欄にチェックを入れる。

④Pi Zeroを再起動するとつながるはず

うまくつながらないこともあるので、ほんとのやり方はほかにあるのかも知れないです。


©2017 shts All Right Reserved.

2017年10月20日金曜日

SH7125でリセット同期PWMモードを使う


センサ周りのポート接続の関係でセンサLEDをリセット同期PWMで動かすことになったのでメモ。
基本的にデータシート通りに設定し、割り込みに関する部分を追加して動かす感じ。
割り込み条件は周期を決める関係上MTU23のTGRAのコンペアマッチを使う。ついでに割り込み許可もこいつだけに出しとけばOKなようだ。

©2017 shts All Right Reserved.

2017年10月16日月曜日

kicadでプリント基板作ってみた


完全にレポーヨに時間を取られ、何もできていなかった中の人です。
少し前になりますが、ひょんな事からプリント基板を作ることになったので少しその話を

今回作った基板は、3cellのlipo からステッピングモーター用の電源とマイコン用の5Vを取り出す電源回路です。

取り敢えず3端子レギュレータを使った降圧回路にしました。保護用のダイオードをつけたのに、100μFのコンデンサのパッドを片方だけ消したのはなんでだろ?
ロゴとビアはやり直したいなぁ


秋月でAZ1086-5.0Hの取り扱いを終了したっぽいのでどうしようかなぁ?

©2017 shts All Right Reserved.

2017年10月9日月曜日

ソフト構成


今回はマイクロマウスソフト構成の話。

とりあえず全体を見通しやすくするために、レイヤーをなるべく少なくする方針で設計を進めてます。
Application layerとController / Driver layerを分けたのは、App layerでなるべくハードを意識せずにプログラムしたいためです。またControllerとDriverは一体にして、プログラムのサイズを小さくする狙いがあります。


構築はまだ全部の動作確認を終えてないのでそちらが優先ですね...

©2017 shts All Right Reserved.

2016年10月15日土曜日

Raspberry Pi Autonomous Car - ソフトウエア

今回はソフトウエア編です。いろいろ試してたら最初4つだったのが6つになってました...。




画像収集

NNのトレーニング用の画像データを収集します。出力するデータは9600次元のベクトルにしました。(160*60)
機械学習
さっきの画像データを元にPybrainを使ってトレーニングさせます。ちなみにNNは9600x32x32x4の4層にしました。(Win10のみ動作確認)
自律運転(白線検知)
先ほどのNNを使って白線を検知し、走らせます。

このほかに、カメラとモータとNNのテスト用のスクリプトを作りました。

大体10Hzぐらいで処理できているので、移動速度がそこそこ遅ければしっかり白線トレースできます。カメラからのデータ読み込みさえ速ければ、もっと処理速度あげられるのに...

©2017 shts All Right Reserved.