レビューメディア「ジグソー」

AK4137を使った非同期サンプリングレートコンバーター

初回は気づくのが遅くて間に合いませんでしたが、再頒布の申し込みに間に合いました。

長い間暖めていたものの製作となります。

 

今回は、アドオン基盤も同時に申し込みました。

 

水晶発振子は標準で行くことにしました。

 

アイソレータは写真の時点では、装着していませんが、ISO7640FMで行くことにしました。

 

コンデンサは、手持ちのOSコン16V100uFがありましたのでこれを使っています。

 

 

ケースはこちらを選択してみました。

 

 

組み込みに関して、今回もHDMI-I2S送信基板を使用します。

組み合せには、ISO7640FMにてアイソレート仕様とします。

また、今回は、DDCを組み込んで一体機とすることにしました。

 

 

電源部に関しては、秋月のTPS7A4700基盤を使用し3.3Vを2系統作ります。

トランスに関しては、今回は共立のトロイダルトランスにて対応します。

 

 

表示、操作部は、ケースに合わせて液晶で16桁×2桁タイプを選択しました。

ロータリーエンコーダ、IRレシーバを組み込みます。共に秋月にて入手。

 

 

 

 

 

 

 

AK4490DACと合わせて現在視聴中です。

AK4490DACは、自作プログラム仕様なのでバージョンを上げる形での調整になります。

下手なプログラムなので合わせて調整中です。

  • 購入金額

    8,960円

  • 購入日

    2015年12月15日

  • 購入場所

    やなさん

18人がこのレビューをCOOLしました!

コメント (25)

  • 退会したユーザーさん

    2016/03/16

    始めましてkkumaxと申します。ほぼ同じ構成でDACを構築しているようで
    質問したいことがあります。良かったら教えてください。
    写真をみると
    特にPIC基板、マイコン関連等が見あたらないのですが
    自作プログラムとは?XMOSの中身をいじっているのでしょうか?
    最初はその方向で自分は検討したのですが...
    英語力不足で挫折しました(笑)
    今はArduinoをやってみようかと検討中です。
  • lukaworldさん

    2016/03/17

    はじめまして、kkumaxさん。
    このP2D基板自体にマイコンは搭載されていますよ。
    XMOS自体は、単体モデルで中身は変更していません。
    AK4490用のファームウェアが存在しているとは思うのですが、DIYINHKさんが公開してくれていないのでなんともなりませんねぇ。

    XMOSUSB基板との信号はPCM・DSD識別信号ですが、このP2D基板の識別入力にてそのまま識別可能です。

    ここで気づいたのですが、もしやAK4490についてでしょうか?

    であれば、AK4490はくろ豆工房さんのところで頒布されているLCD一体型のArduino搭載キットがあり、それをLCDの状態表示とAK4490をソフトウェアモードにて制御しています。
    ただ、私も自作プログラムは初めてで、状態表示とPCM・DSD自動切り替えの機能をもたせた程度の単純でなんとか動作できている程度のプログラムしか出来ていません。データシートを睨みつけながら1ヶ月試行錯誤でなんとかなりました。(^^;)

  • lukaworldさん

    2016/03/17

    私の作成したなんとか動作したレベルのプログラムです。

    /*
    * Controler for AK4490EQ
    * 2015/08/31
    * V1.6
    */

    // LIBRARIES

    #include <LiquidCrystal.h> // For LCD
    #include <Wire.h> // For I2C

    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(2, 3, 15, 14, 17, 16);

    // CONSTANT DEFINITION

    // (The digital volume for Velvet is 0 to -127 db in .5 db steps)

    #define DEFAULTATTNU 0xFF //-50 dB this is 50x2=100 or 0x64
    #define MAXATTNU 0x01 //-99dB this is 99X2=198 or 0xC6
    #define MINATTNU 0xFF //- 0 dB

    // analog input Pin number

    //#define PNDPin 10 //Velvet PND Pin Output
    #define DSDModePin 11 //PCM・DSD mode signal
    int swVal = 0;

    #define VOLUPPIN 5 // Button to increase volume or RotEnc A terminal
    #define VOLDOWNPIN 7 // Button to decrease volume or RotEnc B terminal
    #define SELECTPIN 8 // Switch to select function

    #define INTERVAL_BOUNCE 2 // Time in milliseconds to debounce the rotary encoder
    #define INTERVAL_SWITCHBOUNCE 250 // Time in milliseconds to debounce switch
    #define INTERVAL_SELECT 5 // Time to exit select mode when no activity

    #define VOL 0 // The order of selection when clicking the select switch
    #define FIL 1
    #define SC 2

    // VARIABLE DECLARATION

    byte regVal; // Variable to pass register value
    byte regAddr; // Variable to pass register value
    byte currAttnu=DEFAULTATTNU; // Variable to hold the current attenuation value

    unsigned long displayMillis = 0; // Stores last recorded time for display interval
    unsigned long debounceMillis = 0; // Stores last recorded time for switch debounce interval
    unsigned long selectMillis = 0; // Stores last recorded time for being in select mode

    byte select; // To record current select option

    boolean SHARP; // FIR filter mode
    boolean ON; // SOUND CONTROLL
    boolean selectMode;

    // Rotary encoder interrupt service routine
    static boolean rotating=false;
    void rotEncoder()
    {
    rotating=true; // If motion is detected in the rotary encoder, set the flag to true
    }

    void writeVelvetReg(byte regAddr, byte regVal)
    {
    Wire.beginTransmission(0x11); //Hard coded to the the Velvet device address
    Wire.write(regAddr); // Specifying the address of volume register
    Wire.write(regVal); // Writing the volume value into the register
    Wire.endTransmission();
    }

    void setVelvetVolume(byte regVal)
    {
    writeVelvetReg(0x03, regVal); // set up volume in DAC-L ATT
    writeVelvetReg(0x04, regVal); // set up volume in DAC-R ATT
    }

    void printVol(byte regVal)
    {
    lcd.setCursor(11,0);
    if (regVal<10) // transition between two digit and one digit display
    {
    lcd.print("0"); // Add a leading zero
    lcd.print(regVal, DEC);
    }
    else
    {
    lcd.print(regVal, DEC);
    }
    }

    void printSelectBar(){ // PRINTING SELECTION INDICATOR
    lcd.setCursor(5,1);
    lcd.print("");
    lcd.setCursor(15,1);
    lcd.print("");
    }

    void clearSelectBar(){ // CLEARING SELECTION INDICATOR
    lcd.setCursor(5,1);
    lcd.print("");
    lcd.setCursor(15,1);
    lcd.print("");
    }

    /*************************MAIN PROGRAM*************************************************************/
    void setup() {

    // Set up the LCD's number of columns and rows:
    lcd.begin(16,2);

    // Join the I2C bus as a master
    Wire.begin();

    //Velvet PND Pin setup (Reset)
    // pinMode(PNDPin,OUTPUT);
    // digitalWrite(PNDPin,LOW);

    // Attach Interrupts
    attachInterrupt(0, rotEncoder, CHANGE); // ISR for rotary encoder

    // Set up the pin modes
    pinMode(VOLUPPIN, INPUT); // Button for Encoder pin for volume up
    digitalWrite(VOLUPPIN, HIGH); // If H/W debouncing is implemented, set to LOW

    pinMode(VOLDOWNPIN, INPUT); // Button for Encoder pin for volume down
    digitalWrite(VOLDOWNPIN, HIGH); // If H/W debouncing is implemented, set to LOW

    pinMode(SELECTPIN, INPUT); // Button for encoder switch
    digitalWrite(SELECTPIN, HIGH); // Enable pull-up resistor

    pinMode(DSDModePin,INPUT); //DSD mode Pin setup

    //AK4490EQ reset
    Wire.beginTransmission(0x11);
    Wire.write(0x00); // move pointer to control1 address
    Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
    Wire.endTransmission();

    //32bitI2S mode
    // Wire.beginTransmission(0x11);
    // Wire.write(0x00); // move pointer to control1 address
    // Wire.write(0x8F); // sends 0x8F (hex) 10001111 (binary)
    // Wire.endTransmission();

    // Print the welcome message and other labels to the LCD

    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("AK4490EQ DAC");
    lcd.setCursor(5,1);
    lcd.print("Ver 1.5");

    delay(1000);
    lcd.clear();
    delay(500);

    lcd.home();
    lcd.setCursor(10,0);
    lcd.print("-");
    lcd.setCursor(12,0);
    lcd.print("- dB");
    lcd.setCursor(1,1);
    lcd.print("FIL:SHARP");
    lcd.setCursor(11,1);
    lcd.print("SC:1");

    SHARP=true; // This is the default value of roll-off filter (sharp)
    ON=true; // This is the default value for SOUND CONTROLL (ON)

    setVelvetVolume(DEFAULTATTNU); // Set volume at startup otherwise
    // default is full volume
    printVol(DEFAULTATTNU/2-127);
    }

    void loop() {

    //AUTO INPUT MODE SELLECT
    swVal = digitalRead(DSDModePin);

    if (swVal == HIGH) {
    Wire.beginTransmission(0x11); // Set to DSD Mode / L out to R in/R out to L in
    Wire.write(0x02); // move pointer to control3 address
    Wire.write(0x82); // sends 0x80 (hex) 10000010 (binary)
    Wire.endTransmission();
    Wire.beginTransmission(0x11); // Set to RESET
    Wire.write(0x00); // move pointer to control1 address
    Wire.write(0x01); // sends 0x01 (hex) 00000001 (binary)
    Wire.endTransmission();
    Wire.beginTransmission(0x11); // Set to DSD Data Mute/DSD Mute Control/DSD Mute Release
    Wire.write(0x06); // move pointer to control5 address
    Wire.write(0x99); // sends 0x99 (hex) 10011001 (binary)
    Wire.endTransmission();
    Wire.beginTransmission(0x11); // Set to DSD Sampling Speed Control
    Wire.write(0x09); // move pointer to control8 address
    Wire.write(0x01); // sends 0x01 (hex) 00000001 (binary)
    Wire.endTransmission();
    lcd.setCursor(0,0);
    lcd.print("DSD");
    lcd.setCursor(4,0);
    lcd.print("");
    }
    if (swVal == LOW) {
    Wire.beginTransmission(0x11); // Set to PCM Mode
    Wire.write(0x02); // move pointer to control3 address
    Wire.write(0x00); // sends 0x80 (hex) 00000000 (binary)
    Wire.endTransmission();
    Wire.beginTransmission(0x11); // Set to Master Clock Frequency Auto / 24bit I2S Mode
    Wire.write(0x00); // move pointer to control1 address
    Wire.write(0x8F); // sends 0x8F (hex) 10001111 (binary)
    Wire.endTransmission();
    Wire.beginTransmission(0x11); // Set to De-emphasis Response 44.1 / Sharp roll-off filter
    Wire.write(0x01); // move pointer to control2 address
    Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
    Wire.endTransmission();
    Wire.beginTransmission(0x11); // Set to De-emphasis Response 44.1 / Sharp roll-off filter
    Wire.write(0x02); // move pointer to control3 address
    Wire.write(0x00); // sends 0x01 (hex) 00000000 (binary)
    Wire.endTransmission();
    Wire.beginTransmission(0x11); // Set to L out to L in/R out to R in
    Wire.write(0x02); // move pointer to control3 address
    Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
    Wire.endTransmission();
    lcd.setCursor(0,0);
    lcd.print("PCM");
    lcd.setCursor(4,0);
    lcd.print("I2S32");
    }

    if((digitalRead(SELECTPIN)==LOW)&&((millis()-debounceMillis)>INTERVAL_SWITCHBOUNCE)) {
    selectMode=true; // Now we are in select mode
    printSelectBar(); // Indicate we are in select mode
    debounceMillis=millis(); // Start debounce timer
    selectMillis=millis(); // Start being in select mode timer

    select++; // Move to next select option
    switch(select%3){
    case VOL:
    printSelectBar();
    break;
    case FIL:
    printSelectBar();
    lcd.setCursor(5,1);
    lcd.print("");
    break;
    case SC:
    printSelectBar();
    lcd.setCursor(15,1);
    lcd.print("");
    break;
    } // End of switch
    }

    if(rotating)
    {
    delay(INTERVAL_BOUNCE); // debounce by waiting INTERVAL_BOUNCE time

    switch(select%3){
    case VOL:
    if (digitalRead(5) == digitalRead(7)) // CCW
    {
    if (currAttnu<MAXATTNU) // Check if not already at maximum attenuation (minimum Volume)
    {
    currAttnu+=2; // Increase 1 dB attenuation (decrease volume 1 db)
    setVelvetVolume(currAttnu); // Write value into registers
    printVol(currAttnu/2); // Divide by 2 to print in whole dBs
    }
    }
    else // If not CCW, then it is CW
    {
    if (currAttnu>MINATTNU) // Check if not already at minimum attenuation (max volume)
    {
    currAttnu-=2; // Decrease attenuation 1 dB (increase volume 1 db)
    setVelvetVolume(currAttnu); // Write value into registers
    printVol(currAttnu/2); // Divide by 2 to print in whole dBs
    }
    }
    break;
    case FIL: // Toggle between Sharp and Slow filter
    if (SHARP){ // If currently in sharp, toggle to slow roll off filter
    Wire.beginTransmission(0x11); // Set to Slow roll-off filter
    Wire.write(0x01); // move pointer to control2 address
    Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
    Wire.endTransmission();
    Wire.beginTransmission(0x11); // Set to Slow roll-off filter
    Wire.write(0x02); // move pointer to control3 address
    Wire.write(0x01); // sends 0x01 (hex) 00000001 (binary)
    Wire.endTransmission();
    lcd.setCursor(5,1);
    lcd.print("SLOW ");
    SHARP=false; // Now in slow roll off filter
    }
    else { // Toggle to sharp roll off filter
    Wire.beginTransmission(0x11); // Set to Sharp roll-off filter
    Wire.write(0x01); // move pointer to control2 address
    Wire.write(0x00); // sends 0x00 (hex) 00000000 (binary)
    Wire.endTransmission();
    Wire.beginTransmission(0x11); // Set to Sharp roll-off filter
    Wire.write(0x02); // move pointer to control3 address
    Wire.write(0x00); // sends 0x01 (hex) 00000000 (binary)
    Wire.endTransmission();
    lcd.setCursor(5,1);
    lcd.print("SHARP");
    SHARP=true; // Now in sharp roll off filter
    }
    selectMillis=millis(); // Update being-in-select-mode timer
    break;
    case SC:
    if (ON){ // If SOUND CONTROLL is on, turn off
    Wire.beginTransmission(0x11);
    Wire.write(0x08); // move pointer to control8 address
    Wire.write(0x01); // sends 0x03 (hex) 00000001 (binary)
    Wire.endTransmission();
    lcd.setCursor(14,1);
    lcd.print("2");
    ON=false; // Now SOUND CONTROLL is off
    }
    else {
    Wire.beginTransmission(0x11);
    Wire.write(0x08); // move pointer to control8 address
    Wire.write(0x00); // sends 0x01 (hex) 00000000 (binary)
    Wire.endTransmission();
    lcd.setCursor(14,1);
    lcd.print("1");
    ON=true; // Now SOUND CONTROLL is on
    }
    selectMillis=millis(); // Update being-in-select-mode timer
    break;
    } // End of switch

    rotating=false; // Reset the flag

    } // End of while(rotating)

    // When the being-in-select mode timer expres, we revert to volume mode
    if(selectMode&&millis()-selectMillis > INTERVAL_SELECT*1000){
    selectMode=false;
    clearSelectBar();
    select=VOL; // Back to volume mode
    }
    } // End of loop()
他22件のコメントを表示

ZIGSOWにログインするとコメントやこのアイテムを持っているユーザー全員に質問できます。

YouTube の動画を挿入

YouTube の URL または動画の ID を入力してください

動画の ID が取得できません。ID もしくは URL を正しく入力してください。

ニコニコ動画の動画を挿入

ニコニコ動画の URL または動画の ID を入力してください

動画の ID が取得できません。ID もしくは URL を正しく入力してください。

ZIGSOWリンク挿入

検索対象とキーワードを入力してください

    外部リンクを挿入

    リンク先の URL とタイトルを入力してください

    URL を正しく入力してください。

    画像を挿入(最大サイズ6MB)

    画像を選択してください

    ファイルサイズが6MBを超えています

    別の画像を追加

    ZIGSOW にログイン

    ZIGSOW会員登録(無料)はこちらから