【自作ドローンの製作Ⅱ】第3回:機体のスペック紹介
はじめに
第2回ではモチベーションの関係からドローン製作を中止するお知らせを出しました。
しかし、フレームのアイデアを思いついたことによってモチベーションを取り戻し、なんとかハードウェア製作を完了しました。
よって、第3回はハードウェアについてのまとめになります。
製作したドローン
今回製作した自作ドローンを以下に示します。特徴としてロッドの部分にサーボモータを取り付けて推力方向を変える機構を搭載しています。
サーボを動かした時の動画が以下になります。なんでこんな機能を搭載したかについては第1回を見てください。
機体スペック
サイズ | 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以下だと思います。
ナイロン素材が思ってたより柔らかくてフレームがたわむので、飛行に影響でないか心配です。あと白いナイロンは汚れが目立ちます。
その他外観
裏から見た図。配線もスッキリしているので個人的に満足。
斜めから見た図。今回もダンパつけてます。効果があるかはわからないけど市販ドローンには大体ついてるので真似してる。バッテリーはフライトコントローラの下に収まります。
フライトコントローラ基板
今回のドローン用に以下の基板を作成しました。これがフライトコントローラとして機能します。
まず、真ん中にBMI088とDRV8835が載っかります。
BMI088は自作モジュールで下記で作成したモジュールを回路そのままで更に小型化したものです。
その上にTeensy4.1が載っかります。
最後にオプティカルフローセンサモジュールが載っかります。全部モジュール部品なのでどこか壊れても交換しやすいようにというのがコンセプトです。
回路図
今回は回路図もモジュール化して再利用性を高めようとしましたが、まぁ分離するほどの回路ではなかったですね...。
パターン図
設計している時はこの配置で行けると思っていましたが、実際に実装してみると部品密度高すぎて辛かった...
おわりに
今回は自作ドローン2号機のハードウェアについてまとめました。
今はソフトウェアの作成を頑張っています。次回は飛行している姿を見せたいですね。
なんとか飛びました↓↓↓
【STM32備忘録】SDカードの設定
はじめに
SDカードの設定に関しては下記の動画がとても参考になった。というかこの動画見ればこの記事見る必要はない。
今回はCubeMXの設定のみメモしておく。
CubeMXの設定
SD関係の設定
SDIOでModeをSD 4 Bits Wide busに設定。
DMA SettingsでSDIO_RXを追加。
同様にSDIO_TXも追加。
NVIC SettingsでSDIO global interruptにチェックを入れる。
MiddlewareのFATFSでSD Cardにチェックを入れる。
Advanced SettingsでUse dma templateをEnableにする。
Set Defines でMAX_SSを4096に変更し、Generate Codeする。
以下のようなWarningが出たらYesをクリック。
おわりに
どんどんまとめが雑になっていく。
【STM32備忘録】覚えておくと便利な操作
はじめに
前回はUSBに関する機能について書いた。
今回は番外編的な感じ。ここではCubeIDEなどで覚えておくと便利な操作についてまとめる。便利な操作を見つけたらその都度更新する予定。
便利な操作
コード補完
HAL_GPIOなどと打って「Ctrl」+「スペース」を押すとその先をコード補完で予測してくれる。
宣言場所の検索
ソースコード上で使用されているdefine等がどこで宣言されているのかを検索できる。
検索したいdefine等を選択して右クリック、「Declarations」→「Workspace」をクリック。
右下のWindowに検索結果が出てくるのでダブルクリック。
宣言場所に飛べる。
宣言場所の検索2
こっちのほうが簡単だった。
検索したい関数等を選択して右クリック、「Open Declaration」をクリック。
宣言場所に飛べる。
複数行をまとめてコメント化する
- コメント化したい行をドラッグで選択して、右クリック。「Source」→「Toggle Comment」をクリックすれば複数行のコメント化、コメント解除ができる。
うまく行かない時の確認
Source Locationの確認
インクルードパスを通して.hファイルは認識するのに.cファイルを認識していない時の操作
認識しない.cファイルが入っているフォルダを右クリックし、「Properties」をクリック。
Source Locationにフォルダを登録することで、そのパスにある.cファイルもビルドに含まれる。
おわりに
覚えておくと便利な操作についてまとめた。こういうのもメモっておかないと自分はすぐ忘れる。
次はSDカードに関して書きたいけど、まだ動作確認していない。
【STM32備忘録】仮想COMポートとしてUSB接続する、USBから直接書き込む
はじめに
前回はシリアル通信について書きました。
今回は仮想COMポートとしてSTM32をUSB接続する方法とUSBから直接書き込む方法について書きます。
CubeMXの設定
USBの設定
「Connectivity」→「USB_OTG_FS」をクリック。Modeを「Devie_Only」に設定。設定するとチップ・ビューでUSBに対応したピンが勝手に有効になる。
「Middleware」→「USB_DEVICE」をクリック。Class For FS IPを「Communication Device Class」に設定。
ここまで設定したら一度Clock Configurationを見てみる。以下のような画面になったら何か設定が競合していることになる。「Yes」をクリックすると自動で設定を変更して問題を解決してくれる。
どうやらUSBの設定を行うと赤枠の部分は48MHzでないといけないらしい。
ここまで設定したらGenerate Codeして、main.cにMX_USB_DEVICE_Init()ができていれば成功。
コールバック処理の実装
CDC_Receive_FSで受信、CDC_Transmit_FSで送信ができる。
コールバックするだけなら、CDC_Receive_FSの中にCDC_Transmit_FS処理を入れるだけでできるので簡単。CDC_Receive_FSの引数"Buf"に受信データ、"Len"に受信データの長さが渡されるので、それをそのままCDC_Transmit_FSに渡して送信している。
PCとNUCLEO-F411REの接続
使用部品
配線
USBコネクタDIP化キットの「D+」をNUCLEO-F411REの「USB_DP」、「D-」を「USB_DM」のピンと繋ぐ。GNDも忘れずに。VBUSはUSBから5Vが給電されるので、これで駆動したい場合はNUCLEO-F411REの5Vに接続する。
動作結果
打った文字が返ってくれば成功です。
USB書き込み
今まではデバッガの方から書き込んでいましたが、USBからも書き込むことができるのでやってみます。
STM32CubeProgのインストール
まず、下記からSTM32CubeProgをインストールします。
書き込み手順
STM32CubeProgを起動すると以下のような画面になるので右上のタブから「USB」を選択。
NUCLEO-F411REの「BOOT0」ピンと「VDD」をショートさせた状態でリセットボタンを押してBOOTモードで起動します。
NUCLEO-F411REがBOOTモードの状態で更新ボタンを押す。認識すればPortにUSB1と表示される。この状態で「Connect」をクリック。
接続されるとメモリ情報が読み出される。
左の三本線をクリックして出てくる、「Erasing & programing」をクリック。
下記のような画面になるので「Browse」をクリックして書き込むファイルを選択する。「Run after programing」にチェックを入れると書き込み後にすぐプログラムが実行される。
書き込みファイルはビルドした後、プロジェクト内の「Debug」フォルダにできる。.bin、.elfどっちを選んでも書き込めた。
ファイルを選択したら「Start programming」で書き込める。
書き込み後に幾つかポップアップウィンドウが出るが「OK」を押す。以下のような画面になったら書き込めているはず。
おわりに
今回は仮想COMポートとしてSTM32をUSB接続する、USBから直接書き込む方法について書きました。
これでUSBを繋ぐだけでデバッグと書き込みができる。こんな簡単に実現できるとは思ってなかった、凄い。
次は何書くか...。
覚えておくと便利な操作について書いた↓↓↓
【STM32備忘録】RN-42を使用したシリアル通信
はじめに
前回はタイマー割り込みの設定について書きました。
今回はRN-42とNUCLEO-F303K8を用いて無線でシリアル通信する方法について書きます。
CubeMXの設定
USARTの設定
PA9をUSART1_TXに設定
PA10をUSART1_RXに設定
「Connectivity」→「USART1」をクリックしてUSART1の設定画面を表示。「Mode」を「Asynchronous」に設定すると「Configuration」にデフォルトの設定が出てくる
「Baud Rate」を「115200」に設定
設定が終わったら「Ctrl」+「s」でGenerate Code。main.cにMX_USART1_UART_Init()が追加されていればOK。
エコーバックプログラムの作成
シリアルポートで受信したデータをそのまま送信することをエコーバックという。
適当なバッファ変数を宣言。
char buff[1];
受信と送信の処理をmain文のwhile文の中に追加。あとはビルドして書き込む。
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の接続
使用部品
配線
下記サイトを参考にしてください。使用しているのはArduinoですがそれをNucleoだと思って配線すればいけます。RN-42のCTSとRTSはショートさせることを忘れないように。RN-42とPCのペアリングについても書いてあります。
動作結果
打った文字が返ってくれば成功です。
おわりに
RN-42とNUCLEO-F303K8を用いて無線でシリアル通信する方法について書きました。今回はエコーバックだけですが本格的にデバッグで使用するならちょっと機能不足です。
そういった時は、下記のxprintfというものを使用するのがオススメです。
使い方は下記のブログが参考になります。
gsmcustomeffects.hatenablog.com
書き溜めてたものが尽たので次回は未定です。
USB関係の記事になりました↓↓↓
【STM32備忘録】タイマー割り込みの使い方
はじめに
前回はGPIOの設定について書きました。
今回はタイマー割り込みの設定について書きます。CubeMXで設定をしてGenerate Codeし、タイマー割り込みでLチカします。
CubeMXでの設定
タイマー割り込みはクロックの設定も必要で内部クロックを使うか外部クロックを使うかなどで設定も変わってくるが、今回は内部クロックでTIM3のタイマー割り込みを使用する。
クロックの設定
外部クロックを使用する場合は最初に「System Core」→「RCC」でクロックソースの設定を行う必要がある。外部からクロックを入力する場合は「BYPASS Clock Source」、水晶振動子などを使用する場合は「Crystal/Ceramic Resonator」を選択する。
クロック設定は「Clock Configuration」で行うことができる。TIM3はAPB1のクロックに基づいて動く、今回はデフォルトの状態で設定変更はしない。
どのTIMがどのクロックに基づいて動くかはSTM32F303K8のデータシートを見ると分かる。
タイマーの設定
「Timers」→「TIM3」を見ると以下のような画面が表示される。
因みにタイマーによって画面表示は異なる、以下はTIM6の設定画面。これは各タイマーが持っている機能の違い、TIM3は設定項目が多いので色々な機能を持っているということになる。
「Clock Sorece」で「Internal Clock」を選択すると、「Configuration」に設定項目が出てくる。因みに「⚠」のマークが表示されていたり、黄色くなっている場所は設定によっては機能が競合するということを教えてくれている。赤い表示は機能が競合するから設定できない。
「Parameter Settings」で「Prescaler」と「Counter Period」の設定を行う。下記は1秒毎に割り込みを行う設定。PrescalerとCounter Periodについては後で詳しく書く。
「NVIC Settings」でチェックボックスにチェックを入れる。これによって割り込みが有効化される。
設定が終わったら「Ctrl」+「s」でGenerate Code。main.cにMX_TIM3_Init()が追加されていればOK。
PrescalerとCounter Periodの設定
TIM3はAPB1の8MHzで動作するがPrescaler(分周器)によって更に動作周期を変更できる。今回はPrescalerを8kHzに設定したのでTIM3は1kHzでカウントアップするようになる。
Counter Periodはタイマーのカウントが幾つになったら割り込みを発生させるかの値。今回は1000と設定したので1秒毎にタイマー割り込みが行われる。
Counter Periodを500にすると0.5秒毎にタイマー割り込みが行われる。
因みにConfigurationで設定する時に「8000-1」や「1000-1」のように設定していたのは、プログラム上では0からスタートするので1引いた値を設定している。
Lチカプログラムの作成
タイマーを開始するには以下の関数を追加すれば良い。TIM3なのでhtim3、TIM6ならhtim6になる。
HAL_TIM_Base_Start_IT(&htim3);
タイマー割り込みが発生した時に呼ばれるコールバック関数も追加する。HAL_TIM_PeriodElapsedCallbackは既に用意されている関数でタイマー割り込みが発生すると呼ばれる。引数のhtimに渡された値からどの割り込みが発生したのか判別し処理を行う。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim == &htim3){ HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);//ピンの出力を切り替え } }
あとはビルドして書き込めば1秒周期のLチカができるはず。
おわりに
今回はタイマー割り込みの設定について書きました。次はシリアル通信について書きたい。
書きました↓↓↓
【STM32備忘録】GPIOの設定方法とビルドと書き込み
はじめに
前回はCubeIDEにおけるプロジェクトの作成方法について書きました。
今回はGPIOの設定方法について忘れない程度にまとめます。CubeMXでの設定とLチカプログラムを書いておきます。その流れでビルドと書き込みについても軽く触れておきます。
CubeMXでの設定
GPIOの設定
作成したプロジェクト内の.iocをダブルクリックするとCubeMXが立ち上がって以下のようなチップ・ビュー画面が出ます。
設定したいピンをクリックすると、そのピンに設定できる機能が表示される。今回は「GPIO_Output」を選択。
PB3ピンが緑色になって、GPIO_Outputに設定されている。
左側の「Categories」内の「System Core」→「GPIO」で詳細な設定ができる。
CubeMXのユーザマニュアルを見ると、各項目は以下のような設定ができる。
今回は「User Label」だけ変えた。「PB3 Configuration」の「User Label」を変更するとチップ・ビューの名前も変わっていることが確認できる。
設定が終わったら「Ctrl」+「s」でGenerate Codeするか聞いてくるのでYesをクリック。
main.hに自分が設定したGPIOが追加されていればGenerate Code成功。
Lチカプログラムの作成
main.cのwhile文の中に以下のように書けば一応Lチカできます。HAL_GPIO_TogglePinを使うともっとスマートにかけます。
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ですかね。
HAL_GPIO_WritePinの使い方を簡単に説明すると以下のような感じです。
ポートとピンの確認はチップ・ビューを見るのが良いと思います。PA0ならPortA(GPIOA)の0番ピン、PB3ならPortB(GPIOB)の3番ピンといった感じです。
ビルドと書き込み
トンカチでビルド、再生ボタンで書き込みできます。
最初の書き込みは以下のような画面が出ますがデフォルトの状態で「OK」をクリック。
おわりに
今回はGPIOの設定方法とビルドと書き込みについてまとめました。次はタイマーの設定についてまとめたい。
まとめました↓↓↓