忍者ブログ

【ルンバ:ROI】Buttonsコマンドの使用

ルンバ770のボタン仕様について。
Buttonsで返ってくる値に癖があったのでメモ。
結果的には、状態によって立つビットが違うってこと。
普通に使う場合の表示に合わせて対応したビットが立つ。

ROIの仕様書にはこうあります。
Bit76543210
ValueClockScheduleDayHourMinuteDockSpotClean
んで、ルンバ上の表記はこう。
①初期状態
DockClockScheduleSpot
この状態でClockボタンを押すと、②の状態へ移行します。

② Clockを押す
DayHourMinuteOK
ここでOKを押すと①の状態に戻ります。
Scheduleを押した時も同様。

で、Buttonsで返ってくる値は、
①の状態では対応したビットのみが立つ。
②の状態では、何も押していない場合はClockのビットがたった状態。
 何かしらボタンを押すと、対応したビットに加えて、Clockのビットも立った値が返ってくる。
 また、OKを押した時はClockのみが立った状態。すなわち、押したことを判別できない。状態は①に戻る。
 そして、Cleanボタンを押すと0が返ってきて、状態は①に戻る。

 ClockとScheduleボタンがこんな挙動。

ルンバ770だとボタンが4つ(Clean除いて)あるのですが、Buttonsで返される値のビットとの対応は状態によって変わるわけですね。
めんどいなぁ。状態によっては読めない一番右のボタンと、Cleanボタンの扱いをどうするか。。。



2016/06/11追記
ROIの資料だと下4bitしか載ってないので調査。
76543210
OKゴミフルサインダスト検知クリーンCheck RobotDockSpotDebris
CleanボタンとバッテリLEDの表示は分かれていて、
LEDs(Opcode 139)のコマンドで送る
1バイト目の4bit目でCleanボタンのon/offを設定。
続く2バイトはクリーンボタンでなく、バッテリ表示の色と明るさの設定となる。
・・・けど、明るさは変えられないっぽい。

Scheduling LED Bitsも補完。
76543210
DAYHOURMINUTEScheduleClockAMPMColon

拍手

PR

Comment (0) | ▲TOP

Roomba Open Interface (ROI)

例によってルンバと戯れています。

ちょっといまハマってる・気になってること
①速度司令コマンドで下2桁くらい四捨五入される?
 速度司令出した後に、速度読むと、ちょっと違う値が返ってくる
 -80で-78
 -90で-92
 -200で-199
②Cleanボタンの明るさ0にしても うっすら光る
③コマンド送信間隔どこまで早く出来る?
 受信は15msごと
 モード切り替えてすぐは指令効かないみたい。(→20ms間は効かないっぽい?(2016/03/26))
④タイヤの回転方向変えた時にエンコーダずれないかな?
 エンコーダのカウント方向はタイヤへの回転方向指令によるため
⑤音コマンド受け付けない…
 ただただプログラムミスってた
⑥miniDinコネクタのL字のやつってないかな。もしくは短いの。
⑦iRobot_Roomba_500_Open_Interface_Spec.pdfたまに間違ってる
 エンコーダのLとRが逆

拍手

Comment (0) | ▲TOP

PS3のコントローラをマイコンで

マイコンでお手軽にPS3コントローラを使えるようにするSBDBT。
http://www.runele.com/ca1/2/
基板にはPICが載ってるだけで、ソフトも公開されていることから、自作してみました。

Elecrowに発注。
届く。基板17枚。(黒い方はまた別の基板です。I2Cのカラーセンサ。)マイコンはPIC24FJ64GB002ってやつ。
ソフトを少しいじって書き込み&動作確認。
こんなことができます。PS3コントローラでルンバを動かしつつ、パソコンでルンバの物理バンパーの接触状態を取得してます。
SBDBT基板一つでPCとPS3コントローラと通信できるので便利。
--- 接続概要 ---
パソコン ─ (Bluetooth) ─ SBDBTもどき基板 ─ ルンバ
PS3コントローラ ─ (Bluetooth) ┘
-------------------

拍手

Comment (0) | ▲TOP

VL6180X試食

ストロベリーリナックスで買えるVL6180X。
https://strawberry-linux.com/catalog/items?code=16180
測距センサですね。
よくあるSharpの奴とは違って、光が跳ね返ってくるまでの時間を計るタイプです。
なので物体の反射率とか形状に影響を受けにくいとかなんとか

I2C面倒だなーと思いながら簡単に実装してみました。
でも何故か110mm程引いたされた値で取得されちゃいます(´・ω・`)
 →アプリケーションノートのオススメ設定を試したらちゃんと計測できました(2016/03/15追記)
ひとまずやり方↓

【使い方(暫定版)】
I2C通信フォーマット
[I2Cアドレス(0x29)][レジスタ上位アドレス][レジスタ下位アドレス][データ][データ][…
送受信ともにこんな感じ。

詳細
1, 計測間隔を設定する
I2Cで0x00, 0x1B, 0x04を送る。
 3バイト目で間隔を設定している。10msなら0x00, 20msなら0x01, …, 50msなら0x04

2, 連続計測モードにする
I2Cで0x00, 0x18, 0x03を送る

3, 計測結果を読む
I2Cで0x00, 0x62を送って1バイト受信

これでmm単位の値が取れます。

あと気になるのはI2Cアドレス書き換えられるかだけど、0x0212に7bitの新アドレスを書けば良いみたい。でも電源切ったら忘れちゃうみたい?意味ない!!!!???
GPIO-0が起動時にCEな機能を持つこととGPIO-1を組み合わせて使えないかかんがえちゅー
アプリケーションノートの初期化コードで、データシートに載ってないレジスタいじってるから何か隠されてるようだ。。。

-----------------------
2016/04/10 追記
Using multiple VL6180Xs in a single design
複数デバイスを使いたい時用アプリケーションノート見っけた。
使いたい数分のGPIOをマイコンとつなぐか、I2CでIO拡張するIC使う的な感じで対応するしかないみたい。

拍手

Comment (0) | ▲TOP

SHARP測距モジュールGP2Y0E03

これ
http://akizukidenshi.com/catalog/g/gI-07547/

過去の測距モジュールと比較して、とっても小さくなりましたねっ。
いつものアナログ出力に加え、I2Cで接続できるのでポートをたくさん消費することなく複数台使えるようになったのが特徴。(16台までね)
さらに、コマンドを送ってフィルタの設定とかしたりスリープ入れられたりします。

昨年の知能ロボコンマシンでお世話になりました。
複数台使うためにはそれぞれに異なったI2Cアドレスを設定する必要があります。
ちょっと面倒だったのでやり方メモ。

【参考】
http://www.sharp.co.jp/products/device/doc/opto/gp2y0e02_03_appl_e.pdf

まずは写真のピンにハンダ付け。(アドレス書き換え時に使うだけなのでてきとーでおっけーヽ(´ー`)ノ
これ電源なんで、マイコンからFETとかでon/offできるように回路構成してください(50mA流せればok。以下"電源"と言ったらこのピンのこと)。


あとはデータシートのFig.40、Table.20あたりを参考に、ハンダ付けした電源ピンをon/offしつつI2Cでコマンド送るだけです。
ただし、一回きりしか変更できないっぽいので要注意。
----------
・電源offにする
【Stage1】
・I2Cで0xEC, 0xFFを送る。 (Fig.40だと0xEFを書くようになってるけど誤植?)
・送信終わったら電源をon
【Stage2】
・I2Cで0xC8, 0x00を送る。
【Stage3】
・I2Cで0xC9, 0x45を送る。
【Stage4】
・I2Cで0xCD, 新アドレスを送る (使えるアドレスはデータシートのTable.21参照)
【Stage5】
・I2Cで0xCA, 0x01を送る
・500us待つ (E-fuse書き込み待ち)
・電源offにする
----------
ひとまずここまでやればアドレスが変更されます。
データシートだとこの後ちゃんと書けたかどうか確認してるみたい(?
Stage6以降は新しいI2Cアドレスでアクセスするみたい(未確認

というわけで、無事量産出来ましたとさ。

拍手

Comment (2) | ▲TOP