STM32CubeIDEでSTM32F411設定

はじめに

前の記事でArduino IDEを生かしてSTM32F411の設定、動作確認を行った。今回はST本家のIDE環境であるSTM32CubeIDEでSTM32F411を設定してから、UARTシリアル出力を確かめたい。

STM32CubeIDEでSTM32F411設定
STM32CubeIDEでSTM32F411設定

環境

・PC Ubuntu 18.04
・STM32F411CEU6 on Weact Black Pill
・USB-TTLモジュール(STM32シリアル送信の確認)
・J-Linkモジュール、4ピン簡易版(STM32へスケッチを書き込む)

結線

・PC USB<-> J-LinkのUSB (J-Linkモジュール) J-Linkの3V3、GND、SWDIO、SWCLK <-> Black Pillの3V3、GND、SWDIO、SWCLK
・PC USB<-> USB-TTLモジュールのUSB (USB-TTLモジュール) USB-TTLケーブルのRx、Tx <-> Black PillのTx、Rx

設定

・STM32CubeIDEを立ち上げる。
・New Projectのtestを作成する。
・test.iocを開いて、システムクロックを100MHz(RCC、HSE、Crystal、25MHz)になるように設定する。
・USART2(A2ピン、A3ピン)をAsyncに設定する。
・sys(J-Link)を設定する。
・test.iocを保存して、BUILDを行う。
・main.cを開いて、下記をwhile(1)ループに追加する。

HAL_UART_Transmit(&huart2, (uint8_t *)"Hello, world!\r\n", 15U, 100U);

・RUNをクリックする。
・ターミナルでsudo gtkterm(以下を参照)。

シリアルモニタ

今回は、Ubuntuターミナルのgtktermを使いたい。

$ls -lrt /dev/serial/by-id/
$sudo apt-get install gtkterm
$sudo gtkterm

gtktermを立ち上げて、PortとBaudrateの設定を行って、”Hello, world!”の繰り返すことを確認する。

結果確認

STM32F411シリアル出力確認
STM32F411シリアル出力確認

感想

Arduino IDEやPlatform.io等のIDEよりペリフェラルの可視化においては、STM32CubeIDEのほうが優れていると感じたので回路設計や、ファームウェア開発のスピードアップに活用していきたい。

STM32CubeIDEでUSART設定
STM32CubeIDEでUSART設定

関連記事

Arduino IDEでSTM32F411 Black Pillへスケッチを書き込む

1+

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

SAMD21-ATmega328 SPI対向試験

概要

I2C(SCL+SDA)の信号線が1本(SDA)に対して、SPI(SCLK+MISO+MOSI+CS/SS)の信号線が2本(MISO+MOSI)あり、結線がやや複雑で、SAMD21、ATmega328のSPIの挙動が明らかに違う。しかしSPIの通信スループットはI2Cの数倍以上あるため、面倒でもやる価値がある。以下の対向試験でSPIでデータの送受が確認しよう。

Master=SAMD21

/**********************************************
  SAMD21 as SPI Master
**********************************************/
#include <SPI.h>
 
void setup() {
  Serial.begin(9600);
  Serial.println("---------SAMD21G18A as SPI Master--------");
  SPI.begin();
  digitalWrite(SS, HIGH);
}
 
void loop() {
  SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));//SPIトランザクション開始
  digitalPinToPort(SS)->OUTCLR.reg = digitalPinToBitMask(SS);//SS->LOW
  byte rx = SPI.transfer(0x11);//転送
  digitalPinToPort(SS)->OUTSET.reg = digitalPinToBitMask(SS);//SS->HIGH
  SPI.endTransaction();//SPIトランザクション終了

  Serial.print("tx = ");
  Serial.print("17");
  Serial.print(" / rx = ");
  Serial.println(rx);
   
  SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
  digitalPinToPort(SS)->OUTCLR.reg = digitalPinToBitMask(SS);
  rx = SPI.transfer(0x21);
  digitalPinToPort(SS)->OUTSET.reg = digitalPinToBitMask(SS);
  SPI.endTransaction();
  
  Serial.print("tx = ");
  Serial.print("33");
  Serial.print(" / rx = ");
  Serial.println(rx);
   
  delay(2000);
}

Slave=ATmega328

/**********************************************
  Arduino UNO as SPI Slave
**********************************************/
#include "SPI.h";

void setup() {
  Serial.begin(9600);
  Serial.println("----Arduino UNO as SPI Slave-----");
  SPI.setBitOrder(MSBFIRST);//最高位を先に
  pinMode(MISO, OUTPUT);//出力ピン設定
  SPCR |= _BV(SPE);//SPI Control Register
  SPI.attachInterrupt(); //割り込みを可能に
}
//割り込みハンドラー
ISR(SPI_STC_vect) {
  byte rx = SPDR;
  Serial.print("ISR! ");
  Serial.println(rx);
  SPDR = rx;//受信データをそのまま返す
}
void loop() {//空転
}

結果

Master側

tx = 33 / rx = 17
tx = 17 / rx = 33
tx = 33 / rx = 17
tx = 17 / rx = 33
tx = 33 / rx = 17
tx = 17 / rx = 33
tx = 33 / rx = 17
tx = 17 / rx = 33
tx = 33 / rx = 17
tx = 17 / rx = 33
tx = 33 / rx = 17
tx = 17 / rx = 33
tx = 33 / rx = 17
tx = 17 / rx = 33
tx = 33 / rx = 17

Slave側

ISR! 17
ISR! 33
ISR! 17
ISR! 33
ISR! 17
ISR! 33
ISR! 17
ISR! 33
ISR! 17
ISR! 33
ISR! 17
ISR! 33
ISR! 17

※ Master側の受信はずれている。最初からずれているのであとはずっとずれてしまった。

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

Arduino IDEでSTM32F411 Black Pillへスケッチを書き込む

はじめに

STM32F411CEU6実装のWeact Black Pillボードが簡易にArduino IDEでUSB Type-C or シリアル(USB→TTL 4ピン)経由、スケッチが書き込めるかを実験してみよう。当然、FlashLoader、keilなどでJTAG、SWD経由でもFlash書き込み可能とされる。因みに、出荷時の初期状態ではWeAct HID bootloaderが書き込み済みなので、電源を入れたら、C13 LEDが点滅状態に入るのを確認する。また、STM32CubeProgrammer 2.6.0STM32duino Bootloaderや、WeAct HID bootloaderを書き込んで出荷時の初期状態に設定できる。Bootloaderの書き込み先頭アドレスは0x8000000となる。

ボード情報

USB speed : Full Speed (12MBit/s)
Manuf. ID : STMicroelectronics
Product ID : STM32 BOOTLOADER
SN : 3197347F3030
FW version : 0x011a
Device ID : 0x0431
Device name : STM32F411xC/E
Flash size : 512 KBytes (default)
Device type : MCU
Device CPU : Cortex-M4

MCU情報

STM32F411CE、周波数100Mhz、RAM 128KB、ROM 512KB

手順

Flash書き込みソフトのSTM32CubeProgrammer 2.6.0をダウンロードして、Windows 64bit版の場合、exeファイルから、Ubuntuの場合、linuxファイルからインストールする。上記STM32CubeProgを使ってUSB書き込みの場合、プログラムモードにあるUSBポートが認識できない。後述Arduino IDEで書き込みの場合でもUSBポートが認識できない。また、Windows10、ubuntu 18.04環境とも同現象が出る。
※追記、上記USBポート認識できない現象、dfu-utilをインストールすることで解消する。

$sudo apt-get update
$sudo apt-get install dfu-util
$dfu-util -l

STM32duinoの追加

Arduino IDEでファイル→環境設定→下記リンクを追加して、ツール→ボード→ボードマネージャ→STM32を検索してインストールする。

https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json

ボード情報などの設定

シリアルの場合

stm32f411_arduino_ide_serial_setting
stm32f411_arduino_ide_serial_setting

USBの場合

stm32f411_arduino_ide_usb_setting
stm32f411_arduino_ide_usb_setting

PC接続

ボードをUSB Type-C or シリアルケーブルでPCに接続する。

モードの切り替え

プログラムモードへ切り替えるため、BOOT0を押下と同時にNRSTを押下→NRSTを離す→0.5秒後BOOT0を離す→初期状態のLED点滅が消える。この一連の指操作は、Finger Danceと言われる。

スケッチの書き込み

ファイル→スケッチ例→01Basics→Blink、書き込みボタンをクリックする。ときに書き込み失敗が起きても、再びモードを切り替て試したらほとんどの場合、2回連続の書き込みで済むようになる。

stm32f411_arduino_ide_usb_ok
stm32f411_arduino_ide_usb_ok

動作確認

下図のようにUSB接続、USB書き込みの場合、うまくいくと再び初期状態と違うパタンの青色LED点滅が確認できる。

STM32F411SEU6_Black_Pill動作確認
STM32F411SEU6_Black_Pill動作確認

追記

結論として、安価なST-Link/J-Linkでもプログラムの書き込みが安定して、そしてISPモード(シリアル、USB)で書き込む際に必要なFinger Danceも要らないので、作業に向いている。次に、ROSSerialなどを組み込んで、オープンソース化するロボット関連製品の開発に役立てたい。これで、Arudino開発環境が馴染み深いユーザーさん向けの製品の開発にとくに意味あると考えられる。

参考資料

WeActTC/MiniF4-STM32F4x1

関連記事

STM32CubeIDEでSTM32F411設定

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

6軸9軸IMUパフォーマンス

はじめに

6軸、9軸IMUのパフォーマンスについて、さまざまな視点からテスト可能となり、以下のとおり、センサフュージョン、出力周波数、ドリフト、4元数出力、遅延において、弊社ならではのテスト項目、手順をご紹介する。

確認環境の例

・Ubuntu 18.04
・ROS Melodic
・MCU: SAMD21G18A
・IMU: TDK Invensense ICM-20948

センサフュージョン、4元数出力

FPGAなどハードウェアによるセンサフュージョン(4元数出力)、出力値の分散が小さいほうが望ましいので、rvizで出力結果を確認する。

$roslaunch icm20948_imu_driver icm20948_imu.launch
$rostopic imu/data

出力周波数

ROSコマンドで出力周波数を簡単に確かめる。200Hz以上つまり5ms間隔データの出力が望ましい。

$rostopic hz imu/data

ドリフト

数時間〜数十時間に亘って、rqt&rvizで静止状態センサの出力はどれくらい変動したかを確かめる。平均値の変動、分散とも小さいほうが望ましい。

$rosrun rqt_plot rqt_plot

遅延時間

500〜1000fps 高速レコーディングカメラで撮影した動画を解析して、遅延時間を確かめる。fpsが高い、IMUの遅延時間が短いほうが望ましい。

動画コンテンツ

以下イメージをクリックすると、youtubeへジャンプする。

imu_performance_test
imu_performance_test

関連記事

9軸IMU 6軸/9軸フュージョン ICM-20948をロボットに組み込もう
9軸IMU MPU-9250をロボットに組み込もう
6軸IMU MPU-6050をロボットに組み込もう

3+

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

KiCADの自動配線ツールの入手

概略

KiCAD自動配線に必要なツールはFreeroutingとJava SDKの2種類あります。以前利用したリンクは何故か切れてダウンロード不能となって、2020年9月時点において下記のリンクからダウンロードできた。また、必要に応じてインストールしておく。

リンク

・Freerouting releases
・Java SE Development Kit 15

以前、PHPの開発でNetBeans(IDE環境)に馴染み深いので、今回NetBeansとJDK 8を以下のリンクより同時にダウンロードしてそして一発でインストールすることもできて便利に感じる。
・Freerouting releases
・JDK 8u111 with NetBeans 8.2

なお、Freeroutingに関するトラブルが起きた場合、Freerouting issuesを参照する。

Windows10およびUbuntu18.04でKiCADをインストールして、自動配線Freeroutingに、うまくいかないまたは気に入らない時に手動配線と組み合わせて、配線の工数を減らして、単層基板でも多層基板でも回路設計に充分に役立つ。

以上、ご参考まで。

2+

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア