9軸IMUセンサ 6軸/9軸フュージョン 低遅延 USB出力 補正済み ROS対応

はじめに

9軸IMU(型番hayate_imu)は、コロナ禍の中で開発した新商品、令和3年3月まで開発~製造、令和3年4月上旬の出荷と予定して、皆さんの学術研究にお役に立てるようと願って、どうぞご検討ご利用のほど宜しくお願い申し上げます。

製品紹介

9軸センサhayate imu、低消費電力プロセッサーCortexM0+、TDK MPU-9250後継機種である、1.71V低電圧で動作可能なICM-20948使用、6軸/9軸融合クォータニオン(四元数)はFPGA on chip(DMP3)から低遅延出力、別途ソフトでフュージョン必要なし、最大出力レート225Hz、同時に加速度(アクセル)3軸データ225Hz、角速度(ジャイロ)3軸データ225Hz、地磁気(コンパス)3軸データ70Hzまで出力可能、補正済み、ROS対応。ロボット、ドローンなど低遅延が必要とされる科学研究、電子機械の検証試作ヘの活用が期待される。

主な仕様

・ 型番 hayate_imu rev.C 6軸フュージョン or ver.B 9軸フュージョン切替可能
・ 内蔵チップ Cortex-M0+、TDK Invensense ICM-20948(9軸)実装 ※1
・ 外部接続 USB Type-Cコネクタ、USB +5V給電 ※2 ※3
・ 最大出力レート ※4
  - 6軸フュージョン or 9軸フュージョン回転ベクトル四元数 225Hz
  - 加速度(アクセル)3軸センサ  225Hz
  - 角速度(ジャイロ)3軸センサ  225Hz
  - 地磁気(コンパス)3軸センサ  70Hz

・ 測定レンジ
  - 加速度(アクセル)センサ  ±16g
  - 角速度(ジャイロ)センサ  ±2000dps
  - 地磁気(コンパス)センサ  ±4900µT

・ 消費電力 50mW以下(環境温度21℃の実測値)
・ 寸法 30mm × 31.4mm × 4.8mm(突起物含む)
・ 重量 4g以下
・ 取付穴 M3x4、隣り合う穴の中心間距離24.4mm

※1 内蔵Cortex-M0+とICM-20948間インターフェースはSPI(4Mbps)使用、加速度センサ(消耗)、角速度センサ(温度、ドリフト)、地磁気センサ(磁気変動)にダイナミック補正。
※2 USB対向装置OS環境 Ubuntu 16.04以降推奨。
※3 USB対向装置ROS環境 Kinetic以降推奨。
※4 最大出力レートはhayate imuの実力値、IMU対向装置(USB接続先)での実効値はその装置のリソース(CPUクロック周波数、メモリ容量・スピード)に関わる。

デモ情報

hayate_imu ROSパッケージ | Githubリポジトリ

9軸IMUセンサ ICM-20948内蔵 6軸/9軸シュージョン 出力レート225Hz 低遅延 USB出力 ROS対応 | YouTube

9dof_hayate_imu_youtube
9dof_hayate_imu_youtube

販売情報

【製品名称】hayate_imu rev.C 6軸フュージョン or ver.B 9軸フュージョン
【開発会社】ROBOT翔(株式会社翔雲)
【発売時期】令和3年4月上旬頃
【取扱店舗】9軸IMUセンサ 6軸/9軸フュージョン 低遅延 USB出力 補正済み ROS対応 | ROBOT翔

参考資料

Migrating from MPU-9250 to ICM-20948-InvenSense
http://wiki.ros.org/ja/9dof_hayate_imu

関連記事

9軸IMUセンサ ICM-20948をロボットに組み込もう

1+

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

SAMDへファームウェアを書き込む

はじめに

SAMDへUSB(CMDプロンプト、ターミナル)/J-Link(Amtel Studio)経由でファームウェアの書き込み方を以下に記す。

CMDプロンプトから

以下は書き込みの例、USBポート番号とBIN/HEXファイルのパスを実際に使用中のものを入れ替える。

ubuntu 18.04の場合

sudo /home/ub/snap/arduino/50/.arduino15/packages/arduino/tools/bossac/1.7.0-arduino3/bossac -i -d --port=ttyACM0 -U true -i -e -w -v path_to_sample.bin -R 

windows 10の場合

C:\Users\user\AppData\Local\Arduino15\packages\arduino\tools\bossac\1.7.0-arduino3/bossac.exe -i -d --port=COM5 -U true -i -e -w -v path_to_sample.bin -R 

Amtel Studioから

AS立ち上げ → J-Link接続 → Device Programing → Fuses → Memoriesの順に書き込んでいく。

amtel_studio_bin_fuses
amtel_studio_bin_fuses

amtel_studio_bin_upload
amtel_studio_bin_upload

1+

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

PCBAをAllpcbに発注してみた

概況

テスト用サンプルを作成することで、品質かねてコストの面から海外PCB生産を試してみたいと思ったので、旧正月休まず営業と宣伝していたAllpcb(Jiepei、捷配)に依頼した。今回はPCBのみならず、試しに部品調達、実装も頼むことにした。

allpcbにpcbaを発注してみた
allpcbにpcbaを発注してみた

ミッション

PCBサイズ5cm x 5cm+、かつMOQが5枚+のハードルから、PCB 5枚大きいサイズPCB 5枚(6cm x 6cm)、小さいサイズPCB 20枚(3cm x 3cm)、面付2枚x2枚、つまり大きいサイズPCBに小さいサイズPCBが4枚入るので、大PCB 5枚=小PCB 20枚と注文した。また、小さいサイズPCB 4枚に部品調達に実装も依頼した。Allpcbが一旦図面、部品調達確認を終えたものの、のち、Allpcb営業から面付のVスロット加工は8cm x 8cm+にしないとできないと、Vスロットの代わりに、0.5mmの穴開けをすると提案した。Allpcb営業曰く回路と外観に影響なしと言い切ったので、今回限り見栄えを犠牲するかもしれないことを覚悟してGo aheadと穴あけ提案を承認した。

これまでの流れ

2月10日にAllpcb営業にWEBメッセージを送って、ユーザ登録を済ませてGerb&BOMファイルをUpload、2月12日旧正月を挟んで、2月19日にAllpcb営業が確認完了、3月2日までに作成完了と伝えて、2月19日にクレジットでお支払いを済ませて、いよいよ生産をスタートさせることに。これで、旧正月を挟んだとはいえ、ほとんど毎日メッセージかメールの往来で生産に必要な図面確認してもらって9日間もかかった。料金は、166.56USDと表示して、実際の支払い+5USD(3%)、カード会社の手数料だろうか。DHL送料は28USDとの見積もりで、クーポン30USDで免除となった。残りのクーポン2USDが破棄か行方不明。

PCBA工程

Allpcb営業が作成したスケジュールは上記添付画像のとおり。

Parts

5日(2月19日~2月25日)、冗長分含む部品代75.80USD。すべての部品の数がPCB図面必要数以上に調達したようで、生産時のムダが発生した際に必要だそうだ。最後余った分を完成品とともに必ず送るように要望した。

PCB

5日(2月19日~2月25日)、製造費用17.00USD。

SMT

2日(2月26日?~2月27日?)、実装費用70.69USD、開始、完成時間がよく分からない。

オーダー~届くまで

今回PCBA生産依頼したものが届くまでの進捗を以下のとおり記録しておくので、ご参考にしてください。

・2月10日(水) 見積依頼、注文オーダー、2月12日(金)旧正月、2月15日(月)旧正月連休明け

→2月19日(金) やっとAllpcb技術が確認完了、2月25日にPCB完了、3月2日に発送の予定が知らせたので、支払い済ませた

→2月25日(木) PCB予定完了日、完了せず、Allpcbに連絡して返事なし

→2月26日(金) 返事なし

→2月27日(土) 再度連絡、2月25日にPCB完了予定だったが、完了せず、部品到着済み、SMT未着手と返事くれた。予定日3月2日の出荷に間に合うか、遅れるならいつ送るか不安、やっと19時19分にPCB Packing完了

→2月28日(日) PCBAに入ったらしい、予定の3月2日出荷に間に合いそう

→3月2日(火) Allpcb営業に本日出荷可能かと確かめると、本日出荷できない、いつ出荷するかわからないと返事してくれた。予定日出荷不能のことを事前予告なし、いきなり出荷しないとの事態になった。再度遅延の理由を聞いたところ、注文が立て込んで生産が追い付かない状況?との回答だった。予定とおりに出荷するようと要望して工場が調整した結果、日暮れ時今夜DHL発送可能との回答あった。

allpcb-message
allpcb-message

→3月3日(水) DHL画面で荷物を検索したところ、Allpcbが荷物データを作成したが、DHLへの引渡しは完了してないと。やはり宣言通りに3月2日(火)に出荷できなかった。クレームを出して早く出荷するよう求めた。13時すぎDHL集荷した。

allpcb_dhl
allpcb_dhl

→3月5日(金) DHL配達予定日。

→3月6日(土) 予定日より1日遅れて、届いた。関税&DHL通関手数料→1900円、制作総額→およそ2万円。早速PCBA=4枚、動作確認していずれも設計通りに動いたので主な目標が達成したとの判断。ステンシルの添付を忘れたみたいなので、別途送付するようと要望した。

pcba_動作確認
pcba_動作確認

→3月8日(月) Allpcb営業はステンシルが工場の判断で破棄したと返事、おかしいと感じた。情報セキュリティへ不安が残る。

結び

注文~届くまでほぼ1ヶ月経った。品質に不安があったが、幸いに動作確認済みなので、今回の制作が目標達成とした。反省として、PCBAよりPCBを発注したほうが良いことが分かった。また海外配送のほうがDHLでも3~4日かかるので、早く作りたいのであれば、国内へ発注したほうが良い。なお、Allpcbの場合、本社と営業は杭州市におき、工場は安徽省のどこかにあるか、外注したためか、キャッチフレーズに書いたように「世界最速生産」は、残念ながら実力を見せられなかった。PCBAの場合、部品が揃わないと長い時間かかるため、国内へ発注か、部品を調達して自社で実装したほうが良いだろう。良いところとしては、価格と、営業は平日、休日にも関わらず連絡すると返事してくれた。日本製含む部品の価格は、中国現地で調達したほうが圧倒的に安い。もちろん正規ルートから購入するのが前提。恐らくほとんどの部品は東南アジアで製造されて、まして大量購買による単価の引き下げが当然なことだ。ステンシルを送ったらお客がSMTを頼まないとか、送料はお客が払うから高いほうを選ぶとか考え方がおかしい、嘘やんと思われた時に大人の辛抱が必要でまだ進化の余地が多々あると感じさせられた。この経験を生かして、これからは評判のよいJLCPCBに発注することに。

関連記事

PCBをJLCPCBに発注してみた

2+

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

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翔・電子部品ストア