2015年4月5日日曜日

モータのPID制御2(偏差無し制御,I制御)

一年以上期間が開きましたが,せっかくなんで前回の続きでも.

モーターでPID制御を使う,といった場合,何をしたいかというと,前回も述べたとおり
  • 一定の速度で回したい
  • ある角度で合わせたい
  • 指定した動作をさせたい
がありましたね.前回同様,2つめの「ある角度で合わせたい」という機能に絞ります.

前回は,指定された角度と現在の角度を引き算して,その差の分だけ入力するのがP制御という話をしました(したと思う).

今回は,PIDの二つ目のI制御(積分制御)について.

2013年12月8日日曜日

モータのPID制御1(サーボ制御の基礎,P制御)

久しぶりの記事があんなのだけでは少し寂しいので,よくあるPID制御について少し.
メカトロ系の研究室に配属されたこともあり,制御の話も少し耳にするので備忘録になれば.

まず,PID制御ってなんじゃ,って話.

Proportional(比例項),Integral(積分項),Differential(微分項)の3要素により
物体を制御する…
なんて言っちゃえばお終いなんですけど.それじゃちょっと...

一般的にモータ制御の目的というと,
  • 一定の速度で回したい
  • ある角度で合わせたい
  • 指定した動作をさせたい
とかですね.今回は2つめの,「ある角度で合わせたい」という機能に絞ってみます. たとえば,現在の角度から90度だけ回したい,とか.

高校生の頃は正直,やっすいギア付きモータしか知らなかったので,
「90度になったらOFFにすればいいじゃん」
とか思ってたんですけど.

実際には慣性力のよく効くモータ(e.g.ギア無しのモータとか)では,ON-OFFだと,
早すぎて回り過ぎ→モータを逆転させる→反対側に行き過ぎる
の繰り返し(振動)みたいになるんですよね.

これを解決するのがPIDなどの制御.(実際にはもっと色々あるけど)

とまあ,前置きはこれくらいで.

PIDってなんじゃ,っていう僕の高校時代くらいの人が読めるレベルで書いてます.

2013年11月24日日曜日

近況

お久しぶりです.
ちょうど一年ぶりくらいです.サボりすぎ.

ちょうど一年前に研究室への配属がありまして(本学では3年の後期配属),研究なんかをちょこちょこやってたわけです.
その配属の頃,先生から「国際会議に出てみないか?」と言われまして,その準備やらで一年が過ぎていました.

場所はオーストリアのウィーンで,IEEEという学会が主催するIECONとかいうカンファレンスでした.
修学旅行以外では初の海外なのに現地集合・現地解散.しかも一人.怖すぎ.



こんな感じの会場でやってました.
論文の著者は先生で,自分がプレゼンターとして参加した形です.

内容は,
PFC制御系と,スミス補償器を用いたPID制御系でのバルーンアクチュエータの制御性能の比較
という感じです.

発表に関してはボコボコにやられました.なんてったって初めての学会だもの.
なぜ初めてが国際会議なんだろう
でもみんな優しかったです.来年もちゃんと勉強して再チャレンジしたいなあ.


あと,学会は3日間あったんですけど初日にあったウェルカムパーティ,通称Banquetですが,規模が凄絶で壮大でした.



これ全部投稿者なんだぜ…

この大人数の中,とてもぼっちしてました.怖い.
日本人の学生も多かったですが,みんな仲間内で固まってたなあ.

まあこんな感じでやってました.

この国際会議が今月終わり(11/9-15でした),少し余裕が出来たので更新.
またぼちぼち増えるかもです.

2012年11月18日日曜日

UbuntuでのAVR開発

AVRマイコンをUbuntu上で開発しよう、という試み。
といっても先駆者が結構たくさんいるので
玉虫色に染まれ!さんの手順をそのまま実行すれば問題なく動作するかも。
http://d.hatena.ne.jp/over80/20090302/1236006771

統合開発環境はありません。曰く、
"「初めに言いますが、いわゆる「統合開発環境」的なものはありません。そういったものが欲しい人は素直にWindowsで開発していた方が幸せでしょう。Linuxでやろうと思う人は「エディタは自分の好きなものを使わせろ!」とか「GUIだといちいちマウスに持ち替えなきゃあかんやろ。CUIでやらせろ!」とか言い出すような人です。"
ということみたいです。
Ubuntuに限らずLinuxを敢えて利用するってことはそれなりの信念があるのでしょう。
もちろん主にコマンドでの操作です。

詳細は続きから。

2012年11月4日日曜日

lagrange補間

離散した複数の点を結ぶlagrange補間法。
あんまり実用的でないらしい。

ソース内で複数の点(x,y)を設定し、プログラムを実行することで補間すべき点(x,y)を列挙したファイルlag_dat.i10と補間曲線上の適当な刻み幅の点(x,y)を列挙したファイルlag_dat.o10を作成。
また、それをgnuplot上に描画するためのプロットファイル*.pltを作成する。

lagrange補間は任意の数の点(x,y)を滑らかな曲線でつなぐ関数を求める。
2点なら直線で繋げる、3点なら2次曲線で繋げる、4点なら3次曲線で繋げる、といった事象を利用している。

説明もそこそこに以下リスト。
indent FILENAME -kr -i8
を使うと幸せ。

2012年8月30日木曜日

DCモータのPWM制御

最近のモータ制御では主流となっているPWM(Pulse Width Modulation)での制御をしてみた。

目的は
1.モータをPWMでドライブする。
2.可変抵抗(ボリューム)で回転数が変えられる。
3.正転、逆転が可能。
の3つ。
大昔の授業でマイコン制御のサンプルとして持ってきてもらったので良い実験材料かと。

で、まあ必要なのがボリュームの位置を読むAD変換と、
出力用のPWMという訳で。

PWM自体はやったことあったので2時間あれば組みきれると思ったら大間違い。
原因はプログラム特有の問題(オーバーフロー)だったりモータ特有の問題(突入電流など)だったり。


まず、手持ちでAD変換ができるチップがATMEGA88Pだったのでこれを使用。
データシートを見ると11番(PD5)と12番(PD6)がPWMの出力端子で、
23〜28番(PC0〜PC5)がAD変換用に使える。

PWM用の端子もたくさんあるみたいだけど今回はOC0xしか使わないので。

モータードライブにはTOSHIBAのTA8428K(S)を使用。
なければ自作でフルブリッジドライバを作るほかない。

ドライバはIN1がHIGH、IN2がLOWで正転、

IN1がLOW、IN2がHIGHで逆転、
両方LOWで開放、
両方HIGHでブレーキだったような気がする。
詳しくはデータシートを。


可変抵抗は今回特に何でもいいので適当。


プログラムリストは続きから。


今回、最も詰まった注意点を先に。
まず、volatile unsigned long でvalue を宣言しているけど、
途中で割り込み排除したのでvolatileは多分不要。

あと、これはint型ではオーバーフローしてしまう(最大値を超えてしまう)ので、必ずlong型に。
これに気づかずボリュームを上げてるのに、ある点で急に回転数が低くなってしまった。


もうひとつはマイコンの電源をACアダプタから取っていて、
ACアダプタが3Aまで流せるんだけど、そこにモータつないでたのも失敗だった。

やっぱりドライバには別電源が必要だと感じた。
モータの突入時(通電時)には大電流が流れるので、PWM制御でモータを動かすときには、
秒間何回も突入が起きて動作が不安定になる。

もっとACアダプタの定格電流が大きければ問題ないかもしれないけど、
今回は3Aだったので突入電流によってアダプタが落ちていたかも。
これに一番苦労させられた。

モータの通電時にアダプタが落ちて、一瞬後に復旧するわけだけど、
このときも通電時なわけでまたアダプタが落ちる。

このせいでモータが動いたと思った瞬間止まって、また動いてを繰り返す。
今回はPWM制御が目的だったから、この反応がむしろ正常に見えてデューティに問題がないかなどのプログラム上の問題を探しに行ったりもした。

また、モータドライバで2V程度電圧が落ちるらしいので、モータ用には少なくとも5V程度はほしい。
定格は30Vなのでよくある箱型の9V電池を使用した。


なので電源とオーバーフローには注意。
とくにAVRのAD変換器の出力は10bit(1024通り)なので。


プログラムの大まかな流れは、
AD変換の出力が0〜1023なので、半分の511で区切り、
0〜511が逆転、512〜1023が正転となってる。
ただし、511近傍では信号を与えない停止状態となってる。
この近傍の広さがdefineにあるBRANGEの値。

あと今回は可変抵抗の出力を電圧として読む必要が無いので、
0〜1023のままで使ってる。


では、以下リスト。

2012年8月10日金曜日

USBメモリからMacbookAir2012にUbuntuをインストールする

前回(http://hamachan-pon.blogspot.jp/2012/07/macbookair2012ubuntu.html)、
USBフラッシュメモリを利用したUbuntuのインストールについて言及したので。

なお、MacbookAir2012でしか確認していないのでWin機や他のMacでも同様に動作するかは不明。
あと、大抵の場合にはCDドライブついてるのでそちらを利用するととても便利。
また、外付けCDドライブでもインストール可能みたいなので持っているならそちらを利用。


この記事は
「CDドライブの付いていないPCに外付けCDドライブを購入することなくUbuntuをインストールする」
ためのものです。
また、作業をUbuntuで行なっているのでMacに無いコマンドがあるかも…。



本題。
簡単な流れは、
1.Macでのセットアップ
2.USBインストールメディアの作成
3.インストール
となってます。


詳しくは以下。


1.Macを起動し、rEFItをインストール
rEFItをインストールすることで、起動時にOSやUSBメモリを選択することが可能になります。
インストールはこのあたり(http://refit.sourceforge.net/)から出来ます。

2.パーティションの分割
Macの上部のメニューから移動→ユーティリティ→HDD(SSD)のパーティションを選択。
Mac側を適当に減らして空き領域を作る。
この際、「Mac,空き領域,空き領域(4GB)」のように、4GB程度(実際にはメモリの2倍だっけ)のスワップ領域を作成することが推奨されてますが、なくても問題なく動くという話もあります。

3.Ubuntuインストールメディアの作成
まず、公式(http://www.ubuntu.com/download/desktop)からUbuntuのisoイメージをダウンロード。64bit対応してるのかよく知らないけど32bit。
ダウンロード先はデスクトップにしておくとわかりやすいかな。

端末を開いて、
cd Desktop
など。カレントディレクトリをダウンロードしたisoイメージのあるディレクトリに移動すればOK。

このディレクトリで、
hdiutil convert -format UDRW -o FILENAME.dwg FILENAME.iso

とする。
FILENAMEはisoイメージの名前。
これでisoイメージを変換する。


ここでUSBメモリを差し込む。端末から、
diskutil list
でUSBメモリのデバイス名を確認。
今回は(/dev/disk1)だった。

確認できたらアンマウント。端末から
diskutil unmountdisk /dev/disk1
とするとアンマウントできる。


手順2で使ったディスクユーティリティからUSBメモリのパーティションを変更。
USBメモリをフォーマットする。(FAT32で)

さっきと同様にアンマウント(されてるかも)


次のコマンドを実行。
dd if=filename.dmg of=/dev/rdisk1 bs=1m
これでUSBに書きこんでます。
確認したデバイスの頭にrが付いていることに注意。
(/dev/disk1→/dev/rdisk1)

書きこみ完了まで十数分かかります。
/dev/disk1に書きこむと気が遠くなるほど長いので注意。


書き込みが終わったらUSBメモリの取り出し。
diskutil eject /dev/disk1



4.Ubuntuのインストール
作成したUSBインストールメディアを挿したまま、コンピュータを再起動。

するとrEFItにより選択画面が出てくるのでUSBメモリ(Ubuntu)を選択。

画面の流れに沿ってキーバインドなどの設定を行う。

Ubuntuのインストール先をパーティション分けした空き領域に入れる。
マウントポイントは「/」です。
同様に4GBの空き領域にはswapを設定。

両方ともフォーマットはext4でよいです。


ブートローダのインストール先を/dev/sdaに設定。

インストールの実行。




以上です。

記憶で書いてるのでなかなか間違いも多いかも。