R2S15902FP Arduino Library with Basic Arduino Code

April 09, 2023
R2S15902FP Arduino Library with Basic Arduino Code - Daacwaves

In this article I have explained a R2S15902FP Arduino library and basic Arduino code for testing. Included all features of the R2S15902FP in this library and included the circuit diagram and PCB design for testing. You can build best 5.1 surround sound system with these.

R2S15902FP is best 5.1 audio converter and 6 channel volume controller IC. You can build better quality 5.1 amplifier with this IC.

Features

  • Input gain control
  • 6 channels independent volume control
  • 6 channels independent gain control
  • Tone control: Bass and Treble
  • L/R channel 4 input selector
  • Multi channel input: 6 channels input

If you need more about the R2S15902FP, Please check the datasheet. I have attached end of this article.

Hardware

R2S15902FP is a SMD component. It can't connect to the breadboard for testing. So I have created a PCB design for testing. You can make the testing board with this. I have attached all files end of this article. In the Microcontroller section I am using the Arduino UNO board, Check the circuit diagram below.

R2S15902FP circuit diagram
R2S15902FP controller circuit diagram
R2S15902FP PCD design

Programming

After completing the hardware section successfully, then start the programming. First of all, create the library files and put into the Arduino's library folder in your PC. Its have two files for the library. Check the library code below.

R2S15902FP.h
Copy
#ifndef R2S15902FP_h
#define R2S15902FP_h

#include "Arduino.h"

class R2S15902FP {
  public:
    R2S15902FP(int data, int clk);
    void slot1(int in, int rec_out, int rec_gain, int att, int lr_in, int bass, int treble, int sl_sr_c_sw_in, int in_gain);
    void slot2(int lch_gain, int lch_vol, int rch_gain, int rch_vol);
    void slot3(int cch_gain, int cch_vol, int swch_gain, int swch_vol);
    void slot4(int slch_gain, int slch_vol, int srch_gain, int srch_vol);
  private:
    int _data;
    int _clk;
};

#endif
R2S15902FP.cpp
Copy
#include "Arduino.h"
#include "R2S15902FP.h"

//Data
bool in_data[5][3]={{0,0,0},{0,1,0},{1,0,0},{1,1,0},{0,0,1}}; // Input Selector
bool rec_gain_data[4][2]={{0,0},{0,1},{1,0},{1,1}}; // REC-Output Gain Control
bool att_data[4][2]={{0,0},{0,1},{1,0},{1,1}}; // ADC Input ATT
bool tone_data[15][4]={{0,1,1,1},{0,1,1,0},{0,1,0,1},{0,1,0,0},{0,0,1,1},{0,0,1,0},{0,0,0,1},{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}}; // Bass/Treble
bool gain_data[8][3]={{0,0,0},{0,0,1},{0,1,0},{0,1,1},{1,0,0},{1,0,1},{1,1,0},{1,1,1}}; // Gain Control
bool ch_vol_data[100][7]  ={{1,1,0,0,0,1,1},{1,1,0,0,0,1,0},{1,1,0,0,0,0,1},{1,1,0,0,0,0,0},{1,0,1,1,1,1,1},{1,0,1,1,1,1,0},{1,0,1,1,1,0,1},{1,0,1,1,1,0,0},{1,0,1,1,0,1,1},{1,0,1,1,0,1,0},{1,0,1,1,0,0,1},{1,0,1,1,0,0,0},{1,0,1,0,1,1,1},{1,0,1,0,1,1,0},{1,0,1,0,1,0,1},{1,0,1,0,1,0,0},{1,0,1,0,0,1,1},{1,0,1,0,0,1,0},{1,0,1,0,0,0,1},{1,0,1,0,0,0,0},{1,0,0,1,1,1,1},{1,0,0,1,1,1,0},{1,0,0,1,1,0,1},{1,0,0,1,1,0,0},{1,0,0,1,0,1,1},{1,0,0,1,0,1,0},{1,0,0,1,0,0,1},{1,0,0,1,0,0,0},{1,0,0,0,1,1,1},{1,0,0,0,1,1,0},{1,0,0,0,1,0,1},{1,0,0,0,1,0,0},{1,0,0,0,0,1,1},{1,0,0,0,0,1,0},{1,0,0,0,0,0,1},{1,0,0,0,0,0,0},{0,1,1,1,1,1,1},{0,1,1,1,1,1,0},{0,1,1,1,1,0,1},{0,1,1,1,1,0,0},{0,1,1,1,0,1,1},{0,1,1,1,0,1,0},{0,1,1,1,0,0,1},{0,1,1,1,0,0,0},{0,1,1,0,1,1,1},{0,1,1,0,1,1,0},{0,1,1,0,1,0,1},{0,1,1,0,1,0,0},{0,1,1,0,0,1,1},{0,1,1,0,0,1,0},{0,1,1,0,0,0,1},{0,1,1,0,0,0,0},{0,1,0,1,1,1,1},{0,1,0,1,1,1,0},{0,1,0,1,1,0,1},{0,1,0,1,1,0,0},{0,1,0,1,0,1,1},{0,1,0,1,0,1,0},{0,1,0,1,0,0,1},{0,1,0,1,0,0,0},{0,1,0,0,1,1,1},{0,1,0,0,1,1,0},{0,1,0,0,1,0,1},{0,1,0,0,1,0,0},{0,1,0,0,0,1,1},{0,1,0,0,0,1,0},{0,1,0,0,0,0,1},{0,1,0,0,0,0,0},{0,0,1,1,1,1,1},{0,0,1,1,1,1,0},{0,0,1,1,1,0,1},{0,0,1,1,1,0,0},{0,0,1,1,0,1,1},{0,0,1,1,0,1,0},{0,0,1,1,0,0,1},{0,0,1,1,0,0,0},{0,0,1,0,1,1,1},{0,0,1,0,1,1,0},{0,0,1,0,1,0,1},{0,0,1,0,1,0,0},{0,0,1,0,0,1,1},{0,0,1,0,0,1,0},{0,0,1,0,0,0,1},{0,0,1,0,0,0,0},{0,0,0,1,1,1,1},{0,0,0,1,1,1,0},{0,0,0,1,1,0,1},{0,0,0,1,1,0,0},{0,0,0,1,0,1,1},{0,0,0,1,0,1,0},{0,0,0,1,0,0,1},{0,0,0,1,0,0,0},{0,0,0,0,1,1,1},{0,0,0,0,1,1,0},{0,0,0,0,1,0,1},{0,0,0,0,1,0,0},{0,0,0,0,0,1,1},{0,0,0,0,0,1,0},{0,0,0,0,0,0,1},{0,0,0,0,0,0,0}}; // Channels Volume

R2S15902FP::R2S15902FP(int data, int clk) {
  pinMode(data, OUTPUT);
  pinMode(clk, OUTPUT);
  _data = data;
  _clk = clk;
}

void R2S15902FP::slot1(int in, int rec_out, int rec_gain, int att, int lr_in, int bass, int treble, int sl_sr_c_sw_in, int in_gain) {

  // D0a - D2a
  for (int i = 0; i < 3; i++) {
    digitalWrite(_data, in_data[in][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D3a
  digitalWrite(_data, rec_out);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D4a - D5a
  for (int i = 0; i < 2; i++) {
    digitalWrite(_data, rec_gain_data[rec_gain][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D6a - D7a
  for (int i = 0; i < 2; i++) {
    digitalWrite(_data, att_data[att][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D8a
  digitalWrite(_data, lr_in);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D9a - D12a
  for (int i = 0; i < 4; i++) {
    digitalWrite(_data, tone_data[bass][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D13a - D16a
  for (int i = 0; i < 4; i++) {
    digitalWrite(_data, tone_data[treble][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D17a
  digitalWrite(_data, sl_sr_c_sw_in);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D18a - D20a
  for (int i = 0; i < 3; i++) {
    digitalWrite(_data, gain_data[in_gain][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D21a
  digitalWrite(_data, LOW);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D22a
  digitalWrite(_data, LOW);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D23a
  digitalWrite(_data, LOW);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, HIGH);
  digitalWrite(_clk, LOW);
  digitalWrite(_data, LOW);
}

void R2S15902FP::slot2(int lch_gain, int lch_vol, int rch_gain, int rch_vol) {

  // D0b - D2b
  for (int i = 0; i < 3; i++) {
    digitalWrite(_data, gain_data[lch_gain][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D3b - D9b
  for (int i = 0; i < 7; i++) {
    digitalWrite(_data, ch_vol_data[lch_vol][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D10b - D12b
  for (int i = 0; i < 3; i++) {
    digitalWrite(_data, gain_data[rch_gain][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D13b - D19b
  for (int i = 0; i < 7; i++) {
    digitalWrite(_data, ch_vol_data[rch_vol][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D20b
  digitalWrite(_data, LOW);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D21b
  digitalWrite(_data, LOW);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D22b
  digitalWrite(_data, LOW);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D23b
  digitalWrite(_data, HIGH);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, HIGH);
  digitalWrite(_clk, LOW);
  digitalWrite(_data, LOW);
}

void R2S15902FP::slot3(int cch_gain, int cch_vol, int swch_gain, int swch_vol) {

  // D0c - D2c
  for (int i = 0; i < 3; i++) {
    digitalWrite(_data, gain_data[cch_gain][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D3c - D9c
  for (int i = 0; i < 7; i++) {
    digitalWrite(_data, ch_vol_data[cch_vol][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D10c - D12c
  for (int i = 0; i < 3; i++) {
    digitalWrite(_data, gain_data[swch_gain][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D13c - D19c
  for (int i = 0; i < 7; i++) {
    digitalWrite(_data, ch_vol_data[swch_vol][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D20c
  digitalWrite(_data, LOW);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D21c
  digitalWrite(_data, LOW);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D22c
  digitalWrite(_data, HIGH);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D23c
  digitalWrite(_data, LOW);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, HIGH);
  digitalWrite(_clk, LOW);
  digitalWrite(_data, LOW);
}

void R2S15902FP::slot4(int slch_gain, int slch_vol, int srch_gain, int srch_vol) {

  // D0d - D2d
  for (int i = 0; i < 3; i++) {
    digitalWrite(_data, gain_data[slch_gain][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D3d - D9d
  for (int i = 0; i < 7; i++) {
    digitalWrite(_data, ch_vol_data[slch_vol][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D10d - D12d
  for (int i = 0; i < 3; i++) {
    digitalWrite(_data, gain_data[srch_gain][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D13d - D19d
  for (int i = 0; i < 7; i++) {
    digitalWrite(_data, ch_vol_data[srch_vol][i]);
    digitalWrite(_clk, HIGH);
    digitalWrite(_data, LOW);
    digitalWrite(_clk, LOW);
  }

  // D20d
  digitalWrite(_data, LOW);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D21d
  digitalWrite(_data, LOW);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D22d
  digitalWrite(_data, HIGH);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, LOW);
  digitalWrite(_clk, LOW);

  // D23d
  digitalWrite(_data, HIGH);
  digitalWrite(_clk, HIGH);
  digitalWrite(_data, HIGH);
  digitalWrite(_clk, LOW);
  digitalWrite(_data, LOW);
}

Arduino Code

Connect your Arduino board to the PC then upload the 'audio.ino' file from the downloaded folder. You can create the Arduino file with the below code. I have added 'Serial print' function in Arduino code. So you can see the particular feature's values in the Serial Monitor. This code is developed for testing purpose. But you can develop a good remote kit with these.

audio.ino
Copy
#include <R2S15902FP.h>

R2S15902FP R2S15902FP(5, 6);  // (Data Pin, Clock Pin)

int ctrl, in, rec_out, rec_gain, att, lr_in, bass, treble, sl_sr_c_sw_in, in_gain, lch_gain, lch_vol, rch_gain, rch_vol, cch_gain, cch_vol, swch_gain, swch_vol, slch_gain, slch_vol, srch_gain, srch_vol;

#define sw01 8
#define sw02 9
#define sw03 10
#define sw04 11

#define btn_delay 300

void setup() {

  Serial.begin(9600);

  pinMode(sw01, INPUT);
  pinMode(sw02, INPUT);
  pinMode(sw03, INPUT);
  pinMode(sw04, INPUT);

  delay(1000);

  initialControl();
  audio();
}

void loop() {

  // Serial Monitor
  Serial.print("Ctrl ");
  Serial.print(ctrl);
  Serial.print(", in-");
  Serial.print(in);
  Serial.print(", rec_out-");
  Serial.print(rec_out);
  Serial.print(", rec_gain-");
  Serial.print(rec_gain);
  Serial.print(", att-");
  Serial.print(att);
  Serial.print(", lr_in-");
  Serial.print(lr_in);
  Serial.print(", bass-");
  Serial.print(bass);
  Serial.print(", treble ");
  Serial.print(treble);
  Serial.print(", sl_sr_c_sw_in-");
  Serial.print(sl_sr_c_sw_in);
  Serial.print(", in_gain-");
  Serial.print(in_gain);
  Serial.print(", lch_gain-");
  Serial.print(lch_gain);
  Serial.print(", lch_vol-");
  Serial.print(lch_vol);
  Serial.print(", rch_gain-");
  Serial.print(rch_gain);
  Serial.print(", rch_vol-");
  Serial.print(rch_vol);
  Serial.print(", cch_gain-");
  Serial.print(cch_gain);
  Serial.print(", cch_vol-");
  Serial.print(cch_vol);
  Serial.print(", swch_gain-");
  Serial.print(swch_gain);
  Serial.print(", swch_vol-");
  Serial.print(swch_vol);
  Serial.print(", slch_gain-");
  Serial.print(slch_gain);
  Serial.print(", slch_vol-");
  Serial.print(slch_vol);
  Serial.print(", srch_gain-");
  Serial.print(srch_gain);
  Serial.print(", srch_vol-");
  Serial.println(srch_vol);

  // Control select
  if (digitalRead(sw03) == LOW) {
    ctrl++;
    if (ctrl > 20) { ctrl = 0; }
    if (ctrl > 20) { ctrl = 20; }
    delay(btn_delay);
  }
  if (digitalRead(sw04) == LOW) {
    ctrl--;
    if (ctrl < 0) { ctrl = 0; }
    delay(btn_delay);
  }

  // Control 0 - Input Selector
  if (ctrl == 0) {
    if (digitalRead(sw01) == LOW) {
      in++;
      if (in > 4) { in = 4; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      in--;
      if (in < 0) { in = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 1 - REC Output
  if (ctrl == 1) {
    if (digitalRead(sw01) == LOW) {
      rec_out++;
      if (rec_out > 1) { rec_out = 1; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      rec_out--;
      if (rec_out < 0) { rec_out = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 2 - REC-Output Gain Control
  if (ctrl == 2) {
    if (digitalRead(sw01) == LOW) {
      rec_gain++;
      if (rec_gain > 3) { rec_gain = 3; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      rec_gain--;
      if (rec_gain < 0) { rec_gain = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 3 - ADC Input ATT
  if (ctrl == 3) {
    if (digitalRead(sw01) == LOW) {
      att++;
      if (att > 3) { att = 3; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      att--;
      if (att < 0) { att = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 4 - L/R Input
  if (ctrl == 4) {
    if (digitalRead(sw01) == LOW) {
      lr_in++;
      if (lr_in > 1) { lr_in = 1; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      lr_in--;
      if (lr_in < 0) { lr_in = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 5 - Bass/Bypass (Tone control is bypass)
  if (ctrl == 5) {
    if (digitalRead(sw01) == LOW) {
      bass++;
      if (bass > 14) { bass = 14; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      bass--;
      if (bass < 0) { bass = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 6 - Treble
  if (ctrl == 6) {
    if (digitalRead(sw01) == LOW) {
      treble++;
      if (treble > 14) { treble = 14; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      treble--;
      if (treble < 0) { treble = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 7 - SL/ SR/ C/ SW Input
  if (ctrl == 7) {
    if (digitalRead(sw01) == LOW) {
      sl_sr_c_sw_in++;
      if (sl_sr_c_sw_in > 1) { sl_sr_c_sw_in = 1; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      sl_sr_c_sw_in--;
      if (sl_sr_c_sw_in < 0) { sl_sr_c_sw_in = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 8 -  Input Gain
  if (ctrl == 8) {
    if (digitalRead(sw01) == LOW) {
      in_gain++;
      if (in_gain > 7) { in_gain = 7; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      in_gain--;
      if (in_gain < 0) { in_gain = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 9 - Left Channel Gain Control
  if (ctrl == 9) {
    if (digitalRead(sw01) == LOW) {
      lch_gain++;
      if (lch_gain > 7) { lch_gain = 7; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      lch_gain--;
      if (lch_gain < 0) { lch_gain = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 10 - Left Channel Volume Control
  if (ctrl == 10) {
    if (digitalRead(sw01) == LOW) {
      lch_vol++;
      if (lch_vol > 99) { lch_vol = 99; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      lch_vol--;
      if (lch_vol < 0) { lch_vol = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 11 - Right Channel Gain Control
  if (ctrl == 11) {
    if (digitalRead(sw01) == LOW) {
      rch_gain++;
      if (rch_gain > 7) { rch_gain = 7; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      rch_gain--;
      if (rch_gain < 0) { rch_gain = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 12 - Right Channel Volume Control
  if (ctrl == 12) {
    if (digitalRead(sw01) == LOW) {
      rch_vol++;
      if (rch_vol > 99) { rch_vol = 99; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      rch_vol--;
      if (rch_vol < 0) { rch_vol = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 13 - Center Channel Gain Control
  if (ctrl == 13) {
    if (digitalRead(sw01) == LOW) {
      cch_gain++;
      if (cch_gain > 7) { cch_gain = 7; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      cch_gain--;
      if (cch_gain < 0) { cch_gain = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 14 - Center Channel Volume Control
  if (ctrl == 14) {
    if (digitalRead(sw01) == LOW) {
      cch_vol++;
      if (cch_vol > 99) { cch_vol = 99; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      cch_vol--;
      if (cch_vol < 0) { cch_vol = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 15 - Subwoofer Channel Gain Control
  if (ctrl == 15) {
    if (digitalRead(sw01) == LOW) {
      swch_gain++;
      if (swch_gain > 7) { swch_gain = 7; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      swch_gain--;
      if (swch_gain < 0) { swch_gain = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 16 - Subwoofer Channel Volume Control
  if (ctrl == 16) {
    if (digitalRead(sw01) == LOW) {
      swch_vol++;
      if (swch_vol > 99) { swch_vol = 99; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      swch_vol--;
      if (swch_vol < 0) { swch_vol = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 17 - Surround Left Channel Gain Control
  if (ctrl == 17) {
    if (digitalRead(sw01) == LOW) {
      slch_gain++;
      if (slch_gain > 7) { slch_gain = 7; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      slch_gain--;
      if (slch_gain < 0) { slch_gain = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 18 - Surround Left Channel Volume Control
  if (ctrl == 18) {
    if (digitalRead(sw01) == LOW) {
      slch_vol++;
      if (slch_vol > 99) { slch_vol = 99; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      slch_vol--;
      if (slch_vol < 0) { slch_vol = 0; }
      audio();
      delay(btn_delay);
    }
  }
  
  // Control 19 - Surround Right Channel Gain Control
  if (ctrl == 19) {
    if (digitalRead(sw01) == LOW) {
      srch_gain++;
      if (srch_gain > 7) { srch_gain = 7; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      srch_gain--;
      if (srch_gain < 0) { srch_gain = 0; }
      audio();
      delay(btn_delay);
    }
  }

  // Control 20 - Surround Right Channel Volume Control
  if (ctrl == 20) {
    if (digitalRead(sw01) == LOW) {
      srch_vol++;
      if (srch_vol > 99) { srch_vol = 99; }
      audio();
      delay(btn_delay);
    }
    if (digitalRead(sw02) == LOW) {
      srch_vol--;
      if (srch_vol < 0) { srch_vol = 0; }
      audio();
      delay(btn_delay);
    }
  }
}

void initialControl() {
  ctrl = 0;           // Control 0 - 20

  in = 1;             // Input Selector 0 to 4 (0=ALL OFF, 1=IN1, 2=IN2, 3=IN3 and 4=IN4)
  rec_out = 0;        // REC Output 0 or 1 (0=OFF and 1=ON)
  rec_gain = 0;       // REC-Output Gain Control 0 to 3 (0=0dB, 1=+2dB, 2=+4dB and 4=+6dB)
  att = 0;            // ADC Input ATT 0 to 3 (0=0dB, 1=-6dB, 2=-12dB and 4=-18dB)
  lr_in = 0;          // L/R Input 0 or 1 (0=Selector In and 1=Multi In)
  bass = 7;           // Bass/Bypass 0 to 14 (0=-14dB, 7=0dB, 14=+14dB)
  treble = 7;         // Treble 0 to 14 (0=-14dB, 7=0dB, 14=+14dB)
  sl_sr_c_sw_in = 0;  // SL/ SR/ C/ SW Input 0 or 1
  in_gain = 0;        // Input Gain 0 to 7 (0=0dB to 7=+14dB) +2dB/step

                      // Channel Gain 0 to 7 (0=0dB to 7=+14dB) +2dB/step
                      // Channel Volume 0 to 99 (0=-99dB to 99=0dB) 1dB/step
  lch_gain = 0;       // Left Channel Gain
  lch_vol = 60;       // Left Channel Volume

  rch_gain = 0;       // Right Channel Gain
  rch_vol = 60;       // Right Channel Volume

  cch_gain = 0;       // Center Channel Gain
  cch_vol = 60;       // Center Channel Volume

  swch_gain = 0;      // Subwoofer Channel Gain
  swch_vol = 50;      // Subwoofer Channel Volume

  slch_gain = 0;      // Surround Left Channel Gain
  slch_vol = 60;      // Surround Left Channel Volume

  srch_gain = 0;      // Surround Right Channel Gain
  srch_vol = 60;      // Surround Right Channel Volume
}

void audio() {
  R2S15902FP.slot1(in, rec_out, rec_gain, att, lr_in, bass, treble, sl_sr_c_sw_in, in_gain);
  R2S15902FP.slot2(lch_gain, lch_vol, rch_gain, rch_vol);
  R2S15902FP.slot3(cch_gain, cch_vol, swch_gain, swch_vol);
  R2S15902FP.slot4(slch_gain, slch_vol, srch_gain, srch_vol);
}

Documents

Download Files

I have included R2S15902FP.h, R2S15902FP.cpp, audio.ino, Circuit digram, PCB Design(PDF) and R2S15902FP Datasheet in the link.

Releted Articles