總之這次是把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月21日 星期日
2014年12月9日 星期二
AFE4400 with Arduino
總之這次來做個biosensor,
這是利用AFE4400做成的一個測血氧以及心跳的模組,利用一個波長的LED可以看出來心跳的波形,如果再用另一個波長的LED就可以透過比值計算血氧量,AFE4400的工作就是高速切換不同波長的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果然很難搞
這是利用AFE4400做成的一個測血氧以及心跳的模組,利用一個波長的LED可以看出來心跳的波形,如果再用另一個波長的LED就可以透過比值計算血氧量,AFE4400的工作就是高速切換不同波長的LED以及讀取PN二極體的電流量經由內部類比迴路的處裡之後的電壓.
可以看到一個是發射兩種波長的LED,另一個是接收用的PN二極體
幸好這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);
}
}
上圖就是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);
}
}