TJ3Bのセンサーを増やす マルチプレクサの使い方

 TJ3Bでセンサーを増やしたいけど、もうセンサーポートがないよ、と言う場合があります。

方法として、センサーをつなげたサブマイコンを用意して通信させる手があります。

その場合も2つ方法があり、

 案1.  Arduino(アルディーノ)など、他のマイコンで作る

 案2.  TJ3Bまたは、TJ3Bcoreを用意して接続する

があります。

案1はArduinoは値段も安く、とても良い方法です。ただ、もう本体もArduinoにしたいと思っているレベルの選手ならやれるでしょうが、Arduinoを使ったことがない場合にセンサーを増やすためにやるのはちょっと難しいと感じるでしょう。

案2はものさえ用意できれば、ケーブルを接続しほぼ設定するだけでできるので難易度は低いです。ただし値段がそれなりにかかりますので、予算が問題になります。もう少し安くて工夫次第で使えるものはないのでしょうか。




今回はちょっとお試しレベルでできるものを紹介します。

値段は安く、難易度はそこそこで、電子工作やマイコンの仕組みなども学べるので今後TJ3Bを卒業してからも役に立つものです。

それができる装置は「マルチプレクサ」と言います。

今回はAmazonで買えるものを試してみました。

Amazonリンク https://amzn.asia/d/1HDxL57

10個で1000円以下とリーズナブルです。これでセンサーが増やせるなら楽しそうです。


マルチプレクサの仕組みと接続


C-CODEを使う部分はありますが、この値段でセンサーの数を増やせるのは魅力です。

例ではセンサーポート4つを使って8個のセンサーをつなぐ例です。

このように、CN8,CN9,CN10をOUTPUTにしてセンサーの番号を指定すると、CN7に特定のセンサーがつながるという仕組みです。

マイコンをつなぐことを考えれば単純な配線なので、これぐらいは練習でやってみると良いと思います。


マルチプレクサのプログラム(新(黒)マイコン)

※白マイコンについても同じ論理でできる(コードは異なる)はずなので確認次第追記します。

センサー番号を指定してからCN7を読み込めばいいのでプログラムを書いてみます。


理論上は、これで指定したC0のセンサーの値が変数Aに入るはずです。

だが、これだとおかしな値が出てきます。

解析の結果、原因はCM7にまだつながったばかりのC0の値が読み込まれていないためと分かりました。

実はマイコン内部の処理として、アナログセンサーの値はリアルタイムにCN7に入るわけではなく、CN1~CN10までが順番に読み込まれて保存されていく。なので切り替えた瞬間にはまだ古いデータが入っているのです。

つながったばかりのC0の値をCN7に読み込ませるために、以下のC-CODEを追加することで、変数AにC0につながったセンサーの値が入ります。

まずプログラムの変数定義のため、以下のC-CODEをプログラムの一番最初の1行目に加えます。自分のプログラムは2行目から書いてください。

プログラム最初の1行目(読み込み時に使う変数を定義する)

BYTE cADch[MAX_CN] = { AN0,AN1,AN2,AN3,AN5,AN8,AN9,AN10,AN11,AN12 }; 

これは後で使う変数を定義するものです。これを書かないと後のC-CODEの内容がややこしくなるのでこのまま書いてください。

次に、センサー番号を指定した後、変数Aに代入する前に2行のC-CODEを加えます。

読込前1行目(内部の接続をCN7に固定して少し待つ)

for (int n = 0; n < 1000; n++) {ADPCH = (BYTE)cADch[CN7];} 

読込前2行目(電圧の値を読み込む)

gU_AD.H = ADRESH;gU_AD.L = ADRESL;gAD[CN7] = gU_AD.W;
※センサー入力がCN7ではない場合は、CN7をCN1~CN8のつないである番号に変えてください。

あとはこれをサブプログラムにして保存、呼び出しをすればメインプログラムでも1行でスマートに書けるでしょう。


いろいろと勉強になる事も多いので、実験を兼ねてぜひやってみてください。

マルチプレクサのプログラム(旧(白)マイコン)

少しだけC-CODEが異なりますが追加する箇所は同じです。下記のプログラムをそれぞれコピペして使ってください。

プログラム最初の1行目(読み込み時に使う変数を定義する)



int n; BYTE cADch[MAX_CN] = { AN0,AN1,AN2,AN3,AN4,AN8,AN9,AN10,AN11,AN12 }; volatile U_UINT gU_AD;

センサーの値の読込



読込前1行目(内部の接続をCN7に固定して少し待つ)

for (n = 0; n < 100; n++) {ADCON0 = cADch[CN7];}

読込前2行目(電圧の値を読み込む)

gU_AD.H = ADRESH;gU_AD.L = ADRESL;gAD[CN7] = gU_AD.W;

なんと、白マイコンのほうが値が安定する時間は短くできました。4つの値を連続で読み取って1msと黒マイコンより高速ですが、十分実用になる値が取得できました。理由は良く分かりません。


読込が成功したら、新マイコン同様、これをサブプログラムにして、使うと良いでしょう。


ブレッドボードのススメ

試す場合ははんだ付けしてしまう前に、ブレッドボードでやりましょう。ブレッドボードがない人はこの機会にブレッドボードとコード(ジャンプワイヤといいます)とセットで買っておくと良いですよ。電子工作の試作にはあるととても便利です。作ってから動かなかった、ということも減らせるので事前の実験は重要です。今後Arduinoに進む場合も使えます。



説明動画も撮影したので、文章だけでは分かりにくい人はこちらも見てください。






コメント

このブログの人気の投稿

センサー自作のための参考情報

TJ3Bにm5stck UnitV AI Cameraをつなぐ(暫定版)

TJ3BでHMC5883L(QMC5883L)を使う方法