2014年2月19日 星期三

IN-9 nixie tube

這次從ebay買了六支IN-9.俄羅斯運來的(☆_☆)等了快四周
至於為什麼一次買那麼多支呢?沒辦法,單買一支的話運費都比較貴了QAQ
原本想要買IN-13的,不過電路都差不多複雜,於是就買便宜的吧


這次的真空管是顯示長條型的,電源需求140V,藉由改變電流來控制顯示的長度
電路圖如下:
這個電路有兩個作用,第一是當作溫度計,第二是他可以藉由DAC讓Arduino來控制
上面的LM34出來後,用OPA放大十倍,直接送入IN-9的電流控制區
下面的是用DAC7571輸出送入IN-9的電流控制區
電路先用麵包版驗證:
目前驗證成功啦~~旁邊有兩台三用電表,一個是顯示DAC輸出電壓(V),一個是顯示IN-9的電流(mA)
可以看出來目前的設定是Vin / 500 = I

電路還需要一些的細部調整,主要是Vin和I的比值,這是藉由電路圖中的R1所調整,還在想說要不要用IN-9上端得比較沒那麼線性的部分(大概10mA UP)
至於DAC7571,這是一個非常簡易的DAC IC,基本上就是一個12bit的可變電阻配上一個內建的Rail-to-Rail OPA buffer,溝通方式是i2C,而且這一切都濃縮在一個SOT-6的封裝裏
6支針腳已經是最精簡了,一組電源一個輸出兩個溝通一個位置選擇
放在Layout的電路板上真是省空間Y(^_^)Y
以下是控制DAC7571的CODE:

#include <Wire.h>
void setup() {

  Serial.begin(9600);
  Wire.begin();
  Serial.println("ADC Test");
}


void loop() {
  for (int i = 0;i<=4096;i++){ //12bit = 4096 step
    writeADC(i);
    Serial.println(i);
    delay(3);
  }
}
int writeADC(int value){
  byte a = value%256;                   //Wire send one byte at a time so use this to split a int
  byte b = value/256;
  Wire.beginTransmission(0x4C);  //A0=LOW
  Wire.write(b);
  Wire.write(a);
  Wire.endTransmission();  

}

2014年2月16日 星期日

PCM5102a DAC Ver 2.0

對上次的版本不太滿意於是又再作了一個出來


這次在輸出另外加了一個OPA當作Buffer,另外就是電供切成三塊,
數位,類比,電容幫浦供電,三個都獨立出來,之前的版本是CPVDD和AVDD接在一起的
也因此背面的GND也切成三塊,在PCM5102a底下相接
再來就是把LDO換了一個,原先的LM1117有點大顆,要擠三塊進去有點GG
於是去Ti的網站上,LDO的選項noise直接拉到快底XDD選了一顆LP5907,他有SOT-23的封裝
OPA的選擇是OPA2227-EP,訊源輸入前的下地電阻用10K
這次的所有電容通通改用X7R的規格,還有LPF的電容改用WIMA
3.5"耳機接頭也換成SMD,但是這真的是有夠難找,光華繞了半天都沒有只好去RS買
電容太大只好移去背面

雖然這是第二版了,還是有點小問題....
那就是元件安排未免也太密了 = ="
我的手工已經夠悲劇了還排的那麼密,X7R的電容也比我想像中來的高很多,
超怕接上電源兩顆電容短路
不過這次製作一次就成功真的是可喜可賀

BOM:

QtyValue    Package   Parts     Description                                                                                                     
2   1/4W       R5,R6                    Resistor                                                                                               
6   0.1uF       0805                      C1, C2, C6, C10, C11, C17     Capacitor    
2   10K         1/4W                      R3, R4                        Resistor                                                       
7   10uF        0805                      C3, C7, C8, C9, C14, C15, C16  Capacitor       
2   2.2nF       CAP-PTH-5MM   C4, C5       Capacitor                                                      
2   2.2uF       0805                      C12, C13     Capacitor                                                       
2   470          1/4W                     R1, R2        Resistor                                                       
3                   SOT23-5               U2,U3,U4    Voltage Regulator LDO                                 
5   M02LOCK     1X02_LOCK   JP1, JP4, JP5, JP6, JP7                                 
1   OPAMP-DUAL  SO08        IC1                                                    
1   PCM5102     TSSOP20     U$1 

2014年2月6日 星期四

PGA2311 + Arduino 音量控制

做完PCM5102a DAC之後,我一直覺得他太大聲...
我的音量控制都在0~3之間跳,間隔真的不太夠,所以開始來找音量控制的方法
最簡單的當然就是拿一個VR上去,但是這樣的話,軟體控制就需要帶有步進馬達的VR
而且最重要的是....好的VR很貴,一分錢一分貨就是了,兩邊的電阻值差異真的很小
我不想用便宜的VR....所以就找別的方法吧
就找到PGA系列了,這個PGA2311需要+-5V雙電壓,就可以+31.5dB 到 −95.5dB
兩個散熱片差很大的+-5V線性電源....沒辦法,現在整台Raspberry pi都是靠5V,小散熱片根本撐不住

UPDATE:
剛剛把編碼器也加上去了,現在可以獨立運作~~

可以準備搭棚了

UPDATE'2:


製作完畢, CODE如下:


#define LED_PIN 13

#define PGA_ZCEN_PIN     9
#define PGA_MUTE_PIN     4
#define PGA_CS_PIN      8
#define PGA_SDATA_PIN   7
#define PGA_SCK_PIN     5


int val;
int encoder0PinA = 11;
int encoder0PinB = 10;
int encoder0Pos = 130;
int encoder0PinALast = LOW;
int n = LOW;

int volume_left, old_l;
int volume_right, old_r;

void pga2311_init(void)
{
  pinMode(PGA_CS_PIN,    OUTPUT);    // pga-chipselect pin
  pinMode(PGA_SDATA_PIN, OUTPUT);    // pga-data-out (our data out to it) pin
  pinMode(PGA_SCK_PIN,   OUTPUT);    // pga-clock pin

  pinMode(PGA_ZCEN_PIN, OUTPUT);
pinMode (encoder0PinA,INPUT);
   pinMode (encoder0PinB,INPUT);
   Serial.begin (9600);
}

void pga2311_enable_zero_crossing_detection()
{
  digitalWrite(PGA_ZCEN_PIN, HIGH);
}

void pga2311_disable_zero_crossing_detection()
{
  digitalWrite(PGA_ZCEN_PIN, LOW);
}

void SPI_write(uint8_t out_spi_byte )
{
  uint8_t  i;

  // loop thru each of the 8-bits in the byte
  for (i=0; i < 8; i++) {

    // strobe clock
    digitalWrite(PGA_SCK_PIN, LOW);

    // send the bit (we look at the high order bit and 'print' that to the remote device)
    if (0x80 & out_spi_byte) {  // MSB is set
      digitalWrite(PGA_SDATA_PIN, HIGH);
    }
    else {
      digitalWrite(PGA_SDATA_PIN, LOW);
    }

    // unstrobe the clock via local SPI
    digitalWrite(PGA_SCK_PIN, HIGH);

    // get the next bit
    out_spi_byte <<= 1;   // left-shift the byte by 1 bit
  }
}

void pga2311_mute()
{
  pga2311_set_volume(0, 0);
}


void pga2311_set_volume( uint8_t left, uint8_t right )
{
  // Gain (dB) = 31.5 − [0.5 * (255 − N)]

  digitalWrite(PGA_CS_PIN, LOW);     // assert CS

  SPI_write(left);    // left value (0..255)
  SPI_write(right);   // right value (0..255)

  digitalWrite(PGA_CS_PIN, HIGH);    // deassert CS
}



void setup()   {
  Serial.begin(9600);
  Serial.println("PGA2311 Volume Control");

  pinMode(LED_PIN, OUTPUT);

  // set muting
  pinMode(PGA_MUTE_PIN, OUTPUT);
  digitalWrite(PGA_MUTE_PIN, HIGH); // high -> not muted, low -> muted

  pga2311_init();

  // set zero crossing detection
  pga2311_enable_zero_crossing_detection();

}

void loop()                  
{
  n = digitalRead(encoder0PinA);
   if ((encoder0PinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoder0PinB) == LOW) {
       encoder0Pos--;
     } else {
       encoder0Pos++;
     }
     Serial.print (encoder0Pos);
      pga2311_set_volume(encoder0Pos,encoder0Pos);
     Serial.print ("/");
   }
   encoder0PinALast = n;

}

nRF24l01模組轉接版


好的,事情是這樣的

大概三個月前剛買了nRF24l01模組後,常常遇到一個問題......


怎麼辦,我的線不夠了QAQ

發生的原因很簡單,麵包板插不進去,這件事解決的方法也很容易
1,買更多線
2,搞個轉接版算了

結果是我買了更多條線回來接,但是常常害我在搬東西的時候扯到,移動的時候拉到線
非常難整理...

那就做PCB出來吧~~~
於是下圖就誕生了
等了快半個月下圖也誕生了


這張PCB有兩個功用
1,轉接(廢話)
2,降壓
雖然nRF24l01的SPI可以耐5v,但是供電的VCC一定要3.3V才行,板子的背面有點空虛就放穩壓電路上去了



三張 1.25 USD 結束這回合,真是可喜可賀,可喜可賀
by the way 這個印刷有點點點悲劇阿

2014年2月4日 星期二

PCM5102a DAC with Raspberry pi

之前在PTT上面看到VOLUMIO這個軟體,可以當作網路控制的撥放器使用,還有很多升頻拉,performance tweaks可以用,所以就試試看了,原本搭配的是Dragonfly
結果每十分鐘就一次爆音....好吧可能要等BUG修正
之後就想說接到PCM5102a那片DAC試試看,結果一試成主顧
效果超棒的,還可以搭配升頻,一下子達到PCM5102a的極限32bit 384KHZ
雖然Raspberry pi沒有MCLK可以接出來,但是這顆IC也不用MCLK就可以運作了~超級適合拿來搭配PI的說

只要照著連BCK,LRCK,DATA就可以,PCM5102a DAC的MCLK連到GND


官網下載IMG檔後寫到SD卡上面(PS:我試過1.1版好像有問題),把網路線接上就可以用,網頁連線到http://volumio.local/或是他的ip就可以進到畫面


進到System後,按一下i2Son再重開就可以使用i2S介面了,超方便
值得注意的是,由於PCM5102a沒有內建音量控制,所以必須在Playback選擇軟體控制

另外放檔案可以有三種,NAS Ramdisk USB Drive
Windows底下可以用執行=>//Raspberry的ip
可以直接拉檔案過去

Update:
後來直接做了一個給RPI的版本