こんなの見~つけた!

Orange Pi

シリーズものでいくつか種類があり、
Orange Pi one (どこかで聞いたことのあるような響き)が、$9.99。
その上位の Orange Pi PC だって $15! ビックリポン!
安いからとあなどるなかれ、4core/1GB/SDcard/LAN … etc
「中華謹製」恐るべし。
LinuxBeanだってサクサク動くかもしれない。
ただ、GUI動かすのはメモリ1GBじゃきつきつそう、せめて2GBあればなぁ~。
処理部分とGUIだけ分離させるっていう手はあるかも。
今じゃあまり聞かないけど、その昔UNIX−WSが高価だったころ流行ったXターミナルっていう奴。知らない?
おもしろそう、欲しいよ~。
オッとイケナイ、いけない。
余分なことは考えず、今は Arduino に集中集中。
うっかりすると、また在庫が増えてしまう。

 

■ NJW1159 de あるで~の

とうとうArduino目的の本丸、電子ボリュームNJW1159と対峙する。

その前にSPIのことをチョットお勉強。
まずは Arduinoで用意されているライブラリの説明を拝見。
http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=531
http://garretlab.web.fc2.com/arduino_reference/libraries/standard_libraries/SPI/
や、ここ<http://www.geocities.jp/zattouka/GarageHouse/micon/SPI/SPI.htm>の内容をひと通り頭に入れて・・・
NJW1159_controlFormat NJW1159_example
[JRCのスペックシートより抜粋]

感覚的には分かった気がするんだが・・・どうもイマイチなにか足らない気がする。頭か?

そんなことを思いつつ、いろいろ徘徊するなか見つけたこれ。決定打!
このサイト
NJW1159の核心、コントロール部分を大公開!“あざ~~す”・・・軽過ぎ!いい歳なんだから丁寧に・・・“ありがとうございます”
実際に動作を確認して「メモメモ」させていただいき、理解に大いに参考にさせてもらった。

どのように動くのかが分かれば、「プッシュボタン」を「ロータリーエンコーダー」へ変更して、LCDでボリューム量を表示させてチョット格好良く。
オマージュ(便利な言葉)していく。
ということで、戦闘開始。

 

■ 割り込み

まずは、ロータリーエンコーダーの値取得。
「時計回り/反時計回りの回転値の取得」を理解するのにとっても苦労した。
ググって見つけたどのサイトでも同じようなことが書かれているのだろうが、ニュアンスのせいだろう、その判定の仕方がどこか微妙に異なり、だんだん頭がこんがらがってくる。
結局、ロータリーエンコーダーの両ピンの一つ前の値と今取得した値で、時計回り/反時計回りを判断できることが分かった。
これだけのことでそれだけの日数を費やしたことか・・・・頭悪いな~~まったく。
しかしまたひとつ大きな収穫だ。

うまく値が取れるようになったら、それをどう実装してNJW1159へ渡すかだ。

考えたのは一般的な発想でロータリーエンコーダー入力を割り込みで処理したらどうだろうかと。
ボリュームが他の処理より優先して処理された方がよさそうだという理由。

ロータリーエンコーダーの値が変化したときに下記ルーチンを実行。
NJW1159の部分はまんまデスな。

void update(){

noInterrupts();

int MSB = digitalRead(encoderPin1);
int LSB = digitalRead(encoderPin2);

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

if(status == 0b1101 || status == 0b0100 || status == 0b0010 || status == 0b1011) encoderValue ++;
if(status == 0b1110 || status == 0b0111 || status == 0b0001 || status == 0b1000) encoderValue –;

prevEncoded = encoded;

encoderValue = constrain(encoderValue,0,128);

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

interrupts();
}

Arduino IDE の命令セットを勉強しながら、ようやくここまで組んでみたのだが、苦労した割に実が薄い。
ロータリーエンコーダーを廻すたびにノイズがつきまとう。
delay(50) を短くしても長くしてもダメ!
update()の中身を、1159の更新部分だけにしてもダメ。

あれこれコードを変更して、いろいろ試行錯誤したが徒労に終わった。
結果、割り込みでは処理ができないという結論に至った。

ロータリーエンコーダーのクリックノイズ以外に、シリアルポートへの表示にもノイズが発生。
シリアルポートとの関連も疑い、最終的にデバッグ用のserialWrite()はすべてコメントしたが、クリックノイズだけは消えることはなかった。

割り込みをしていないプッシュボタンのオリジナルコードではクリックノイズが無かったから、原因は割り込み処理かロータリーエンコーダーなんだろう。

 

■ メインルーチン

割り込みを止め。そこで処理していた部分をゴッソリ、メインルーチンへ移動。

メインルーチンがスカスカで割り込みにする理由が今のところないことに気付いた。いまごろ~~~。

割り込み時に発生していた、クリックノイズはだいぶ静かになった。でもまだ残っている。
同じように処理しているだけなのに何が違うんだろう。

チョット整理して。
クリックノイズの原因は・・・・
1)NJW1159への書き込みの時だけ発生。
2)クリックのたびに電源電圧に変動があるかも。
3)チャタリング?
思い当たるのはこれくらい。

1)は、音量絞込みの際、途中からクリック音が聞こえなくなる。調べてみると-95dB~-110dB の間、ビット値を書き込んでも対応する値がない。
考えられるのは、その間のデータは NJW1159がハネていること。だとしたら書き込んでいない可能性がある。
もし、書き込み時に発生しているのであればロータリーエンコーダーのノイズでは無くなる。
NJW1159がらみだとしたら厄介だな~、初めてのチップだからよく解らない。
また、試行錯誤か・・・・

2)は、ブレッドボードなのでチョチョイと、arduino側(デジタル部分)の電源に大きめのコンデンサを配備。
安易な発想だったかもしれないがイヤイヤどうして、効果があったみたいで、より低くなった。
それでも・・・“チチチ”と小さい音が出る。
両チャネルではないところが怪しい。
現在のところLch の方が大きい。
電源じゃないのか?電源はタマタマか!

3)の心配はないかも。くるくる回しても不自然な急な数値の上下は発生していないので未対処。
ただ早く廻すとむしろ処理が追いつかず、音量の上下が緩慢になるので読み飛ばしが発生している模様。

所詮、ブレッドボード。
何があってもおかしくない。ノイズの原因はブレッドボードかも。

そして実は、上記コードにはバグがある。
ボリュームを最小にしても、音が出ているのだ。

最初は、ブレッドボードなテスト環境なので配線時のクロストークが原因だと思って、あれこれ配線をキレイにやり直したり。
ばらして、最初から組み立てなおしてみたり、いろいろやったがどうも直らない。
こんなものなのかな~とNJW1159に疑いの目を向ける。
そんなの製品にするわけないしな。何かあるんだろう。何だろう???
スペックシートでは、絞切りは -95dB。ミュートレべルなら -110dB。
こんな大きく聴こえる分けないよな。

クリックノイズが先か、これが先か。

このあとLCDを繋ぐことを考えると、またいろいろ出てくるだろうなぁ。

フゥ。覚悟して掛からなきゃ。









Comments are closed.