ESP32でhello, world

 ESP32はWifiBluetoothを搭載する安価なマイコンです.
技適にも通っており,2018年9月号のinterfaceでも取り扱われているほど注目されています.

 今回は公式開発フレームワークであるESP-IDFのhello, worldを確認しました.

 基本的にESP-IDF Programming Guide通りの内容です.
省略している部分があるため,詳細な説明は公式を御覧ください.

 ※ユーザ名となっている部分は適宜変更してください.

開発環境

  • 開発ボード:ESP32-DevKitC(秋月にて約1500円)
  • OS:Windows 10

Setup Toolchain

 Standard Setup of Toolchain for WindowsにてツールチェインとMSYS2のzipをダウンロード.
記事公開時点ではesp32_win32_msys2_environment_and_toolchain-20180110.zipが最新.
解凍したmsys32フォルダC:\に移動し,C:\msys32\mingw32.exeを起動.

 ※ 以後のコマンドはmingw32.exeで実行すること.

 ESP-IDFをダウンロード.

$ mkdir esp
$ cd ~/esp
$ git clone --recursive https://github.com/espressif/esp-idf.git

 esp-idfのパスを通す.

$ cd /c/msys32/etc/profile.d
$ echo export IDF_PATH="C:/msys32/home/ユーザ名/esp/esp-idf" > export_idf_path.sh

mingw32を再起動し,パスの確認する.

$ printenv IDF_PATH
C:/msys32/home/ユーザ名/esp/esp-idf

Connect ESP32 to PC

 USB to UART Bridge VCP Drivers | Silicon Labsからドライバをインストール.

 開発ボードを接続し,デバイスマネージャにてCOMポートを調べる.

f:id:htn_hs:20180831194302p:plain:w400
バイスを調べる
 COM3として認識されていることが確認できる.

Start a Project

 デフォルトのシリアルポートを設定する.

$ cd ~/esp
$ cp -r $IDF_PATH/examples/get-started/hello_world .
$ cd hello_world
$ make menuconfig

f:id:htn_hs:20180831233532p:plain:w400
シリアルポートの設定
 Serial flasher config > Default serial portCOM3に設定. <Save>して <Exit>

$ python -m pip install -r $IDF_PATH/requirements.txt # 必要なパッケージのインストール
$ make 
$ make flash # 書き込み
$ make monitor # Ctrl+]で終了.

 これで,Hello, world!の出力を確認できる.

 詳細な出力は以下の通り.

つまづいた点

  • C:\msys32\には似たようなものが他にあるがmingw32.exeで行うこと.
  • pythonserialが無いとエラーが出た場合は参考リンク1を参照.

参考リンク

  1. ESP-IDF の環境をWindows10につくる

  2. ESP32(ESP-WROOM-32)でLチカ (WindowsでESP-IDF使用)

I2Cで制御できるモータドライバモジュールDRV8830

 以前の記事ではTA7291PがPWMには不向きという事を書きました.
今回の記事ではPWMで制御できるDRV8830の動作確認をします.

DRV8830の概要

 DRV8830の特徴は以下の通り.(データシートより抜粋)

  • 安い(秋月で1個230円)
  • 内部DACにより電圧制御をしており,電源電圧が変化する電池用途に最適
  • 動作電圧が2.75~6.8Vと広い
  • 最大連続1Aまで出力可
  • 電源電圧,温度,電流(Current Limit と OCP)の保護機能

 モータに加わる電圧が指定した電圧になるようにPWMのデューティー比を変えるようです.
I2CアドレスはA0ピンとA1ピンを開放/GND/Vccとすることで最大9個まで変更できます.
保護機能が動作した場合にはFAULTピンがLowレベルになります.

 OCPは1.3A以上流れた場合にモータを停止させ,Current Limitは電流を制限しつつモータを回転させ続けます. Current Limitはモータの起動時に流れる突入電流を抑えるときに使えるようです.

回路

f:id:htn_hs:20180831152442p:plain:w500
回路図

 I2Cのプルアップ抵抗はAVRの内部プルアップがありますが,
波形がのこぎり波のようで不安だったので別途プルアップ抵抗を付加しました.

 A0とA1ピンは回路を簡単にするために開放としています.

 Current Limitは外部抵抗によって設定できます.

 R _ {sense} = 0.2 \ / \  I _ {limit}

今回は Current Limitによる制限電流を1Aとし,0.2Ωにしました.
データシートにはCurrent Limitを使わないなら直接GNDに接続しても良いと書いてありますが,
この抵抗がないとOCPによる保護が働いてモータが止まってしまいます.
電源を再起動させるかFAULTをリセットさせないと再度回せないので入れた方が良い.

実際の回路は以下の通り.

f:id:htn_hs:20180831134523j:plain:w400
実際に制作した回路

 0.2Ωは1Ωの抵抗を5つ並列させています.

 Current LimitによるFAULTが頻発していましたが, モータにノイズ除去用のコンデンサを追加したところ解決しました.

プログラム

// モータ正転 入力電圧 0.5V
#include <Wire.h>
enum {STANDBY, REVERSE, FORWARD, BRAKE};

void setup() {
  Wire.begin();
}

void loop() {
  double Vout = 0.5; // [V]
  byte drive = FORWARD;
  byte driverAddress = 0xC8 >> 1; // A0 開放 A1 開放
  byte controlAddress = 0x00;

  double Vref = 1.285; // 内部基準電圧

  // 出力電圧から送信データのフォーマットへ変換
  byte vset = (double) Vout / Vref * 16.0;
  byte data = drive | (vset << 2);

  Wire.beginTransmission(driverAddress);
  Wire.write(controlAddress);
  Wire.write( data );
  Wire.endTransmission();
}

 I2Cのアドレスはデータシートでは8bit分書かれていますが,
LSBは書き込みか読み込みのフラグなので上位7ビットがドライバのアドレスとなります.

 VSETと出力電圧の変換式はデータシートに書かれている

 V _ {out} = 4 \times V _ {ref}(V _ {set} + 1)\  /\  64

からVSETについて説いた式

 \displaystyle{ V _ {set} = \frac{V _ {out} }{V _ {ref} } \times 16 }-1

を使っています. ここで,Vrefは内部基準電圧1.285V.
実際にはVout=0の時に負の値となるのを避けるために-1を省略しました.
VSETは0x00〜0x05は予約となっていますが普通に動作します.

 無事モータが回り,DRV8830の動作を確認できました.
ただし,FAULTの原因を読み込んだりFAULTを解除する場合にはもう少し工夫が必要です.
ArduinoのI2Cライブラリでうまく読み込めなかったのでとりあえず保留.

参考リンク

  1. DRV8830を使ったDCモーターの制御(1): 猫にコ・ン・バ・ン・ワ

  2. 7-bit, 8-bit, and 10-bit I2C Slave Addressing – Total Phase

  3. I2Cモータードライバ・モジュール DRV8830 - サポート | ストロベリー・リナックス

3Dプリンタのフィラメント検知エラー回避方法

 先日購入した3Dプリンタ Anycubic i3 Mega 3Dを使用していたらエラーが頻発するようになりました.

f:id:htn_hs:20180731222601j:plain:w400
フィラメントの検知エラー『Lack of firament of firament monitor abnormal.』

 フィラメントが切れまたはフィラメント検知エラーとのこと.
フィラメントはまだ残っておりコネクタが接触不良でないことを確認しましたが直りません.

 調べてみるとフィラメント検知用の部品に原因があることが分かりました.

f:id:htn_hs:20180731222533j:plain:w400
フィラメント検知用部品

 フィラメントが入ると中のマイクロスイッチがONになり,コネクタ中の2本が短絡する仕組みのようです.
フィラメントを入れるとカチッとスイッチが押される音がします.

 テスターの導通チェックをしながら確認してみると, フィラメントの曲がり具合によってマイクロスイッチが離れてしまう模様.

f:id:htn_hs:20180731222539j:plain:w300f:id:htn_hs:20180731222548j:plain:w300
フィラメントを誤検知する状況.フィラメントが曲がると中のスイッチがOFFになる.

 原因が判明したのでフィラメントの検知を切ることにしました.
ブレッドボードに使うジャンパーピンをコネクタに挿します.

f:id:htn_hs:20180731222605j:plain:w400
ピンを短絡させて常にフィラメントを認識させる.

 とりあえずこれでエラーを回避できました.

 ただし,フィラメントが切れた時はフィラメントの大半がチューブの中に入り込んでしまいます.
フィラメントの交換に少し手間がかかるのでご注意ください.

3DプリンターAnycubic i3 Mega 3Dの購入

 Amazonで評価の良かったAnycubic i3 Mega 3Dという3Dプリンタを購入しました.

 価格は4万円台でしたが,10万円前後と造形物の品質はあまり変わらないとも言われているほどコスパが良い3Dプリンタです.何より出品者によるサポートが良いらしい.

 届いたので中身を開けてみました.

f:id:htn_hs:20180721112445j:plain:w480f:id:htn_hs:20180721112449j:plain:w480
箱の中身
 メンテナンスに必要な工具やゴム手袋などが入っていました.
PLAのフィラメント1kgや予備のホットエンドまで付属してくるのは嬉しい.

f:id:htn_hs:20180721112457j:plain:w480
組み立てた状態.

 組み立てはネジ8つと,コネクタを差し込むだけで完了.
キャリブレーションはマニュアルなので時間をかけて丁寧にやりました.
印刷面裏の四つ角のネジを回すことで調整できます.
付属してくるマニュアルは英語ですが,Youtubeや他のブログなど参考になる情報が転がっているので参考にすると良いです.

f:id:htn_hs:20180721112506j:plain:w480f:id:htn_hs:20180721112501j:plain:w480
印刷中

 付属してきたSDカードに入っているサンプルデータを印刷してみました.

 気にしていた音は長い距離を一気に動かすときだけ少し大きめな音がしますが,思っていたより大丈夫でした.
ヘッドを動かす音と冷却のためのファンを回す音が主な音なので, インクジェットプリンターを動かしつつパソコンのファンがフルで回っているのを想像してもらえば大体あっていると思います.
ただし,床に置いて使用すると振動が伝わってしまうので,今回は梱包材を下に敷いて音を軽減させています.
裏面に排気口があるので排熱がされにくくなりそうで注意が必要.

f:id:htn_hs:20180721112513j:plain:w480f:id:htn_hs:20180721112527j:plain:w480
印刷したサンプル

 フクロウの頭のシュッっとなっているところや頭に乗っかった花(?)まできれいに仕上がっています.

 3Dプリンタは初めてなので試しながら使いこなしていこうと思います.


使用後の注意

  • 土台を保護するため,造形物が冷えるまで土台から取り外さない
  • 熱による破損を防ぐため,ホットエンドが冷えるまで電源を切らない 

ubuntu 16.04 にてマウスのリマップ

f:id:htn_hs:20180716232848j:plain
マウスはキーボードの左側
 キーボードの右側は矢印やテンキーなどがあってマウスまでが遠いため, 右利きでもマウスは左手で操作しています.

 使っているKensingtonのマウスはWindowsMacではドライバの設定を変更することで左手用にボタンの役割を変更することができます.

 一方, ubuntuではマウスだけで簡単に設定できるような専用のドライバは存在しません. 調べてみると入力デバイスの設定ユーティリティであるxinputリマップさせるスクリプトを組んでブート時に実行させる事例が多いようです. しかし複数台でマウスやキーボードを共有させる場合は切り替える都度スクリプトが実行してくれないとリマップは有効になりません.

 そこでデバイスの認識時にリマップさせるスクリプトを実行させ,快適に左手マウスを使えるようにしました.


■ xinputによるリマップ

リマップのスクリプトを組むまでの手順は以下.

  1. xinputのインストール
  2. マウスボタンの番号確認
  3. 実際にリマップしてみる

1. xinputのインストール

$ sudo apt-get install xinput

xinputの動作を確認.

~$ xinput list # 認識されているデバイスのリストを表示
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Kensington Expert Wireless TB             id=10   [slave  pointer  (2)]
⎜   ↳ Gaming KB  Gaming KB                      id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Eee PC WMI hotkeys                        id=9    [slave  keyboard (3)]
    ↳ Gaming KB  Gaming KB                      id=12   [slave  keyboard (3)]

 今回はid=10Kensington Expert Wireless TBのマップを変更します.

 以降,Kensington Expert Wireless TBは目的のデバイス名に変更してください.

2. マウスボタンの番号確認

ボタンのマップを確認

$ xinput get-button-map "Kensington Expert Wireless TB"
1 2 3 4 5 6 7 8 9 10 11 12 13 

 1が主ボタン,3が副ボタン,...,とそれぞれの番号に役割が振られています.
デフォルトでは1から昇順になっています.

 どのボタンが何番目に対応するか確認

$ xinput test "Kensington Expert Wireless TB"
button press   1 
button release 1 
button press   3 
button release 3 
...

リマップ前は左図のようになっていました. これを右図のように,右側を主ボタン,左側を副ボタンとなるように変更します.

f:id:htn_hs:20180717201037j:plain:w200f:id:htn_hs:20180717201033j:plain:w200
ボタンマップ(左:変更前,右:変更後). 1は主ボタン,3は副ボタンを意味する.

 実際にリマップさせるコマンドは次.

$ xinput set-button-map "Kensington Expert Wireless TB" 3 3 1 4 5 6 7 1 

 1 2 3 ... と昇順になっていたのを変えてあげれば良いだけです. これで無事左手用にリマップされました.

 しかし,これではPCの再起動やマウスの抜き差しをするたびにリセットされてしまいます. 再起動に対しては「自動起動するアプリケーションの設定」に追記すれば解決するのですが、抜き差しに対しては意味ありません。

 そこで、マウスを認識したらコマンドが実行されるように工夫する必要があります。

■ udevによる認識時のリマップ

 udevというデバイス管理ツールを使えば,マウスの認識時にリマップコマンドを叩かせることができます.

具体的な手順は以下.

  1. atのインストール
  2. ルールの作成
  3. スクリプトの作成

参考リンク6の内容をほぼそのまま使わていただきました.

1. atのインストール

sudo apt-get install at

2. ルールの作成

 udevの動作は/etc/udev/rules.d配下に置かれたruleファイルで設定が可能です.

※正しいrulesファイルの書き方は参考リンク9をご覧ください.

$ sudo touch /etc/udev/rules.d/90-myrule.rules

mouse.rulesの中身を次のように編集します.

ACTION=="add", ATTRS{name}=="Kensington Expert Wireless TB", RUN+="/usr/local/bin/remap.sh"

 マウスが認識されたら/usr/local/bin/remap.sh を実行させるという内容です.
1行で書くというのも仕様なので注意してください.

3. スクリプトの作成

実際に実行させるスクリプトは2つ用意します.

$ sudo touch /usr/local/bin/remap.sh
$ sudo touch /usr/local/bin/remap_mouse.sh
$ sudo chmod 700 /usr/local/bin/remap.sh
$ sudo chmod 700 /usr/local/bin/remap_mouose.sh

remap.shの中身を次のように編集します.

#!/bin/sh
at now -f /usr/local/bin/remap_mouse.sh

remap_mouse.shの中身を次のように編集します.

#!/bin/sh
DISPLAY=":0.0"
USER="user_name" # ユーザー名に変更する
HOME=/home/$USER/
export HOME DISPLAY
DEVICE_NAME="Kensington Expert Wireless TB"

for i in `seq 0 9`
do
        if /usr/bin/xinput list | grep -q "$DEVICE_NAME"; then
                /usr/bin/xinput set-button-map "$DEVICE_NAME" 3 3 1 4 5 6 7 1
                break
        fi
        sleep 1
done                                                                                           

 user_nameは適宜自分のユーザー名に変えてください.

 remap.shが実行される瞬間はまだxinputがマウスを認識しないため,後の処理を進めつつ認識するまで10秒間待つようになっています(詳細は参考リンク6参照).

 環境変数が設定されていないのでコマンドは絶対パスで指定する必要があります. 環境変数DISPLAYやHOMEを設定しないと動かないので注意(なぜだろう?)・

 これでマウスが認識された時にリマップされるようになりました.

その他コマンド

その他役に立ちそうなコマンドを列挙しておきます.

$ lsusb # USB デバイスの情報を示す.
$ service udev status # udev サービスの状態を表示.ruleファイルのバグ確認用.
$ udevadm control --reload # ルールの適用.使わなくても大丈夫だった.
$ udevadm monitor --env # イベント環境を含めイベントを表示.
$ udevadm info -a -p $(udevadm info -q path -n /dev/video2) # dev/video2 の属性を表示

参考リンク

  1. Linux boxにUSBストレージを接続したとき勝手に同期するようにする | d.sunnyone.org
  2. udev の設定をカスタマイズする - いますぐ実践! Linuxシステム管理 / Vol.115
  3. udev の仕組みを理解する - いますぐ実践! Linuxシステム管理 / Vol.114
  4. udevに新しいルールを適応する - ktomoyaの日記
  5. Raspberry Pi 2 + systemd + udevで、USBデバイス挿入時にサービスを起動する - メモ的な思考的な
  6. UbuntuでBluetoothマウスの接続時に自動的に速度の設定を変更する方法 - うひょー(ブログ)
  7. udevルールの設定(Red Hat Enterprise Linux server 6以降の場合)
  8. udev - ArchWiki
  9. Writing udev rules

手元を照らすデスクライト

天井のライトでは手元が暗くなってしまうのでデスクライトを使用しています. しかし,モニタまで照らしてしまうと今度はモニタが見にくくなってしまいます.

モニタの下から手元を照らすライトを探してみると意外と無い. かろうじて次の商品が見つかりました. www.interiorhacks.com 固定がクリップであるため,モニタだけでなくタブレットにも使えるようです. ただし,電池駆動な上にAmazonのレビューを見るとあまり明るくないらしくイマイチ.

というわけでデスクライトをモニタに固定する部材を作りました. 用意したのはこちらのデスクライト.

www.amazon.co.jp

色温度を4色に変えられる上にUSBで電源の供給ができるLEDライトです. Amazonで3000円ぐらいで安いのにスタイリッシュでかっこいい.

ライトの部分だけキレイに取って,モニタに固定させたのがこちら!

f:id:htn_hs:20180715203443j:plain

ライトだけでなくBlueToothスピーカーも載せています. ライトの照らす角度は固定にしていますが,モニタを少し上向きにするなどで調整できます.

後ろから見るとこんな感じ.

f:id:htn_hs:20180715203217j:plain

ディスプレイの固定に使われるネジ穴を利用して取り付けしました. 今はERGOTRONのモニタアームを使っていますが, ネジの間隔などは規格化されているので色々なモニタアームに取り付け可能.

固定に使った板は厚さ15mmのMDF.加工は東急ハンズに図面渡してやってもらいました. 基板そのままテープ固定でひどい見た目ですが,タッチパネルなのでテープの上からでも触れば使えます.

モニタまで照らしていたデスクライトがひとまず満足できるようになりました. そのうち裏側の色々をキレイに作り直そうと思います.

TA7291PのPWM制御について

秋月でも購入できるモータドライバICにTA7291PというICがあります.
安価で5Vでも動作するため使いやすいICなのですが,PWM制御をする方法が大きく二通り見られるようです.

  • 制御電源端子VrefにPWM信号印加
  • IN1 or IN2 にPWM信号を印加したフリー←→CW/CCW

モータドライバの使い方について | うしこlog
TA7291P を使った小型モータ駆動回路 | マルツオンライン

後者はロジック側電源電圧とモーター側電源電圧が異なっていても回路の変更無く使える方法です.
特に縛りなく: モータードライバTA7291PでモーターのPWM制御

ところがTA7291P自体PWMに向かないという話もあり,どこまで高速に動作してくれるのか確認してみました.
TA7291P は PWM に向かない!?|夕焼けの漣

回路図

f:id:htn_hs:20170812200324j:plain

抵抗1Ω(10Ω10個並列)に約1A流れる電源電圧2.3Vに設定.
ハイサイドの実験時には1ΩをGNDに,ローサイドの実験時には1Ωをモーター側電源につなげています.

回路写真
f:id:htn_hs:20170812120414j:plain

実験環境
f:id:htn_hs:20170812130836j:plain

IN2をGND,IN1にPWM信号を入れれば正転(OUT1:HIGH, OUT2:LOW)・フリー
IN1をGND,IN2にPWM信号を入れれば逆転(OUT1:LOW, OUT2:HIGH)・フリー
と動作し,ハイサイドとローサイドの駆動の速さを確認できます.

ハイサイドを確認する時はIN1にPWM,ローサイドを確認する時はIN2にPWMを印加しました. PWM信号には20KHzデューティー比50%のPWM信号を使用しました.

実験結果

ローサイド側の波形 f:id:htn_hs:20170812121427j:plain

ハイサイド側の波形 f:id:htn_hs:20170812121437j:plain

緑が入力の矩形波,黄色がそれぞれOUT2,OUT1の波形になります.
ハイサイドとローサイド両方とも通電するまでに約10us程度の遅延が含まれている事が分かります.
今回の場合PWMの周期が50usですので,周期に対して大きな遅延です.

最後にOUT1とOUT2間に1Ωを接続し,2端子間の電源電圧波形を測定しました.
f:id:htn_hs:20170812122309j:plain
ピンク色がOUT1-OUT2で負荷に加わる電圧の波形です.

出力波形のデューティー比を測定すると約30%. 遅延の影響が大きく,入力したデューティー比と負荷に印加されるデューティー比が大きく異なってしまっています.

とりあえず回転数が変えられれば良いという場合には周波数を低くすれば問題ないですが,
なめらかにモータを回すために電流連続モードで駆動させたいという場合はkHzオーダーの周波数が必要になるようです.
NOTE - 回路設計編 - PWMドライブの設計

また,今回実験で使用した正転←→フリー方式のPWMではなく正転←→ブレーキ方式のPWMの方が回転数はデューティー比に対して線形になるようです.
DCモーター制御
しかし,データシートを確認すると正転とブレーキの切替時には100usのデッドタイムが必要なので正転←→ブレーキのPWM方式には向かないでしょう.

回転数などを制御したい場合には滑らかに回り,デューティー比に対して回転数が線形な特性が望ましいので他のICを使った方が良さそうです.

微分方程式の初歩をダイナミクスとして考え直す(3)

前回に引き続き,微分方程式を時間変化として考えていきます.

今回は次の微分方程式
\displaystyle \frac{dx}{dt} = ax + b
パラメータはaとbの二つ.

この微分方程式の解はCを任意定数とすると

\displaystyle x=Ce^{at} - \frac{b}{a} となります.

パラメータbにより項が一つ増えます.
定数変化法を使えば\displaystyle -\frac{b}{a}が出せるのですが,今回はグラフを使って説明していきます.

f:id:htn_hs:20170715222640p:plain
例としてこのグラフにa=-2,b=1として書き加えると

f:id:htn_hs:20170806175421p:plain

パラメータbにより,\displaystyle \dot{x} = 0の位置が\displaystyle x=0からズレたグラフになります.

今回は例として負の傾きを考えたので,初期値が任意の値でも\displaystyle \dot{x} = 0となる点へ収束していきます(安定).
したがって\displaystyle \lim_{t\rightarrow \infty}x(t) = -\frac{b}{a} = 0.5

定数変化法を使わずに簡単なグラフだけで\displaystyle \frac{a}{b}が出てきました.

改めて微分方程式の解を見ると

  • 第1項は減衰していく項
  • 第2項は収束後の値を示す項

となっていることが分かります.

例としてaが負の場合を考えましたが,aが正の場合は不安定に変わるだけです.

微分方程式の初歩をダイナミクスとして考え直す(2)

前回に続き,微分方程式を時間変化として考えていきます.

今回は次の微分方程式
\displaystyle
\frac{dx}{dt} = ax
パラメータは\displaystyle aのみ.

この微分方程式の解は \displaystyle c を任意定数とすると

\displaystyle x =  C e^{at} となります.

ここで,次のように軸を考えます.

f:id:htn_hs:20170715222640p:plain

縦軸を横軸の時間変化にとったグラフは非線形力学系でも安定性を考える時によく使われるグラフです.

パラメータ\displaystyle aを3つのパターン(正・負・ゼロ)に分けて描きます.

\displaystyle a = 1の場合
f:id:htn_hs:20170715224135p:plain

\displaystyle a = 0の場合
f:id:htn_hs:20170715224123p:plain

\displaystyle a = -1の場合
f:id:htn_hs:20170715224145p:plain

\displaystyle \dot{ }\displaystyle \frac{d}{dt}を示します.
なんてこともない,ただの直線ですが,

  • \displaystyle \dot{x} = 0になる場所
  • 直線の傾き(今回の場合パラメータ\displaystyle a

が重要になります.

なぜかと言うと,
\displaystyle \dot{x} > 0 の場合,\displaystyle xは増加していく
\displaystyle \dot{x} = 0の場合,\displaystyle xは変化なし
\displaystyle \dot{x} > 0の場合,\displaystyle xは減少していく
となるからです.

これを模式的にグラフに書き込むと

\displaystyle aが負の場合
f:id:htn_hs:20170715231237p:plain
赤矢印は\displaystyle xの変化の方向と大きさを示しています.
初期値がゼロから離れていてもゼロに収束していく様子(安定)が想像できると思います.

\displaystyle aが正の場合
f:id:htn_hs:20170715231251p:plain
初期値がわずかでもゼロから離れたら\displaystyle \pm\infty に発散していく様子(不安定)が想像できると思います.

\displaystyle a = 0では常に\displaystyle \dot{x} = 0となるため,変化はありません.

縦軸を横軸の時間変化にとったグラフを描き,直線の傾きのパラメータ\displaystyle aによって収束や発散が切り替わる事が確認できました.

改めて解を見てみると
\displaystyle x = e^{at+c} = C e^{at}
\displaystyle Cは初期値と対応)

aが負で初期値がいずれの場合でも,\displaystyle  \lim_ {t \rightarrow \infty} x(t) = 0(安定)

aが正で初期値がゼロの場合.\displaystyle  \lim_ {t \rightarrow \infty} x(t) = 0

aが正で初期値が非ゼロの場合.\displaystyle  \lim_ {t \rightarrow \infty} x(t) = \pm \infty(不安定)

であり,微分方程式の解はグラフで確認した振る舞いを再現できている事が分かります.

ちなみに,今回使ったグラフはテイラー展開と組み合わせることで更に複雑な安定性解析へと応用されます.

微分方程式の初歩をダイナミクスとして考え直す(1)

物体の運動や水の流れなどの時間とともに変化していく振る舞いは微分方程式で記述できます.

例えば,真空中でリンゴを1mの高さから静かに落下させた場合,リンゴの振る舞いは次の式で示されます.


\displaystyle \frac{d^{2}y}{dt^{2}} = -g

ここで\displaystyle y[m]は地上からのリンゴの高さ,\displaystyle g[m/s^{2}]は重力加速度,\displaystyle t[s]は時間です. 振る舞いが微分方程式で記述できれば,任意の時間での高さは決定されます.
(初期速度0,初期位置1)


\displaystyle \frac{dy}{dt}=-gt

\displaystyle y=-\frac{1}{2}gt^{2}+1

この式は次のような線を描きます.
f:id:htn_hs:20170715215714p:plain f:id:htn_hs:20170715215723p:plain

時間経過につれて落下速度は大きくなっていき,0.32sあたりで落下することがわかります. 徐々に加速していく様子は直感的にも一致するのではないでしょうか.

少し一般的な形である


\displaystyle \frac{d^{2}y}{dx^{2}} = c

として微分方程式を考えるより,あえて一手間加えて時間変化として考えた方が直感的に分かりやすい事があるかと思います.
微分方程式を解く手段としてラプラス変換など便利なものはあるのですが,直感的に理解するために今回のような考え方は便利です.

次はもう少し複雑な微分方程式について書こうと思います.