以前はedisonで温度湿度計を作りました。
今回Edisonを使ってオーディオセレクタを作りたいと思います。
本当はもっと複雑な機器組み込みとかに使うべきなのでしょうけど、簡単に作れてしまうよという所に主眼をおいてつくっていきたいと思います。
さて、今回もやってきたedisonの箱です。
そして中身です。
横の10円玉と比較するとわかると思いますが、本当に小さいですね。
ちなみにこの小さなモジュールのスペックがこちら。
サイズ : 35.5×25×3.9mm
SoC(CPU) : 500 MHz Intel Atom Silvermont dual-core processor
RAM : RAM:1GB(LPDDR3 POP memory 800 MT/sec)
Flash : 4GB eMMC(v4.51 spec)
wifi : IEEE 802.11a/b/g/n 2.4GHz/5GHzデュアルバンド
Blutooth : Bluetooth 4.0+2.1 EDR
入力電圧 : DC3.15~4.5 V
前回のときも書きましたが、もうこれPCレベルですよね?
そしてこのモジュールの下にArduino互換拡張ボードとスペーサーが入ってます。
それではとりあえず組み立てましょう。
このarduino拡張基盤にはACアダプタのジャックもついてますが、USBからの給電でも起動します。
J3が通信用、J16が給電用になります。
ですので 単純にUSBを2本つなぐだけですぐ使えてしまいます。
edison内部はLinuxが動いています。
まさに小型PCって感じですね。
ドライバを入れればTeraTerm等のコンソールソフトで状態を見たり、wifiの設定とかもできるのですが、まずは環境を整える必要があります。
インストーラーができてより初心者に優しくなった
さて、edisonを使うためにはまずPCとの接続をするためにドライバ」をインストーしたり、開発用ソフトをいれる必要があります。
まずは環境準備
もちろんそれらはIntelのサイトからダウンロードできるので早速インストールしておきましょう。
前回のedisonの開発のときに比べてずいぶんサイトが様変わりしちゃいました。
真ん中くらいのボタンをクリックします。
次にページの中ごろにあるIntel Edison Board InstollerからWindows版のインストーラーのダウンロードを開始します。
以前はドライバとSDK(開発ソフト)が別だったのが一つのインストーラーに収まったのはありがたいですね。
ということで早速ダウンロードしたファイルをダブルクリックしてインストールを開始します。
基本的にすべてデフォルトのままでいいようです。
これでドライバーとSDK(開発ソフト)がまとめてインストールされます。
インストーラーができて、galileoからするとずいぶん初心者向けに変わった気がしますね。
それではドライバーもインストールできたので少しedisonで動いているLinuxを触ってみましょう。
edisonのシリアルポートはデバイスマネージャで確認します。
私の環境ではCOM22ですね。
これでボーレートを115200bpsに設定するとedisonのLinuxに接続できます。
ログインIDをrootにするとログインできるはずです。
ファームウェアのアップデートやwifiの設定時にはこのLinux上での操作が必要になりますから覚えておいたほうがいいかもしれませんね。
今後edisonの開発にはインストールされたSDKを使います。
まずはLチカ
まずはサンプルプログラムのLEDを点滅させてみましょう。
最初は開発のターゲットボードがIntel edisonになっていないはずですので”ツール”の”ボード”からIntel Edisonを選択します。
次に必要に応じてポートの設定も変える必要があります。
これは先のデバイスマネージャを開いて必要な部分(COMポート番号)を確認してください。
あとは左上のボタンを押すとコンパイルとedisonへのデータ転送が自動で行われます。
さて、これでedisonの開発準備と動作確認がとれました。
次からはオーディオセレクタの設計に入っていきましょう。
結構簡単に動く。でも・・・・
今回は俗に言うメカニカルリレーを使うのではなく今回はちょっと変わってMOS-FETでリレーを作ってそれを制御します。
なぜメカニカルリレーでなくMOS-FETリレーなのかというと・・・
メカニカルリレーにも接点抵抗というものが発生し、数十mΩという微弱ながらも抵抗として働いてしまうのです。
しかもメカニカルリレーは劣化するとどんどん抵抗値が大きくなり、オーディオ信号に大きな影響がでてきます。
しかし、MOS-FETリレーに使うMOS-FETはオン抵抗が数mΩのものを使えばさらに抵抗を下げることができます。
ということで今回はMOS-FETリレーでセレクタを作ってみたいと思います。
試験回路で試してみる
それではまずMOS-FETリレーがどういった構成なのかを調べる必要があります。
動作原理はOMRONのサイトに載っているようですのでこれを参考にさせてもらって試験回路を作ってみます。
MOS-FETのスイッチ部分はN型MOS-FETを2個つなぐ形で実現できるようです。
とりあえず動作原理を知るための試験なので、手持ちのMOS-FET(2SK4021)で試験してみましょう。
オシロスコープの下(黄)が入力、上(赤)が出力になります。
まずは1khzの正弦波入力でMOS-FET ON状態です。
そして次はOFF状態。
しっかりON,OFFできてます。
次は10khz入力でのON、OFFを試してみます。
まずはON状態。
続いてOFF状態です。
さらに256khz入力のON状態です。
そしてOFF状態。
入力周波数が変わっても入力波形はきちんと制御できているようです。
しかしMOS-FETで気になるところは漏れ電流です。
MOS-FETスイッチではOFF状態でも完全に絶縁されているわけではないのです。
ということでOFF時の出力を拡大してみました。
やはり20mVほど漏れてますね。
これは使ってるMOS-FETにもよるでしょうが、全く漏れのないMOS-FETなんてあり得ませんから多少はやはり漏れると考えたほうがよさそうです。
しかもこの信号はこれからアンプで増幅されるとするとあまり無視はできそうもありません。
スイッチoff時にはもう少し漏れ電流を逃がす対策を考える必要がありそうですね。
ただ、MOS-FETスイッチの動作は確認できました。
実際に作るときにはon抵抗の低いIRLB3813PbFを仕入れて作ることにしましょう。
セレクタに必要な機能を作りこむ
さて、スイッチ部はMOS-FETを使ったMOS-FETスイッチで実現できそうなことがわかりました。
それでは早速edisonに必要な機能を組み込んでいきます。
まずはオーディオセレクタに必要な機能の洗い出しです。
・入力、出力切り替えスイッチ
・状態出力
・MOS-FETスイッチの制御
この3つが最低限必要な機能では無いでしょうか?
入力、出力切り替えスイッチ
まずは入力と出力を切り替えるスイッチの読み取りをさせてみましょう。
今回は2入力4出力を目標にしますのでそれを見越してスケッチを考えていきます。
本来入力切替と出力切り替えとスイッチは2個欲しいところですが、手持ちのスイッチはコレ一個だったのでひとまずこれ1つで切り替えるようにしましょう。
それでは早速作っていきましょう。
スケッチの例 digital -> Button で記載されているスケッチを参考にボタンの読み込みをさせてみます。
サンプルスケッチを参考にして、ボタン入力があればoutputを0から3まで推移させ、3まで来たらinputを0から1へ切り替えるスクリプトを作りました。
const int buttonPin = 2; //ボタン接続pin
int buttonState = 0; //ボタン状態
int prebuttonState = 0; //前ボタン状態
int inselect = 0; //inputセレクト状態
int outselect = -1; //outputセレクト状態
int count = 0;
void setup()
{
//pinmodeの初期化
pinMode(buttonPin, INPUT);
//デバッグ用標準出力
stdout = freopen("/dev/console","w",stdout);
stderr = freopen("/dev/console","w",stderr);
printf("test start\n");
}
void loop()
{
// put your main code here, to run repeatedly:
buttonselect();
}
void buttonselect(void)
{
//ボタン読み込み
buttonState = digitalRead(buttonPin);
if(buttonState == HIGH && prebuttonState != buttonState)
{
outselect ++;
count ++;
if(outselect == 4)
{
outselect = 0;
inselect ++;
if(inselect == 2)
{
inselect = 0;
}
}
//状態表示
printf("%d:input=%d output=%d\n",count,inselect,outselect);
delay(200);
}
prebuttonState = buttonState;
}
ちなみにチャタリングに対応するため、状態が推移したら200ms待機させています。
結果はこんなかんじになります。
ボタンを押すたびにoutputが切り替わり、outputが3まできたら、inputを推移させoutputを0に戻しています。
ひとまずボタンの入力についてはこれでよさそうです。
LCDで状態を表示させよう
次にLCDを使って状態を表示させます。
使う液晶は秋月電子で購入したLCDキャラクタモジュールです。
さて、こいつを使うにあたり、スケッチの例にある LiquidCrystal -> HelloWorld のサンプルスケッチのとおりに接続し、スケッチを流してもうまく動きません。
どうやら修正というか追記が必要なようです。
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
lcd.init(1, 12, 255, 11, 5, 4, 3, 2, 0, 0, 0, 0);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop()
{
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis() / 1000);
}
黄色で反転した1行
lcd.init(1, 12, 255, 11, 5, 4, 3, 2, 0, 0, 0, 0);
初期化がうまくいってないのかな?
これがないとどうもedisonではLCDモジュールをうまく使えないようです。
これでひとまずLCDモジュールが使えるようになりました。
それでは少し改変してインプット、アウトプットの状態をLCDで表示するようにした結果がこうなります。
さて、これで液晶による状態表示もできました。
MOS-FETスイッチの制御
さて、次にMOS-FETスイッチの制御をedisonで行います。
MOS-FETスイッチのON、OFFにはMOS-FETのゲート(G)に電圧を印加するのですが、オーディオ信号とedisonのGNDを直結すると、edisonからのノイズが音声信号に流れ音質に影響が出るからちょっといただけません。
なので、MOS-FETスイッチのON,OFFにはフォトボル出力のフォトカプラ(TLP190)を使います。
これは1-2ピン側に電圧をかけると、4-6側に約10Vの電圧が出力されます。
これを使うことでedison側とaudio側と絶縁した状態で電圧の印加が可能になります。
ということで、基本的なスイッチ回路は下図のようになります。
検証した結果にもあるように、INPUT側に漏れ電流を逃がすためのスイッチが必要です。
また、ゲート(G)に貯まった電圧を抜くためにR2の抵抗を入れています。
ここもフォトカプラで抜こうかとも思ったのですが、試しに抵抗入れたらすんなり抜けたのでこれでやってみます。
しかし、今回はちょっと部品が足りなくなりそうなので簡易的に漏れ電流を逃がすスイッチは取り付けずに作ります。
まぁぶっちゃけ使ってないinput側の機器の電源落としておいたら問題ないんで・・・
ここは部品を追加していずれver2とかで改善していくことにして、今回の基本的なMOS-FETスイッチのみで回路は以下のようにします。
かなりスッキリしましたね。
それではこれをedisonで制御してみましょう。
この回路を制御するにはDigitalのOn-OFFを制御するだけです。
なので、これを動かすのは スケッチの例にある Basics -> Blink を改変して使います。
// the setup function runs once when you press reset or power the board
void setup()
{
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
}
// the loop function runs over and over again forever
void loop()
{
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
このスケッチの例では13番pinで1秒ごとに電圧(5V)がOn,OFFされています。
そのとおりに接続して動かしてみます。
全体写真を撮り忘れていましたが、左下の蛇の目基板に先のTLP190Bを取り付けてそれをedisonで制御させています。
最初TLP190Bにつなぐ抵抗の値を間違えて、意図した電流が流れずに動作せずちょっとあせりましたが、設計どおりに220Ωをつなぐと無事動かせました。
オーディオセレクタとして仕上げる
最後にオーディオセレクターとして仕上げていきます。
まずは大本となるスイッチ回路です。
こうやってまとめるとなんか非常に単純ですね。
入力側スイッチでonにしたい入力を選択します。
次に出力側スイッチで出力を選択するという構成です。
さて、それではこれを先のMOS-FETスイッチ回路を基に蛇の目基板に作っていきます。
・・・MOSーFETスイッチの数が少ないって?
すみません。
TLP190Bの発注数を1ch分で計算して間違えてしまっていたことに組み立て始めて気づいて急遽片ch2入力、2出力で作ることになりました。
そのうち時間ができたらCAD書いてプリント基板発注するつもりですから、そのときにTLP190Bを追加して拡張することにしましょう。
それでは次にケースを加工してオーディオセレクタとして組み込んでいきます。
ケースは以前使ったものと同じSL-88-43-33SSを使います。
せっせと加工します。
といってもLCDの穴とボタンスイッチの穴だけですが・・・
穴あけはドリルで穴を開けた後、ハンドニブラーで窓の形に広げていきます。
そして組み込んだ結果が・・・
ボタンの色が違うのと、ケースをラックに固定する耳がないので若干違和感がありますが、ひとまず組み込み完了です。
電源はスイッチが無いので電源タップのスイッチをセレクタの電源スイッチと併用します。
それではいざ起動。
上が今回作成したオーディオセレクタ、下が以前作成したDACです。
セレクタの液晶はDACに比べてバックライトがちょっと暗いかな?
接続はこんな感じです。
それでは再生してみます。
ちゃんとスピーカー鳴ってます。
ひとまず安心ですね。
切り替えもきちんとできてます。
ゲートに貯まった電圧もしっかり抜けているようで切り替えも、もたつきなくすんなり切り替わってます。
気になる音質も、低on抵抗のMOS-FETを使ったおかげもあるのでしょうが、まったく感じられません。
といっても新品のメカニカルスイッチでも、音質低下は聞き取れないのでわからないんですけどね・・・
あと、ボタン一個はやっぱり不便なのでINPUT、OUTPUTのスイッチ分けたいですね・・・
そうするとすでにedisonの出力ポートの空きが3個なのでスイッチつけて出力を4系統に増やすともうedison側の秋ポートがありません。
入力も増やすとするとちょっと細工が必要になりますが、ひとまず今回はこれで完成とします。
開発は簡単。でもちょっと癖がある
さすがにAruduino互換というだけあって非常に開発がしやすくなってます。
また、初めてedisonに触ったときに比べるとずいぶん開発アプリケーションもよくなったように思います。
ただ、気になるのはgalileoの時と同じく、そのままでは動かないライブラリがあるということでしょうか?
LCDがらみとか簡単に修正できるものは、やはり早めにバージョンアップ等で修正して欲しいという思いはあります。
また、動かないのは仕方ないにしても、それを補う情報がもっと簡単に入手できたり、そういったコミュニティの案内があると助かるのですが、そうなると工作初心者には優しくないのかな?
ただedisonは他のaruduinoに比べるとダントツで高性能です。
なので高機能の開発ができるともちろんいいのですが、初心者がそれなりに書いたスケッチで処理に無駄があっても問題なく処理して動いてくれるのは非常にいいかもしれませんね。
やはり小型で高性能な組み込み用デバイスが簡単に手に入り、簡単に開発できるようになったというのはうれしいですね。
jakeさん
2015/08/31
ダミーのスピーカーとみなして抵抗につなげれば、20mVの漏れ電流を出さずに抵抗が処理してくれるのかな、と思ったんですが。
eulerさん
2015/08/31
今のところご指摘どおり、ダミー負荷の抵抗でグランドに落として漏れ電流は流れないことを確認しました。
この部分は音質とか気にしなくていいので安物FETか機械式スイッチでもいいかな?なんて思ってます。
でもここまで機械的動作なくしているから安物FETスイッチに行っちゃう予感・・・