STM32のDSPを使う
お久しぶりです。もりゅーです。
今日はSTM32のDSP libraryで三角関数演算をしてみたいと思います。
環境
Windows10+STM32CubeIDE+NucleoG474RE
参考
以下のサイトが参考になります。
ioloa.com
簡単な使い方
1. CubeMXでの設定
プロジェクトの作り方などは他サイトさんを参照ください。特に特別なことはないです。
まずCubeMX画面で「Additional Software」を選択
開いた画面の左側で「CMSIS」を選択すると、こんな感じの画面になる。
始めてDSPなどを使用する場合はインストールが必要なので、右の方のinstallを選択
インストールが終わったらDSPでLibraryを選択しOK
CubeMXの左の方にAdditional Softwareが追加されるので、CMSIS DSPにチェックを入れる。
その後、コードを生成する。
こんな感じ(なんかエラーが出てるのは気にしないでください)
2. ライブラリファイルの設定
(なぜかここは手動。もしかしたら自動で持ってきてくれるオプションとかあるのだろうか・・・)
まず、CubeMXのrepositoryの以下のフォルダにある
・libarm_cortexM4lf_math.lib
・libarm_cortexM4lf_math.a
をプロジェクトの適当なところにインポートする。
なお、G4以外のシリーズを使う場合はフォルダが異なるので注意(特にCortexシリーズが異なるもの)
Paths and SymbolsでLibの設定を行う。
↑で置いたフォルダのパスを設定する。
3. 実際に使う
こんな感じのフォルダ構成になっているはず。
使用方法は簡単でCortex-M4の場合は以下のように書けば、中の関数を使用できる。
#define ARM_MATH_CM4 #include "arm_math.h"
4. 比較
比較したのは以下の三つ
・DSPの arm_sin_f32
・math.hのsinf
・学生時代にずっと使わせていただいていた軽量な三角関数
コンパクト三角関数 - ロボット工作研究室Wiki
なお、比較方法としては各演算を1000回繰り返し、
その間のタイマー(1usにつき1カウントインクリメントする設定)の進み量を演算時間とした
★DSPの arm_sin_f32 : 433 us
★math.hのsinf : 20789 us
★コンパクト三角関数 : 821 us
ちなみに最後の_hogeは sin(999)なのですが、真の値は
sin(999) = -0.0264607527....
なので、精度的には
math.h > DSP > コンパクト三角関数
ですね。
STM32G4のOPAMPを使ってみる
お久しぶりです。もりゅーです。
もう少し更新頻度上げたいですねえ・・・
さて今回は、最近流通し始めたSTM32G4についてです。
STM32G4シリーズ
https://www.st.com/ja/microcontrollers-microprocessors/stm32g4-series.html
"DSPおよびFPU命令による高い性能と高度な機能を備えたミックスド・シグナル・マイコン"らしいです。
ADC/DACを始めとする豊富なアナログペリフェラルを搭載しており、モータ制御なんかに適していそうですね。
プログラマブル・ゲイン・オペアンプ(PGA)とは
その名の通り、ゲインをプログラム上から変更できるオペアンプです。STM32はいくつかのシリーズには搭載されていますが、
G4は数・設定ゲイン・帯域等が優れているようです。
簡単な使い方
とりあえずCubeIDEとnucleoG474REを用いて、最も簡単な非反転増幅でPGAを試してみます。
1. CubeMXでの設定 Nucleoボード
STM32G4は最新のCubeMXじゃないと存在しないみたいです。アップデートして、nucleoG474REを選択します。
この後にちょろちょろ出てくる設定はデフォルトで大丈夫のはずです。
2. OPAMPペリフェラル設定
今回は、マイコン内部で
・OPAMPの出力とマイナス入力
・OPAMPの出力とADCチャンネル
を接続し、OPAMPのプラス入力電圧(PB0)を増幅することとします。
まず使用するOPAMPをOPAMP3とし、以下のように設定します。ゲインはとりあえず4倍で。
OPAMP出力をADCに入れる設定は以下です。
OPAMP3の場合はADC3に「VOPAMP3 Channel」というのがあるので、それを使用します。
また、参照用として、OPAMPプラス入力電圧を監視するADCも追加しときます。
これはADC1_Channel1を使用しました。特に意味はありません。
ADC回りについては以下のブログがよくまとまっています。よく参考にさせていただいております。
gsmcustomeffects.hatenablog.com
設定が終わったらコードを生成します。
3.コード
とりあえずOPAMPが動いていることを確認したかったので、最低限のコードのみ記載します。
ADCなどと同じように、HAL_OPAMP_StartでOPAMP機能と開始できます。
あとはADCの値を取ってくれば、OKという感じ。
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC3_Init(); MX_OPAMP3_Init(); MX_USART1_UART_Init(); MX_ADC1_Init(); /* USER CODE BEGIN 2 */ uint32_t _u32_bframp_value = 0; uint32_t _u32_aftamp_value = 0; HAL_ADC_Start(&hadc1); HAL_ADC_Start(&hadc3); HAL_OPAMP_Start(&hopamp3); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_Delay(1000); if(HAL_ADC_PollForConversion(&hadc1,100) != HAL_OK){ }else { _u32_bframp_value = HAL_ADC_GetValue(&hadc1); } if(HAL_ADC_PollForConversion(&hadc3,100) != HAL_OK){ }else { _u32_aftamp_value = HAL_ADC_GetValue(&hadc3); } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
4. 配線
Aliexpressで買った電源を雑に繋いでいきます。
AliexpressでCFRPのCNC加工サービスを発注した話
お久しぶりです。もりゅーです。
今回は、なんでも売ってることで有名なAliexpressで、CFRPのCNC加工サービスを発注した話です。
経緯
学生の身分を無くし、加工機が使えなくなってしまった。
↓
でもまだロボワン欲はある
↓
加工は外部に発注しよう
発注先
ここです。日本語にすると意味が分からないので英語のままの方が良いかと。
www.aliexpress.com
発注のやり方
基本的には書いてある通りにすればいいですが、一応メモ程度に書いておきます。
1. 見積もりメールを送る
Product Descriptionに記載されているfoxmailドメインメールに、dwgかdxfの図面を送る。
その際、見積もり依頼であること、加工品は日本に送ることを伝えましょう。(もちろん英語でね)
ちなみに図面ですが、いわゆるちゃんとした製図図面でなく、ただパーツ外形を並べただけの物でも大丈夫です。自分は下のようなものを送りました。その場合、板厚は別途記載しておきましょう。
2. Aliexpressから見積もり金額分購入する
数(営業)時間以内に見積もりが返ってきます。
自分の場合は、40ドル(加工費25ドル、運送費15ドル)でしたので、上記Aliexpressページで加工サービスを40個購入し、40ドルを支払います。
この際、加工サービス代が1個20ドルだったり50ドルだったりすることがあるので、そうなっていた場合はメールで連絡して1個1ドルにしてもらいます。
(見積もりを投げずに購入するやつがいるらしく、とりあえず1個数十ドルぐらいで設定しているっぽい。見積もり投げないとブラックリスト入りと明言されているので注意!)
3. (一応)発注したよメールを投げる
表題通り。Aliから連絡が行くはずなので問題はないと思うが念のため。
4. 届くまで待つ
大体加工に1週間、配送に1週間ちょいかかります。パーツ量とかにもよるかもしれないのであくまで目安ですが。
届いたもの
中華CFRP板部品届いた!パッと見は良い感じ pic.twitter.com/Va7L8BXZV6
— (ひ)もりゅー (@Moryu_io) 2018年9月10日
以上です。何か質問あればコメントかTwitterでリプ飛ばしてください。
V-REPとC/C++で自作ロボットを動かす
皆さん初めまして.もりゅー(@Moryu_io)と申します.
東京でしがない理系学生をやっております.
本ブログは,もりゅーが学んだ技術的なことを中心に,備忘録代わりに更新していくものです.
よろしくお願い致します.
さて,記念すべき最初の更新は,rogy Advent Calendar 2017 - Adventar 16日目の記事になります.
すなわち,V-REPというロボット用動力学シミュレーション開発環境を用いて,自作のロボットを動かしてみます.
V-REPの詳細はググるなり公式サイトをご覧ください.
http://www.coppeliarobotics.com/www.coppeliarobotics.com
ロボットを動力学シミュレーションするのに適した環境が提供されており,
サンプルを弄ってるだけでもかなり面白いです.
本記事では,サンプルで既に入ってるモデルではなく,自分で用意したロボットをV-REP上で動かします.
また,ただ動かすだけでなく,マイコンで動かす際とプログラムを一部共通化しやすくするため,
remoteAPIを用いて,C/C++から動作させます(デフォルトではLuaによるスクリプトで動かす).
さて早速やっていきましょう.
続きを読む