LancerStratos’s blog

第23回ロボットグランプリに向けたロボットランサー”ランサーストラトス”開発記録

BNO055読み取り成功

やっとBNO055の方位角(オイラー角)読み出しに成功しました。原因はデータ型の間違いでした。マニュアルには、オイラー角の出力型は符号付き2バイトとなっているので、上位8ビットと下位8ビットを組み合わせた時のデータ型をint16_tとしなければならないところ、マニュアルに「方位角は0~360°で出力」とあるのを見てuint16_tでよいと思い込んでいたのが間違いだったようです。これに気付くまで、何十回と書き込みを繰り返しました。

方位角出力の時間変化を液晶に表示させてみると、結構ドリフトしているような気がします。以前秋ピコで試したときはそれほどドリフトしなかった記憶なだけにガッカリです。とりあえず読み取りできたので、コースを周回させたときにどうなるか見てみようと考えています。今回作成した関数を記載しておきます。赤字に注目。

#include "stm32f4xx_hal.h"
#include <stdio.h>
extern I2C_HandleTypeDef hi2c1;

#define BNO055_ADDRESS (0x28<<1)
#define BNO055_SYS_TRIGGER 0x3f
#define BNO055_SYS_TRIGGER_1 0b11000000
#define BNO055_SYS_TRIGGER_2 0b10000001
#define BNO055_PWR_MODE 0x3e
#define BNO055_PWR_MODE_1 0b00000000
#define BNO055_AXIS_MAP_CONFIG 0x41
#define BNO055_AXIS_MAP_CONFIG_1 0x21
#define BNO055_AXIS_MAP_SIGN 0x42
#define BNO055_AXIS_MAP_SIGN_1 0x01
#define BNO055_UNIT_SEL 0x3b
#define BNO055_UNIT_SEL_1 0b0000000
#define BNO055_OPR_MODE 0x3d
#define BNO055_OPR_MODE_1 0b00001100

uint8_t bno_read_address = 0x1a;
uint8_t bno_receivedata[2];
int16_t Eular_Z;

void BNO055_Init()
{
    HAL_I2C_Mem_Write(&hi2c1, BNO055_ADDRESS, BNO055_SYS_TRIGGER, I2C_MEMADD_SIZE_8BIT, (uint8_t*)BNO055_SYS_TRIGGER_1, 1, 100);
    HAL_I2C_Mem_Write(&hi2c1, BNO055_ADDRESS, BNO055_SYS_TRIGGER, I2C_MEMADD_SIZE_8BIT, (uint8_t*)BNO055_SYS_TRIGGER_2, 1, 100);
    HAL_I2C_Mem_Write(&hi2c1, BNO055_ADDRESS, BNO055_PWR_MODE, I2C_MEMADD_SIZE_8BIT, (uint8_t*)BNO055_PWR_MODE_1, 1, 100);
    HAL_I2C_Mem_Write(&hi2c1, BNO055_ADDRESS, BNO055_AXIS_MAP_CONFIG, I2C_MEMADD_SIZE_8BIT, (uint8_t*)BNO055_AXIS_MAP_CONFIG_1, 1, 100);
    HAL_I2C_Mem_Write(&hi2c1, BNO055_ADDRESS, BNO055_AXIS_MAP_SIGN, I2C_MEMADD_SIZE_8BIT, (uint8_t*)BNO055_AXIS_MAP_SIGN_1, 1, 100);
    HAL_I2C_Mem_Write(&hi2c1, BNO055_ADDRESS, BNO055_UNIT_SEL, I2C_MEMADD_SIZE_8BIT, (uint8_t*)BNO055_UNIT_SEL_1, 1, 100);
    HAL_I2C_Mem_Write(&hi2c1, BNO055_ADDRESS, BNO055_OPR_MODE, I2C_MEMADD_SIZE_8BIT, (uint8_t*)BNO055_OPR_MODE_1, 1, 100);
}

int16_t get_Heading()
{
    if(HAL_I2C_Mem_Read(&hi2c1, BNO055_ADDRESS, bno_read_address, I2C_MEMADD_SIZE_8BIT, &bno_receivedata[0], 2, 1) == HAL_OK)
        Eular_Z = (bno_receivedata[1]<<8) | bno_receivedata[0];
        else Eular_Z = 999;
    return Eular_Z;
}

BNO055マニュアルには基準座標が下記の通り示されています。この図から方位角はZ軸に関連すると考えるのが普通だと思うのですが、方位角を読みだすアドレスの名はZでなくXと書かれていて、この間違いに気づくのにもかなりの時間がかかりました。マニュアルをよく読めば分かることなのですが。

BNO055座標

BNO055読み取りならず

BNOじゃなくVINOに乗って近くの「かつや」に行きました。お目当ては「ホル玉とロースカツの合い盛り丼」税込み¥869です。2週間前に行ったときは昼過ぎですでに売り切れだったのでリベンジです。自分のものにはホルモン3切れが入っていました。美味しかった。期間限定ということで、1食でも食べることができてよかったです。

ホル玉とロースカツの合い盛り丼

さて先週に引き続き新基板用プログラムを開発しています。

近藤のシリアルサーボKRS2542の作動が確認できました。なので残すはBNO055との接続になります。これまではネットに転がっていたプログラム例を参考にマイコン(STM32F405)とBNO055との通信にHAL_I2C_Master_Transmit/Receive関数を用いていました。試しにMPU9250の時に使っていたHAL_I2C_Mem_Write/Read関数に変えたところ、通信ができるようになりました(と思っている)。確かにBNO055のデータシートをよく見るとI2C通信プロトコルとしては後者の関数の方が合っているようです。では、ネットに転がっていた例は何だったのだろう・・・。

しかしながら、肝心のオイラー角の読み出しには至っていません。方位角の上位8ビットと下位8ビットをつないで16ビットの符号付整数データ(int16_t)とし、16で割ってdeg単位に変換して液晶に表示させようとするのですが、期待通りに表示してくれません。まあ、通信自体はできている様なので、データ型の取り扱い辺りを間違っているのではないかと思って気長にやっていきます。

BNO055接続ならず

先日、人生で初めての原付を購入し、週末はちょこちょこと乗車して楽しんでいます。ヤマハのVINOの新色ですが、丸っこいデザインが気に入っています。大切に乗っていきたいと思っています。

VINO YAMAHAのHPから

さてロボットランサーですが、DCモータ制御のためTB67H450FNGの作動を試し、無事に回転することを確認しました。マイコンカーラリーの作例にあるMOSFETを4個使用したHブリッジ回路に比べると最大電流が少ないのですが、回路と工作のシンプルさがもたらす信頼性は魅力です。ピニオンギヤとスパーギヤのバックラッシュが不適切だったようで回転中の音が大きかったのですが、ピニオンを10歯から8歯へ変えたところ劇的に静かになりました。ラジコン飛行機やラジコンカーでバックラッシュを調整する際は、新聞紙1枚挟める程度、という指示だった記憶が懐かしく蘇ります。

9軸センサーモジュールBNO055との接続も試みましたが、今週は確認できませんできた。以前、秋月製RP2040マイコンボード(秋Pico)にて同モジュールとI2C接続できた経験があるので簡単にできると思ったのですが、プログラム上の何らかのミスだと思います。時間があれば解決できると思います。

ゆくゆくは2つのロータリーエンコーダで車速と方位角変位を計算、それを累積することでコーナリング中の機体位置と方位角を計算し、ラインセンサーを使わないコーナリングを実現したいと考えています。この際、方位角の確からしさを確認するためにBNO055が出力するオイラー角を参照しようと考えています。

新しい基板と車体の連接

最近花粉症が酷く、鼻の奥がイガイガして涙や鼻水がでて止まりません。眼に痒みもあり、遂に最悪の症状になってしまったようです。こんな時はお気に入りのYouTube動画(2014年RIJのELTDear My Friend”など)を聞き自分を鼓舞して作業します。

新しく届いたプリント基板に部品をはんだ付けするのにかなり時間がかかりました。一番最初にSTM32マイコンICをはんだ付けしましたが、0.5mmピッチQFP64のはんだ付けは老眼にはとても難しい作業でした。今回は余白をグランドで塗りつぶしたため熱が逃げやすく、グランドへのはんだ付けが難しかったですが、何とか仕上げました。

苦労の成果

組みあがった基板を車体と連接し2個のロータリーエンコーダREL18-100BPが正常にカウントされるか確認すると、左側がなにか変です。1個だけなら気づかなかったかもしれませんが、ある角度においてインクリメントしないのです。ノイズ対策のコンデンサを追加したり、正常動作している方の端子に繋ぎ変えてみたりしてみましたが解決しませんでした。そこで代わりに旧車体のエンコーダを移植したところ正常動作しました。写真は手押しして左右のエンコーダがほぼ同じカウントをすることを確認したところです。

左右ロータリーエンコーダのカウント

現時点において、SWD書き換え、TSL1401ラインセンサ、マーカーセンサ、ジョイスティックスイッチ、LED照明、LCD表示、圧電ブザー、バッテリー電圧表示、SD読み書き、ロータリーエンコーダについては、何とか旧車体と同様の作動をするまでの状態になりました。写真のジョイスティックスイッチ周りのジャンパー線辺りに苦労の跡が見え隠れしています。

今後9軸センサ、シリアルサーボ制御、DCモータドライブを確認したら走行実験に移ります。

ロボットグランプリ今年も開催されず

先日、ロボットグランプリ事務局に今年の開催予定を尋ねましたが無いとのこと。理由はコロナではなさそうですが、開催しないならしないでホームページに掲示してほしいです。再設計した基板をFusionPCBに注文していたのですが、ちょうど春節の時期だったので未だにデザインレビュー中とあり、もし大会が開催されていても出場は難しかったかもしれません。

かなり前の書き込みにある2010年第13回大会に出場した時のロボットの写真を偶然見つけたので載せてみます。

第13回ロボットグランプリ出場マシン

シャシーは3mm厚ポリカーボネイト板、推進、ステアリング共にタミヤギヤボックスを使用、マイコンはH8、前部の8つのラインセンサーを用いるタイプで、低速はいいものの少しスピードを上げるとすぐ蛇行して脱線してしまうマシンでした。が、ステアリングサーボの自作や、初めて感光両面基板に挑戦するなど、思い出深いマシンです。

さて、新作ランサーも作りかけで放っておくのもなんなので、一応完成はさせようと思います。今日は初めて秋月電子八潮店に車で行ってみました。秋葉原店には在庫が無かったZHコネクタ他を買いました。

 

ZHコネクタは難しい

3連休でロボット作製を頑張っていますが、現時点で第23回ロボットグランプリのホームページは更新されておらず、今年の開催の有無に関する情報は何もありません・・・

前回QIコネクタからZHコネクタに変更すると書きました。昨日からその作業をしていますが、コネクタに方向性があるので、仕上がりをイメージして金具を圧着する手順に配慮しないといけません。また金具がとても小さく、圧着工具へのセットが非常に難しい。私の圧着工具の場合、2回ラッチ音させた後にピンセットで金具をバレルにセットし反対側からリード線を差し込むのですが、工具内のリード線と金具の重なり具合が目で直接確認できないので、大体これくらいか?という感覚でやっています。数回練習した上で本番に移りましたが、視力的にとても厳しい作業です。

あと、ZHコネクタ専用ではないですがamazonにてコネクタ抜き工具を調達しました。これが無いとZHコネクタの扱いは不可能だと思います。

ZHコネクタへの変更

長すぎたロータリーエンコーダのリード線は最適な長さにカットしました。ついでに照明用LEDアレイ部もユニバーサル基板を用いてしっかりとしたものに作り変えました。

プリント基板設計再び

年末に新規作成したプリント基板のモータドライブが思う様に動かずFETを何度も壊してしまいました。検証用に従来品と比較しながらプログラムを修正したり、部品を交換したりしたのですが上手くいきません。そのうち従来品も動きが怪しくなり途方に暮れてしまいました。

一念発起し再度設計からやり直すことにしました。今回はモータドライブ回路に専用ICを用いて回路を簡略化するのと同時に、マイコンICのはんだ付けに挑戦することにしました。それ以外はほぼ従来品と同様です。昨日は徹夜でKiCADと格闘し明け方には何とか形になりました。

新たなプリント基板の設計

フラットパッケージICのはんだ付けは経験がありませんし、もちろん基板設計もしたことが無いのですが、ネット記事を参考に見様見真似でやってみました。一番心がけたのは、部品配置を考慮してマイコンから周辺回路への配線がなるべくシンプルになるようにした点です。CubeMXでピンアサインをあれこれと変化させ納得いくまで試行錯誤しました。

また、これまではQIコネクタを使用していましたが、挿抜機会の多いプログラム書き込みコネクタや電流量の大きなものを除き、小型化を考慮してZHコネクタを使う予定です。基板製造はFusionPCBに発注しました。2月末までには届くと思います。