2022年6月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

カテゴリー

ブログパーツ

無料ブログはココログ

花岡ちゃんのウィークエンド

週末で完結、簡単ロボティックプロジェクト

2022年5月 1日 (日)

レーザー距離センサVL53L0Xを複数使うには

花岡ちゃんのウィークエンド:

以前の投稿で、PIC24FでのVL53L0Xの使い方について説明しました。この時はI2CバスにVL53L0X一つだけを接続する使い方でしたが、今回は一つのI2Cバスに複数のVL53L0Xを接続する方法を解説します。以前の投稿のプログラムをベースにしてますので、こちらから始まる一連の投稿に目を通してから読んでください。

VL53L0XはI2C接続されるのでデフォルトのアドレスは0x29(7bit)となっています。このデバイスにはEEPメモリのようなアドレスを変更するピンはないので、起動時には全て0x29となってしまいます。その代わり、アドレスを変更するコマンドがあり、これで任意のアドレスを割り当てられるようになっています。ただし、割り当てたアドレスは電源を切ると初期値(0x29)に戻ってしまうので、起動時に毎回設定してやる必要があります。

接続はこの回路図のようにします。A,B二つのVL53L0Xを一つのI2Cバスに接続し、各デバイスのXSHUTピンをそれぞれマイコンのGPIOに接続します。

ダウンロード - hanaoka_vl53l0x_multi.pdf

XSHUTはリセットと同様に働く入力ピンで、これをLにするとVL53L0Xはデゼーブルになり、I2Cにも反応しなくなります。これを利用し、一つのVL53L0Xだけを有効にし、アドレスを設定していきます。

2個のVL53L0Xを使用する場合のプロジェクトを公開します。以前公開したものをベースにマルチ化したものですが、コンテニュアスモードだけがマルチに対応しています。シングルモードでは使えません。この点、注意してください。(作業を簡素化したためです。もちろんシングルモードでも複数のセンサを扱うことができます。)

ダウンロード - pic24f_vl53l0x_multi.x.zip

669行からがA,B二つのセンサに0x2A,0x2Bのアドレスを割り付け、コンテニュアスモードで初期化する部分です。測定値の読み出しかたは、690行あたりを見てください。VL53L0XのAPI(readRangeContinuousMillimeters()など)の実行前に、それぞれに割り当てたアドレスの指定が追加されています。

このようにA,Bセンサの値を読み出せます。

アドレスの割り当ては、次のような手順で行なっています。

1・全てのXSHUTをLにしてデゼーブルに

2・最初の一つのXSHUTをH、デフォルトアドレス(0x29)でアドレス変更APIを実行

3・次のXSHUTをH、デフォルトアドレス(0x29)でアドレス変更APIを実行

このように一つずつVL53L0Xをイネーブルにしてアドレスを変更する作業を、全てのVL53L0Xについて行えばよいわけです。

 

 

 

2022年4月14日 (木)

PIC24Fでレーザー距離センサVL53L0Xを使う(おしまい)

花岡ちゃんのウィークエンド:

VL53L0Xを使う際の注意点です。

 

1:実用測距性能は1mちょっと

VL53L0Xを使ったモジュールの謳い文句に「最大測定距離 2m」とよくありますが、これはあくまでも最大です。設定毎に下記のような制限があります。スペックでよくある控えめな数値というわけではなく、実際やってみるとほんとにこんな感じです。long rangeでは使ったことがないのでどの程度明るさ(日中の窓際など)の影響を受けるかはわかりません。

Range

 

2:レーザー光は円錐状に放射されてる

使う前は、レーザーというくらいだから、レーザーポインターのようにピンポイントで測定しているのかなと思ってましたが大違い。実際は次の図のように円錐形に広がっているそうです。

Rad

そのため、成形品の内側に置いて測定用の窓を開ける場合は注意が必要です。下の写真はこれを使ったある商品のセンサ部分です。白い部分が成形品で、そこから5mmくらい奥まったところにセンサを設置してます。これは試作段階なので測定窓がだいぶ大きいですが、量産版では色々工夫してこれより小さくできたとはいえ、結構大きな開口部が必要で、見た目が悪くなってしまいました。大きくしないと成形品にレーザーが当たって反射してしまうからです。設計段階では開口部がこれほど必要とは思わずに、生産上の都合からかなり奥まった位置にセンサ基板を置いてしまったのが敗因。センサはなるべく成形品ギリギリにしたほうが良いです。

Sensor

これはまた移動ロボットのセンサに使うときにも重要で、次の写真のように床面からかなり高い位置にセンサをつけないと、放射状に広がったレーザーが床面に反射し、前方に障害物があるように反応してしまいます。この試作機では150mmも持ち上げないと、畳の上で安定に使えませんでした。この点はPSDに分があるようです。これほどシビアではありません。

Img_3580

 

 

この辺りに気をつければ、このセンサは大変に使い良く、安定です。いろいろなモードがありますが、実際に使うには、コンテニュアスモードでなるべく早い周期でデータを取得し、マイコン側で移動平均を取るなどして安定化させるのがよいと思います。

最後に重要な注意を。センサの表面の薄黄色の保護シートの剥がし忘れに注意してください。一応動作してしまうけど、本来の性能は出ていないので、なんだこりゃということになります。特に量産時には注意が必要です。

今回のウィークエンドはこれでおしまいです。複数のVL53L0Xを使う方法については、実際にやっているので、近いうちに別の投稿で解説したいと思います。

2022年4月13日 (水)

【訂正!】PIC24Fでレーザー距離センサVL53L0Xを使う

花岡ちゃんのウィークエンド:

動作には問題ないですが、ソースコードに間違いがありました。投稿に訂正を入れましたので、こちらを確認してください。

PIC24Fでレーザー距離センサVL53L0Xを使う(その3)

花岡ちゃんのウィークエンド:

 

まずVL53L0Xの測定モードの説明です。次の二つのモードがあります。

1:コンテニュアス

デバイスは連続的に測定を繰り返し、読み出しコマンドを実行するとレジスタにある直近の測定値を返します。使いやすいモードで、僕はもっぱらこれを使っています。デフォルトでは30msごとに測定をおこなっているようです。このモードでは、デバイスは常に20mA程度(実測値)の電流を消費しています。

プロジェクトではCONTINUOUSモードを選択(デフォルト)すると、50msごとに直近の測定結果を表示します。

2:シングル

読み出しコマンドを実行すると、測定プロセスをスタートさせ、レジスタにある前回の測定結果を返します。注意すべきなのは、コマンド発行時点の測定値を知りたい場合は、測定時間経過後にもう1度読み出しコマンドを発行しなければならないことです。最初のコマンドの時読み出されるのは「前回の」測定結果だからです。このモードはたとえば3秒毎の測定で十分な場合など、測定時以外はデバイスを低消費状態(実測で350uA程度)に置けるので、消費電力を倹約することができます。

プロジェクトではSINGLEモードを選択すると、3秒おきにセンサを起動し、測定時間を空けて2回読み込むことでそのときの測定結果を表示します。

 

次にプロジェクトでモードを切り替える方法です。

モードの切り替えはmain.cの35行からの「プログラムスイッチ」で#defineを有効にしたりコメントアウトして無効にしたりして行います。ソースコードを読んでもらえばやり方はわかると思います。

HIGH_SPEEDやHIGH_ACCURACY、LONG_RANGEなどのセンサの感度調整はSINGLEモードでのみ使えるようになっていますが、実際はコンテニュアスでも使えます。643行のstartContinuous(0);の前にsetHighAccracyVL53();などを挿入すると、その設定で測定を繰り返します。ただし、測定時間もそれに応じて変わるので、setHighAccracyVL53();ならば200ms周期での結果更新になります。50ms毎に読み出しても、4回は同じ値が入ってくる勘定になります。その際は読み出し周期を設定に合わせて調整する必要があります。

 

最後にプロジェクトの構成です。

VL53L0X.cがドライバのソースコードです。そのヘッダファイルがVL53L0X.hです。main.cではこれをインクルードしています。main.cはプログラムの本体でI2Cや液晶用のドライバなどもこれに記述されてます。I2C関係の関数と、呼ばれると起動後からの時間をmsで返す関数millis();を定義したmain.hがあり、VL53L0X.cはこれをインクルードしている構成になっています。

簡単なプロジェクトなら、main.cを改造して作ることができると思います。


次回はセンサを使う上での注意点などを解説します。

2022年4月12日 (火)

PIC24Fでレーザー距離センサVL53L0Xを使う(その2)

花岡ちゃんのウィークエンド:

MPLAB Xのプロジェクトファイルを公開します。開発環境はMacOS12.2.1、MPLAB X IDE V5.50、XC16(V1.61)、PicKit3です。

まずは実験機の回路図です。マイコンはPIC24FJ64GA002です。

ダウンロード - hanaoka_vl53l0x.pdf

VL53L0Xのモジュールは他のものでも使えます。ただしXSHUTがモジュール内部でプルアップされている必要があります。ほとんどのモジュールはそうなっていると思います。

LCDモジュールは秋月電子のAE-AQM0802です。これがなくとも動作はしますが何をやってるかわかりません。

電源電圧は3.3Vです。もっともあまりシビアではないので乾電池2本直結で十分動作します。

 

プロジェクトファイルです。

ダウンロード - pic24f_vl53l0x.x.zip

マックで開発してますので文字コードなどWindowsと異なる可能性もあります。文字化けしたらプロパティを確認してください。

訂正です。1ms単位での経過時間関数 millis();が100ms単位になっていました。使っていないTimeOutがらみなのでそれでも問題ないですが、正しくないので修正しました。こちらのプロジェクトを使ってください。

ダウンロード - pic24f_vl53l0x_1.x.zip

 

 

そのままビルドして動作させた時の動画です。

小さいブレットボードにセンサが上向けに固定されており、手のひらをかざして動かすと液晶の数字が変わります。これはセンサから手のひらまでの距離をmmで表示しています。センサを「コンテニュアスモード」で動作させており、距離データを50ms毎に読み出しています。センサからデータを読みだすときLEDが点灯するようになっています。

 

次回はプログラムの中身を説明します。

2022年4月11日 (月)

PIC24Fでレーザー距離センサVL53L0Xを使う(その1)

花岡ちゃんのウィークエンド:

以前、このカテゴリーでマイクロチップの16bitマイコン、PIC24Fシリーズにいろいろなデバイスを接続してみました。その続編です。今回はレーザー測距センサVL53L0XをI2Cで接続します。実はかなり前に(2017年)に製作したのですが、ブログを休止していたため、公開していませんでした。

STマイクロのVL53L0Xは、測距センサの定番PSDと比較して非常に小型で消費電力も少ないです。PSDが三角測量なのに対し、レーザーの飛行時間を計測するタイプで精度も高く、何も考えずに使っても、cm単位でなら安定な計測ができます。また、直接mmで測距結果を読み出せるのも、手抜き派の僕にとってはありがたいですね。

足のない面実装の部品なので試作用に実装するのは大変ですが、モジュールがたくさん出ているのでそれを使えば簡単です。僕がよく使っているのはAmazonで購入できる写真のものです。

Img_3568

このモジュールは小さいので試作品に載せやすく、また値段が安いのもフリーランスの開発者としてはありがたいです。もっとも最近は「半導体の逼迫」のせいかだいぶ高くなってるようですが。

ただ、I2Cで指定のレジスタを読めば距離データが取得できる、という簡単な構造ではなく、専用のドライバソフトからアクセスしないといけません。本来はSTマイクロから提供されているCのライブラリを利用するのですが、今回のものは当時(2017年)のArduino用のcppライブラリをベースに作成しています。センサについてあまり知識がなかったので、とにかく実際に動いているものをお手本にしたわけです。その後、幾つものプロジェクトで使い、特に問題はありませんでしたが、そういう素性のコードなので、センサの性能が100%発揮できてるかどうかは保証できません。

次回は、mplabXのプロジェクトを公開します。

2016年8月 7日 (日)

タミヤのギアボックスで連続回転サーボを作る

久しぶりのウィークエンドです。今回は、サーボ信号でスピードをコントロールできる連続回転サーボを、タミヤの工作用ギアボックスを利用して作ります。

連続回転サーボはサーボ信号でモーターのパワーをコントロールするもので、ラジコンカーのアンプと同じものです。以前は入手しにくかったので、普通のサーボを改造する方法を投稿しましたが、最近のメイカームーブメントのせいか、GWSのS35などが国内でも入手できるようになり、わざわざ改造しなくとも良くなりました。こういったサーボはArduinoのサーボシールドとかで回せるので、走行するロボットやワイヤを巻き取るウインチなんかを簡単に作ることができます。

サーボーモーターのギアボックスをそのまま使っているので、トルクは十分なのですが、反面、回転速度が遅く、スピードの点ではものたりません。下の動画は以前実験したものですが、70mmくらいの車輪でだいたいこんなものです。(このロボットの正体は2011/4からのバックナンバーにあるので興味がある方は見てください)

今回の工作では、サーボの基板とタミヤの4速ギアボックスを使ってもっと早い連続回転サーボを作ってみます。

工作は簡単です。まずサーボを分解して基板を取り出します。使ったのはGWSのS03Nですが、一般のサーボならなんでも構いません。底の4本のビスを外すとバラバラになります。基板からモーターに行っているリード線は、後で継ぎ足すので、適当なところで切ってしまえばOKです。基板はこんなものでした。単体での写真を撮るのを忘れてしまったので、試作機に組み込んだ状態です。

Dscn3451_2

ギアの減速比を変えると出力軸の回転方向が変わるので、モーターリードは写真のようにピンソケットで差し替えられるようにしました。この基板の場合は、赤と白がモーターで、黒はモーターボディへのアースです。モーターノイズ抑圧のためだと思いますが、あまり効果がなかったので今回は使っていません。

ただし!ギアボックス付属のモーターは使えません。そのままではサーボの電圧が高いのでモーターが過熱してしまいます。この投稿にあるモーターに取り替える必要があります。また、元々のマイクロモーターに比べて電気ノイズが多いので、下の写真のように端子間に0.1uFくらいのコンデンサー(セラミックコンデンサがベスト)を入れるのと、どちらかの端子をモーターボディに接続する必要があります。これをしないと他のサーボがガタガタしたり、ひどい時にはマイコンがリセットしたりすることがあります。

Dscn3453

最終的に接続したのがこの写真です。基板の真ん中にあるのがポテンショメーターの軸です。サーボにニュートラルの信号を送ってモーター停止するよう調整します。結構シビアです。調整したら軸が回らないよう合成ゴム系の接着剤で固定します。このサーボは4.8Vで使うのが良いでしょう。ニッケル水素かエネループ4本がおすすめです。

Dscn3452

今回テストした実験用ロボット(高速色認識カメラとサブサンプションを使って生物的な動きの実験中です。いずれ紹介したいと思っています)にこんな風に組み込みました。車輪はタミヤのナロータイヤです。

Dscn3456

ロボットの重量は850g、114.7:1のギア比だとこのくらいのスピードです。早いですがボールのスピードには追いついていません。

ギア比を38.2:1にかえるとスピードはだいぶ早くなります。ボールに追いつけそうですが、トルクが小さくなるので、低速での俊敏な制御には向きません。そもそも130モータークラスでは力不足です。

ともあれ、サーボの基板で普通のモーターも制御できるのは実証できたと思います。いずれ他のモーターでも試してみたいと思っています。

2016年4月30日 (土)

Arduinoで動かすアームロボットBraccio

久しぶりの「ウィークエンド」です。今回は入門者向けのアームロボットキットを組み立てます。Arduino.orgで開発したBraccioという6軸ロボットです。

購入はいつものスイッチサイエンスです。こちらのページです。Arduino同様、かなりオシャレなパッケージングです。

Dscn3418  Dscn3420

組み立てはラジコンカー程度ですから、あまりキット慣れしてない人でも大丈夫だと思います。とはいえ幾つか注意すべきことがあります。ほとんどの部分を止めるタッピングビスが短いので、あまり力を入れるとポストを舐めて効かなくなる恐れがあります。マニュアルにも「あまり力を入れて締めるな」とあるくらいです。精密ドライバーのような柄の細いものを使えば、力が入らず安心して作業できます。

もう一つ、写真を撮りそこないましたが、ベース部分にアーム全体にテンションをかける引きバネが入っています。これを2mmのタッピングで取り付けるようになっているのですが、引きバネのあなが大きいので、タッピングの頭に引っかからないため、外れやすくなっています。引きバネのあなをラジオペンチで少しつぶして、タッピングの頭から外れないようにしておきます。これが外れてしまうと、アームが持ち上がりにくくなってしまいます。

Dscn3425

動作にはArduinoが必要です。僕は手持ちのUNOを使いました。テストするときに迷ったのはライブラリをどこからダウンロードするかです。だいぶ探しましたが見つかりません。どうもIDEに組み込まれているようで、最新版をインストールしたらexampleでBraccioのサンプルやライブラリが入ってました。動作の様子です。

ラジコンサーボを使ったものとしては、バランスよくできていると思います。ただ、PWMサーボなので、電源投入時に全体がいきなり動くのでびっくりします。立ち上げサイクルを工夫しないといけないようです。

役に立つかどうかはともかく、Hanabot2に乗っけるとこんな感じになります。なんかいい感じです。

Dscn3427

2015年12月24日 (木)

RedBearLab WiFi Microを試してみよう(おしまい)

今回はプログラムをしてみます。

arduinoライクな環境で、サンプルスケッチも同様です。まずはarduinoにならってLED点滅のサンプルコードを試してみました。基板裏のLEDがチカチカして、これはOKです。

これでは面白くないので、スケッチ例→WiFi→ScanNetworksを試してみます。

Scanwifi

このスケッチは受信したWiFiの情報をシリアルモニタに表示します。

色々と実験してみると、WEPキーのアクセスポイントには接続できないことがわかりました。WEPキーのサンプルスケッチはあるのですが、ウチの環境ではどうもうまくつながりませんでした。ネットタンサー時代のWiFiルーターですがそろそろ潮時かもしれません。

それからMQTTクライアントを試そうとしたら、認証付きのサンプルスケッチが見当たりません。ここのページを読んでサンプルをダウンロードする必要がありました。

myThingsで何か作ってみようかと思っていますが、それはまた別の機会に。

2015年12月12日 (土)

RedBearLab WiFi Microを試してみよう(その3)

またまた続きです。

今回はAruduinoライクな開発環境Energiaをインストールします。Windows,Mac,Lunux対応版が用意されてます。僕はもちろんMac用をインストールしました。
このページがダウンロードとセットアップとのリンクです。
ダウンロードの手順は下記になります。

1:前出ページの最初の方から必要なデストリビューションをダウンロードする。まだインストールしない
2:ページの">>Installation<<"から該当するOSのリンクに移動
3:インストールするのはCC3200 LaunchPadなので、まずドライバをインストールし再起動
4:先ほどダウンロードしたenergiaをインストール

ここで一通りはインストールできましたが、まだやることがあります。
前にGitHubからダウンロードしたフォルダから、必要なファイルをenergiaのフォルダに追加する必要があります。
ダウンロードしたファイルRBL_CC3200-masterの中の
RBL_CC3200-master->Energia->hardware
の中にあるフォルダの中身を、インストールしたEnergia->hardwareフォルダの中身に追加します。重要なのは「追加する」ことです。差分しか入ってないので、フォルダを置き換えてしまうとダメです。

Macの場合は、アプリケーションでEnergiaのアイコンをCtrl+クリックし「パッケージの内容を表示」し
Contents->Resources->java->hardware
の中身に追加します。

このように基板をセットして、MX20のLEDが点灯すればOKです。点灯しない場合は、前回のMX20のアップデートか、ドライバのインストールに失敗している可能性があります。

Dscn3067

これでCC3200も通電しているはずなので、このPDFの最初にあるWiFiテストをやってみると良いでしょう。(このデモは別のプログラムを書き込むと消えてしまいます。)

WiFi-Webサーバとして機能しているCC3200にブラウザからアクセスして基板上のLEDをコントロールします。テストのあらましは下記です。

1:パソコンなどでRedBearLab CC3200というセキュリティなしのWiFiに接続
2:ブラウザを開いて192.168.1.1に接続(結構時間がかかるときがあります)
3:ブラウザで開いた画面のON,OFFボタンをクリックするとWiFi Micro基板裏のLEDが点滅する

続きます。

より以前の記事一覧