Home Made Garbage

環境センサ で ラジコンカー − GOBERNABLES de Pi −

ホーム
電子工作
Raspberry Pi
WordPress
IOT

今年のみんなのラズパイコンテストでOMRON製の環境センサの無償提供が実施されましてー

 
即効でアイディア送ってGET!ありがとうございまーす!

“センサ観測値(加速度とか)を用いて、ラジコン作ります!”ってアイディアを送ったのだけど、この時点ではセンサのスペックよくわからない状態(事前に調べとけよ)。。。
本当にセンサが届いたとき、「やっべ。。。」と思いつつ焦って調査&ラジコン製作スタートしましたとさ。このときばかりはトランキーロじゃいられなかったゼ。。
 

構成

環境センサの加速度と照度の測定値をラズパイに送って、モータとLEDを制御します。

部品

センサをコントローラとして、車を走らせたりライトをつけたりします。

 

環境センサ 2JCIE-BL01

この環境センサは温度、湿度、気圧、照度などの各種環境値を測定してBLEを介して、スマホアプリで測定値みたりプロットされたグラフを見れるという代物。
GitHubでラズパイで値を取得できるpythonサンプルコードも公開されております。
 https://github.com/OmronMicroDevices/envsensor-observer-py

環境センサの設定

上記のpythonサンプルコードを使用するためには環境センサをBroadcasterモード(デフォルトではBeaconモード)にする必要があります。
また今回は車のリモコンとしてセンサを使用するので、測定間隔もデフォルトの300秒から最速の1秒に変更します。

センサの設定を変更するためにスマホアプリBLE Scannerを使用しました。
 

動作モード変更

スマホアプリ BLE Scannerを起動するとBLEデバイスのスキャンが開始します。環境センサは”Env”という名前で表示されますのでCONNECTをクリックします。

2JCIE-BL01 ユーザーズマニュアル p. 26-28 によると、センサのモードはService UUID:0x3040のCharacteristics UUID: 0x3042で変更します。

BLE ScannerでCUSTOM SERVICEの”0C4C3040〜”をクリックして”0C4C3042〜”にデータを書き込みます。書き込むデータは以下の表 (p. 27)のとおりです。

ここでは、ADV_IND 送信間隔を最短の500msec (0x0320)にしてBeacon ModeをGeneral Broadcaster 1 (0x02) [マニュアル p. 28参照]にして、その他は初期値のままにします。

ちなみにBeacon Mode : General Broadcaster 2では加速度は送信されませんでした。

ここで注意が必要でデータを書き込む際は上の表の通りLow Byteから書いて後にHigh Byteを書き込みます。よって今回は以下を書き込みます。

“2003A0000A0032000200” (書き込みタイプはByte Arrayを選択)

ADV_IND 送信間隔500msec (0x0320)にしたいので最初にLow Byte : 02、そしてHigh Byte : 03を書きます。これ最初気づかずに0320で書き込んでいて全然測定値更新されずオムロンさんに問合せちゃった。。。。
こんな私に対しても丁寧に対応くださったオムロン様、本当にありがとうございます!!!!
 

測定間隔変更

センサの測定値の更新間隔を最速の1secにします。

BLE ScannerでCUSTOM SERVICEの”0C4C3010〜”をクリックして”0C4C3011〜”にデータを書き込みます。書き込むデータは以下の表 (p. 15)のとおりです。

ここでは、測定間隔を最短の1sec (0x0001)にしますのでLow Byteから

“0100”(書き込みタイプはByte Arrayを選択)

を書き込みます。0001じゃないことに注意!Low Byte → High Byteで書き込みます。

以上で環境センサの設定はOKです。
 

参考

 

サンプルコードでセンサ動作確認

オムロン公式のpythonサンプルコードを動かしてみます。

ここではRaspberry Pi Zero Wを使用しました。OSはRASPBIAN STRETCH WITH DESKTOP ver. 4.14です。

pythonでBLEを使用するためのライブラリをインストール

https://github.com/OmronMicroDevices/envsensor-observer-py でZipをDLしてラズパイの適当なフォルダに解凍して、解凍したフォルダで以下を実行

デバッグモードでプログラムが実行されターミナルに測定値が表示されます。

↑ちょっとわかりにくいですがセンサの設定変更がきちんとなされて1秒毎に測定値が送られています。
 

コントローラ製作

コントローラはダンボールで製作しましたww。Nintendo Laboで鍛えられたダンボール工作力を駆使しています。

百均で買った木の箱とダンボールで作ったバネと環境センサが入る直方体ダンボール箱を用意。

んで、この3つを木工用ボンドで接着して先端に環境センサをはめて出来上がり!

はいそうです。9/14に発売予定の「Nintendo Labo Toy-Con 03: Drive Kit」を参考に作りました。パクりちゃう。。サンプリングや。。。


 
 

車製作

ヘッドライトとして左右にLEDをつけました。ライト部に穴を開けてグルーガンで固定しました。

シャーシはガッツリ加工して、後輪にギアドモータを接続。タイヤは元のものを使用。前方にはボールキャスターをつけて右折・左折に対応します。

後輪のグリップが甘いので輪ゴム巻いてます。

Raspberry Pi Zero WとモータドライバDRV8830を載っけて配線します。

モバイルバッテリーも詰め込んでボディーを被せます。LEDの配線もZero Wに接続します。なんかギュウギュウだけど。。。まぁ。。完成!
 

ラズパイ設定

モータドライバ 用I2Cの設定

モータドライバDRV8830にI2Cでデータを書き込んで回転方向や印加電圧を指定します。回転方向や電圧は環境センサの加速度で変更します。

I2C有効化

まずはラズパイのI2Cを有効にします。Raspberry Piの設定を開きインターフェースのタグでI2Cの有効を選択しRebootします。

 

Python用I2Cライブラリインストール

Python-smbusをインストールします。

OS RASPBIAN STRETCH WITH DESKTOP ver. 4.14では初めからインストールされてました。

コードの書き方は以下を参考にしました。
 http://www.raspberry-projects.com/pi/programming-in-python/i2c-programming-in-python/using-the-i2c-interface-2

I2CモータードライバDRV8830

マニュアルを参考にI2Cデータ書き込みを実施します。

I2Cアドレス設定

2個のモジュールを制御する必要がありますので、それぞれ異なるI2Cアドレスを設定します。

本モジュールは基板上のジャンパA1, A0のステートによって以下の表のようにアドレスを指定することができます。

表のアドレスxは読み込み時には1、書き込み時は0をしてします。ここでは書き込みのみ使用します。左モータ用モジュールのジャンパを両方GND (アドレス:0x60)、右モータ用モジュールのジャンパを両方Open (アドレス:0x64)としました。
 

書き込みI2Cデータ

アドレス0x00に8bitの情報を書き込むことでモータを制御します。
各ビットの設定は以下の通り

 

ヘッドライトLED用PWM出力

ヘッドライトLEDの輝度は環境センサの照度で制御します。PWM制御でLEDの輝度を設定します。センサの照度が低下するとLEDの輝度を上げ、センサ照度が上がるとLED輝度を下げます。

コードの書き方は以下を参考にしました。
 http://blog.robotakao.jp/blog-entry-122.html

 

pythonコード

公式pythonサンプルコードを元にプログラム修正しました。
 https://github.com/OmronMicroDevices/envsensor-observer-py/blob/master/envsensor-observer-py/envsensor_observer.py

 

モータ動作

センサの重力加速度に対する座標

コントローラを前に傾けてセンサのx軸の加速度が+になるとモータは前進、-になると後進します。

回転スピードは傾きを大きくして加速度が大きくなるほど早くなります。ここでは書き込み電圧2.97V (0x25)以上にならないようにしています。

またコントローラを横に傾けてy軸の加速度が+になると右折、-になると左折します。

 

ヘッドライト動作

環境センサの窓が照度センサになっており、窓を覆って暗くするとLEDヘッドライトが点灯します。

 

参考

ラズパイ起動時にpythonコードを自動スタートする方法は以下を参考にしました。
 Pythonプログラムを起動時に実行する方法

 

動作

以上でやっとこ完成!

センシング間隔が1秒のためタイムラグあるけど動いてるよね 😀 

 

 

終わりに

多くにおいて人間は環境に抗うことはできず、順応もしくは耐えるしか道はありません。
でも一歩踏み出す勇気さえあれば環境を変え物事を動かすことができるのです。
ま・さ・に・  
GOBERNABLES de Pi!

コメントを残す

メールアドレスが公開されることはありません。コメントのみでもOKです。

TOP