2017年1月28日土曜日

フォトダイオードとLEDで光通信をしてみる実験

S6775というフォトダイオードをtozさんにもらっていたので、これとLEDを組み合わせて光通信してみた。


仕組みとしてはフォトカプラと同じだと思うが、暗所に封入するのではなく普通の室内で光通信できるかという実験。

受信部の回路図



フォトダイオードからの出力電流を、OPAMPのI→V変換回路で増幅して電圧として取り出す。OPAMPは単電源で使えて入力インピーダンスの高いCMOSタイプのNJU7032を使った。

C1はノイズ除去のために入れている。定数はブレッドボードで実験しながら決めた。

ブレッドボード配線図


上側のブレッドボードが受信部。下側のブレッドボードが送信部。電気的にはつながっていない。(正確に言うと測定用のオシロのGNDとArduinoのUSBのGNDはつながっています)

送信部はArduinoのLチカ。白色のLEDのストックがなかったので、高輝度タイプの青色LEDを使った。(電流制限抵抗:100Ω)

通信状態


ch1:送信 ch2:受信

画像の程度の至近距離だと、夜間に室内灯を付けた状態で10kHz程度の送受信はできるようだ。

メモ:


もっと遅い周波数だと、室内灯の60Hzの波形が重畳する(関西なので)

ベースマシン EXIOボードを2段積みにしてみた。

I/OエキスパンダーとEEPROMを載せた基板と、入力用のスイッチを並べた基板をスタックしてみた。精度が甘くてガタガタするのを心配していたが、わりとしっかりしている。

タクトスイッチx8の基板にもキートップを付けて押しやすくしてみた。(こちらは、ちょっとゆるいのでガタガタします)


使ったのは片側にオスのねじを切ってあるスペーサー

以前は平置きにしていたのをスタックしてスペースの節約になった。



パソコンのATX電源を交換した。(軽作業という名の肉体作業)

電子工作でUSBを酷使したせいか、パソコンの電源が故障した。

antec neopower 650というタイプで、いつ買ったか忘れたが、価格コムのクチコミ掲示板をを見ると2009年頃までなのでもう10年近く使っていたのかもしれない。一時は2~3年に1回は買い替えていた気がするので、随分がんばってくれたと思う。

電源スイッチを押しても電源ユニットのファンが回らない、マザーボード上の通電LEDが点灯しないということで電源ユニットの故障と目星をつけた。

ATX電源検証ボード


しょっちゅう電源が故障していた頃に、「電源検証ボード」というのを買っていた。


これにつなげば電源が生きているかどうか分かると思って買ったのだが、このボードで電圧が出ていてもマザーボードにつなぐと動作しないことが多い。今回もこのボードにつないで電源スイッチを入れると電源ユニットのファンが回るし3.3V、5V、12Vも電圧が出ていた。

この検証ボードのコネクタとターミナルブロック部分の通電をテスタで調べてみると、案の定、コネクタの1ピンとしかつながっていない。


ATX2.0は上図の左側の通りで同電圧でも出力は数系統ある。

真面目に検査するなら、メインの24ピンとExtraPowerの8ピンそれぞれに負荷を掛けてチェックしないとダメかもしれない。

Amazonでもう少しマシそうなATX電源チェッカーを見つけたが、レビューを見る限り負荷はかけられなさそう。



電源は以前サーバーとして使っていた筐体に置き去りにされていた700Wの電源(HEC WIN+ POWER 700W)があったのを思い出したのでこれと交換して、無事動作した。ほとんど通電はしていなかったが、これも相当古いのでちょっと怖い(^q^;

メモ:


故障したneopower 650も一応3.3V/5V/12Vは出力されているようなので、そのうちチェックして電子工作の実験用の電源として使うかも?

ペリフェラル用のケーブルが着脱可能なタイプなのでうまく利用できいかな?

パソコンの中をいじると必ずどこか怪我をする(^q^;

2017年1月25日水曜日

リズムマシンからsync信号を出してみる。

去年というか、おととしPSoC 5LP Prototyping Kitで作ったリズムマシンからSync信号を取り出す実験をしてみた。

Sync信号というのはシンセのリズムの同期をとる信号で、これがないと機材同士の同期をとるのがむずかしい。

たとえA機材とB機材が水晶振動子で正確なクロックを刻んでいても、完全には一致せず、少しずつずれてくる。これを片方のクロックで強制的に同期させるのがSync信号。

今、作っているベースマシンと去年作ったリズムマシンとを同時に鳴らすとテンポがずれてしまって、とても気持ちわるくなる。ずれた感じが一瞬いい感じになる時もあります。ハードウェアで作ったおかげだとおもいますが、ずっと聴いているとやっぱり気持ち悪い。

いっぱつで同期をとれるようにSync信号を出すことを考えてみた。


同期の本体は、ベースマシンかリズムマシンか悩んだが・・・。両方から出力しておけば、拾う側で取捨選択できるとおもうのでどっちでもいいのか。

もう、中身を忘れかけてるリズムマシンからSync信号を出力させてみた。

GitHub:
https://github.com/ryood/RhythmMachine-V2


ch1:オーディオ出力 ch2:sync信号

main.c(の中の一部)

//=================================================
// Sync信号出力
//
//=================================================
void generateSyncSignal()
{
    Pin_ISR_Check_Write(1u);
    CyDelay(1);
    Pin_ISR_Check_Write(0u);
}

ソースの中の話になるが、このルーチンは、dds.cの

fp32 generateWave(struct track *tracks)

関数の中で、

if (tick >= ticksPerNote) {
   noteCount++;

(noteUpdateFunc)();

<後略>

として、音符が一つ進むとき、main.cの
void generateSyncSignal()
関数にコールバックするようにした。

SPIのCS用に予備端子を2つ作っていて(Pin_SPI_EX1、Pin_SPI_EX2)、Pin_SPI_EX1をSync信号の出力として指定したが、オシロで信号を拾えなかった。(接触不良も考えられる)

メモ:


Sync信号は取り出せそうだが、どう配線するか悩む。

予備のSPI端子あたりを再チェックする?

スイッチング電源ユニット(DESNSEI-LAMBDA VT-60)のノイズ測定

以前、共立でジャンク品としてDESNSEI-LAMBDA VT-60が380円で売っていたのでとりあえず買ってあったのを思い出したので動かしてみた。


デンセイ・ラムダというメーカーは今はもうなく、TDKに吸収されてTDKラムダという会社名になっているようだ。会社沿革を見ると、平成20年に会社名変更とあるのでDENSEI-LAMBDA名のこれは結構古いものだと思う。

最大出力電流は、
+5V: 5A
+15V: 1.6A
-15V: 0.5A
となっている。

AC100Vを扱うのは初めてなので結構緊張する。5V出力には100Ω/3Wの酸金(50mA/250mW)、±15V出力には220Ω/3Wの酸金(約68mA/約1W)を負荷としてつないで測定してみた。


出力電圧


+5V: 5.00V ※ボード上のトリマーで電圧値を調節可能。
+15V: +15.07V
-15V: -14.97V

出力電圧はかなり正確。

ノイズ測定


5V
電源オフ

電源オン

ノイズは400mVp-p程度で、周波数は625kHz程度。

かなりノイズが乗っているので、1000uFのアルミ電解でデカップリングしてみた。


スパイク状のノイズがまだ乗っている。

±15V
電源オフ

ch1:+15V ch2:-15V

電源オン

プラス側で1Vp-p程度、マイナス側で400mVp-p程度。周波数は180kHz前後。

1000uFのアルミ電解でデカップリング

5Vのときとは縦軸の縮尺がちがうが、こちらは結構きれいになった。

メモ:


安全のため外付けで0.5Aのヒューズを入れたが、実験中に切れてしまった。データ・シートでは4Aのヒューズを使うようになっているので、仕入れてもう少し実験する予定。

何か適当なケースに入れたいが、発火事故の危険を考えると金属製じゃないとだめかな?カネ掛かりそう(^q^;

1.0uFフィルムコンデンサ比較

1uFのフィルムコンデンサをDER EE/DE-5000で測定してみた。


左から

AudioPhiler MKP 1.0uF \62@共立Digit
400Vと高耐圧。サイズがでかい。

TDK MKT 1.0uF \50@aitendo
あんまり見かけないが、TDK製らしい。

WIMA MKS 1.0uF \130@共立
オーディオ用によく使われる。ドイツ製で高い。

Capacitance(nF)



Frequency WIMA #1 WIMA #2 TDK #1 TDK #2 Audiophiler
100 1021.1 1027.7 1054.4 1040.6 989
120 1021.4 1027.7 1054.2 1040.7 989
1000 1017.3 1023.1 1049.9 1036.7 988.4
10000 1007.5 1013.4 1040 1028.2 987.6
100000 943.9 949.5 974.2 964.3 955.8


AudioPhilerが、100kHzでのキャパシタンスの落ち方が少ない。WIMAとTDKはカーブが似ている。

Tan D



Frequency WIMA #1 WIMA #2 TDK #1 TDK #2 Audiophiler
100 0.001 0.001 0 0.001 0
120 0.001 0.001 0.001 0.001 0
1000 0.004 0.004 0.003 0.003 0
10000 0.011 0.01 0.009 0.008 0
100000 0.039 0.04 0.022 0.023 0.006


誘電正接はAudioPhilerが良い。100kHzではWIMAよりTDKの方が良い。

ESR(Ω)



Frequency WIMA #1 WIMA #2 TDK #1 TDK #2 Audiophiler
100 2.3 1.7 1.4 1.8 0.7
120 2.1 1.9 1.5 1.8 0.7
1000 0.68 0.64 0.59 0.53 0.01
10000 0.18 0.17 0.14 0.13 0
100000 0.06 0.06 0.03 0.03 0.01


ESRもAudioPhilerが良い。WIMAとTDKは同程度。

AudioPhilerはスペックは一番良いが、サイズがでかいので据え置き用かな?

TDKもWIMAよりスペックが若干良かった。サイズはWIMAと変わらないし値段も安い。スペックが良いからと言って高音質とは限らないが、使いでがありそう。

2017年1月22日日曜日

小ネタ実験 ステッピングモータとサーボをArduinoで動かしてみる。

部品箱で眠っているパーツを少しずつ試していこうと思います。まずは、モーター類から。

ステッピングモータ


共立で買ったやっすいユニポーラのステッピングモータ。 6Vと比較的低電圧で駆動できるので実験しやすいと思う。

付属の紙をみると、「巻線抵抗/相:7Ω」となっているので、6V駆動すると1A近く電流が流れる。当然、Arduinoでは直接駆動できない。ArduinoのStepperライブラリのページには、ULN2003かULN2004か、ダーリントントランジスタ・アレイを使うように書いてあるが、とりあえず手持ちの部品で実験してみた。

モーター駆動回路

NPNトランジスタのスイッチング回路を使ってモーターを駆動する。1A近く流すので小信号用トランジスタではダメで、パワーTrかパワーMOS-FETを使わないといけない。手持ちにあった2SC2655を使った。[IN]がArduinoからの制御信号(H/L)で、[Q1]をスイッチングする。Trなのでベースに流す電流を制限するR1が必要。

D1はモーターの逆起電力を逃がすために入れる。手持ちにあった、整流用ダイオードの1N4007を使った。

ブレッドボード配線図


A、!A、B、!Bはユニポーラ・ステッピングモータの端子名。モータは500mA以上流れるようなので、モーター駆動回路の電源をArduinoから取ると、Arduinoの電源回路が壊れる可能性があるので注意。

これで、ArduinoのExample/Stepperのサンプルプログラムが試せる。

使用したモーターのステップ数が48stepなので

// change this to the number of steps on your motor
#define STEPS 48

とした。

Exampleの[MotorKnob]は挙動がわかりにくいので、最初は他のExampleの方がいいかもしれない。

また、[stepper_speedControl]は48stepを指定すると、

    myStepper.step(stepsPerRevolution / 100);

のところが0になってしまい、動作しない。

↓48Step対応の修正版

#include <Stepper.h>

const int stepsPerRevolution = 48;  // change this to fit the number of steps per revolution
// for your motor


// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;  // number of steps the motor has taken

void setup() {
  // nothing to do inside the setup
}

void loop() {
  // read the sensor value:
  int sensorReading = analogRead(A0);
  // map it to a range from 0 to 100:
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  // set the motor speed:
  if (motorSpeed > 0) {
    myStepper.setSpeed(motorSpeed);
    // step 1/100 of a revolution:
    //myStepper.step(stepsPerRevolution / 100);
    myStepper.step(2);
  }
}

サーボ


秋月で一番安かったサーボ。このサーボは180°しか可動域がない。(普通そうなんだろうか?)

配線図


サーボの方はArduinoから制御用のパルス波を送るだけなので、回路はシンプル。このサーボも数100mAの電流が流れるようなので、Arduinoとは別に電源を用意して使った。

example/servoのサンプルプログラムを動作させることが出来た。プログラムも回転角を与えるだけなので楽ちんだ。

メモ:


DCモータをHブリッジ回路を使って動かしてみようと思ったが、手持ちのパワーTr/MOS-FETのPチャネル側のものがオーディオアンプ用に買ってストックしているものなので、なんとなく使いづらい(^q^;適当なパーツを仕入れてテストしてみるつもり。

2017年1月19日木曜日

3桁電圧表示器[ST-VM036R]を使った電流計 でけた

aitendoの3桁電圧表示器[ST-VM036R]を使った電流計。


配線図

前回はローサイド(GND側)で電流検知するように考えていたが、測定回路の電源は9V電池で測定対象とは独立しているので、ハイサイド(プラス側)で測定できる。

正電源のみを対象としているので、ハイサイドで測定するように変更した。

もう一つ同じ回路を作って、ローサイドで電流検知するようにすれば、負電源の電流を測定できると思う。


電流をとるコネクタは、DCジャック×2にした。


0.1Ωのシャント抵抗をDCジャックに直付けした。

GND側はいらないのでテスターみたいに+/-の2端子にしようかとも思ったが、自作の安定化電源とスタックして使いやすいようにDCジャックにしておいた。


5Vの安定化電源から出力して、100Ωの負荷抵抗に電流を流しているようす。50mA程度で、0.52という表示になっている。

精度はあまり考慮していないが、そのうち精度やノイズを測定してみるつもり。

回路図

基板図

Github:
https://github.com/ryood/ST-VM036R-Ammeter

2017年1月17日火曜日

470uFのコンデンサ比較

3桁電圧表示器[ST-VM036R]を使って電流計を作ることを考えたが、ブレッドボードで組んだ回路ににつないで、もう一度ノイズを測定してみた。

デカップリングコンデンサなし

縦軸は500mV/divなので、1.5Vp-p程度の激しいノイズが出ている。

100uFのOSコンでデカップリング

デカップリングなしのときとは、オシロの縦軸の縮尺が違う。80mVp-pのノイズが顕著。

470uFのOSコンでデカップリング

470uFのOSコンにしたら40mVp-p程度にまで抑え込めた。

1000uFや2000uFの電解コンデンサを入れた場合に比べるとノイズは増えているが、なんだこれは?よくわからん(@@;

ともかく、100uFではなく470uFのOSコンのほうがノイズが少なくなっていそうなので、470uFを使う方向で、470uFのケミコンの特性をDER EE/DE-5000で比較をしてみた。

以前にも470uFのケミコンを比較してみたが、OSコンの性能比較のため再度測定してみた。



TKが東信工業株式会社のもの(前回と同じ個体)、MuseがニチコンのMuseシリーズ、OSがPanasonic(SANYO)のSPECシリーズ

Capacitance(uF)                       


Frequency Muse#1 Muse#2 OS#1 OS#2 TK#1 TK#2
100 403.6 409.6 459.1 443.8 412.6 427.4
120 403.3 408 459.3 443.3 411.2 426.1
1000 386 390 448 433 388 402




<追記:2017.01.17>OS#2のデータの転記ミスしていたので、443→433に変更しました</追記>

Tan D                       


Frequency Muse#1 Muse#2 OS#1 OS#2 TK#1 TK#2
100 0.044 0.031 0.011 0.011 0.079 0.081
120 0.036 0.033 0.012 0.012 0.089 0.091
1000 0.119 0.102 0.041 0.048 0.503 0.521



ESR(Ω)                       


Frequency Muse#1 Muse#2 OS#1 OS#2 TK#1 TK#2
100 0.1 0.1 0 0 0.3 0.3
120 0.1 0.1 0 0 0.2 0.2
1000 0.04 0.04 0.01 0.01 0.2 0.2



2017年1月14日土曜日

ベースマシン まとめ(弱め)

予定していたハードウェアがほぼほぼ完成したので、まとめておきます。

全体図

左側がシーケンス打ち込み、パラメータ設定用のユーザーインターフェイス。右側がベースマシンのシンセ本体です。こうやって見るとシンセ本体よりユーザーインターフェイスの占めている面積が大きくなってしまった。

最初の構成案

半年前に漠然と考えた構成案です。デジタル制御できるところはデジタル制御で、しかし音声信号はアナログ回路で、という方針は貫き通しました。

ディティールは試行錯誤の結果異なりますが、全体のつながりは構成案のままになりました。I/Oピンが足りなくて一度はUI系とシンセ系でコアとなるNucleo F401REを2枚使うように分けてみましたが、Nucleo同士のSPI通信がうまく行かず、結局1枚にまとめてI/Oエキスパンダーを使ってI/Oピンを増やしました。


Sequencer UI パネル


シーケンス打ち込み用のユーザーインターフェイスの本体です。PropellerHeadのReasonというソフト・シンセのシーケンサーをリスペクトしています。

128x64ドットの大型LCD(CH12864F-SPI)を使ってシーケンスパターンを表示するようにしました。LCDの左右のロータリーエンコーダでシーケンスのピッチとステップを指定。左側のオレンジと青のタクトスイッチで表示するオクターブを指定。

下側のタクトスイッチはNoteのOn/Off、Tie、Accentを指定します。右のタクトスイッチでシーケンスの再生/停止。

上の基板のロータリーエンコーダはBPMを指定。去年作ったリズムマシンはBPMをPOTで設定していましたが、値がふらついて設定が難しいのでデジタル的に値を決められるロータリーエンコーダにしました。

白色のタクトスイッチはDCOの波形選択。黒色のタクトスイッチはLCDの表示モード切り替えようです。

今のところ、LCDの表示モードはシーケンス打ち込み画面、パラメータの数値表示、POTの読み取り値の数値表示、の3モードにしています。(参考:「ベースマシン UIとSequencerを分離 ハードウェア接続の整理」)

「ベースマシンのシーケンサ基板を作ってみた。(http://dad8893.blogspot.jp/2016/09/blog-post.html)」
「ベースマシンのシーケンサ基板 その2(http://dad8893.blogspot.jp/2016/09/2.html)」

アナログPOTパネル


POT(可変抵抗)を並べたパネルです。パネルは1mm厚のアルミ板をトンカチで叩いて加工しました。

POTに割り当てた機能は、上の2つの「A4/RESO」と「A3/CUTOFF」はDCFのCutoffとResonance、下の5つ(PC_2のPULSE_W以外)はDCA用のエンベロープ設定用です。「PC_2/PULSE_W」はDCOのパルス幅変調用。A0~A5、PC_2、PC_3は、NucleoのPin名。

経験的にPOTの分圧値をADCで拾うと7bit精度がせいぜいなので、読み取り値は7bit(128段階)に設定して使っています。

「ベースマシン用のコントロール・パネルを作ってみた。(http://dad8893.blogspot.jp/2016/07/blog-post_29.html)」

Exioパネル


Nucleo 1枚ではI/OPinが足りなかったので、I/OエキスパンダーのMCP23S17を使ってI/Oピンを増やしました。下側のSW×8はシーケンスパターンの切り替え用、上側のスイッチ類はパターンのロード&セーブ、コピー&ペースト用です。ロータリーエンコーダはロード&セーブのスロットを選択するためのものです。

ロータリーエンコーダーとOK/Cancelのスイッチは1次的には使っていないので(LoadかSaveボタンを押さないと有効にならない)、まだ機能が増やせないかと妄想中。

永続的にパターンを記録するために、最初はSDカードを考えていましたが、SDカードをmbedで使うとややこしそうなのでI2C接続のEEPROMのAT24C1024を使いました。

「ベースマシン I/Oエクスパンダ―基板 でけた(http://dad8893.blogspot.jp/2017/01/io.html)」

Nucleo F401RE



シーケンサー本体です。mbedでプログラミングしています。
https://developer.mbed.org/users/ryood/code/BaseMachine/

PSoC4 DCO



矩形波とノコギリ波を生成するモジュール。テーブル参照ではなくて、サンプリング・タイム毎に値を生成するようにしています。

「PSoC 4 Prototyping Kit DCOでけた。(http://dad8893.blogspot.jp/2016/09/psoc-4-prototyping-kit-dco.html)」

https://github.com/ryood/PSoC4_DCO

VCVS DCF



VCVS LPFのカットオフ周波数とレゾナンス(Q値)をDigital PotのAD8403を使って制御しています。


「VCVS DCF シールドでけた(http://dad8893.blogspot.jp/2016/04/vcvs-dcf_19.html)」
https://github.com/ryood/VCVS_DCF_Shield

OTA DCA


DACのMCP4922とOTAのNJM13600を使っています。

OTAとは電流で増幅率を可変できる素子で、アナログ・シンセを作るにはとて有用な素子です。
NJM13700は秋月電子でも取扱いされるようになったので、ある程度いじくりがいがありそう。←といっても、アナログ素子なので理屈で考えてもうまくいかないところはあります。


「NJM13700 DCAの基板でけた。(http://dad8893.blogspot.jp/2016/07/njm13700-dca_28.html)」

https://github.com/ryood/NJM13700_DCA

PWR Board


電源ボードです。入力は±9V。5V出力は3端子レギュレータの7805、3.3VはLDOを使っています。


「5V/3.3V/2.5V電源 はんだ付け完了(http://dad8893.blogspot.jp/2016/12/5v33v25v_27.html)」

https://github.com/ryood/BaseMachine/tree/master/5V_3.3V_%2B-2.5V_PowerSupply


SPI Bus Buffer


シンセに回すSPI信号を補強するためのバッファ・ボードです。Nucleoから直接出力した場合と比べて、ロジックICのバッファを通すと波形が整形されるので使っています。

「SPIバス・バッファ(TC74HC541)基板の製作(http://dad8893.blogspot.jp/2016/11/spitc74hc541.html)」

https://github.com/ryood/BaseMachine/tree/master/SPI%20Bus%20Buffer


全体の配線表



ToDo:
Sequencer

1    EEPROMがSaveされていない場合、Loadするとハングする
2    Run/StopでSTEP0から再生(前回停止位置から再生と切り替えられる?)
3    シーケンス打ち込み画面でBPM表示
4    Tieした時にエンベロープもTie。Durationを引き延ばす?
5    32Step打ち込めるようにする
6    BaseMachineUIController.h Timer系のスタートのタイミングを整理
7    Exio BufferのTimer間隔を調整
8    Filterにエンベロープをかけられるようにする
9    外部信号でSync
   
DCO   
1    DCOの周波数をDDSのサンプリング値で補正できる?
2    PSoC4 DCO 三角波とノコギリ波をデューティ比で可変できるようにする。 VC++で実験済み
   
DCF   
1    SVFをデジ・ポットで実験
2    4pole VCF Feedbackを検討