2014年12月21日 星期日

LMX9838 USB stick

總之這次是把LMX9838做成一個USB的裝置,用的是CP2102做UART轉USB
架構上大致就是RX-TX TX-RX CTS-RTS RTS-CTS,把Flow control也補了上去
另外就是保留外接32.768khz震盪器的空間,應該勉強可以懸在空中啦XD
然後就是把LMX的LED燈拉出來兩個,

這東西的好處大概就是可以一次接7個dev了吧
PCB連結,我把這電路Share出來了

2014年12月9日 星期二

AFE4400 with Arduino

 總之這次來做個biosensor,
這是利用AFE4400做成的一個測血氧以及心跳的模組,利用一個波長的LED可以看出來心跳的波形,如果再用另一個波長的LED就可以透過比值計算血氧量,AFE4400的工作就是高速切換不同波長的LED以及讀取PN二極體的電流量經由內部類比迴路的處裡之後的電壓.

可以看到一個是發射兩種波長的LED,另一個是接收用的PN二極體

電路還算是有點多東西,而且是QFN....這是我第一次焊接測試成功這種封裝的IC,比起CC3000來說難的多,因為CC3000可以透過ㄉㄨㄞˉㄉㄨㄞˉ的感覺知道說已經焊在一起了,但是AFE體積不大,錫量也很少,基本上只能壓下去然後希望成功這樣QQ
幸好這IC有些輸出可以讓我知道他焊接正常,第一個是VCM以及BG會有電源輸出,附帶一提,VCM是作為接收器的遮蔽用,BG是Bandgap輸出
另外還有4Mhz的clock輸出,
至於LED以及PN有沒有接好,可以利用DIAG讀取狀態,他會檢測有沒有地方短路或是空接
確定完之後就可以開始讀資料了
我之前找到一個Library可以給Arduino用的,結果他竟然寫說這個Code不能用
所以改阿改的,拿LA出來看資料長怎麼樣真的好用,一下就看到問題點,總之改好的東西我放在這https://github.com/will127534/AFE4400


上面是raw,下面是平均10個資料後的輸出

基本上SPI介面長這樣
這是讀取六個ADC data的狀況,可以看到ADC_RDY觸發Interrupt,然後Arrduino先寫說我要讀資料,在讀取完六個後再寫說我不用讀資料惹,以上請參閱Datasheet.

接線的話SPI接SPI,CS接10,RDY接2,RST+PWN接3,4,其他就接電源

接下來就是要分析心跳和血氧量了

這東西搞了我一整個周末...先是改Library的各種bug,之後是改各種參數....從Led current到I-V轉換的參數,到放大器等等
Analog果然很難搞

2014年12月7日 星期日

HDC1000 + Arduino

最近Ti 出了一堆種類的ADC,從Capacitor 到 Inductor  到 Humidity sensor
上圖就是Humidity + Temperature Sensor HDC1000

原本是想要搞個pcb在用個熱風槍或啥的焊接,不過有點懶得在eagle做library所以就變成上圖那樣了....
還滿難搞的,尤其是第一隻腳,因為IC很難固定的住,黏上高溫膠帶之類的也只有一點幫助
線是從多心線拆下來的,手邊那麼細的線大概就只有這個了

總之接上Arduino 後(注意3.3V)
以下code

#include <Wire.h>

#define addr 0x41
uint16_t readingT,readingH;
void setup()
{
  Wire.begin();

  Serial.begin(9600);
  Serial.println("HDC1000 Test");
  sethdc();
}


void loop()
{
 readhdc();
 delay(1000);
}

void sethdc(){

   Wire.beginTransmission(addr);
   Wire.write(0x02);
   Wire.write(0x10);   //14 bit 14bit config MSB
   Wire.write(0x00);   //14 bit 14bit config LSB
   Wire.endTransmission();
   Wire.beginTransmission(addr) ; //check write success or not
   Wire.write(0x02);                      
   Wire.endTransmission();
   Wire.requestFrom(addr, 2);
if(2 <= Wire.available())  
{    
       readingT=0;
readingT = Wire.read();
readingT = readingT << 8;  
       Serial.print(" Config:");
Serial.println(readingT,BIN);  
}
   Wire.beginTransmission(addr);     //read ID
   Wire.write(0xFB);
   Wire.endTransmission();
   Wire.requestFrom(addr, 3);
if(3 <= Wire.available())  
{      
     readingT=0;
readingT = Wire.read();
readingT = readingT << 8;  
      Serial.print(" ID:");
Serial.print(readingT,BIN);
      Serial.println( Wire.read(),BIN);
}

}


void readhdc(){
        Wire.beginTransmission(addr);
        Wire.write(0x00);
        Wire.write(0x00);
        Wire.endTransmission();
        delay(20);

Wire.requestFrom(addr, 4);
if(4 <= Wire.available())  
{             readingT=0;
                readingH = 0;
readingT = (Wire.read()<<8);
                readingT+=Wire.read();
                readingH = (Wire.read()<<8);
                readingH+=Wire.read();
                Serial.print(" Temp:");
                Serial.print(readingT);
                Serial.print(" =>");
Serial.print(readingT/65536.0*165.0-40.0);  
Serial.print("  RH:");
                Serial.print(readingH);
                Serial.print(" =>");
Serial.println(readingH/65536.0*100.0);
}



}