暇人の技術備忘録

ハサミの技術備忘録

趣味でやっている電子工作の備忘録です。

【自作ドローンの製作Ⅱ】第3回:機体のスペック紹介

f:id:sbasami:20210816145401p:plain

はじめに

第2回ではモチベーションの関係からドローン製作を中止するお知らせを出しました。

sbasami-tech.hatenablog.com

しかし、フレームのアイデアを思いついたことによってモチベーションを取り戻し、なんとかハードウェア製作を完了しました。

よって、第3回はハードウェアについてのまとめになります。

製作したドローン

今回製作した自作ドローンを以下に示します。特徴としてロッドの部分にサーボモータを取り付けて推力方向を変える機構を搭載しています。

f:id:sbasami:20210816141649j:plain

サーボを動かした時の動画が以下になります。なんでこんな機能を搭載したかについては第1回を見てください。

youtu.be

機体スペック

サイズ 260×260×75mm
重量 205g
マイコン Teensy4.1
サーボモータ 150:1 シャフト付き超小型メタルギアドモーター HPCB 6V
サーボモータエンコーダ シャフト付き超小型メタルギアドモーター用磁気式エンコーダ
サーボモータドライバ デュアルモータードライバDRV8835
ESC RCX BS-15A Pro 4-In-1 BLHeli_S ESC
姿勢センサ BMI088自作モジュール
位置センサ VL53L0x/PMW3901搭載 ToF測距/オプティカルフローセンサモジュール
プロペラ 3x2.5" T-Type 3025 Multirotor Propeller
モータ RCX NK1108 6000KV FPV Racing Motor for Mini/Micro Drone
バッテリー 950mAh 25C 7.4V バッテリー (New V120D02S 2セルヴァージョン用)
受信機 R3206SBM
フレーム 3Dプリンタ(ナイロン素材)

本当は200g以下に抑えたかったけどわずかにオーバーしてしまいました。プロペラガード外せば多分200g以下だと思います。

ナイロン素材が思ってたより柔らかくてフレームがたわむので、飛行に影響でないか心配です。あと白いナイロンは汚れが目立ちます。

その他外観

裏から見た図。配線もスッキリしているので個人的に満足。

f:id:sbasami:20210816141732j:plain

斜めから見た図。今回もダンパつけてます。効果があるかはわからないけど市販ドローンには大体ついてるので真似してる。バッテリーはフライトコントローラの下に収まります。

f:id:sbasami:20210816141747j:plain

フライトコントローラ基板

今回のドローン用に以下の基板を作成しました。これがフライトコントローラとして機能します。

f:id:sbasami:20210816141809j:plain

まず、真ん中にBMI088とDRV8835が載っかります。

f:id:sbasami:20210816141859j:plain

BMI088は自作モジュールで下記で作成したモジュールを回路そのままで更に小型化したものです。

f:id:sbasami:20210816141911j:plain

sbasami-tech.hatenablog.com

その上にTeensy4.1が載っかります。

f:id:sbasami:20210816141948j:plain

最後にオプティカルフローセンサモジュールが載っかります。全部モジュール部品なのでどこか壊れても交換しやすいようにというのがコンセプトです。

f:id:sbasami:20210816142000j:plain

回路図

今回は回路図もモジュール化して再利用性を高めようとしましたが、まぁ分離するほどの回路ではなかったですね...。

パターン図

設計している時はこの配置で行けると思っていましたが、実際に実装してみると部品密度高すぎて辛かった...

f:id:sbasami:20210816143406p:plain

おわりに

今回は自作ドローン2号機のハードウェアについてまとめました。

今はソフトウェアの作成を頑張っています。次回は飛行している姿を見せたいですね。

なんとか飛びました↓↓↓

sbasami-tech.hatenablog.com

【STM32備忘録】SDカードの設定

f:id:sbasami:20210417145021p:plain

はじめに

SDカードの設定に関しては下記の動画がとても参考になった。というかこの動画見ればこの記事見る必要はない。

www.youtube.com

今回はCubeMXの設定のみメモしておく。

CubeMXの設定

SD関係の設定

  1. SDIOでModeをSD 4 Bits Wide busに設定。
    f:id:sbasami:20210425132757p:plain

  2. DMA SettingsでSDIO_RXを追加。
    f:id:sbasami:20210425132813p:plain

  3. 同様にSDIO_TXも追加。
    f:id:sbasami:20210425132824p:plain

  4. NVIC SettingsでSDIO global interruptにチェックを入れる。
    f:id:sbasami:20210425132842p:plain

  5. MiddlewareのFATFSでSD Cardにチェックを入れる。
    f:id:sbasami:20210425132851p:plain

  6. Advanced SettingsでUse dma templateをEnableにする。
    f:id:sbasami:20210425132901p:plain

  7. Set Defines でMAX_SSを4096に変更し、Generate Codeする。
    f:id:sbasami:20210425132912p:plain

  8. 以下のようなWarningが出たらYesをクリック。
    f:id:sbasami:20210425132921p:plain

おわりに

どんどんまとめが雑になっていく。

【STM32備忘録】覚えておくと便利な操作

f:id:sbasami:20210417145021p:plain

はじめに

前回はUSBに関する機能について書いた。

sbasami-tech.hatenablog.com

今回は番外編的な感じ。ここではCubeIDEなどで覚えておくと便利な操作についてまとめる。便利な操作を見つけたらその都度更新する予定。

便利な操作

コード補完

HAL_GPIOなどと打って「Ctrl」+「スペース」を押すとその先をコード補完で予測してくれる。
f:id:sbasami:20210418083503p:plain

宣言場所の検索

ソースコード上で使用されているdefine等がどこで宣言されているのかを検索できる。

  1. 検索したいdefine等を選択して右クリック、「Declarations」→「Workspace」をクリック。
    f:id:sbasami:20210418085810p:plain

  2. 右下のWindowに検索結果が出てくるのでダブルクリック。
    f:id:sbasami:20210418085852p:plain

  3. 宣言場所に飛べる。
    f:id:sbasami:20210418085906p:plain

宣言場所の検索2

こっちのほうが簡単だった。

  1. 検索したい関数等を選択して右クリック、「Open Declaration」をクリック。
    f:id:sbasami:20210425123844p:plain

  2. 宣言場所に飛べる。
    f:id:sbasami:20210425123912p:plain

複数行をまとめてコメント化する

  1. コメント化したい行をドラッグで選択して、右クリック。「Source」→「Toggle Comment」をクリックすれば複数行のコメント化、コメント解除ができる。
    f:id:sbasami:20210418182728p:plain

うまく行かない時の確認

Source Locationの確認

インクルードパスを通して.hファイルは認識するのに.cファイルを認識していない時の操作

  1. 認識しない.cファイルが入っているフォルダを右クリックし、「Properties」をクリック。
    f:id:sbasami:20210425124707p:plain

  2. Source Locationにフォルダを登録することで、そのパスにある.cファイルもビルドに含まれる。
    f:id:sbasami:20210425124843p:plain

おわりに

覚えておくと便利な操作についてまとめた。こういうのもメモっておかないと自分はすぐ忘れる。

次はSDカードに関して書きたいけど、まだ動作確認していない。

【STM32備忘録】仮想COMポートとしてUSB接続する、USBから直接書き込む

f:id:sbasami:20210417145021p:plain

はじめに

前回はシリアル通信について書きました。

sbasami-tech.hatenablog.com

今回は仮想COMポートとしてSTM32をUSB接続する方法とUSBから直接書き込む方法について書きます。

CubeMXの設定

USBの設定

  1. 「Connectivity」→「USB_OTG_FS」をクリック。Modeを「Devie_Only」に設定。設定するとチップ・ビューでUSBに対応したピンが勝手に有効になる。
    f:id:sbasami:20210422194307p:plain

  2. 「Middleware」→「USB_DEVICE」をクリック。Class For FS IPを「Communication Device Class」に設定。
    f:id:sbasami:20210422194333p:plain

  3. ここまで設定したら一度Clock Configurationを見てみる。以下のような画面になったら何か設定が競合していることになる。「Yes」をクリックすると自動で設定を変更して問題を解決してくれる。
    f:id:sbasami:20210422194346p:plain

  4. どうやらUSBの設定を行うと赤枠の部分は48MHzでないといけないらしい。
    f:id:sbasami:20210422194358p:plain

  5. ここまで設定したらGenerate Codeして、main.cにMX_USB_DEVICE_Init()ができていれば成功。
    f:id:sbasami:20210422194413p:plain

コールバック処理の実装

CDC_Receive_FSで受信、CDC_Transmit_FSで送信ができる。
f:id:sbasami:20210422194431p:plain f:id:sbasami:20210422194440p:plain

コールバックするだけなら、CDC_Receive_FSの中にCDC_Transmit_FS処理を入れるだけでできるので簡単。CDC_Receive_FSの引数"Buf"に受信データ、"Len"に受信データの長さが渡されるので、それをそのままCDC_Transmit_FSに渡して送信している。
f:id:sbasami:20210422194556p:plain

PCとNUCLEO-F411REの接続

使用部品

akizukidenshi.com

f:id:sbasami:20210422195145p:plain
"https://os.mbed.com/platforms/ST-Nucleo-F411RE/"より引用
f:id:sbasami:20210422195217p:plain
"https://os.mbed.com/platforms/ST-Nucleo-F411RE/"より引用
f:id:sbasami:20210422195237p:plain
"https://os.mbed.com/platforms/ST-Nucleo-F411RE/"より引用
f:id:sbasami:20210422195250p:plain
"https://os.mbed.com/platforms/ST-Nucleo-F411RE/"より引用

akizukidenshi.com

f:id:sbasami:20210422195405p:plain
"https://akizukidenshi.com/download/ds/akizuki/AE-USB-MICRO-B-D.pdf"より引用

配線

USBコネクタDIP化キットの「D+」をNUCLEO-F411REの「USB_DP」、「D-」を「USB_DM」のピンと繋ぐ。GNDも忘れずに。VBUSはUSBから5Vが給電されるので、これで駆動したい場合はNUCLEO-F411REの5Vに接続する。
f:id:sbasami:20210422195729p:plain

動作結果

打った文字が返ってくれば成功です。
f:id:sbasami:20210422195555p:plain

USB書き込み

今まではデバッガの方から書き込んでいましたが、USBからも書き込むことができるのでやってみます。

STM32CubeProgのインストール

まず、下記からSTM32CubeProgをインストールします。

www.st.com

書き込み手順

  1. STM32CubeProgを起動すると以下のような画面になるので右上のタブから「USB」を選択。
    f:id:sbasami:20210422195635p:plain

  2. NUCLEO-F411REの「BOOT0」ピンと「VDD」をショートさせた状態でリセットボタンを押してBOOTモードで起動します。
    f:id:sbasami:20210422195704p:plain

  3. NUCLEO-F411REがBOOTモードの状態で更新ボタンを押す。認識すればPortにUSB1と表示される。この状態で「Connect」をクリック。
    f:id:sbasami:20210422200249p:plain

  4. 接続されるとメモリ情報が読み出される。
    f:id:sbasami:20210422200300p:plain

  5. 左の三本線をクリックして出てくる、「Erasing & programing」をクリック。
    f:id:sbasami:20210422200312p:plain

  6. 下記のような画面になるので「Browse」をクリックして書き込むファイルを選択する。「Run after programing」にチェックを入れると書き込み後にすぐプログラムが実行される。
    f:id:sbasami:20210422200337p:plain

  7. 書き込みファイルはビルドした後、プロジェクト内の「Debug」フォルダにできる。.bin、.elfどっちを選んでも書き込めた。
    f:id:sbasami:20210422200401p:plain

  8. ファイルを選択したら「Start programming」で書き込める。
    f:id:sbasami:20210422200423p:plain

  9. 書き込み後に幾つかポップアップウィンドウが出るが「OK」を押す。以下のような画面になったら書き込めているはず。
    f:id:sbasami:20210422200434p:plain

おわりに

今回は仮想COMポートとしてSTM32をUSB接続する、USBから直接書き込む方法について書きました。

これでUSBを繋ぐだけでデバッグと書き込みができる。こんな簡単に実現できるとは思ってなかった、凄い。

次は何書くか...。

覚えておくと便利な操作について書いた↓↓↓

sbasami-tech.hatenablog.com

【STM32備忘録】RN-42を使用したシリアル通信

f:id:sbasami:20210417145021p:plain

はじめに

前回はタイマー割り込みの設定について書きました。

sbasami-tech.hatenablog.com

今回はRN-42とNUCLEO-F303K8を用いて無線でシリアル通信する方法について書きます。

CubeMXの設定

USARTの設定

  1. PA9をUSART1_TXに設定
    f:id:sbasami:20210418175554p:plain

  2. PA10をUSART1_RXに設定
    f:id:sbasami:20210418175619p:plain

  3. 「Connectivity」→「USART1」をクリックしてUSART1の設定画面を表示。「Mode」を「Asynchronous」に設定すると「Configuration」にデフォルトの設定が出てくる
    f:id:sbasami:20210418175634p:plain

  4. 「Baud Rate」を「115200」に設定
    f:id:sbasami:20210418175647p:plain

  5. 設定が終わったら「Ctrl」+「s」でGenerate Code。main.cにMX_USART1_UART_Init()が追加されていればOK。
    f:id:sbasami:20210418175707p:plain

エコーバックプログラムの作成

シリアルポートで受信したデータをそのまま送信することをエコーバックという。

適当なバッファ変数を宣言。
f:id:sbasami:20210418175721p:plain

char buff[1];

受信と送信の処理をmain文のwhile文の中に追加。あとはビルドして書き込む。
f:id:sbasami:20210418175732p:plain

HAL_UART_Receive(&huart1, (uint8_t *)buff, sizeof(buff), 0xFFFF);
HAL_UART_Transmit(&huart1, (uint8_t *)buff, sizeof(buff), 0xFFFF);

HAL_UART_ReceiveとHAL_UART_Transmitの引数をまとめると以下のような感じ。

HAL_UART_Receive HAL_UART_Transmit
第1引数 使用するCH 使用するCH
第2引数 受信データを格納する変数とか配列 送信データを格納する変数とか配列
第3引数 何バイト受信するか 何バイト送信するか
第4引数 タイムアウト時間 タイムアウト時間

RN-42とNUCLEO-F303K8の接続

使用部品

akizukidenshi.com

f:id:sbasami:20210418180133p:plain
秋月販売ページのマニュアルより引用

akizukidenshi.com

f:id:sbasami:20210418180234p:plain
"https://os.mbed.com/platforms/ST-Nucleo-F303K8/"より引用

配線

下記サイトを参考にしてください。使用しているのはArduinoですがそれをNucleoだと思って配線すればいけます。RN-42のCTSRTSはショートさせることを忘れないように。RN-42とPCのペアリングについても書いてあります。

qiita.com

動作結果

打った文字が返ってくれば成功です。
f:id:sbasami:20210418180640p:plain

おわりに

RN-42とNUCLEO-F303K8を用いて無線でシリアル通信する方法について書きました。今回はエコーバックだけですが本格的にデバッグで使用するならちょっと機能不足です。

そういった時は、下記のxprintfというものを使用するのがオススメです。

elm-chan.org

使い方は下記のブログが参考になります。

gsmcustomeffects.hatenablog.com

書き溜めてたものが尽たので次回は未定です。

USB関係の記事になりました↓↓↓

sbasami-tech.hatenablog.com

【STM32備忘録】タイマー割り込みの使い方

f:id:sbasami:20210417145021p:plain

はじめに

前回はGPIOの設定について書きました。

sbasami-tech.hatenablog.com

今回はタイマー割り込みの設定について書きます。CubeMXで設定をしてGenerate Codeし、タイマー割り込みでLチカします。

CubeMXでの設定

タイマー割り込みはクロックの設定も必要で内部クロックを使うか外部クロックを使うかなどで設定も変わってくるが、今回は内部クロックでTIM3のタイマー割り込みを使用する。

クロックの設定

  1. 外部クロックを使用する場合は最初に「System Core」→「RCC」でクロックソースの設定を行う必要がある。外部からクロックを入力する場合は「BYPASS Clock Source」、水晶振動子などを使用する場合は「Crystal/Ceramic Resonator」を選択する。
    f:id:sbasami:20210418125137p:plain

  2. クロック設定は「Clock Configuration」で行うことができる。TIM3はAPB1のクロックに基づいて動く、今回はデフォルトの状態で設定変更はしない。
    f:id:sbasami:20210418125155p:plain
    どのTIMがどのクロックに基づいて動くかはSTM32F303K8のデータシートを見ると分かる。

    f:id:sbasami:20210418125212p:plain

タイマーの設定

  1. 「Timers」→「TIM3」を見ると以下のような画面が表示される。
    f:id:sbasami:20210418125406p:plain
    因みにタイマーによって画面表示は異なる、以下はTIM6の設定画面。これは各タイマーが持っている機能の違い、TIM3は設定項目が多いので色々な機能を持っているということになる。
    f:id:sbasami:20210418125427p:plain

  2. 「Clock Sorece」で「Internal Clock」を選択すると、「Configuration」に設定項目が出てくる。因みに「⚠」のマークが表示されていたり、黄色くなっている場所は設定によっては機能が競合するということを教えてくれている。赤い表示は機能が競合するから設定できない。
    f:id:sbasami:20210418125459p:plain

  3. 「Parameter Settings」で「Prescaler」と「Counter Period」の設定を行う。下記は1秒毎に割り込みを行う設定。PrescalerとCounter Periodについては後で詳しく書く。
    f:id:sbasami:20210418125547p:plain

  4. 「NVIC Settings」でチェックボックスにチェックを入れる。これによって割り込みが有効化される。
    f:id:sbasami:20210418125603p:plain

  5. 設定が終わったら「Ctrl」+「s」でGenerate Code。main.cにMX_TIM3_Init()が追加されていればOK。
    f:id:sbasami:20210418125620p:plain

PrescalerとCounter Periodの設定

TIM3はAPB1の8MHzで動作するがPrescaler(分周器)によって更に動作周期を変更できる。今回はPrescalerを8kHzに設定したのでTIM3は1kHzでカウントアップするようになる。


\displaystyle{8000000Hz / 8000Hz = 1000Hz}

Counter Periodはタイマーのカウントが幾つになったら割り込みを発生させるかの値。今回は1000と設定したので1秒毎にタイマー割り込みが行われる。


\displaystyle{1000 / 1000Hz = 1s}

Counter Periodを500にすると0.5秒毎にタイマー割り込みが行われる。


\displaystyle{500 / 1000Hz = 0.5s}

因みにConfigurationで設定する時に「8000-1」や「1000-1」のように設定していたのは、プログラム上では0からスタートするので1引いた値を設定している。

Lチカプログラムの作成

タイマーを開始するには以下の関数を追加すれば良い。TIM3なのでhtim3、TIM6ならhtim6になる。
f:id:sbasami:20210418125706p:plain

HAL_TIM_Base_Start_IT(&htim3);

タイマー割り込みが発生した時に呼ばれるコールバック関数も追加する。HAL_TIM_PeriodElapsedCallbackは既に用意されている関数でタイマー割り込みが発生すると呼ばれる。引数のhtimに渡された値からどの割り込みが発生したのか判別し処理を行う。
f:id:sbasami:20210418125722p:plain

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim == &htim3){
        HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);//ピンの出力を切り替え
    }
}

あとはビルドして書き込めば1秒周期のLチカができるはず。

おわりに

今回はタイマー割り込みの設定について書きました。次はシリアル通信について書きたい。

書きました↓↓↓

sbasami-tech.hatenablog.com

【STM32備忘録】GPIOの設定方法とビルドと書き込み

f:id:sbasami:20210417145021p:plain

はじめに

前回はCubeIDEにおけるプロジェクトの作成方法について書きました。

sbasami-tech.hatenablog.com

今回はGPIOの設定方法について忘れない程度にまとめます。CubeMXでの設定とLチカプログラムを書いておきます。その流れでビルドと書き込みについても軽く触れておきます。

CubeMXでの設定

GPIOの設定

  1. 作成したプロジェクト内の.iocをダブルクリックするとCubeMXが立ち上がって以下のようなチップ・ビュー画面が出ます。
    f:id:sbasami:20210418082740p:plain

  2. 設定したいピンをクリックすると、そのピンに設定できる機能が表示される。今回は「GPIO_Output」を選択。
    f:id:sbasami:20210418082759p:plain

  3. PB3ピンが緑色になって、GPIO_Outputに設定されている。
    f:id:sbasami:20210418082816p:plain

  4. 左側の「Categories」内の「System Core」→「GPIO」で詳細な設定ができる。
    f:id:sbasami:20210418083308p:plain

  5. CubeMXのユーザマニュアルを見ると、各項目は以下のような設定ができる。

    f:id:sbasami:20210418083326p:plain

  6. 今回は「User Label」だけ変えた。「PB3 Configuration」の「User Label」を変更するとチップ・ビューの名前も変わっていることが確認できる。
    f:id:sbasami:20210418083350p:plain

  7. 設定が終わったら「Ctrl」+「s」でGenerate Codeするか聞いてくるのでYesをクリック。
    f:id:sbasami:20210418083402p:plain

  8. main.hに自分が設定したGPIOが追加されていればGenerate Code成功。
    f:id:sbasami:20210418083417p:plain

Lチカプログラムの作成

main.cのwhile文の中に以下のように書けば一応Lチカできます。HAL_GPIO_TogglePinを使うともっとスマートにかけます。
f:id:sbasami:20210418090309p:plain

HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//ピンの出力をHIGHに
HAL_Delay(100);//100ms待機
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);//ピンの出力をLOWに
HAL_Delay(100);//100ms待機

HAL_GPIOまで打って「Ctrl」+「スペース」でコード補完をかけると以下のように出てきます。GPIOはこれらのAPIがあるらしいですね、よく使うのはWritePinとReadPinですかね。
f:id:sbasami:20210418083503p:plain

HAL_GPIO_WritePinの使い方を簡単に説明すると以下のような感じです。
f:id:sbasami:20210418083520p:plain

ポートとピンの確認はチップ・ビューを見るのが良いと思います。PA0ならPortA(GPIOA)の0番ピン、PB3ならPortB(GPIOB)の3番ピンといった感じです。
f:id:sbasami:20210418083532p:plain

ビルドと書き込み

トンカチでビルド、再生ボタンで書き込みできます。
f:id:sbasami:20210418083544p:plain

最初の書き込みは以下のような画面が出ますがデフォルトの状態で「OK」をクリック。
f:id:sbasami:20210418083555p:plain

おわりに

今回はGPIOの設定方法とビルドと書き込みについてまとめました。次はタイマーの設定についてまとめたい。

まとめました↓↓↓

sbasami-tech.hatenablog.com