Shujima Blog

Apple製品,技術系の話をするブログ

OMRONの環境センサ2JCIE-BL01をRaspberry Piから使えるように設定する

基本的にこちらのQiita記事と同一の内容が書かれています.

qiita.com

違うのはIMモードである点です.

手順はほぼ変わらないですが,ねんのため独立して書くことにします.

設定に必要な環境

  • 電源が入っておりペアリングしていない環境センサ2JCIE-BL01(WxBeacon2での挙動は不明)

  • iPhoneまたはAndroid端末

当方はiPhone 6sです.

設定する内容

Omronの環境センサは内部に変更可能なパラメータを持っており,外部から書き換え可能です. その中の「Beacon Mode」という変数は初期状態で「Event Beacon (ADV)」に設定されており,発信するパケットにセンサ値を含まない空のパケットを送信するモードになっています.

これを,EPモードまたはIMモードに設定することで,センサ値を含ませることが可能です.

EPモードとIMモード

最初にご紹介したQiitaではEPモードに書き換えていましたが,今回IMモードにしか含まれない情報が欲しかったため,IMモードに設定してみようと思います.

モードなどの情報はこちらのページに載っています.

omronmicrodevices.github.io

Table 33を見るとBeaconのADV setting パラメータで設定するBeacon Modeによってパケットがどのように変化するかがわかります.

表の一番左Beacon Modeの数値が変化することによって表の右2行 Adv. Packetの内容が(A)〜(E)のどれになるかが決定されます.この(A)〜(E)はTable 45〜50に詳細が載っています.

標準ではBeacon Modeが0x08に設定されており,パケットの形式は(C)です.Cにはセンサのイベントフラグ(Evt)のみが含まれており,センサの情報は入っていません.

EPモードのパケット(E)は加速度センサを除くセンサの計測値の他に不快指数や熱中症危険度など,他のセンサによって計算されるであろう環境指数が含まれています.

IMモードのパケット(D)にはそういった環境指数の代わりに,加速度センサを含むすべて計測値が含まれています.

WxBeacon2には加速度センサが入っていないという噂を聞いたことがあり,またOmron製の場合であっても,加速度センサに言及されていないページがあるなど,使用できない場合がありそうです.

EPモード,IMモードにある,「Limited Broadcaster」ですが,Table 32中の説明を読む限り,間欠的な運転により電池を削減することができるかもしれません.

今回は,「General Broadcaster」= 0x 02に設定してみました.

今回はIMモードに設定してみます.

設定方法

App Store/Google PlayからApp「BLE Scanner」をダウンロードします(無料)

f:id:masa_flyu:20181009191457p:plain

アプリを開くと,近くにある電源の入ったBLE機器が一覧されます.ここで,XX-BL01(XXにはEnvSensor,EP,IMのいずれかが入る)を探し,Connectを選択します.自分はすでにQiita記事を参考にEPモードに変えていたため,名前がEP-BL01になっていますが,多くの人はここがEnvSensor-BL01になっているはずです.

これを開くと詳細な画面が出てきます.

f:id:masa_flyu:20181009191513p:plainf:id:masa_flyu:20181009191515p:plain

このSERVICESの中身はインターフェースマニュアルにあるTable 6の内容です. この中からParameter Serviceを開きたいので,「0C4C3040...」を探し,選択します

f:id:masa_flyu:20181009191519p:plain

すると,またパラメータの一覧が出てくるため,今度はTable 30に従いParameter Service内のAdv Settingsを開きたいので,「0C4C3042...」を探し,「Write,Read」を選択します.

f:id:masa_flyu:20181009191525p:plain

この画面は,パラメータの読み込み,書き込みを行えます.Read Valueをタップすると,現在のパラメータの情報を確認できます.

Write Valueで値を書き換えるのですが,その際,以下の値にします.

xxxx xxxx xxxx xxxx 02 xx

空白はただ見やすくしているだけなので無視してください. xは今の書き換える必要が無いため今のセンサの値をRead Valueしたものをそのまま書けばいいです. インターフェースマニュアルによれば,デフォルトは

0808 a000 0a00 3200 08 00

のようですが,自分の場合,

0808 a000 0a00 3300 04 00

となっていました.そのため私は

0808 a000 0a00 3300 02 00

としました.

デフォルトだった場合にIMに切り替えるには,

0808 a000 0a00 3200 02 00

となります(空白は無視)

Write Valueを押して,この数値を打ち込みます.

f:id:masa_flyu:20181009191527p:plain

打ち込みおわったら,Read Valueを押して,正しく変化しているかを確認します.

その後1分ぐらいしたら,センサの名前が「IM-BL01」に変わります.

これで終了です.

あとはOmronのサンプルプログラムを動かすと,全センサの値のログが取れます. .

I2C電子ボリューム(MCP4018T)のついたオーディオミキサの製作

構成要素

オーディオミキサーについて

今回作成するオーディオミキサは3入力1出力のものです.オーディオミキサの作り方ですが,単純に3つつなぐだけでも動く場合もあるようです.ただ,後段のアンプ・スピーカーの構成によるため,きちんと加算回路を組むことにしました.

この加算回路ですが,オペアンプの反転増幅回路の入力を増やしたものです.

f:id:masa_flyu:20181009175010j:plain

しかしながら,このままだと出力が反転してしまうため,非反転増幅回路にしたくなりますが,どうやら良くないようです.

OPアンプのお勉強

反転入力ならば,非反転入力が設置されていることで,仮装接地により反転入力が∞インピーダンスの0[V]電位となります.これがシンプルな回路で加算できる,重要な条件のようですね.

この反転加算回路により得られた出力をそのままスピーカーに流してもいいのですが,元と反転してしまうのが少し気になります.今回は念の為,後段に反転増幅回路を取り付けました.

電子ボリュームについて

電子ボリュームにはMCP4018を用います.非常に小型のため,扱いには注意が必要でしょう(実際1つ無くしました).また変換基板を用いることが推奨されます.私はAliExpressで買いましたが,同等製品がAmazonにもありました.

https://www.amazon.co.jp/exec/obidos/ASIN/B018AOK0O8/masaflyu-22/

f:id:masa_flyu:20181007213605j:plainf:id:masa_flyu:20181007213049j:plain

こちらの電子ボリュームはI2C通信で,アドレスのあとに1バイトの0〜127の数値を送信すると,内蔵の可変抵抗(10kΩ)を数値に比例して動かすという極めてシンプルなものです.ArduinoRaspberry Piでの動作チェックは過去記事をご覧ください.

masa-flyu.hatenablog.com

masa-flyu.hatenablog.com

端子構成は6ピンで

f:id:masa_flyu:20181009180625p:plain

この図のように書き表せられます.ここからわかる通り,3本足の可変抵抗の片側はVss(GND)に落とされています.

そのことに注意すれば,基本的には普通の可変抵抗器と同じように使用できます.A側を入力,W側を出力とすることで,分圧の形になりW/(A+W)だけ減衰します.

今回はオーディオの入力のあと,手動のボリュームの直後に,さらに減衰させるように接続しました.

以上を複合した回路構成

以上を合わせた3チャンネルオーディオアンプの構成図は以下の通りです. f:id:masa_flyu:20181009161305p:plain

これをEagleで設計したものが以下の通りです. f:id:masa_flyu:20181009172231p:plain

パーツリスト

品目 値・型番 個数 購入店 備考
2回路入りオペアンプ 5532D 2 秋月 回路図中の型番は間違い
電子ボリューム 10k 2 秋月
電解コンデンサ 10uF 10 秋月 カップリング用8+電源用2
電解コンデンサ 1000uF 2 秋月 電源用,電源の方式によっては不要
半固定抵抗 20k 2 秋月
イヤホンジャック 3.5mm 4 秋月
VHコネクタ(ハウジング) 3ピン 1 秋月
VHコネクタ(コンタクト) 3 秋月
VHコネクタ(ヘッダ) 3ピン 1 RS 横向きは秋月等に無かった
ボリューム 10k 3 マルツ メイン音量調整用
QIコネクタ 4ピン 1 Ali 向きを間違えるのでXHとかの方が良かったかも
抵抗 51 2 Ali
抵抗 2k 2 Ali
抵抗 2.5k 2 Ali
抵抗 33k 6 Ali
抵抗 47k 8 Ali
抵抗 100k 2 Ali
セラミックコンデンサ 0.1uF 6 Ali 位相補償用2+電源用4

なお,電源は正負電源を供給する必要があります.このオーディオミキサは車載用のため,自動車の電源+12Vをレールスプリッタで±6Vに分割して供給するのが簡単です.

これを実際やってみたところ,ノイズがひどく実用に耐えませんでした.

そこで,外部に搭載した(たまたま持っていた)DCDCコンバータ(+12V→±12V)を利用して供給することとしました.

www.cosel.co.jp

製作

上記の回路図(の旧バージョン)を加工したものが以下の通りです.

f:id:masa_flyu:20181009182639j:plain

なんか妙なフットプリントがありますが,後述します.そして,実装したものが以下の通りです.

f:id:masa_flyu:20181009182341j:plain

さきほどの変換基板が宙を舞っていますね.

じつは基板を加工した当初は,別の電子ボリュームを使用しようとしていたのですが,その製品が使用できないことがわかったため,後付けしました.その結果がこの芸術的な配線です.

一応これで問題なく聞けたことをご報告します.音質は...私には良く感じましたけどわかりません.

もうちょっとUEWの配線を綺麗にすべきですが,実験用に長く作ったままでした.また今度短く綺麗にしようかと思います.

オーディオ回路自体作ったことがほぼ皆無なので,普通に音が出たことに満足しています.

先述のArduino/Raspberry Piプログラムで問題なく音量を変えられました.音量変更時のノイズもありません.

比較的実用性のあるものが作れたと思っています.

デジタル可変抵抗器 MCP4018をRaspberry Pi ( Python )で使ってみる(I2C書き込み)

DIP化などの準備はArduino編を参照

masa-flyu.hatenablog.com

環境

準備

Raspberry Piの設定

Raspberry Piの設定からI2Cをオンにしておく必要があります.

古臭いUIで作業する必要があったのは過去の話で,今はGUIで普通に設定できます(再起動が必要です)

Raspberry PiのI2Cデータ転送速度と波形を見る その1 | 電子工作の環境向上

接続

I2Cの2ピンと電源を以下のように接続します.

Raspberry Pi MCP4018
3.3V 1 (Vdd)
GND 2 (Vss)
5 (GPIO3, I2C-SCL) 3 (SCL)
3 (GPIO2, I2C-SDA) 4 (SDA)

f:id:masa_flyu:20181008004557p:plain

Raspberry Pi にはAnalog入力が無いのでテスターで5番ピンとGNDとの間の抵抗を測定してみようと思います.

Raspberry Pi 接続確認

I2Cが正しく接続されていれば,Raspberry Piの端末で

sudo i2cdetect -y 1

と入力すると,

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 2f
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

と出力されるはずです.

Pythonプログラム

依存ライブラリはsmbusとtimeです.

smbusはI2Cと,その類似の(同じ?)接続規格に関するライブラリです. 私は特にインストール操作無しに使用できました.

このプログラムはMCP4018に送る値tapを0〜127の範囲で台形波状に変化させます.

import smbus
from time import sleep

addr = 0x2F
bus = smbus.SMBus(1)
cnt = 0
tap = 0
    
while True:
    if ( cnt % 100 < 25 ):
        tap = 0
    elif ( cnt % 100 < 50 ):
        tap = int (( cnt % 100 - 25 ) / 25 * 127)
    elif ( cnt % 100 < 75 ):
        tap = 127
    else:
        tap = int(( 100 - cnt % 100 ) / 25 * 127)
        
    bus.write_byte(addr, tap )
    print ( "cnt=" + str ( cnt ) + "  tap= " + str( tap ) + "  Rwa= " + "{:.2f}".format( (1 - tap / 127.0) * 10.0 ) + "kohm  Rwgnd = " + "{:.2f}".format( tap / 127.0 * 10.0 ) + "kohm" )
    cnt += 1
    sleep( 0.2 )

実行

Pythonプログラムを管理者権限で実行します.

f:id:masa_flyu:20181008015337p:plain
(macOSからSSHで表示)

手元のテスターでWピンとGND,WピンとAピンの間の抵抗を測定したところ,ほぼ理論値通りの結果が得られました.

MCP4018を2つ同時に利用する場合

この記事は以下の記事の続きです.

masa-flyu.hatenablog.com

結論

2つを同じ値に設定する場合はなんの工夫も無しに可能です.

逆に2つを異なる値に設定することはできません(正攻法では).

はじめに

MCP4018をオーディオの音量調整に使用したいと考えています.その場合L,R両チャンネルを同時に制御したいという要求があります.

ところで,MCP4018はI2C通信を利用しています. I2Cはバス上にいくつものデバイスを接続できますが,その接続されたスレーブデバイスはアドレスで管理されます.データ送信時に必ずアドレスを伝送することで,他のアドレスの機器は反応せず,必要な機器だけが反応します.

MCP4018はアドレス0x2Fに設定されています.そしてこれを変えることはできません.

同じアドレスの機器がバス上に2つ存在する場合どのような挙動になるのかわからなかったため,同時に使用できるか調べてみました.

実験

回路

過去記事の回路にもう一つのMCP4018を接続します.

5番Wピン以外は全て同じものを接続しました.

I2Cも変えていません.

5番WピンをArduinoのA1に接続しました.

これで,1つ目のMCP4018を接続したA0ピンの電圧と同時に確認できそうです.

プログラム

// MCP4018用実験プログラム
// MCP4018の抵抗を一定時間ごとに一定量変化させる.

#include <Wire.h>

void setup() {
  Serial.begin(9600);
  Wire.begin();
}

int cnt = 0 , a1 , a2 ;
 
void loop() {

  // MCP4018 のアドレスは0101111 → 16進数で2Fにセットされている
  // 0〜127の値を送る
  Wire.beginTransmission(0x2F);
  Wire.write(cnt);
  Wire.endTransmission();

  // 送信した値と,それをW→Vss間の抵抗で表した抵抗値をシリアル出力させる.
  Serial.print(cnt);
  Serial.print(" ( ");
  Serial.print(cnt / 127.0 * 10.0);
  Serial.print(" kohm)  ");

  a1 = analogRead(0);

  // MCP4018-1 のW-Vssの電位差をシリアル出力させる.
  Serial.print("\t\t 1 =" );
  Serial.print(a1);
  Serial.print(" ( ");
  Serial.print(a1 / 1024.0 * 5.0 );
  Serial.print(" V )");

  a2 = analogRead(1);

  // MCP4018-2 のW-Vssの電位差をシリアル出力させる.
  Serial.print("\t 2 =" );
  Serial.print(a2);
  Serial.print(" ( ");
  Serial.print(a2 / 1024.0 * 5.0 );
  Serial.println(" V )");

  // カウントアップ
  cnt += 5 ;

  // カウントが127を超えていたら,意味がないので,0に戻す.
  if( cnt > 127 ) cnt = 0;
  
  delay(200);
}

実験結果

実行すると以下のように出力されます.

f:id:masa_flyu:20181007224848p:plain

同じI2Cアドレスに設定されている2つのMCP4018について,同じ抵抗値に設定されることが確認できます.

デジタル可変抵抗器 MCP4018をArduinoで使ってみる

デジタルポテンショメータMCP4018を使ってみました.

今回はArduinoで値を変化させてみます.

環境

製作

MCP4018のDIP

小型のパッケージは自作基板に実装するときとても便利ですが,実験でブレッドボードに取り付けたいとき不便です.

今回は,AliExpressで購入したピッチ変換ボードを利用しました.

MCP4018は0.65mmピッチです.

購入したものは販売中止になっていましたが,ほぼ同じものがありました. ja.aliexpress.com

Amazonにも(Aliより高い)

取り付けた様子が以下の図です(2つ付けました).

f:id:masa_flyu:20181007220327j:plain

そして拡大

f:id:masa_flyu:20181007213049j:plain

(↓こちらで拡大しました)

Kenko 顕微鏡 Do・Nature 20~40倍 LEDライト内蔵 コンパクト携帯型 STV-40M

Kenko 顕微鏡 Do・Nature 20~40倍 LEDライト内蔵 コンパクト携帯型 STV-40M

ABTUの刻印が見えますが,この向きで左下が1番ピンです.

Arduinoとの結線

f:id:masa_flyu:20181007215548p:plain データシートを元につなぎます. まずこのようにつなぎます.

Arduino MCP4018
3.3V 1 (VDD)
GND 2 (VSS)
SCL ※ 3 (SCL)
SDA ※ 4 (SDA)

Arduino UNO R3ではAREF端子の隣がSDA,そのさらに隣の端がSCKピンが利用できる.R3含む全てのArduino UNOではA4がSDA,A5がSCLを兼ねている.

さらに,今回は動作チェックのため,追加で以下のようにつなぎます.

Arduino MCP4018
A0 5 (W)
5V 6 (A)

MCP4018は10kohmの抵抗器の片側がVcc,もう片側がAピンに接続されており,その抵抗の任意の中間点にWピンが接続されています.

A側を5Vに接続することで,MCP4018の抵抗は点Wから見たとき,5V電源を2つの抵抗で分圧しているようになります.

つまりWの位置がVss付近のときWは0[V],Wの位置がA付近のときWは5[V]になり,その間はWの位置に比例して増加します.

最終的にこのようになりました. f:id:masa_flyu:20181007220328j:plain

スケッチ

// MCP4018用実験プログラム
// MCP4018の抵抗を一定時間ごとに一定量変化させる.

#include <Wire.h>


void setup() {
  Serial.begin(9600);
  Wire.begin();
}

int cnt = 0 , a;
 
void loop() {

  // MCP4018 のアドレスは0101111 → 16進数で2Fにセットされている
  // 0〜127の値を送る
  Wire.beginTransmission(0x2F);
  Wire.write(cnt);
  Wire.endTransmission();

  // 送信した値と,それをW→Vss間の抵抗で表した抵抗値をシリアル出力させる.
  Serial.print("set = ");
  Serial.print(cnt);
  Serial.print(" ( ");
  Serial.print(cnt / 127.0 * 10.0);
  Serial.print(" kohm)");

  a = analogRead(0);

  // W-Vssの電位差をシリアル出力させる.
  Serial.print("\t\tanalogRead = " );
  Serial.print(a);
  Serial.print(" ( ");
  Serial.print(a / 1024.0 * 5.0 );
  Serial.println(" [V] )");

  // カウントアップ
  cnt += 5 ;

  // カウントが127を超えていたら,意味がないので,0に戻す.
  if( cnt > 127 ) cnt = 0;
  
  delay(200);
}

実験結果

プログラムを実行すると以下のように出力されます.

f:id:masa_flyu:20181007210855p:plain

セットした値に応じて,抵抗値が変化していることがわかります.

↓続き? masa-flyu.hatenablog.com

当ブログをご利用いただく際には免責事項をお読みください。