LoginSignup
0
0

TofセンサVL6180xをAPI叩いてnucleo-f303k8で使う

Last updated at Posted at 2023-06-25

概要

STMマイコンを使ってみよう、ということでnucleo-f303k8でLチカ、HelloWorldをしたのだが、もともと練習の目標だった測距センサの評価がしたいね!ということで始まった。

CubeIDEの使いかた、APIとかセンサのデータシート読みで苦労したが、デキる人たちに助けてもらいI2Cを用いて何とか動かせた、という話。

使ったもの

https://www.st.com/en/evaluation-tools/nucleo-f303k8.html
https://www.pololu.com/product/2489

前段階

とりあえずHALでI2Cを動かしてみる。ArduinoのWireライブラリ様に慣れ切っていたためデータシート読んでレジスタ叩いて~というのに苦労した。

  • I2Cの仕組みを知る(いいデータシートはそこから説明してくれてる)
  • 書き込みと読み取りを「指定したレジスタ」に対して行うので、その表部分だけでもデータシートで読めば動く
    ということを知る。

以下参考になったリンク
https://qiita.com/sttn/items/567c9f49b88ff275b51a
https://yukblog.net/stm32cubeide-printf-uart/
https://forum.digikey.com/t/stm32cube-hal-i2c/22664

APIを使う

web系のサービスが強くなってそっちのイメージが強いAPIだけども、STMicroとかが用意してるセンサ類とかのAPIもある。
今回APIってライブラリみたいに入れたら簡単に使えて便利なんでしょ~と思っていたが、素人なのでかなり理解するまでに時間がかかった。
つまずいた点は以下

  • CubeIDEが慣れない
  • API使う上で一部自作しないといけない
  • 回路のトラブル

まず、https://www.st.com/en/imaging-and-photonics-solutions/vl6180x.html からAPI一式をダウンロード(登録が必要)をして、内包されているdocsの中のhtmlからデータシートを閲覧。
一通りの.hと.cをそれぞれCoreのIncとSrcに入れる。

そこで用意された関数が使えないことに気づく。
データシートを読んだ結果、VL6180x_I2CWriteとVL6180x_I2CReadを自作しないといけないこと、自分の思ってたデータ型が今回用意されてる構造体とあってなかったことに気づく。

コード

https://github.com/daidai100/Tests/tree/main/vl6180xTesting/vl6180xTesting
にまんま挙げてある。
-.hをIncに.cをSrcにいれる
-.main.cに以下の文を足す

main.c
/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c1;

/* USER CODE BEGIN 0 */
int  VL6180x_I2CWrite(VL6180xDev_t dev, uint8_t  *buff, uint8_t len){
	HAL_I2C_Master_Transmit(&hi2c1, dev, buff, len , 1000);
	return 0;
}

int VL6180x_I2CRead(VL6180xDev_t dev, uint8_t *buff, uint8_t len){
	HAL_I2C_Master_Receive(&hi2c1, dev, buff, len, 1000);
	return 0;
}
/* USER CODE END 0 */

用意された関数を使いたいときはさらに初期化とデバイスの指定をしないといけない。(今回は単デバイスなのでシンプルだけど複数の時は用意された宣言方法に注意。)

main.c
  VL6180xDev_t myDev = 0x52;
  VL6180x_RangeData_t Range;

  VL6180x_InitData(myDev);

これでやっと以下のようにAPIで用意されてて使いたかった関数が使えた!

main.c
  VL6180x_RangePollMeasurement(myDev, &Range);
	  if (Range.errorStatus == 0 ){
		  printf("%d mm\r\n", Range.range_mm); // your code display range in mm
	  }else{
		  printf("Failed to get distance\r\n"); // your code display error code
	  }

連続モードとかいろいろとモードでまた微妙に使いかたが違うみたい。

問題点

  • 回路の問題で複数センサが同時に複数使えない→回路設計見直せば行けそう
  • CubeIDE慣れない→PlatformIOとかをSTM仕様にしてやろうかな

今後

あまりプログラミングに耐性がない(一から作ろうとするとエラーの解決とかで大体挫折する)ので多少遠回りとか冗長でも外部リソースを使いたい!と思っているのでAPI使えるようになってきたのは大きな一歩だと思うことにした。

あとやっぱりプログラミングでエラーが出るとそこからの復帰が人より不得意であることを自覚したので人を使うなりAIとかツールを使うなり対策したい。

ArduinoIDEを使って書き込めばもっと簡単であった模様。

次はWeb系のAPIとか触ってみたいなーと思う今日この頃。
多少ごちゃってて重くてもAPI取説がしっかりしてるから動くのありがたい。
とにかく動くのが偉い。ということで。
今後作るものに活かしたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0