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

rosserial_arduinoをSTM32F4に対応させてみる

はじめに

rosserialはROSノードと非ROSノードをシリアルで繋ぐ役割を果たせるパッケージとしてよく知られている。ただし、ArduinoノードとしたSTM32F4に公式に対応しておらず、今回はROS melodicベースのArduinoノードとしたSTM32F411CEU6にroseerialを立ち上げてみた。動作確認テストを含むソースコードはGithubに公開を予定している。ソースコードの改修および動作確認に手数かかるため、ROS melodicを除いて、他のROS Distroはまだ確認しておらず、Githubでのコメント、プルリクエスト、フォークについては他の開発者からの情報共有を歓迎する。

ソースコード

すみません、作成中です。

テスト

テスト環境 Arduino V1.8.13 & STM32F411CEU6
rosserial公式サンプルのLED Blinkingをそのまま流用する。一目瞭然なので、説明は割愛する。

参考文献

rosserial melodic-devel branch@Github

0

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

外部32.768KHzクリスタルからSAMD21クロック設定まで

はじめに

外部32.768KHz水晶発振子からSAMD21クロックを48MHzに設定する手順、ソースをメモにしておく。

設定手順

1. DFLL48Mリファレンスとして使用されるXOSC32Kクロック(オンボード外部32.768Hzクリスタル)を有効にする。
2. XOSC32Kを汎用クロックジェネレーター1として使用する。
3. 汎用クロックジェネレータ1を汎用クロックマルチプレクサ0(DFLL48Mリファレンス)のソースとして使用する。
4. DFLL48Mクロックを有効にする。
5. 汎用クロックジェネレータ0をDFLL48Mに切り替える。
6. CPUのクロックは48MHzで動作する。

ソースコード

下記参考資料から抜粋したソースは以下のとおり。

/* Set 1 Flash Wait State for 48MHz, cf tables 20.9 and 35.27 in SAMD21 Datasheet */
NVMCTRL->CTRLB.bit.RWS = NVMCTRL_CTRLB_RWS_HALF_Val ;

/* Turn on the digital interface clock */
PM->APBAMASK.reg |= PM_APBAMASK_GCLK ;

/* Enable XOSC32K clock (External on-board 32.768Hz oscillator) */
SYSCTRL->XOSC32K.reg = SYSCTRL_XOSC32K_STARTUP( 0x6u ) | /* cf table 15.10 of product datasheet in chapter 15.8.6 */
                       SYSCTRL_XOSC32K_XTALEN | SYSCTRL_XOSC32K_EN32K ;
SYSCTRL->XOSC32K.bit.ENABLE = 1 ; /* separate call, as described in chapter 15.6.3 */
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_XOSC32KRDY) == 0 )
{
  /* Wait for oscillator stabilization */
}

/* Software reset the module to ensure it is re-initialized correctly */
GCLK->CTRL.reg = GCLK_CTRL_SWRST ;
while ( (GCLK->CTRL.reg & GCLK_CTRL_SWRST) && (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY) )
{
  /* Wait for reset to complete */
}

/* Put XOSC32K as source of Generic Clock Generator 1 */
GCLK->GENDIV.reg = GCLK_GENDIV_ID( GENERIC_CLOCK_GENERATOR_XOSC32K ) ; // Generic Clock Generator 1
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Write Generic Clock Generator 1 configuration */
GCLK->GENCTRL.reg = GCLK_GENCTRL_ID( GENERIC_CLOCK_GENERATOR_OSC32K ) | // Generic Clock Generator 1
                    GCLK_GENCTRL_SRC_XOSC32K | // Selected source is External 32KHz Oscillator
//                  GCLK_GENCTRL_OE | // Output clock to a pin for tests
                    GCLK_GENCTRL_GENEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Put Generic Clock Generator 1 as source for Generic Clock Multiplexer 0 (DFLL48M reference) */
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID( GENERIC_CLOCK_MULTIPLEXER_DFLL48M ) | // Generic Clock Multiplexer 0
                  GCLK_CLKCTRL_GEN_GCLK1 | // Generic Clock Generator 1 is source
                  GCLK_CLKCTRL_CLKEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Enable DFLL48M clock */  
SYSCTRL->DFLLCTRL.reg = SYSCTRL_DFLLCTRL_ENABLE;
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}
SYSCTRL->DFLLMUL.reg = SYSCTRL_DFLLMUL_CSTEP( 31 ) | // Coarse step is 31, half of the max value
                       SYSCTRL_DFLLMUL_FSTEP( 511 ) | // Fine step is 511, half of the max value
                       SYSCTRL_DFLLMUL_MUL( (VARIANT_MCK + VARIANT_MAINOSC/2) / VARIANT_MAINOSC ) ; // External 32KHz is the reference
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Write full configuration to DFLL control register */
SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_MODE | /* Enable the closed loop mode */
                         SYSCTRL_DFLLCTRL_WAITLOCK |
                         SYSCTRL_DFLLCTRL_QLDIS ; /* Disable Quick lock */
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Enable the DFLL */
SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_ENABLE ;
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLLCKC) == 0 ||
        (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLLCKF) == 0 )
{
  /* Wait for locks flags */
}
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz. */
GCLK->GENDIV.reg = GCLK_GENDIV_ID( GENERIC_CLOCK_GENERATOR_MAIN ) ; // Generic Clock Generator 0
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Write Generic Clock Generator 0 configuration */
GCLK->GENCTRL.reg = GCLK_GENCTRL_ID( GENERIC_CLOCK_GENERATOR_MAIN ) | // Generic Clock Generator 0
                    GCLK_GENCTRL_SRC_DFLL48M | // Selected source is DFLL 48MHz
//                  GCLK_GENCTRL_OE | // Output clock to a pin for tests
                    GCLK_GENCTRL_IDC | // Set 50/50 duty cycle
                    GCLK_GENCTRL_GENEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

参考資料

ArduinoCore-samd | Github

0

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

PCBをJLCPCBに発注してみた

はじめに

今回は、PCB生産を評判の良いJLC(嘉立創、深せん市)に任せてみたので、お問い合せからPCBが届くまでの経過をメモにしておく。

お問い合せ

英文のサイトに、対応もサイトから英文でLive chat可能、土日含めて何回もリクエストを出してほぼ待たさずにすぐに返事が来る。リクエストへ回答の質も良く、PCBに詳しい、プロの印象を受けた。のちほど自分が注文のオプション設定にミスを犯して向こうエンジニアの経験で自主回避して細心の注意を払っていることが分かった。

発注

1回発注するとあとはスムーズにいくはず、質問があるとすぐ聞けるので大きな支障がなかった。ホームページは使いやすいほうと。今回12cm寸法のPCB 5枚にサイズ16cmのステンシルを1枚依頼した。GerbビュアーがついてUploadのあとで便利に確認できる。ところで、何故かクーポンの使えるところがいないではないかと聞いたら、すぐ「ご迷惑をかけた」と謝った。

生産

16日(金)夕方の発注からステンシルは16日(金)22時頃の開始~18日(日)14時頃、PCBは21日(水)6時頃の完成、約5.3日間かかった。予定の3日間を超えた。以下履歴画面と見ると、生産のプロセス、スケジュール、いま現在のステータスが明確になっている。また、今回は不透明レジストを聞いたら、対応できないと即答してくれた。ごく普通に依頼した。

決済

送料込み4,400円ほど。支払いにJPay、クレジット、Paypalが使える。JPayについては説明を見ると銀行の振込みみたいなので申し込みが必要。

配送

送料の高い順からDHL、SFexpress、ダイレクトメールが選べる。1kgなら2000円未満。今回の配送はDHLを選んで、深せん~香港~届くまで、約5日間かかった。梱包はしっかりしている。

検収

目視検査および回路の動作を確認済み。シルクはセラミックのようにきれいに見えて繊細の表現までできている。

所感

依頼したあとで企業情報を調べてみると大きな工場を持つ企業であることと分かった。電子部品のほとんどは東南アジア生産なので、コストのみならず物流の利便性からみても深せんのほうは都合が良いかもしれない。きちんと生産、技術、社会貢献に注力する企業ならば支持すべきだと思う。同社の部品サイトLCSCは、まだDIGIKEY、MOUSERほど部品が揃っていないのでこれからと期待する。

jlcpcb-order
jlcpcb-order
1+

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

Ubuntu 20.04 + ROS Noetic

はじめに

新製品のテスト環境を用意することで、Ubuntu 20.04 + ROS Noeticを「Raspberry 3 Model B v1.2 (2015 Made in Japan)」にインストールしてみた。2015年製のRaspberry Pi旧型機種なのに、テストに都合が良く、インストールの手順をメモしておく。

Ubuntu 20.04

Raspberry Pi向けUbuntu Server 20.04.2 LTSをダウンロードしてSDに書き込む。

$xz -dv ubuntu-20.04.2-preinstalled-server-arm64+raspi.img.xz
$sudo dd if=ubuntu-20.04.2-preinstalled-server-arm64+raspi.img of=/dev/mmcblk0 status=progress

SDカードを抜き差しすると、

$df -k

SDカードをRaspberry Piに挿すと、ubuntu:ubuntuでログインする。

$ip -a
$sudo nano /etc/network/interfaces
$auto eth0
$iface eth0 inet dhcp
$sudo ifup eth0
$sudo apt-get update
$sudo apt-get upgrade

ROS Noetic

$sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
$sudo apt update
$sudo apt install ros-noetic-desktop-full
$echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
$source ~/.bashrc
$sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
$sudo rosdep init
$rosdep update
$mkdir -p ~/catkin_ws/src
$cd ~/catkin_ws/
$catkin_make
$echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
$source ~/.bashrc
$roscore

参考資料

Install Ubuntu on a Raspberry Pi
Ubuntu install of ROS Noetic

0

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

コマンドラインでリポジトリ作成

はじめに

Windows Github APPより、ときにUBUNTUでリポジトリをプッシュしたほうが都合がよいので、至って簡単にできたのでメモしておく。

プッシュ手順

1. https://github.com/github_idでNEWリポジトリを新規作成しておく。

2. コマンドラインで新しいリポジトリをプッシュする。

cd reposity_folder
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/github_id/reposity_name.git
git push -u origin main

続いて、github_id、passwordを入力しておくと、完成となる。

もしgitファイルはローカルに存在して、initとaddが省いてコマンドラインから既存のリポジトリをプッシュして良い。

cd reposity_folder
git remote add origin https://github.com/github_id/reposity_name.git
git branch -M main
git push -u origin main

続いて、github_id、passwordを入力しておくと、完成となる。

以上

1+

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