秋月で売られているリモコンでとりあえず動作する(完璧では有りませんが)プログラムをでっち上げました。
ゴミが含まれて居ますが取り合えず使えそうです。
リモコンのVOL+を押すとゲインが1dB上がり、押し続けると連続してゲインが最大0dBまで上がります。VOL-を押すとこの逆の動作をします。VOL+とVOL-の間にある>||を押すとMUTEになります。
それ以外のボタンを押す(押し続けると)と一桁目が変化します。例えば 表示が-72dBなら-71dB、-72dBを繰り返します。関係ないボタンをしても何の影響も受けないようにしたいと思いいろいろ考えてみましたが、どうもうまく行かず私にはこの辺が限界です。
回路図も作るつもりですが、さっぱり先へ進みません。リモコン制御が完全でない為、モチベーションが上がりません。
ロータリエンコーダの「rotary.h」はhttp://www.buxtronix.net/2011/10/rotary-encoders-done-properly.htmlを参照しました。
最初はタイマー割り込み、や普通のポートの割り込みを使ったのですが、期待はずれで、Loop()に入れたりしていましたが、今一動きが悪く上記のライブラリを利用しました。
Arduino Sketch
#include //<----これは要らない
#include
#include
#include
#include
//------------- RS E D4 D5 D6 D7 --------------
LiquidCrystal lcd(19,18,17,16,15,14);
volatile int enc_data = 96;
volatile unsigned data_l;
volatile unsigned data_r;
volatile unsigned char vol_p;
volatile unsigned char vol_n;
volatile unsigned char mute;
volatile unsigned long code;
#define ROT_A_PHA 2
#define ROT_B_PHA 3
Rotary r = Rotary(ROT_A_PHA,ROT_B_PHA);
#define VOL_DATA 11
#define VOL_CLOCK 13
#define VOL_LATCH 10
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;
void send_att_mute_value_lch(void)
{
digitalWrite(VOL_LATCH ,LOW);
int data_mute_l;
data_mute_l = 0xff00; //Lch Mute
data_l = data_mute_l;
enc_data = 96;
SPI.transfer16(data_l);
digitalWrite(VOL_LATCH ,HIGH);
}
void send_att_mute_value_rch(void)
{
digitalWrite(VOL_LATCH ,LOW);
int data_mute_r;
data_mute_r = 0xff10;//Rch Mute
data_r = data_mute_r;
enc_data = 96;
SPI.transfer16(data_r);
digitalWrite(VOL_LATCH ,HIGH);
lcd.setCursor(6,1);
lcd.print(" MUTE ");
}
void send_att_0_value_lch(void)
{
digitalWrite(VOL_LATCH ,LOW);
int data_0_l;
data_0_l = 0x0000; //Lch Mute
data_l = data_0_l;
SPI.transfer16(data_l);
digitalWrite(VOL_LATCH ,HIGH);
}
void send_att_0_value_rch(void)
{
digitalWrite(VOL_LATCH ,LOW);
int data_0_r;
data_0_r = 0x0010;//Rch Mute
data_r = data_0_r;
SPI.transfer16(data_r);
digitalWrite(VOL_LATCH ,HIGH);
disp_lcd_0db(enc_data);
}
int load_att_value_lch(int data_l)
{
digitalWrite(VOL_LATCH ,LOW);
SPI.transfer16(data_l);
digitalWrite(VOL_LATCH ,HIGH);
}
int load_att_value_rch(int data_r)
{
digitalWrite(VOL_LATCH ,LOW);
SPI.transfer16(data_r);
digitalWrite(VOL_LATCH ,HIGH);
}
int disp_lcd_0db(int enc_data)
{
lcd.setCursor(5,1) ;
lcd.print(" dB");
lcd.setCursor(8,1) ;
lcd.print(enc_data);
}
int disp_lcd_1_9db(int enc_data)
{
lcd.setCursor(5,1) ;
lcd.print(" - dB");
lcd.setCursor(8,1) ;
lcd.print(enc_data);
}
int disp_lcd_10_94db(int enc_data)
{
lcd.setCursor(5,1) ;
lcd.print(" - dB");
lcd.setCursor(7,1) ;
lcd.print(enc_data);
}
int disp_lcd_10_95db(int enc_data)
{
lcd.setCursor(5,1) ;
lcd.print(" - dB");
lcd.setCursor(7,1) ;
lcd.print(enc_data);
}
int disp_lcd_95db(int enc_data)
{
lcd.setCursor(5,1) ;
lcd.print(" - dB");
lcd.setCursor(7,1) ;
lcd.print(enc_data);
}
void data_inc(void){
enc_data ++; // データーをインクリメント
enc_data = constrain(enc_data, 0, 96);
if(enc_data >=10 & enc_data
data_l += 0x0200;
data_r += 0x0200;
load_att_value_lch(data_l);
load_att_value_rch(data_r);
disp_lcd_10_95db(enc_data);
}
if(enc_data == 96){ //MUTE
send_att_mute_value_lch();
send_att_mute_value_rch();
}
if(enc_data == 0){
data_l += 0x0200;
data_r += 0x0200;
load_att_value_lch(data_l);
load_att_value_rch(data_r);
disp_lcd_0db(enc_data);
}
if (enc_data 0) {
data_l += 0x0200;
data_r += 0x0200;
load_att_value_lch(data_l);
load_att_value_rch(data_r);
disp_lcd_1_9db(enc_data);
}
}
void data_dec(void){
enc_data --; // データーをデクリメント
enc_data = constrain(enc_data, 0, 95);
if(enc_data == 95){
data_l -= 0x4000;
data_r -= 0x4000;
load_att_value_lch(data_l);
load_att_value_rch(data_r);
disp_lcd_95db(enc_data);
}
if(enc_data >=10 & enc_data
data_l -= 0x0200;
data_r -= 0x0200;
load_att_value_lch(data_l);
load_att_value_rch(data_r);
disp_lcd_10_94db(enc_data);
}
if (enc_data 0) {
data_l -= 0x0200;
data_r -= 0x0200;
load_att_value_lch(data_l);
load_att_value_rch(data_r);
disp_lcd_1_9db(enc_data);
}
if(enc_data == 0){
send_att_0_value_lch();
send_att_0_value_rch();
}
}
ISR(PCINT2_vect) {
unsigned char result = r.process();
if(result) {
if(result == DIR_CW)
data_inc();
else
data_dec();
}
}
文字数が規定をオーバーするのでsetup()とloop()はその2へ書きます。
リモコンと赤外線受光器の角度に拠っては誤動作をする場合があります。この辺が面白くない所ですが、、、、。
何しろド素人が作ったプログラムですので動作は保証の限りではありません。