なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

小型フォトリフレクタ「 NJL5901AR-1」のはんだ付け

Posted by arms22 on 2017年06月18日 0  0



少し前から秋月電子で取り扱いが始まったJRCの小型フォトリフレクタ「 NJL5901AR-1」、表面実装タイプのフォトリフレクタでパッケージサイズが1.3×1.6×0.6mmと非常に小さく、またリードが部品側面に露出しておらずリフロー装置を使わずに実装するのが難しい部品です。

今回パッドサイズを推奨0.4×0.6mmから0.4×0.9mmに変更することではんだゴテを使って実装することができたので、その様子を動画として公開します。NJL5901AR-1を買ったはいいもののあまりの小ささに心が折れてしまった方の参考になれば幸いです。

表面実装小型フォトリフレクタ NJL5901AR-1 (2個

床拭きロボットの製作(6)- DCモータのトルク制御

Posted by arms22 on 2017年04月16日 0  0

床拭きロボットに必要かどうかはおいといて、DCモータのトルク制御を行ってみたいと思います。まずはその準備としてDCモータの逆起電力を測定し、逆起電力定数を求めてみました。今回はDCモータの逆起電力の測定方法、逆起電力定数の求め方について書きます。またトルク制御になぜ逆起電力の測定が必要なのかDCモータ特性の解説とともに簡単にまとめておきます。

ちなみにちゃんとしたメーカ製モータの場合、逆起電力定数はカタログスペックとして記載されているので、そもそもこのような作業はいらないはずです。特性がよくわからないモータを使いたい場合などに参考になれば幸いです。


逆起電力測定回路


逆起電力と回転速度の測定回路
実験に使用するモータはPololu社のエンコーダ付き20:1ギアードモータで、タミヤのスポーツタイヤを取り付けて測定を行いました。DCモータの端子間電圧をR1・R2抵抗で1/3に分圧してマイコンのアナログピン(A0)に接続します。またこの時の回転速度も必要なのでエンコーダ出力をマイコンのデジタルピン(13と12)に接続します。DCモータのステップ応答を見るためバッテリーをプッシュスイッチを通してモータの+端子に接続します。実際の測定はプッシュスイッチをジャンパー線に置き換えて行いました。


ステップ応答

回転速度と端子間電圧のステップ応答

DCモータに一定の電圧(エネループ6本直列)をかけた時のステップ応答です。回転速度が安定している間(電圧をかけている)の値は無視して、回転速度が降下している間(電圧をオフ)の値に注目します。


回転速度と逆起電力の関係

回転速度vs端子間電圧

回転速度が降下中の端子間電圧(逆起電力)と回転速度をグラフにすると比例関係にあることがわかります。近似直線を求めると直線の傾き(0.0051x)が求まります。これが逆起電力定数です。逆起電力定数の単位はVs/radが一般的なので単位変換すると以下の値になりました。

0.009740Vs/rad



DCモータの特性

DCモータのトルクと電流は比例関係にあり次式で表すことができます。比例定数KTをトルク定数と呼びます。

トルク(Nm) = KT(Nm/A) * 電流(A)

DCモータの逆起電力と回転速度は比例関係にあり次式で表すことができます。比例定数KEを逆起電力定数と呼びます。逆起電力は電流の向きとは逆向きに発生し、電流を流れにくくします。

逆起電力(V) = KE(Vs/rad) * 回転速度(rad/s)

またKTとKEは同じ値になることが証明されています。

KT = KE

逆起電力はモータに電圧をかけて回している時も発生しています。モータに電圧をかけている時の端子間電圧と逆起電力の関係は次式で表すことができます。モータは両辺の電圧が釣り合う回転速度で回転します。

端子間電圧(V) = ブラシ接触電圧降下(V) + 巻線抵抗(R) * 電流(A) + 逆起電力(V)

ここでブラシ接触による電圧降下は無視するとして、PWM制御中のトルクは次式で求めることができる、はず。。

端子間電圧(V) = バッテリー電圧(V) * PWMデューティー(%)
逆起電力(V) = KE(Vs/rad) * 回転速度(rad/s)
電流(A) = (端子間電圧(V) - 逆起電力(V)) / 巻線抵抗(R)
トルク(Nm) = KT(Nm/A) * 電流(A)



疑問など

今回実験に使用したギアードモータのギアなし版のカタログスペック。

無負荷回転数 : 6200RPM@6V
起動トルク : 0.15kg-cm@2.4A (0.01471Nm)

上記値から逆起電力定数とトルク定数を計算したところ値が一致しませんでした。

逆起電力定数:0.009241Vs/rad
トルク定数:0.006129Nm/A

逆起電力定数はわりと近い値なんだけれどもトルク定数が66%ぐらいになっています。軸受けやブラシの摩擦の影響なのか、また他の要因なのかよくわかっていません。。


参考記事

2-1-2 回転原理の基礎 | 日本電産株式会社 - Nidec Corporation
2-1-3 DCモータの回転速度と逆起電力 | 日本電産株式会社 - Nidec Corporation


参考書籍

実験で学ぶDCモータのマイコン制御術 (メカトロ・シリーズ)
萩野 弘司 井桁 健一郎
CQ出版
売り上げランキング: 427,890


床拭きロボットの製作(5)- Blynkアプリでリモートコントロール

Posted by arms22 on 2017年03月28日 0  0

「ボタン1つで勝手に掃除」というレベルにはまだまだ先が長いのでとりあえずBlynkアプリで操縦できるようにしました。



今回2つの動作モードを用意しました。左右のモータを別々に制御するダイレクトドライブモードと運動モデルに基づくモーションコントロールモードです。モーションコントロールモードはロボットの運動を併進速度・角速度で制御するモードで独立2輪ロボットでよく使われる運動モデルです。詳しくは下記を参照してください。

車輪移動ロボット - 機械知能工学科 - 東北学院大学



実際に走行させてみました。速度が速くて操縦が難しいです。台形加速の制御を入れてないと、、


BlynkアプリのUI


床拭きロボット-リモートコントローラ

左がダイレクトドライブモード、右がモーションコントロールモードのUIです。ダイレクトドライブモードでは移動速度をパルス/毎秒で左右のモータに直接指令を出します。モーションコントロールモードでは併進速度をmm/毎秒、角速度を角度/毎秒で指令を出し、マイコン側でパルス/毎秒に変換してモータを制御しています。


ソースコード

arms22/blynk_motor_controller
https://github.com/arms22/blynk_motor_controller


関連記事

Blynkを使ってスマートフォンからAdafruit Feather M0 Bluefruit LEを制御する方法
床拭きロボットの製作(2)- DCモータの制御

床拭きロボットの製作(4)- エンコーダパルスの誤差

Posted by arms22 on 2017年03月14日 0  0

一定の速度でモータを回した時に速度が少しバラつくので原因を調べてみました。次の図はPID制御をオフにして40%ぐらいの電圧をかけて空転させた時の結果です。横軸は時間(ミリ秒)、縦軸はパルス間隔(マイクロ秒)です。

パルス幅-起動時

パルス間隔は徐々に短くなってきて1800〜1750あたりで安定になります。この時50マイクロ秒ほどパルス間隔に変動があります。

パルス幅-安定時

速度が安定したあたりを拡大すると振幅が一定周期で現れているのがわかります。また1回転先の結果を重ね合わせてみると振幅がピッタリ一致することも確認できました。どうやらエンコーダの誤差のようです。振幅は常に一定なのでパルス間隔の平均をとって1パルスごとの変動率を求めれば簡単に補正できそうですね。

パルス幅-安定時_移動平均ありなし

でも今回は簡単に移動平均をかけて平滑します。パルス間隔を取得するコードに下記の処理を加えます。_pulseWidthが前回までの値で_pulseWidthRawが今回の値。それぞれ0.7と0.3の重みをつけて足しあわせています。

_pulseWidth = _pulseWidth * 70 + _pulseWidthRaw * 30;
_pulseWidth = _pulseWidth / 100;


PID制御-移動平均あり

移動平均をかけた状態でのPID制御の結果です。縦軸の単位がパルス秒に変わっています。速度安定時の制御量の振幅が随分小さくなりました。これで低速時も回転が安定するようになるかも。


参考記事

気まぐれ備忘録 磁気式エンコーダ

床拭きロボットの製作(3)- フィードバック制御でDCモータの回転速度を制御する

Posted by arms22 on 2017年02月26日 0  0

フィードバック制御を組み込んで速度制御を行えるようになったので、その制御方法と結果についてまとめておきます。


速度制御


速度制御処理

速度指令は1秒あたりのパルス数=パルス秒としました。エンコーダ入力との差分をPID制御器に入力し、PID制御器の演算結果をPWMのデューティーとして使用しています。
 PID制御器の出力はPWMデューティー幅に制限し、リセットワインドアップの対策としてPID制御器の出力がPWMデューティーの範囲を超えたら積分の演算を止めるようにしました。
 エンコーダからの入力はA相のパルス間隔をタイマーのインプットキャプチャ機能を使って計測し、速度(パルス秒)に変換しています。


制御成績

実験に使用したモータはPololu社のエンコーダ付きギアードモータで、負荷としてタミヤのスポーツタイヤを取り付けています。計測はタイヤを浮かした状態(空転)で行いました。PIDのパラメータはステップ応答法、またステップ応答法の1種であるCHR法で求めました。縦軸は速度(パルス秒)、横軸は時間(ミリ秒)です。

ステップ応答法で求めたPIDパラメータを使用した場合のP制御とPI制御それとPID制御の結果を以下に示します。またCHR法で求めたPIDパラメータを使用したPID制御の結果も以下に示します。

Pololu 20.4:1 金属ギヤードモータ 25Dx50L mm LP 6V 48CPRエンコーダ付き
タミヤ スポーツタイヤセット(56mm径)


P制御 Kp 3.74491
P制御


PI制御 Kp 3.37042 Ki 127.66741
PI制御


PID制御 Kp 4.49389 Ki 280.86830 Kd 0.01798
PID制御


CHR法(目標追従:0%)Kp 2.24695 Ki 54.80357 Kd 0.00899
PID制御-CHR法目標追従0%


CHR法(目標追従:0%)Kp 2.24695 Ki 54.80357 Kd 0.00899 1200ppsから1000pps
PID制御-CHR法目標追従0%-1200_1000


ソースコード

ソースコードはgithubで公開しています。
arms22/motor_pid_test: DC motor PID control test code


参考URL

PID制御 - Wikipedia
PID controller - Wikipedia
PID制御 - MATLAB & Simulink
モータの制御法
滑らかで安定したライントレースを実現する (1/2)

センサーの値が一定量変化したら送信する - Wifi温度湿度計の製作(11)

Posted by arms22 on 2017年02月19日 0  0

温湿度センサー一定量変化があった時のグラフ
ESP8266 with HDC1000 Module Temperature/Humidity Monitor in Kyoto

ThingSpeakへのセンサーデータの送信間隔を一定間隔(5分)から一定量変化があったら送信するように変更しました。温度変化が激しい朝晩は5〜15分間隔、深夜から朝方にかけては温度がほぼ一定なので数時間間隔で送信しているのがわかります。1日のセンサーデータの送信回数が288回から30回〜40回に減って電池の消費量も大幅に減った、かも。これで半年ぐらい保つかな?


スケッチ


DeepSleepに入るとメインメモリのデータは保持されないので、RTCメモリにセンサーデータをバックアップして次回起動時にRTCメモリから前回データを読み出すようにしました。ThingSpeakへのセンサーデータの送信タイミングは温度±0.5度または湿度±2.0%または電源±0.02V変化があった場合としています。起床間隔は従来どおり5分。


床拭きロボットの製作(2)- DCモータの制御

Posted by arms22 on 2017年01月26日 0  0



DCモータを使うのは初めてなのでとりあえず回して感触を掴んでみることにします。タクトスイッチを押すと低速・中速・高速と速度を変えてDCモータが回転するスケッチを書きました。analogWrite関数を使ってモータドライバにPWM波形を入力し速度を調整しています。PWM周波数が732Hzと低く可聴域にあるのでモータからヴーという音が聞こえる。



クイックルワイパーを装備して実際にフローリングを走らせています。本体が軽いせいか思った以上に速度がでています。モータのトルクが足りるか心配だったのですが問題なさそう。2つのモータの回転数は合わせていないので、斜めに走っているのが分かる。


回路図


床拭きロボット_モータテスト回路図
今回使用するモータは静止電流が2.4A@6Vと少々電流多めなので、モータドライバ(以下、TB6612FNG)の出力を並列にして1つのモータに入力して電流を稼ぐようにしました。TB6612FNGの出力電流の定格は1つのモータにつき最大1Aですが、Peakは3.2A(たぶん2つの出力合わせて)なので回転始めの一瞬だけなら大丈夫と踏んでいます。DCモータは回転数が上がると電流が減るので、実際は並列とかいらんかもしれない。


TB6612FNGの制御ロジック

TB6612FNG H-SW制御ファンクション

IN1/IN2で回転方向を指定して、PWMで回転速度を制御します。IN1←H、IN2←LとしてPWMに矩形波を入力するとCW→ショートブレーキ→CW→ショートブレーキ…を繰り返すします。

このロジック表を見るとPWMをH固定にして、IN1またIN2にPWM波形を入力しても制御できるように見える。そうすると制御ピンを1本減らせるんだけど、PWMをH固定にする作例を探してみたけど見つからなかったので、無難に3本使って制御することする。


スケッチ





参考記事


DCモータードライバの使い方
https://trac.switch-science.com/wiki/DCMotorDriver


実験で学ぶDCモータのマイコン制御術 (メカトロ・シリーズ)
萩野 弘司 井桁 健一郎
CQ出版
売り上げランキング: 492,730


床拭きロボットの製作(1)

Posted by arms22 on 2016年12月30日 0  0

IMGP1354

DCモータのフィードバック制御をやりたくなったので、その実験用に床拭きロボットを作ることにしました。現状、木のフレームにブレッドボードとやっつけ感満載ですが、ある程度仕様が固まってきたらフレームは3Dプリンタで作って、専用の基板も起こしたいと思います。

IMGP1361

メインのマイコンモジュールはAdafruit Feather M0 Bluefruit LE、モータドライバはPololu TB6612FNGデュアルモータドライバを採用しました。TB6612FNGの出力は2つありますが、並列にして電流を稼ぐつもり。

IMGP1356

Pololuの直径25mmのエンコーダ付きギアードモータにタミヤのスポーツタイヤを付けています。バッテリーはニッケル水素直列6本の7.2Vを予定。ゆくゆくはラジコン用のリチウムイオンバッテリーに置き換えたい。

IMGP1365

スポーツタイヤ付属のホイールハブがPololuのモータシャフトに合わなかったので3Dプリンタでホイールハブを作りました。タイヤとホイールも3Dプリンタで作れるといいな。


部品リスト




ThingSpeakにセンサーデータを送ってグラフに表示する - Wifi温度湿度計の製作(10)

Posted by arms22 on 2016年11月04日 0  0

ThingSpeak-温度湿度グラフ
ESP8266 with HDC1000 Module Temperature/Humidity Monitor in Kyoto - ThingSpeak

さていよいよ大詰め、ThingSpeakにセンサーデータを送ってグラフに表示させるよ!


ThingSpeakって何ぞ?


ThingSpeakはIoT向けのクラウドデータサービスです。デバイスから送られた来たデータを貯めて、データを解析したりグラフに表示したり、データをトリガーに何らかのアクション(ツイートするとか)を起こしたりできます。Arduino用のライブラリがあるので簡単にデータを送ることができます。


アカウントの登録

まずはThingSpeakのページを開いて新しいアカウントを作成しましょう。Sign UpをクリックしてユーザID、メールアドレス、タイムゾーン、パスワードを入力しCreate Accountボタンをクリック。


チャンネルの作成


チャンネル作成

次にチャンネルを作成します。チャンネルには8種類のデータ・場所・状態を登録することができます。場所やデバイス毎にチャンネルを分けて作成するとよいでしょう。ここでは4つ(温度・湿度・露点温度・Vcc電圧)のセンサーデータを書き込むためのチャンネルを作成します。

  1. メニューバーの Channels > MyChannels をクリック。
  2. New Channel ボタンをクリック。
  3. 以下の情報を入力。
    Name(チャンネルの名前)
    Field1 Temperature(フィード1の名前)
    Field2 Humidity(フィード2の名前)
    Field3 Dew Point(フィード3の名前)
    Field4 Vcc(フィード4の名前)
    Make Public(公開しても良いならチェック)
  4. Save Channel ボタンをクリック


チャンネルIDと書き込み用のAPIキーの取得


チャンネルIDとAPIキー

センサーデータの書き込みにはチャンネルIDと書き込み用のAPIキーが必要です。メニューバーの Channels > MyChannels をクリックして、作成したチャンネルを開きます。Channel ID と書かれた6桁の数字がチャンネルID、API Keys をクリックして Write API Key と書かれた英数字の文字列が書き込み用のAPIキーです。


Arduino用ライブラリのインストール


ThingSpeakライブラリ

ThingSpeakにセンサーデータを書き込む為のArduino用ライブラリをインストールします。ライブラリはArduino IDEのライブラリマネージャからインストールします。Arduino IDEを起動しライブラリマネージャを開きます(スケッチ > ライブラリをインクルード > ライブラリを管理)。検索フィルターに“thingspeak”を入力し、"ThingSpeak by MathWorks"を選んでインストールボタンを押します。


スケッチ

5分毎にセンサーデータをThingSpeakに送るスケッチです。Wifi設定、ネットワーク設定、ThingSpeak設定は環境に合わせて変更してください。


処理の流れは次のとおりです。
  1. Vcc電圧を取得
  2. Vcc電圧が3.05V未満ならバッテリーの過放電を防ぐために無限スリープに入る
  3. 温度・湿度データを取得
  4. 露点温度を計算
  5. Wifi接続(リトライ3回まで)
  6. ThingSpeakに接続
  7. センサーデータを送信
  8. 5分間ディープスリープに入る
  9. 1に戻る

また消費電流を減らすため下記の対策を入れています。基本方針は「余計な電波を出さない・動作時間は短く」です。
  • ステーションモードに設定
    初期モードはステーション+APモード。APモードではSSIDを通知するためにビーコンを送信しています。このビーコンを送信しないようステーションモードに変更しています。
  • LightSleepモードに設定
    データシートによるとModemSleepよりLightSleepのほうが消費電流が少ないのでこのモードに設定しています。
  • 固定IPアドレス設定
    DHCPのやり取りが不要になるので余計な通信が減って接続時間が短縮されます。

ThingSpeak接続時にIP直指定にするとThingSpeakへの接続時間が短くなるはずですが今回は試していません。


グラフを表示する

メニューバーの Channels > MyChannels から先ほど作成したチャンネルを開くと、ThingSpeakに送ったデータが自動的にグラフとして表示されます。グラフ右上の鉛筆マークを押すとグラフをカスタマイズすることができます。


動作時間

1000mAの電池で約20日動作しました。1000mAで30日を目標にしていたのですがなかなか厳しいです。データを溜めてまとめて送るなど対策が必要です。ただThingSpeakは15秒に1回しかAPIを呼び出せないのでまとめて送るとその分動作時間が延びてより多く電力を消費してしまいます。これについてはまた次回。




ワイヤレスマウスの修理

Posted by arms22 on 2016年11月04日 0  0

無線マウスを修理

壊れて動かなくなっていたワイヤレスマウス(型番:BSMOW07BW)を修理しました。写真中央のダイオードがグラグラしていて接触不良を起こしていました。子供が「新幹線、新幹線」といって遊んでいる時に何度も落としていたので半田が割れてしまったのでしょう。ハンダ面のランドが剥がれていたので部品面からはんだづけし直したところ正常に動くようになりました。

黒いワイヤは電池ボックスのマイナス端子につながっています。このダイオードは電池の逆挿入防止用だと思いますがなぜか立てて実装されていました。後から無理やり実装した感じがします。

無線(2.4GHz)光学式マウス 5ボタン/横スクロールタイプ | バッファロー 
http://buffalo.jp/products/catalog/supply/input/mouse/wireless-optical/bsmow07/

このカテゴリーに該当する記事はありません。