マイクロマウス初参加(できるといいなぁ) 機体完成!

こんにちは。もりゅーです。

ガチプロ最強者しかいないマウス集団BlueCheeseに(実は)所属していますが、
僕は完全な初心者なので、ゆるふわな感じでマウスやっていきたいです。

さて今回は、先日完成したマイクロマウス機体を紹介します。
今年こそは初参加できるといいなぁと思っています!!
(学生の頃の記憶は無くしました)

f:id:Moryu_io:20200504130912j:plain

  • 機体の諸元
  • システムブロック図
  • 特徴
  • おわりに
続きを読む

STM32G4シリーズのCORDICを使ってみる1

こんにちは、もりゅーです。

今日は前回の続きみたいなもんで、STM32G4シリーズに搭載されている
CORDICプロセッサーの使い方をざっくり説明したいと思います。

CORDICとは

Coordinate Rotation Digital Computerらしいです。
反復演算で三角比などを求めていく手法で、テーブル参照・シフト演算・加算のみで演算できるため
高速かつハードウェア化しやすいらしいです。
詳しくはググってください。

続きを読む

STM32のDSPを使う

お久しぶりです。もりゅーです。

今日はSTM32のDSP libraryで三角関数演算をしてみたいと思います。

環境

Windows10+STM32CubeIDE+NucleoG474RE

参考

以下のサイトが参考になります。
ioloa.com

簡単な使い方

1. CubeMXでの設定

プロジェクトの作り方などは他サイトさんを参照ください。特に特別なことはないです。

まずCubeMX画面で「Additional Software」を選択
f:id:Moryu_io:20200211153329p:plain

開いた画面の左側で「CMSIS」を選択すると、こんな感じの画面になる。
始めてDSPなどを使用する場合はインストールが必要なので、右の方のinstallを選択
f:id:Moryu_io:20200211153457p:plain

インストールが終わったらDSPでLibraryを選択しOK
f:id:Moryu_io:20200211153620p:plain

CubeMXの左の方にAdditional Softwareが追加されるので、CMSIS DSPにチェックを入れる。
その後、コードを生成する。
f:id:Moryu_io:20200211153741p:plain

こんな感じ(なんかエラーが出てるのは気にしないでください)
f:id:Moryu_io:20200211154004p:plain

2. ライブラリファイルの設定

(なぜかここは手動。もしかしたら自動で持ってきてくれるオプションとかあるのだろうか・・・)

まず、CubeMXのrepositoryの以下のフォルダにある
・libarm_cortexM4lf_math.lib
・libarm_cortexM4lf_math.a
をプロジェクトの適当なところにインポートする。
なお、G4以外のシリーズを使う場合はフォルダが異なるので注意(特にCortexシリーズが異なるもの)
f:id:Moryu_io:20200211154116p:plain
f:id:Moryu_io:20200211154124p:plain

Paths and SymbolsでLibの設定を行う。
↑で置いたフォルダのパスを設定する。
f:id:Moryu_io:20200211154443p:plain
f:id:Moryu_io:20200211154454p:plain

3. 実際に使う

こんな感じのフォルダ構成になっているはず。
使用方法は簡単でCortex-M4の場合は以下のように書けば、中の関数を使用できる。

#define ARM_MATH_CM4
#include "arm_math.h"

f:id:Moryu_io:20200211154635p:plain

4. 比較

比較したのは以下の三つ
DSPの arm_sin_f32
・math.hのsinf
・学生時代にずっと使わせていただいていた軽量な三角関数
コンパクト三角関数 - ロボット工作研究室Wiki

なお、比較方法としては各演算を1000回繰り返し、
その間のタイマー(1usにつき1カウントインクリメントする設定)の進み量を演算時間とした

DSPの arm_sin_f32 : 433 us
f:id:Moryu_io:20200211155131p:plain

★math.hのsinf : 20789 us
f:id:Moryu_io:20200211155156p:plain

★コンパクト三角関数 : 821 us
f:id:Moryu_io:20200211155208p:plain


ちなみに最後の_hogeは sin(999)なのですが、真の値は
sin(999) = -0.0264607527....
なので、精度的には
math.h > DSP > コンパクト三角関数
ですね。

まとめ

DSPでの演算の簡単な使用方法と簡単な比較を行いました。
DSPは速度も速く、そこそこの精度がありますね。

が、これまで使用していた三角関数も結構いい線いっているので、
DSP演算ができないようなマイコンなどではまだまだ出番はありそうです。

STM32G4のOPAMPを使ってみる

お久しぶりです。もりゅーです。
もう少し更新頻度上げたいですねえ・・・

さて今回は、最近流通し始めたSTM32G4についてです。

STM32G4シリーズ

https://www.st.com/ja/microcontrollers-microprocessors/stm32g4-series.html

"DSPおよびFPU命令による高い性能と高度な機能を備えたミックスド・シグナル・マイコン"らしいです。
ADC/DACを始めとする豊富なアナログペリフェラルを搭載しており、モータ制御なんかに適していそうですね。

その中でも今回はプログラマブル・ゲイン・オペアンプについて、備忘録がてら書いていこうと思います。

プログラマブル・ゲイン・オペアンプ(PGA)とは

その名の通り、ゲインをプログラム上から変更できるオペアンプです。STM32はいくつかのシリーズには搭載されていますが、
G4は数・設定ゲイン・帯域等が優れているようです。

f:id:Moryu_io:20190811140017p:plain
STM32 Application note AN5310より

簡単な使い方

とりあえずCubeIDEとnucleoG474REを用いて、最も簡単な非反転増幅でPGAを試してみます。

1. CubeMXでの設定 Nucleoボード

STM32G4は最新のCubeMXじゃないと存在しないみたいです。アップデートして、nucleoG474REを選択します。
この後にちょろちょろ出てくる設定はデフォルトで大丈夫のはずです。
f:id:Moryu_io:20190811140355p:plain

2. OPAMPペリフェラル設定

今回は、マイコン内部で
・OPAMPの出力とマイナス入力
・OPAMPの出力とADCチャンネル
を接続し、OPAMPのプラス入力電圧(PB0)を増幅することとします。

まず使用するOPAMPをOPAMP3とし、以下のように設定します。ゲインはとりあえず4倍で。
f:id:Moryu_io:20190811140806p:plain

OPAMP出力をADCに入れる設定は以下です。
OPAMP3の場合はADC3に「VOPAMP3 Channel」というのがあるので、それを使用します。
f:id:Moryu_io:20190811141433p:plain

また、参照用として、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で買った電源を雑に繋いでいきます。
f:id:Moryu_io:20190811143503j:plain

5. 結果

デバッガで確認。0.5Vぐらいを4倍増幅している。
_u32_bframp_value が増幅前0.5V = 620ぐらい
_u32_aftamp_value が増幅後2.0V = 2480ぐらい
f:id:Moryu_io:20190811142503p:plain

フィルタリングしてないのでこんなもんでしょうか。今度、出力を外部ピンにして見てみます。

まとめ

STM32G4のPGAを使ってみました。多分それっぽく動いているっぽいです。
マイクロマウスだったら、壁センサの増幅に使えそうですね。
個人的にはBLDCの勉強中なので、ベクトル制御に使ってみたい感じがします。


ちなみに、OPAMPのMODEはいろいろありますので、詳細を知りたい方、他のモードを使いたい方は
Application Note: AN5306やレファレンスマニュアルを読んでください。
反転増幅にして、レファレンス電圧をDACにするとか、いろいろ便利なのがあります。

以上、何か質問があればコメントかTwitter: Moryu_ioまで。

AliexpressでCFRPのCNC加工サービスを発注した話

お久しぶりです。もりゅーです。

今回は、なんでも売ってることで有名なAliexpressで、CFRPのCNC加工サービスを発注した話です。

経緯

学生の身分を無くし、加工機が使えなくなってしまった。

でもまだロボワン欲はある

加工は外部に発注しよう

発注先

ここです。日本語にすると意味が分からないので英語のままの方が良いかと。
www.aliexpress.com

発注のやり方

基本的には書いてある通りにすればいいですが、一応メモ程度に書いておきます。

1. 見積もりメールを送る

Product Descriptionに記載されているfoxmailドメインメールに、dwgかdxfの図面を送る。

その際、見積もり依頼であること、加工品は日本に送ることを伝えましょう。(もちろん英語でね)

ちなみに図面ですが、いわゆるちゃんとした製図図面でなく、ただパーツ外形を並べただけの物でも大丈夫です。自分は下のようなものを送りました。その場合、板厚は別途記載しておきましょう。

f:id:Moryu_io:20180910221519p:plain

2. Aliexpressから見積もり金額分購入する

数(営業)時間以内に見積もりが返ってきます。
自分の場合は、40ドル(加工費25ドル、運送費15ドル)でしたので、上記Aliexpressページで加工サービスを40個購入し、40ドルを支払います。
この際、加工サービス代が1個20ドルだったり50ドルだったりすることがあるので、そうなっていた場合はメールで連絡して1個1ドルにしてもらいます。
(見積もりを投げずに購入するやつがいるらしく、とりあえず1個数十ドルぐらいで設定しているっぽい。見積もり投げないとブラックリスト入りと明言されているので注意!)

3. (一応)発注したよメールを投げる

表題通り。Aliから連絡が行くはずなので問題はないと思うが念のため。

4. 届くまで待つ

大体加工に1週間、配送に1週間ちょいかかります。パーツ量とかにもよるかもしれないのであくまで目安ですが。

届いたもの


以上です。何か質問あればコメントか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によるスクリプトで動かす).

さて早速やっていきましょう.

続きを読む