AIドアマンブラッシュアップ(表面実装品のESP32を回路に組み込んでプリント基板を作成)

乾電池による電源供給に続き、AIドアマンのブラッシュアップを行っていきます。
今回は、プリント基板の設計です。


ブレッドボード上ではESP32の変換ピッチ基板を使っていましたが、プリント基板上ではそうもいかないため、
変換基板上の実装をそのままプリント基板上に再現します。
具体的には、変換基板(AE-ESP-WROOM-32)の配線図を見ると、3V3端子に対して0.1μF,47μFのコンデンサがついているので、これを忘れずにつけておきます。
また、三端子レギュレータ(NJM2391DL1-33)のデバイスデータに関してはネット上にないため、新規に作成しました。
参考にしたのはこちら
そのうち自分で作ったデバイスデータを公開できたらいいのですが、、、、
githubで公開してみました!
(参考にしたサイト:
https://qiita.com/under_chilchil/items/ec9d0050c1e3fb6576de
https://qiita.com/harufuji/items/5e958a87d35a81216c03

公開URLはコチラ(ライブラリの中には他の部品も入ってますので無視してください)
https://github.com/taiotsukou/blog/blob/master/MyParts.lbr



そして、実際の回路図がこちらです。
ざっくりですが、上の方にあるのがレギュレータ回路で、右側にあるのがESP32のプログラム用端子、サーボモーター用の端子になります。
ESP32にはプログラム用の2個のタクトスイッチを接続しています。
f:id:mou-tsukareta:20190310235402j:plain


ボード図はこんな感じ。
f:id:mou-tsukareta:20190310235409j:plain


これを実際に作成してはんだ付けしたのがこちら。
f:id:mou-tsukareta:20190310235421j:plain


ここまでは順調なのですが、このあと少し詰まったのがプログラムの書き込み。
まずデフォルトの設定で書き込むと、なぜか書き込めない(Arduino IDEの画面で、Connecting...が続いてTimeoutする)。
試しに設定を変更(書き込みボーレート115200, 周波数40Hzに落とす)したところ、うまく書き込むことができました。
この原因を深く追及するつもりはありませんが、もしかしたら今回初めて挑戦したチップコンデンサに何か問題があるのか、コンデンサの容量値が間違っているのかもしれません。
・前者の理由:回路上でマルチメータで計測すると容量が0Fと表示されたため、もしかしたら故障した?次はDIP品で確実に実装した方がいいかも
・後者の理由:ESP32変換基板の回路図をみると、3V3には100uFと1uFのコンデンサが付いているが、部品名としてはC1が47uF、C2が0.1uFのものが明記されている。今回は部品名を信じて実装した。本当は100uFと1uFが正しいのかもしれない。
f:id:mou-tsukareta:20190311000833j:plain


とりあえず回路面でのブラッシュアップはここまでとします。

ラズベリーパイから秋月のユニポーラステッピングモータ(ST-42BYG020)を動かす

最近ラズベリーパイを始めました。
というのも、以前から自動でスマホを操作してくれるロボットを作りたいと考えていたからです。
また、最近流行りのラズパイが、お手軽に画像認識とアクチュエータ制御を同時にこなせるため、
この機会に触れてみようと思いました。
今回は最初のステップとして、ラズベリーパイからステッピングモータを動かしてみました。
どちらも初めての経験なので、いい機会になりました。

ステッピングモータの制御方法について

ステッピングモータには大きく分けて、ユニポーラとバイポーラという2つの方式があります。
今回使うのは秋月のユニポーラステッピングモータ(ST-42BYG020)となります。
このモータの端子は全部で6つあり、A,B,C,D,O,O'という名称がつけられております。
下図に示すように、それぞれの端子は2つのコイルと接続されており、
中間端子OもしくはO'に駆動電圧を印加した状態で、
A,B,C,D端子に決められた順番で電流を流すことでモーターが回転します。
f:id:mou-tsukareta:20190310214813j:plain


たとえば、電流を流す順番を
A→B→C→Dとすると正回転、D→C→B→Aとすると逆回転となります。
この駆動方式を1相方式と呼びます。
1端子に1度電流を与えた時の回転角度はデータシートに明記してあり、
このモータだと1.8[deg]です。


また、A→A+B→B→B+C→C→C+D→Dの順番(もしくは逆)で電流を流す方式を1-2相方式と呼びます。
この方式だとよりスムーズに動くらしいので、今回はこちらの方式を採用します。
下のタイミングチャートに示すように、こちらの方式のほうが、回転角度の分解能が細かく制御することができます。
f:id:mou-tsukareta:20190310003126j:plain
 

回路

今回実験した回路は以下のようになっています。
f:id:mou-tsukareta:20190310003517j:plain


速度や回転方向を制御するためにタクトスイッチを4つ配しています。
また、トランジスタには2SD1415を使っています。
このトランジスタについて、データシート上ではVceが9Vのときに、
Icを1A程度を流すためにはIbが0.3mA程度必要だと読み取れます。
ラズパイのポート電圧が3.3Vなので、机上計算では1.1kΩ必要ということになります。
今回は安全のために手持ちの抵抗1.5kΩ→1.1kΩ→3.3kΩと下げていくことで最適値を探りました。
結論としては、3.3kΩが最適となったので、この抵抗を採用します。


プログラム

関数rotate_spmに回転角度(マイナスで逆回転)を引数として与えることで、
決められた角度にモーターを回転できるようにしています。
rotate_spmは与えられた角度から電流を何回流せばいいかを計算し、
その回数分だけ関数enable_phaseをコールしています。
enable_phaseではタイミングに応じてA,B,C,D端子に電流を流すために、
実際にGPIOの電圧をHIGH/LOWしています。
動作速度はTPHS(1相あたりの時間)が長いほど遅く、短いほど速くなります。10[ms]~0.1[ms]まで確認しましたが、0.5[ms]が最速値だったのでこれを採用します(0.1[ms]ではモーターは回転しませんでした)。
また、タクトスイッチ毎の挙動は
90度、180度、、-90度、-180度回るように分けてみました。

import RPi.GPIO as GPIO
import time

# ポート番号の定義
SW1 = 25
SW2 = 8
SW3 = 7
SW4 = 12
SPM_A = 2
SPM_B = 4
SPM_C = 3
SPM_D = 5

# GPIOの初期化
GPIO.setmode(GPIO.BCM) # BCMモードに設定(GPIOのポート番号で指定する) BOARDモードだとピン番号(GND等含む)で指定する
GPIO.setup(SW1, GPIO.IN) # 指定ポートをinに設定
GPIO.setup(SW2, GPIO.IN) # 指定ポートをinに設定
GPIO.setup(SW3, GPIO.IN) # 指定ポートをinに設定
GPIO.setup(SW4, GPIO.IN) # 指定ポートをinに設定
GPIO.setup(SPM_A, GPIO.OUT) # 指定ポートをoutに設定
GPIO.setup(SPM_B, GPIO.OUT) # 指定ポートをoutに設定
GPIO.setup(SPM_C, GPIO.OUT) # 指定ポートをoutに設定
GPIO.setup(SPM_D, GPIO.OUT) # 指定ポートをoutに設定

# ステッピングモータ定数
TPHS = 0.0005 # 1相あたりの時間[s]
DPP = 0.9 # 1-2相励磁における1相あたりの回転角度[deg/phase]
NPHS = 8 # 1-2相励磁における相数

# 最後に通電したステッピングモータの相(1:A, 2:A+B, 3:B, 4:B+C, 5:C, 6:C+D, 7:D, 8:D+A)
phase = 1

# スイッチの状態をチェックする関数
def check_switch():
    ans = 0
    
    if (GPIO.input(SW1) == GPIO.HIGH):
        # チャタリング防止
        time.sleep(0.02)
        if (GPIO.input(SW1) == GPIO.HIGH):
            print("sw1")
            ans = 1
    elif (GPIO.input(SW2) == GPIO.HIGH):
        # チャタリング防止
        time.sleep(0.02)
        if (GPIO.input(SW2) == GPIO.HIGH):
            print("sw2")
            ans = 2
    elif (GPIO.input(SW3) == GPIO.HIGH):
        # チャタリング防止
        time.sleep(0.02)
        if (GPIO.input(SW3) == GPIO.HIGH):
            print("sw3")
            ans = 3
    elif (GPIO.input(SW4) == GPIO.HIGH):
        # チャタリング防止
        time.sleep(0.02)
        if (GPIO.input(SW4) == GPIO.HIGH):
            print("sw4")
            ans = 4
            
    # スイッチの状態をリターン
    return ans

# 指定相を通電する関数(1-2相励磁)
def enable_phase(phase):
    # A相の通電
    if ((phase == 1) or (phase == 2) or (phase == 8)):
        GPIO.output(SPM_A, GPIO.HIGH)
    else:
        GPIO.output(SPM_A, GPIO.LOW)

    # B相の通電
    if ((phase == 2) or (phase == 3) or (phase == 4)):
        GPIO.output(SPM_B, GPIO.HIGH)
    else:
        GPIO.output(SPM_B, GPIO.LOW)

    # C相の通電
    if ((phase == 4) or (phase == 5) or (phase == 6)):
        GPIO.output(SPM_C, GPIO.HIGH)
    else:
        GPIO.output(SPM_C, GPIO.LOW)

    # D相の通電
    if ((phase == 6) or (phase == 7) or (phase == 8)):
        GPIO.output(SPM_D, GPIO.HIGH)
    else:
        GPIO.output(SPM_D, GPIO.LOW)

    # 通電時間待機
    time.sleep(TPHS)

# 通電終了関数
def disable_phase():
    GPIO.output(SPM_A, GPIO.LOW)
    GPIO.output(SPM_B, GPIO.LOW)
    GPIO.output(SPM_C, GPIO.LOW)
    GPIO.output(SPM_D, GPIO.LOW)

    # 通電時間待機
    time.sleep(TPHS)

# 指定した角度だけステッピングモータを正回転(もしくは逆回転)させる関数(1-2相励磁)
def rotate_spm(deg):
    # グローバル変数の指定
    global phase
    
    # 相数算出
    phase_num = round(abs(deg/DPP))

    # 算出した相数分だけ現在相から進める
    for i in range(phase_num):
        # 相を1つだけ進める(もしくは戻す)
        if (deg > 0.0):
            phase += 1
        else:
            phase -= 1
            
        # 余りを計算して相のオーバーを吸収する
        phase %= NPHS

        # 現在相を通電する
        enable_phase(phase)
        
# メイン処理
try:
    # フラグの宣言
    flg = 0
    
    # 繰り返しスイッチの状態を確認してフラグをセットする
    while True:
        # スイッチの状態をチェック
        flg = check_switch()

        # フラグに応じてモータを制御する
        if (flg == 1):
            # 90度正転
            rotate_spm(90.0)
            
        elif (flg == 2):
            # 180度正転
            rotate_spm(180.0)
            
        elif (flg == 3):
            # 90度逆転
            rotate_spm(-90.0)
            
        elif (flg == 4):
            # 180度逆転
            rotate_spm(-180.0)
            
        # 0.1秒待機
        time.sleep(0.1)
        
except KeyboardInterrupt:
    GPIO.cleanup()

実際の動作試験

実際に動作させたときの動画です。
180[deg]→90[deg]→-180[deg]→-90[deg]の順番で各4回ずつ回しています。
十分スムーズに回っているように見えますね。
vimeo.com


最後に

ステッピングモータはドライバが必要で制御が難しいものだという認識でしたが、
実際に触ってみると、ドライバを使わなくとも極めて単純に制御が可能であることがわかりました。
今後の開発に活かせる実験となりました。

EAGLEにおける部品の新規作成(デバイス)

前回に引き続き、EAGLEにおける部品の新規作成、デバイス編です。


ライブラリを開き、「Add Package」ボタンを開くと表示されるダイアログで、「New Package Name」に新しい部品の名前を入力して「OK」をクリック。
「新しいデバイスを作りますか?」の質問も「OK」をクリックすると、デバイス編集画面が表示される。
f:id:mou-tsukareta:20190305103340p:plain
f:id:mou-tsukareta:20190305103350p:plain


まずはシンボルを登録します。
ウィンドウ左部の「Add」ボタンをクリックし、新しく作成したシンボル(ここでは「HT7750A」)を選択して「OK」をクリックすると、シンボルの配置ができるようになるので、原点にカーソルを合わせてクリックして配置する。
f:id:mou-tsukareta:20190305103358p:plain


次に、パッケージを登録します。
バイス編集画面の「New」ボタンをクリックし、新しく作成したパッケージ(ここでは「HT7750A」)を選択して「OK」をクリックするとパッケージが登録される。
f:id:mou-tsukareta:20190305103406p:plain


最後にシンボルとパッケージのピンを対応付けます。
バイス編集画面の「Connect」ボタンをクリックすると、Connectダイアログが表示される。Pin(シンボル作成時に設定したピン名称)とPad(パッケージ作成時に設定したピン名称)をそれぞれ対応するものを選択した状態で、「Connect」をクリックすると当該ピンの対応付けが完了する。対応付けが完了したピンは「Connection」の欄に表示される。この対応付けをすべてのピンに行ったのち、「OK」をクリックする。
f:id:mou-tsukareta:20190305103413p:plain
f:id:mou-tsukareta:20190305103421p:plain
f:id:mou-tsukareta:20190305103428p:plain

EAGLEにおける部品の新規作成(パッケージ)

前回に引き続き、EAGLEにおける新規部品作成、パッケージ編です。



ライブラリを開き、「Add Package」ボタンをクリックすると表示されるダイアログで、「New Package Name」に新しい部品の名前を入力して「OK」をクリック。
「新しいパッケージを作りますか?」の質問も「OK」をクリックすると、パッケージ描画画面が表示される。
f:id:mou-tsukareta:20190304174447p:plain
f:id:mou-tsukareta:20190304174454p:plain


パッケージ描画画面で、グリッド設定を「0.1ミリ」に設定する(以後、描画のしやすさに応じて適宜変更してください)。
f:id:mou-tsukareta:20190304174503p:plain
f:id:mou-tsukareta:20190304174510p:plain


ウィンドウ左部の「Line」ボタンをクリックし、基板上に印刷される部品形状を描画していきます。ウィンドウの原点位置(十字マーク)を中心として、部品の四角い形状を書いていきます。このとき、ウィンドウ上部のレイヤ設定メニューで「21 tPlace」を選択してください。これが部品形状のシルク印刷を表すレイヤになります。
なお、正確な位置の確認は、左上の座標を見ながら進めるとスムーズです。
f:id:mou-tsukareta:20190304174517p:plain


続いて、ピンの部分の形状も書いていきましょう(といいつつ、これは書いても書かなくてもいいと思います。。)
ウィンドウ左部の「Rect」を選択した状態で描画してください。なお、レイヤは先ほどと同じく「21 tPlace」を選択します。
ただ、いきなり正確な位置にピンの形状を書くには、座標を計算する必要があるのであまりお勧めしません。まずは、原点を基準としてピンのサイズの形状を描画した後で、正確な位置に移動させるやり方がいいと思います。
f:id:mou-tsukareta:20190304174524p:plain
f:id:mou-tsukareta:20190304174531p:plain


こうして、全てのピンを描画します。
f:id:mou-tsukareta:20190304174538p:plain


次に、ウィンドウ左部の「Smd」ボタンをクリックし、実際にピンをはんだ付けする領域を描画していきます。レイヤ設定は「1 Top」を指定します。実装部分の領域サイズは、ウィンドウ上部の「Size」から設定します。
実装部分のサイズは、実際のサイズよりも大きめに設定した方がいいです。先に描画しているピン部分のシルク印刷と比較しながら、十分大きな領域を取ってください。
※表面実装部品ではなく、DIP品の場合、「Pad」ボタンからドリル穴の開いたパッドを設定します。
※推奨のパッドサイズが公開されているものもあります。例えば、HT7750AはSOT-23と呼ばれる規格のサイズであり、ネットで「SOT-23 寸法」や「SOT-23 footprint」などで検索すれば、メーカーが公開しているパッドサイズが出てきます(チップ抵抗とかは、データシートの評価試験時のフットプリントとかを参考にすると良さそうです。)。このようなデータがあるならば、先にはんだ付けする領域を描画して、後からシルク印刷を描画した方が効率がいいと思います。
f:id:mou-tsukareta:20190304174545p:plain


シンボルの時と同様に、ウィンドウ左部の「Name」ボタンをクリックし、更に設定したピンをクリックすると、名称設定ダイアログが表示されるので、全てのピンの名称を設定する。
f:id:mou-tsukareta:20190304174551p:plain


シンボルの時と同様に、ウィンドウ左部の「Text」ボタンから部品名称・値の設定領域を「>NAME」、「>VALUE」という文字列として描画します。なお、「>NAME」は「25 tNames」、「>VALUE」は「27 tValues」のレイヤに設定します。
設定後、ウィンドウ上部の「File」→「Save」で保存してパッケージも完成。
f:id:mou-tsukareta:20190304174558p:plain

EAGLEにおける部品の新規作成(シンボル)

プリント基板を作成するとき、ライブラリにない部品があることがあります。このとき、新規に部品(シンボルとパッケージ)を作成する必要があるのですが、毎回参考書を見ながらだと時間がかかるので、必要な時にすぐ確認できるよう自分なりにまとめてみました。シンボル、パッケージ、デバイスに分けてまとめていきます。AIドアマンには結局採用しなかったHT7750Aを例とします。

まずはライブラリを開き、「Add Symbol」ボタンを開くと表示されるダイアログで、「New Symbol Name」に新しい部品の名前を入力して「OK」をクリック。
「新しいシンボルを作りますか?」の質問も「OK」をクリックすると、シンボル描画画面が表示される。
f:id:mou-tsukareta:20190227164211p:plain
f:id:mou-tsukareta:20190227164218p:plain

シンボル描画画面で、グリッド設定を「0.1インチ」に設定する(シンボルの作成終了まで変更しないでください)。
f:id:mou-tsukareta:20190227164230p:plain
f:id:mou-tsukareta:20190227164235p:plain


「Pin」ボタンをクリックすると、ピンの設定準備状態になる。ここで、ウィンドウ上部のピンの長さの設定ボタンで「0.1インチ(右から2番目)」を選択しておく
f:id:mou-tsukareta:20190227164244p:plain

この状態で、描画画面で左クリックすると、実際にピンが設定される。
ピンの円が外側(接続端子側)、直線が内側(部品側)を向くように、ピンを設定する。
なお、ピンの向きは、右クリックするか、ウィンドウ上部のピンの角度ボタンで行う
f:id:mou-tsukareta:20190227164251p:plain

ウィンドウ左部の「Name」ボタンをクリックし、更に設定したピンをクリックすると、名称設定ダイアログが表示されるので、全てのピンの名称を設定する。
f:id:mou-tsukareta:20190227164258p:plain
f:id:mou-tsukareta:20190227164308p:plain
f:id:mou-tsukareta:20190227164318p:plain


ウィンドウ左部の「Change」ボタンをクリックし、「Direction」→「pwr」をクリックする。
この状態で、ピンをクリックすると、クリックしたピンが「電源を必要とするピン」(GNDも含む)として設定される。この例では、LXとGNDが該当する。
同様の手順で、他のピンについても適切な「Direction」を設定する。
※抵抗やセラコン、スイッチ等の受動部品は「Pas」を指定する。
※正しく設定していれば、配線チェック時に、「IOピンと電源がつながってるよ!」とか怒ってくれます。逆に間違って設定していると、正しく配線しているのに間違っていると言われちゃうので、とりあえず全部「io」にして、配線チェック時のエラーは無視でもいいと思います。
「Change」ボタンから設定できる項目に、「SwapLevel」という設定があります。
例えば、抵抗やセラコンなどの極性が存在しない部品は、端子の接続を入れ替えても問題ありません。この場合、交換可能な端子同士を同じ「SwapLevel」にすることで、実際の配線時にクロスを避けやすくなります。
f:id:mou-tsukareta:20190227164324p:plain

ウィンドウ左部の「Line」ボタンをクリックすると、直線描画準備状態となります。
描画画面上でクリックすると、直線が描画されます。これによって、シンボルの図形を描画します。
このとき、レイヤにはかならず「94 Symbols」を指定します。
f:id:mou-tsukareta:20190227164329p:plain
f:id:mou-tsukareta:20190227164334p:plain


最後に、部品の名称・値を描画します。
ウィンドウ左部の「Text」ボタンをクリックし、表示されるダイアログで「>NAME」を入力して、「OK」をクリックすると、文字列を配置できる状態になる。
ここで、ウィンドウ上部のレイヤ設定メニューから「95 Names」を選択した状態で、文字列を配置したい位置で左クリックすると、「>NAME」という文字列が配置される。
上記の手順と同様に、「>VALUE」という文字列も配置する。ただし、レイヤの設定に関してのみ「96 Values」とすること。
これにより、Schematic画面において実際に配線するとき、「NAME」、「VALUE」ボタンで部品の名称と値を設定・反映できるようになる。
設定後、ウィンドウ上部の「File」→「Save」で保存してとりあえずシンボルは完成。
f:id:mou-tsukareta:20190227164340p:plain
f:id:mou-tsukareta:20190227164346p:plain

ESP32+サーボの電源を乾電池から供給する

ここのところ、以前作成したAIドアマンのブラッシュアップを行っています。
まずはコンセントから供給していた電源を乾電池で供給することにしました。


そこで課題が2つ
①なるべくコンパクトにまとめたいので、乾電池は最小個数に留めたい
②ずっと愛用していた3.3Vの三端子レギュレータ(TA48M033F)が秋月でもう扱っていない


①に関しては、HT7750Aというお手軽に昇圧できるICを発見したため、これを試してみることにしました。
②に関しては、将来的にドローンへも適用することを考えると、電流容量が大きめのものが良かったのですが、なかなかDIP品でちょうどいいものが見つかりませんでした。仕方ないので、NJM2391DL1-33という表面実装のレギュレータを使っていきたいと思います。


いきなり基板に起こす勇気はないので、ブレッドボードで実験してみました。
HT7750AもNJM2391DL1-33も1.24mmピッチの変換基板が売っていますので、そちらを使いました。
配線図は下の写真です。
乾電池からの電圧をHT7750Aで昇圧し、サーボへ供給します。
また、更に昇圧した電圧をNJM2391DL1-33へとINして3.3Vを生成してESP32へと供給します。
f:id:mou-tsukareta:20190223234828j:plain


まずはESP32とサーボは使わずに、本当に昇圧できているのか、単三エネループ君(1.2V)で試してみます。
これがNJM2391DL1-33からの出力電圧。ちゃんと3.3Vでてますね。
f:id:mou-tsukareta:20190223234856j:plain


これがHT7750Aからの出力電圧。これだけ見ると確かに5Vまで昇圧できているようです。
f:id:mou-tsukareta:20190223234846j:plain


さて、本番の動作試験ですが、最初のパターンは単四エネループ君(1.2V)を4本で試すことにしました。
が・・・・結果だけ書きますと、失敗でした。
ESP32は動作しますが、サーボが動きませんでした(小さい音がして動かない)。
もしかしたら、HT7750Aの供給できる電流には限界があるのかもしれません。
HT7750Aを介さず直接乾電池からサーボへ供給した場合はうまく動きました。


ちなみに、単四エネループ君を3本に減らして同様の回路でESP32に電源供給(サーボはなし)したときの、NJM2391DL1-33からの出力電圧を図ったのが下の写真です。
3.3V出ててほしいところ、3.1Vくらいまで落ちてしまっているのがわかります。
f:id:mou-tsukareta:20190223234905j:plain


同様に、単三エネループ君1本のときは2V付近まで落ちてしまっていました。
ESP32も正常に動きません(少なくとも、スマホ側からBluetoothを拾えなかった)。
f:id:mou-tsukareta:20190224001601j:plain



以上の結論として、HT7750Aを用いてサーボ駆動を試みたが、動作しなかった。
また、乾電池1本(1.2V)を昇圧→レギュレートしたとしても、ESP32は正常に動作しなかった。


HT7750Aを安定して使うにはなにかテクニックがあるのでしょうか?
とりあえず、単4エネループ4本でHT7750Aを使わずに進めていきたいと思います。

完全自作ドローン初浮上

試行錯誤し続けていた自作ドローンが、ようやく浮上成功しました(と言っても一瞬ですが)。
f:id:mou-tsukareta:20190204225352j:plain

概要を動画にまとめています。
vimeo.com


以前に比べての大きな変更点は
・モータドライブ用のトランジスタを変更
・センサを加速度センサ+ジャイロセンサの組み合わせから、MPU9250に変更
・ガムテープで固定していたバッテリーを、機体下に収納できるように変更
f:id:mou-tsukareta:20190204015735j:plain

AndroidスマホからBluetoothで操作できるようにしており、機体の傾きをスマホで確認できます。
f:id:mou-tsukareta:20190204015658j:plain

重量と基板面積を抑えるために、部品は極力実装部品を使うようにしています。
結果として、重量は50g以内に収まりました。
f:id:mou-tsukareta:20190204015630j:plain

ぱっと思いつく今後の改善点として、
・モータドライブ部を別基板にして独立させることで、高価なセンサ・無線モジュールを使いまわせるようにする。
・姿勢制御の安定化
トランジスタのパッド面積を広げる
・入手不可になったTA48M033Fの代わりを見つける。
もしかすると電流容量0.5A以上の小さめのDIP型3.3Vレギュレータが存在しない?


将来的には、室内で物品を運搬するドローンに発展させていきたいです。
天井にカメラを設置してドローンを誘導する感じのやつです。