■ ピンがイッパイ!

ノイズが入るserialコンソールは使えないから、やっぱり値の確認のためLCDは取り付けないと。
まぁ、先の作業でLCDは確認済なのでお気楽だ。

さてさて、LCDの12本のピンを順番に・・・・・・おっ! 11,12 がSPIとバッティングしている。
ロータリーエンコーダーで使っているピン・・・・・2, 3 もだ!

大丈夫です、安心してください!他が空いてますよ!
てな感じで、11、12 を 6、7 へ移動。
LiquidCrystal lcd(12, 11, 5, 4, 3, 2) -> LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

2、3は何処へ?
ピン8, 9 が空いているけど、ロータリーエンコーダーを アナログピン A0, A1 へ移動。
よってLCDの ピン2, 3 はそのまま。
A0, A1のPULLUPを忘れずに。

こんな感じて動作確認。
テストなのでALL電池で動かしている。
test-njw1159_LCD
Arduino_LCD_SPI

そして以下、ここまでのフルソースコード。
NJW1159を試したいという方の参考になるとうれしい。(※)
絞りきった状態でも音が出る件も解決させてある。
あまりのボケさに恥ずかしいので説明は伏せるけど以下のコードを読んで理解してくだされ。

#include <LiquidCrystal.h>
#include <SPI.h>
/*
NJW1159 | arduino
CLOCK(14 | 13
DATA (13 | 11
LACTH(15 | 10
* pin12(MISO) reserved by SPI lib.

Rotary Encoder
1-A | A0
2-G | GND
3-B | A1
* PULLUP

Speaker Protector (to do)
ON delay / V protect / OFF cut
Pin 9
LOW -> HIGH | ON delay
HIGH -> LOW | protect & OFF
*/

//RAM
volatile int prevEncoded = 0;
volatile int encoderValue = 0;
volatile int oldEncoderValue = 0;

int encoderPin1 = A0;
int encoderPin2 = A1;

int maxVolumeValue = 127;

int MSB = 0;
int LSB = 0;
int encoded = 0;
int status = 0;

const char* fewattz = “fewattz”;
const char* vMax = “Volume Max”;
const char* vMute = “Volume Mute”;
const char* Max = “Max “;
const char* Mute = “Mute “;
const char* dB = “dB “;
const char* Minus = “-“;

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup(){

lcd.begin(16, 2);
lcd.setCursor(4, 0);
lcd.print(F(“fewattz”));
lcd.setCursor(4, 1);
lcd.print(F(“starting”));
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV8);
SPI.setDataMode(SPI_MODE2);

pinMode(encoderPin1, INPUT_PULLUP);
pinMode(encoderPin2, INPUT_PULLUP);

encoderValue = maxVolumeValue; //Mute
write1159();

delay(3000) ;

oldEncoderValue = encoderValue;
lcd.setCursor(0, 1);
lcd.print(vMute);
}
void loop(){

int result = 0;

// Rotary Encoder
MSB = digitalRead(encoderPin1);
LSB = digitalRead(encoderPin2);

encoded = (MSB << 1) |LSB;
status = (prevEncoded << 2) | encoded;

if(status == 0b1101 || status == 0b0100 || status == 0b0010 || status == 0b1011) result = 1; //CCW
if(status == 0b1110 || status == 0b0111 || status == 0b0001 || status == 0b1000) result = -1; //CW

prevEncoded = encoded; //store this value for next time

if(result != 0){
encoderValue += result;
encoderValue = constrain(encoderValue,0,maxVolumeValue);
if( encoderValue != oldEncoderValue){
lcd.setCursor(8, 1);

if(encoderValue == 0){
lcd.print(Max);
}else if(encoderValue == maxVolumeValue){
lcd.print(Mute);
}else{
lcd.print(Minus);
lcd.print(encoderValue);
lcd.print(dB);
}

oldEncoderValue = encoderValue;
write1159();
}
}

}

void write1159(){
int vrValue = encoderValue;
vrValue = (vrValue << 1) | 0;

digitalWrite(10,LOW); //左側ボリューム
SPI.transfer(vrValue);
SPI.transfer(B00010000);
digitalWrite(10,HIGH);
delay(10);
digitalWrite(10,LOW); //右側ボリューム
SPI.transfer(vrValue);
SPI.transfer(B00000000);
digitalWrite(10,HIGH);
delay(10);
}

※著作権はfewattzに帰属します。
無断掲載は禁止とさせていただきます。
本コードの使用は自己責任です。
使用において発生したいかなる損害にも一切補償しません。

 

■ 聴いてみよう!

ひとまず、テスト環境のCDプレーヤーとポタアンを、現環境に差し替えて・・・・

LinuxBean → リハビリDAC(USB) → NJW1159 → 現アンプ → スピーカ

スピーカーからお気に入りの楽曲が流れ出す。

おぉ!かなりイイ。
全体的にバランスが良く、音のひとつひとつがハッキリ、クリアだ。
定位もよく、低域の締まり良く鳴っている。
これまでのDS1882とは対照的。
DS1882はどちらかといえば力強く音楽が“オレが、オレが”と張り出てくる感じ。
比べてNJW1159は日本的といえる音作り。繊細で色づけがない。
“個性がない”と言う方もいるかもしれないが、なんにでも合わせられるところがイイ所。
むしろ音楽ソースそのものが橋渡しされている気がして安心感がある。

お次は、ヘッドホンでと。
あっれ~~?
ホワイトノイズがある。テスト環境では無かったんだけど・・・
さっそく原因箇所の切り分け。
1)リハビリDACを外してみる・・・・変わらない。
2)Arduino の電源を切ってみる。(NJW1159のみON)・・・・変わらない
だとするとどうやら犯人はお前、NJW1159。
え~~~?うそだろ~~~~。
スペックシートではノイズレベルは -105dB。聞こえる筈ないんだけど~
ウ~~~~ン。なぜだろう。
テスト環境に戻してみる・・・・・ホワイトノイズは聞こえない。
あれ~~~?
・・・・・
・・・・
・・・
・・

テスト環境のポタアンがヘタレだから聞こえないのかな?
ならば、Class-AA-sub を引っ張り出してきて・・・・・
元々のメカニカルVRをフルにして・・・・
パワーオン!
ホワイトノイズ・・・・無~~い~~~!
・・・
・・

え~~~?現アンプか~~~。
でもNJW1159を外して、リハビリDACを直結では、The静寂なんだけど。
相性で片付けるのはシャクだなぁ
原因は何だろう。

NJW1159は入出力のインピーダンスが高いようだからその辺かな?
現アンプは、今だバラック配線だからその辺も影響してるかも。
こちらはチョット整理して仕切りなおそう。

Class-AA-subではホワイトノイズもなくいつも通り安心して鳴っているので、しばらくはこちらで視聴。
こちらのアンプはゲインが低いからヘッドホンでもだいぶボリュームを上げないといけない。

ん?・・・ゲインが低くてホワイトノイズが聞こえないだけ?

そんなオチかぁ?

Comments are closed.