2017年8月31日木曜日

ベースマシンの筐体づくり

全部できてから記事にしようと思ってたのですが、側板の塗装にこだわりはじめたので途中までで一旦記事にします。

ダイソーのMDF板材をノコギリで切り出しました。


角になる所に三角材を木工用ボンドで接着


圧着しようと思ってダイソーで買ったF字クランプで挟みましたが


角度が中途半端で、ななめりました。

全体を接合するとこうですが


前板の部材の角度が90度ではないので接合するとずれる。


でも大枠は木工用ボンドで接着して作れました。


ここの部分は補助に使っている三角材が飛び出していたのでヤスリで削りました。


枠に合わせて厚紙を加工して配置の確認。


中の基板も厚紙で位置合わせ


位置を確認してダイソーで売っているクリップボードを加工しました。


MDFで作った枠とパネルを組み合わせ


現状ではここまでですが、両脇にサイドパネルをつければかっこいいかなと思って、塗装方法など先輩の長谷川竹光さんに教えてもらって試行錯誤中です。

2017年8月30日水曜日

Dual OTA VCA はんだ付け完了

ブロック図

回路図

基板図

部品面

ハンダ面

Github:
https://github.com/ryood/Dual_OTA_VCA

出力チェック


PCM5102Aファンクションジェネレータで50HzのSin波を出力してWaveInに入力し、Nucleo F446の内蔵DACからエンベロープ波形を出力してEnvelopeInに入力して、VCAからの出力の様子を見てみた。

電源電圧: +5.00V / -5.03V


WaveIn (PCM5102Aファンクションジェネレータから)

ch1:WaveIn ch2:VCAからの出力

EnvelopeIn (Nucleo F446から)

ch1:EnvelopeIn ch2:VCAからの出力

電圧→電流変換前

Nucleo F446の出力をレベル調整し、LPFを通した後の電圧波形


ch1:電圧→電流変換前 ch2:VCAからの出力

2ch同時


Aチャンネルと、Bチャンネルに同じ波形を入力し、エンベロープ波形のレベル補正とLPFのかかり具合を同じ程度にして両チャンネル出力してみた。

調整後のエンベロープ波形

ch1:ChannelA ch2:ChannnelB

出力波形

ch1:ChannelA ch2:ChannnelB

ChannelBのほうが出力レベルが高く、歪んでいる。

※今気づいたがエンベロープの方は両チャンネル合わせたが、WaveInの方のレベルは合わせていなかった(^q^;

音出し


Sin波にVCAでエンベロープをかけるとTR-808っぽい波形になるので録音してみた。


エンベロープ波形とサイン波のゼロ・クロス点が合っていないのでときどきブチブチ言っています。

Driveの方は、WaveInの入力レベルを上げて歪ませています。

2017年8月28日月曜日

書評?:「新・低周波/高周波回路 設計マニュアル」

Amazonアソシエイトプログラムで報酬がもらえたので参考書を買ってみました。貼ってた甲斐があった(^q^/

もらえたと言っても500円なので、未知の分野のRFについて書かれていて総額で500円程度で厳選して探して購入しました。


3年間で500円というと、時給にすると0.02円×140ぐらいになります。不労所得なのか何かわかりませんが、ありがとうございます。

この本の著者の鈴木雅臣さんは「定本 トランジスタ回路の設計」や「定本 続トランジスタ回路の設計」を記されていて、最近では「回路の素 101」をよく参考にさせていただいています。








知らない分野はわからなくてもまず全部読んでしまえ~、高周波の勉強勉強~と行きたかったのですが、そうは行きませんでした。

復習しようかと思ってもう一度「定本 トランジスタ回路の設計」を読み直してみるかと思って、読み始めると以前はよくわからなかったところがなるほどそういうことかとまじめに読み返すことにしました。

「新・低周波/高周波回路 設計マニュアル」の奥付を見ると


と、「1988年4月30日初版発行」「1997年7月1日11刷」とあるのに非常にきれいで読んだ形跡すらない(^q^;

というわけで「新・低周波/高周波回路 設計マニュアル」は、まだパラ読みしかしてないですが、ありがとうございました。

また、ポチッてください(^q^/


2017年8月26日土曜日

Arduino UnoをSPI Slaveとして使う。

なぜだか分からないが、ArduinoのライブラリはSPIのSlaveに対応していない。I2CはSlaveでも使えるのに何故なんだろう?

今まで素のAVRも含めてSPIのスレーブとして使ったことが無かったので、直接レジスタを叩いてやってみた。

Arduino UnoをSlaveにする



配線図

写真のオフィシャルのArduino Uno Rev3(緑色)をMaster、aitendoのびんぼうでいーの(黄土色)をSlaveとして使っている。

SPIの信号線の間にブレッドボードを入れているのはオシロで測定しやすくするためで、必要がなければArduinoのPin同士を直結した方がいい。以前mbedでSPIの接続を悪条件にしてテストした時エラーが多発した。(参考「Nucleo(mbed OS5)のSPI通信を検証してみる。」)

動作としては、Masterから1ビットずつシフトした8bit値をSlaveに送り(MOSI)、Slaveは受信したデータを8個のLEDに表示する。LEDは流れるように点灯する。

Slaveは1づつインクリメントした8bit値をMasterに送り(MISO)、Master側は受信したデータをSerialで出力する。←Arduino IDEのシリアルモニタでMasterが受信したデータを表示できる。

※Arduinoを2個使うとArduino IDEで操るのがそこそこややこしいです(^q^;

Masterのスケッチ
SPI_Master_LEDx8.ino

#include <SPI.h>
#define SPI_CS_PIN  (10)

uint8_t cnt = 1;

void setup()
{
  Serial.begin(9600);
  Serial.println("SPI_Master_LEDx8 Test");
  
  pinMode(SPI_CS_PIN, OUTPUT);
  digitalWrite(SPI_CS_PIN, HIGH);
  
  SPI.begin();
}

void loop()
{
  digitalWrite(SPI_CS_PIN, LOW);
  uint8_t rdata = SPI.transfer(1 << cnt);
  digitalWrite(SPI_CS_PIN, HIGH);

  cnt++;
  if (cnt > 8) {
    cnt = 0;
  }

  Serial.println(rdata);
  
  delay(100);  
}

Master側のSPIの設定はデフォルトで、Clock:4MHz、MSB First、Mode:0になる。

Slaveのスケッチ
SPI_Slave_LEDx8

volatile uint8_t sdata = 0;

void setup()
{
  // LEDs output
  DDRD = 0xFF;
  PORTD = 0xFF;
  _delay_ms(100);

  // LEDs check
  for (int i = 0; i < 8; i++) {
    PORTD = 1 << i;
    _delay_ms(100);
  }
  PORTD = 0x00;

  // SPI slave
  DDRB = 0x10;  // MISO(PB4)をoutputに設定

  // SPCRのビット設定
  // SPI有効:1 | SPI割り込み有効:1 | MSBから送信:0 | スレーブ:0
  // クロック極性:0 | クロック位相:0 | SPR1:0 | SPR0:0
  SPCR = (1 << SPIE) | (1 << SPE);
}

ISR (SPI_STC_vect)
{
  // 受信データをLEDに出力
  PORTD = SPDR;

  // 次に送信するデータをセット
  SPDR = sdata;
  sdata++;
}

void loop()
{
}

Slave側のスケッチは、まぎれが無いように基本的にArduinoの関数は使っていない。

「//LED check」の部分は、起動時に接続しているLEDを順番に全点灯して配線ミスがないか確認できるようにしている。

ATMega328PのハードウェアSPIは

SCK: PB5 (D13)
MISO: PB4 (D12)
MOSI: PB3 (D11)
CS(SS): PB2 (D10)

を使うようになっていて、Slaveの場合MISOだけはPinの機能をOUTPUTに指定する必要があるので、

  // SPI slave
  DDRB = 0x10;  // MISO(PB4)をoutputに設定

としている。

「ISR (SPI_STC_vect){}」は割り込みハンドラで、SPCRレジスタのSPIEビットを1に設定すると、SPI通信が完了したときに呼び出されるようになる。

SlaveからMasterに送信するデータはSPDRレジスタに設定すればよく、「ISR (SPI_STC_vect){}」内で、受信データをSPDRレジスタから読み出した後、SPDRに書き込んでいる。このデータは、次回SPI通信が行われたときにMISOから出力されてMasterに送信される。

SPI通信は割り込みで処理しているので、メインループの「loop()」では何もしていない。

SPI通信の状態


MOSI

ch1:MOSI ch2:SCK

SPIクロックは4MHz

MISO

ch1:MISO ch2:SCK

ATMega88VをSlaveにする



同じことをATMega328Pとピン互換で、安価なATMega88Vでもやってみた。

配線図

配線図ではatemega168となっているが、実際はATMega88Vを使って内蔵RC/8MHzで動作させている。

Fuse Bit
hFuse: DFh
lFuse: A2h (動作確認のためPB0からクロック出力)
eHuze: 01h

Slave(ATMega88V)のソースコード

Atmel Studio7 (Version: 7.0.1417)でビルド

/*
 * SPI_Slave_LEDx8.c
 *
 * Created: 2017/08/26 9:16:53
 * Author : gizmo
 */

#define F_CPU   (8000000UL)

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile uint8_t sdata = 0;

ISR (SPI_STC_vect)
{
    // 受信データをLEDに出力
    PORTD = SPDR;
    
    // 次に送信するデータをセット
    SPDR = sdata;
    sdata++;
}

int main(void)
{
    // LEDs output
    DDRD = 0xFF;
    PORTD = 0xFF;
    _delay_ms(100);

    // LEDs check
    for (int i = 0; i < 8; i++) {
        PORTD = 1 << i;
        _delay_ms(100);
    }
    PORTD = 0x00;

    // SPI slave
    DDRB = 0x10;  // MISO(PB4)をoutputに設定

    // SPCRのビット設定
    // SPI有効:1 | SPI割り込み有効:1 | MSBから送信:0 | スレーブ:0
    // クロック極性:0 | クロック位相:0 | SPR1:0 | SPR0:0
    SPCR = (1 << SPIE) | (1 << SPE);

    sei();  // 割り込み許可
    
    while (1)
    {
    }
}

基本的にはArduinoのスケッチと同じだが、ハマってしまった点。

#include <interrupt.h>

これを指定しなくても、Atmel Studio 7ではWarningは出るがBuild出来てしまう。「int ISR (SPI_STC_vect){}」という普通の関数と解釈してコンパイルしてしまうからだろう。プログラムの中で「ISR()」は呼び出されていないのでリンクも出来てしまう。

sei();

Arduinoでは(全体の)割り込みはデフォルトで許可されているが、素のAVRのプログラムでは明示的にsei()を呼び出して、割り込みを有効化しないとダメ。

またSPIクロックも問題があって、Arduino同士で使ったMasterのスケッチではLEDの点灯動作がおかしくなった。

SlaveはATMega88Vを8MHz駆動させていて、SPIクロックの最大周波数はマスタークロックの1/2なので、Masterが送ってくるSPIクロックが4MHzだと処理が追いつかないんだと思う。

SPIクロックを1MHzにしたMasterのスケッチ

#include <SPI.h>
#define SPI_CS_PIN  (10)

uint8_t cnt = 1;

void setup()
{
  Serial.begin(9600);
  Serial.println("SPI_Master_LEDx8 Test");

  pinMode(SPI_CS_PIN, OUTPUT);
  digitalWrite(SPI_CS_PIN, HIGH);

  SPI.begin();
}

void loop()
{
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  digitalWrite(SPI_CS_PIN, LOW);
  uint8_t rdata = SPI.transfer(1 << cnt);
  digitalWrite(SPI_CS_PIN, HIGH);
  SPI.endTransaction();

  cnt++;
  if (cnt > 8) {
    cnt = 0;
  }

  Serial.println(rdata);

  delay(100);
}

どこが違うかというと、

  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));

として、SPIクロックを1MHzにしている点。SPI.beginTransaction()しているので、SPI通信の終了時にSPI.endtransmission()している。

SPIの通信状態


MOSI

ch1:MOSI ch2:SCK

SPIクロックは1MHz

MISO

ch1:MISO ch2:SCK

Github:
https://github.com/ryood/Arduino_SPI_Slave

2017年8月24日木曜日

Dual OTA VCA 基板設計

回路図

基板図

部品並べ

今回は、ICの下の隙間にV+のラインとV-のラインを通してGND線は外側に巡らすようにしてみた。

まだもう少し配線の手間を減らせるように粘れるかもしれないが、デバイスの配置と配線の具合が絡んでいて、どっちがはんだ付けが楽かなど悩みだすとキリがない。

こういう正解があるのかないのかわからないけど、ゴールはある程度決まっている問題はAIの方がつようそうなんだが。

ちまちま配線を考えるのも楽しいと言えば楽しいし、ユニバーサル基板のはんだ付けの脳内シミュレーションになるので、これはこれでいいのかもしれない。

ぼちぼちはんだ付けしていきます。

2017年8月21日月曜日

10uF 電解コンデンサ比較

ACカップリングで使いそうな10uFの電解コンデンサをDER EE/DE-5000で比較してみた。


左から

Panasonic Mシリーズ 10uF 50V 85℃
普及品

Nichicon Muse ES BP 50V 85℃
両極タイプ

Nichicon Muse FG 50V 85℃
オーディオグレード

Capacitance(uF)


Frequency Pana BP FG
100 9.933 10.365 9.187
120 9.891 10.327 9.143
1000 9.272 9.953 8.636
10000 8.586 9.608 8.003
100000 6.45 6.64 6.22


Tan D


Frequency Pana BP FG
100 0.037 0.028 0.031
120 0.041 0.028 0.035
1000 0.095 0.043 0.093
10000 0.504 0.221 0.493
100000 3.41 1.44 3.5


ESR(Ω)


Frequency Pana BP FG
100 6 4.3 5.5
120 5.5 3.7 5.1
1000 1.63 0.69 1.71
10000 0.93 0.36 0.98
100000 0.84 0.34 0.89


パナソニックの普及タイプとニチコンのオーディオグレードで大差ない結果となった。LCRメータで測れる以外の違いはあるかもしれない。

両極タイプはなんとなく特性が悪いんでは?と思っていたがそうでもなく、むしろオーディオグレードのFGより良い結果。

Nichicon ESの50V品は外形がでかいが、25V品ならサイズはNichicon FGと同じのようで、値段もES(25V)が15円@秋月、FG(50V)が10円@秋月なので、両極の電位があやふやなときは積極的に使ったほうがいいかもしれない。

両極タイプのESは、LCRメータの+と-を入れ替えて測定しようと思ったが、一瞬のすきにどっちがどっちかわからなくなり、入れ替えながら見てみても測定誤差ぐらいの違いしか無かったので測っていない(^q^;

2017年8月20日日曜日

Dual OTA VCA 2chでテスト


※2chでテストと言っても2ch(掲示板)でテストしたわけではないです。

回路図

ブレッドボード配線図

ブレッドボード配線図の通りAとBの入力をつないで、音声波形、エンベロープ波形とも同じ波形を入力した。

入力インピーダンス10kΩ程度の電圧入力なのでこういうことをしてもほぼほぼ問題ないと思う。

電源電圧 +5.0V / -4.97V

音声入力: PCM5102Aファンクションジェネレータ(100Hz/Sine 両電源波形)
エンベロープ入力: Nucleo F446の内蔵DACからの出力(4Hz/Saw/+3.3p-p 片電源波形)

出力

ch1:OUTPUT B ch2:OUTPUT A

トリムPOTをまわして、AとBでLPFのかかり方や入力レベルを変えている。

入力

ch1:音声入力 ch2:エンベロープ入力

音声入力に単電源波形を入れてみる


音声入力の方はACカップリングして、単電源波形を入れても動作するようにしている。AD9833_FGで単電源波形のSIN波を生成して入力してみた。


ch1:音声入力A ch2:出力A

NJM13600のBIAS入力の電流はどこに向かって流れるか?


データシートに載っている等価回路



左下のAMP BIAS INPUTがBIAS入力で、Tr2のベース・エミッタ間の電圧降下が約0.6V、D1(またはTr1、Tr3のベース・エミッタ間)の電圧降下が約0.6Vで[V-]に向かって流れるようだ。

したがって、AMP BIAS INPUTの電位は[V-]+1.2V程度になると思う。

前回、AMP BIAS INPUTの電位を測定した。


ch1の縦軸は200mV/Divで22.0divシフトしているので、中央が-4.4V。電位は中央からマス目2個半~3個(500mV~600mV)ぐらい上なので、約-3.9V~-3.8V程度。

電源電圧は+5V/-4.97Vだったので、[V-]は-4.97V。

[V-] + 1.2V = -4.97V + 1.2V = -3.74V

なのでこれぐらいの電位になっているんだと思う。

つまり、AMP BIAS INに入力した電流は、ダイオード2個分を挟んで[V-]に向かって流れていることになる。

2017年8月18日金曜日

Dual OTA VCA 1chのみでテスト

OPAMP+PNP TrのV→I変換のテストが少し変だったので、もう一度、自作の可変電流源ユニットをNJM13600につないで実験してみた。

可変電流源ユニットでテスト


Nucleo F446の内蔵DACからノコギリ波を出力し、10kΩの負荷抵抗をつないで出力レベルを調整。

mbed Repository:
https://developer.mbed.org/users/ryood/code/Nucleo_AnalogOut_SawWave/


ch2:可変電流源ユニットの出力電圧

776.0mVp-p / 10kΩ = 77.6uAp-p

NJM13600に接続



ブレッドボード図

電源電圧: +5.00V / -4.97V


ch1:Wave入力 ch2:Wave出力

660.0mVp-pのサイン波を入力して、2.060Vp-pの振幅変調された波形が出力されている。


ch1:可変電流源ユニットに入力したエンベロープ波形 ch2:Wave出力

ch1はNucleo F446からの出力で、可変電流源ユニットでレベル調整後、電圧→電流変換している。可変電流源ユニットの出力電流は上の通り77.6uAp-p。


ch1:NJM13600のPin1(AMP BIAS INPUT A)の電位 ch2:Wave出力

NJM13600のAMP BIAS INPUTは電流入力なので電位の波形は歪になっている。

OPAMP+PNP Trの電圧→電流回路でテスト


回路図


OPAMP+PNP Trの電圧→電流回路のみで、Nucleo F446の内蔵DACからノコギリ波を出力し、10kΩの負荷抵抗をつないで出力レベルを調整。

ブレッドボード図

負荷をPNP Tr(T1)とGNDの間に入れた場合

ch1:エンベロープの入力電圧 ch2:ブレッドボード図のVOUTの電位

332mVp-p / 10kΩ = 33.2uAp-p

T1のコレクタより、GNDの方が電位が高いので反転した波形になっている。

負荷をPNP Tr(T1)とVEEの間に入れた場合

ch1:エンベロープの入力電圧 ch2:ブレッドボード図のVOUTの電位

GNDから見た電位。下がVEE(約-5V)からの波形になっている。

NJM13600に接続



ブレッドボード図

電源電圧: +5.00V / -4.97V


ch1:Wave入力 ch2:Wave出力

660.0mVp-pのサイン波を入力して、1.940Vp-pの振幅変調された波形が出力されている。


ch1:電圧→電流変換回路に入力したエンベロープ波形 ch2:Wave出力


ch1:レベル調整、LPFフィルタ回路通過後のエンベロープ波形 ch2:Wave出力

電圧→電流変換直前の電圧波形で、888mVp-pになっている。LPFはR8の抵抗値を最小にして効かないようにしている。


ch1:NJM13600のPin1(AMP BIAS INPUT A)の電位 ch2:ch2:Wave出力

エンベロープにLPFを効かせる

ch1:レベル調整、LPFフィルタ回路通過後のエンベロープ波形 ch2:Wave出力

R8の抵抗値を中位にした。振幅変調がなめらかになっている。

メモ:


電源電圧は±3V程度から動作するようだ。

電圧→電流変換の比率をもう少し大きくし(現状だとI=V/10,000)、入力のトリマで減衰させるようにしたほうがいいか?