總之這次是把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);
}
}
2014年11月23日 星期日
自製USB to UART
這其實是很久以前做好的,從這DIP混SMD的風格大概可以看的出來....
當然還有堆積的灰塵
總之,這是用Atmega32U2做成的USB轉UART,基本上就是UNO的那一個電路
連Fuse我也保留了
至於為啥那麼晚PO,主要的原因是因為當時我做完之後,發現出來的UART都是亂碼
那時候還沒有LA,所以找不到原因,用了之後就發現UART的時脈有問題,波形比正常的還要大三倍多然後就從震盪器開始追,最後發現了....AVR的FUSE沒有跟動過,當時燒錄的時候用的是Flip,沒有設定過新的,所以系統時脈有問題
基本上這個HEX檔案在Arduino的Hardware裡面有.也有附上FUSE設定的說明,之後用Avrdude+Arduino as ISP設定過就沒問題了
AVRDUDE(Arduino\hardware\tools\avr\bin)和他的config file(Arduino\hardware\tools\avr\etc\)
還有剛剛那個HEX file (Arduino\hardware\arduino\firmwares\atmegaxxu2\)copy到一個新的地方之後,就可以用CMD下指令
avrdude -p 改成你MCU的版本代號(m32u2,m16u2) -P Arduino的COMPORT -b 19200 -c avrisp -U flash:w:UNO-dfu_and_usbserial_combined.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xF4:m -U lock:w:0x0F:m
當然還有堆積的灰塵
總之,這是用Atmega32U2做成的USB轉UART,基本上就是UNO的那一個電路
連Fuse我也保留了
至於為啥那麼晚PO,主要的原因是因為當時我做完之後,發現出來的UART都是亂碼
那時候還沒有LA,所以找不到原因,用了之後就發現UART的時脈有問題,波形比正常的還要大三倍多然後就從震盪器開始追,最後發現了....AVR的FUSE沒有跟動過,當時燒錄的時候用的是Flip,沒有設定過新的,所以系統時脈有問題
基本上這個HEX檔案在Arduino的Hardware裡面有.也有附上FUSE設定的說明,之後用Avrdude+Arduino as ISP設定過就沒問題了
AVRDUDE(Arduino\hardware\tools\avr\bin)和他的config file(Arduino\hardware\tools\avr\etc\)
還有剛剛那個HEX file (Arduino\hardware\arduino\firmwares\atmegaxxu2\)copy到一個新的地方之後,就可以用CMD下指令
avrdude -p 改成你MCU的版本代號(m32u2,m16u2) -P Arduino的COMPORT -b 19200 -c avrisp -U flash:w:UNO-dfu_and_usbserial_combined.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xF4:m -U lock:w:0x0F:m
2014年11月6日 星期四
Linkit one 電路解說
決定來把一些Linkit one的電路做一些介紹
首先從供電電路來看,板子的正面供有兩組DC-DC,分別是5V降4.2V以及3.7V升5V
由於Linkit one 的主要SOC MT2502,其實是為了行動裝置用的,原先IC的設計上就是可以直接將鋰電池接進去,所以供電最高就是4.2V,因此電腦的5V接進來之後就需要經過降壓的DC-DC供電
給MT2502,
又因為鋰電池運作的時候,為了5V的輸出,板子上另外有一個3.7V升壓到5V的DC-DC電路,
有意思的是鋰電池的充電其實是MT2502所控制的,並不需要一個獨立的IC去充鋰電池
除了主要的供電迴路以外,其實還有兩個Backup的電池,就是左上角的兩個3V可充電鋰電池
一個是給MT2502做RTC,另一個是GPS的RTC,Seeedstudio應該是沒有上件,但是他所需要的一些限流電阻都有,所以可以直接拿一個3V的焊接上去,注意不能用3V鈕扣電池,因為這個電路接上電之後是會充電的,還有因為新的鋰電池需要充電,Seeedstudio設定的限流電阻還頗大的,所以需要一點時間充飽,好了之後內建的RTC就有斷電計時了
由左上角開始的IC:MT2502, 韌體存放的Flash, TXS0108與他快樂的MOS們, GSM RF IC ,WIFI IC,GPS IC |
在來就是最有意思的GPIO電路了,由於SOC的電平是2.8V準位,還有些是1.8V,所以需要準位轉換電路,最剛開始的時候用的是TXB系列,不過遇到Pull-up的電路就會失效,所以之後就改用TXS系列,剩下有另外一部分的IO是用MOS做電平轉換,好處就是其實每隻腳都是Pull-up的,所以對於一些按鈕的就不用另外設定或是外接上拉電阻,
但是問題就是TXS的推力非常小,沒甚麼辦法供電給LED,如果你可以接受2.8V準位的話,其實是可以直接把TXS拿掉然後直接接到GPIO,他的供電電流就可以恢復變成15mA左右.不然的話就是直接用一個電晶體放大也是不錯的方案.而且在MCU直接接耗電量高的設備也是危險.
By the way,如果你想要5V的電平的話,其實也是可以把TXS的其中一個供電改成5V就成了,記得把別和3.3V的電線短路就好
另外有趣的部分大概就是ADC電路了,其實MT2502內部的ADC準位是2.8V,而不是5V,為了能夠支援一些電壓可能會大於2.8V的狀況,所以電路板上其實是有一個分壓電阻的,直接將電壓除以2.也就是說,實際上1024位階對應到的是0~5.6V,但是又為了要支援Arduino的5V是1023的問題,於是就出現了底下這段程式碼:
他會將5V的重新MAP回去0~1024,所以對於需要精準ADC的人,可以將這段程式碼去掉,但是要注意他的電壓範圍將會變成0~5.6V
以上大概是Linkit one 的一些基本周邊電路的介紹了
IV-18 真空管時鐘 beta2.0
總之這是第二版的試做,這是大概50%的beta版,主要是IV-18的holder加上他所需要的升壓板
這次我加了一個Attiny44來控制MAX6921,專門拿來掃描,這樣一來Arduino就不需要一直去掃描,使得程式速度不一樣而影響到亮度,
所以這次Holder就多了兩個IC,Attiny+MAX6921
不過下次應該還會再做一次,把升壓模組也放上去,因為空間還滿大的,不用白不用
另外就是應該有人發現了,這真空管亮度有點問題,這主要是燈絲的電壓造成的,我一來電阻搞太大,二來這又是用直流電,所以就悲劇了.下一版會用一個MAX628做燈絲電源的極性切換
這次我加了一個Attiny44來控制MAX6921,專門拿來掃描,這樣一來Arduino就不需要一直去掃描,使得程式速度不一樣而影響到亮度,
所以這次Holder就多了兩個IC,Attiny+MAX6921
不過下次應該還會再做一次,把升壓模組也放上去,因為空間還滿大的,不用白不用
另外就是應該有人發現了,這真空管亮度有點問題,這主要是燈絲的電壓造成的,我一來電阻搞太大,二來這又是用直流電,所以就悲劇了.下一版會用一個MAX628做燈絲電源的極性切換
LMX9838 breakout board
特色就是....底下這張圖
最高一對七,不過我手上的藍芽模組沒那麼多,和別人借了兩個測三個一起上
潮猛der,我還真沒看過可以同時一打七的藍芽2.0模組
不過我還在考慮它可以拿來做甚麼XD,想說要不把USB to UART放上去做一個超強的USB藍牙棒給Raspberry Pi 用
2014年10月11日 星期六
Attiny + PGA2311 音量控制器 第二版
突然發現好久沒發文了,作品生產率有點低,所以趕快把這個做完拿來貼
這次把耳機接頭的放回PCB板子上,佔了不少面積...
另外就是修正VR的線路沒接到的問題,還有就是這次VR的孔位特別預留了更大的位置,然後其他的部分不變,架構上一樣是一個OPA Buffer給PGA2311再用Attiny控制PGA2311這樣
至於為啥正負電壓產生器不放上去....
一來是沒啥地方放,二是就算把PCB加大面積,這種Charge pump的東西也是有一定的噪音在,要如何和OPA線路隔離也是種考驗,所以除非我找到一個迷你的Charge pump IC,而且夠力,還有好的小電容再說吧
#define PGA_ZCEN_PIN 3
#define PGA_CS_PIN 1
#define PGA_SDATA_PIN 0
#define PGA_SCK_PIN 2
#define VR A2
int val;
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);
}
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() {
pga2311_init();
pga2311_enable_zero_crossing_detection();
}
void loop()
{
int Read = analogRead(2);
int val = map(Read, 0, 1023, 0, 255);
pga2311_set_volume(val,val);
delay(10);
}
2014年8月31日 星期日
Attiny + PGA2311 音量控制器
我知道這張照片看起來超醜......
總之,這次是把上次做的Arduino PGA2311音量控制器移動到Attiny去,Code基本上一樣,唯一變化的只有控制器改成用VR,電路基本上和之前的差不多,都是OPA Buffer完之後用PGA2311控制音量,最後由Attiny85控制.
Code Size基本上不到2K,所以其實是可以把85換成25or45,可能之後下一版出來我會把Attiny85挪作他用XD
至於為啥不用VR控制音量就好了這點在之前的作品就有說明了不再重複
然後就是為啥要有第二版?....因為這版悲劇的點不少
第一就是那條跳線很煩..仔細看的話會發現那條是接再VR的輸出,結果我剛接上去發現都沒聲音,還以為PGA2311壞了....
第二就是VR的大小,原先要用的是 比較小的版本,但是通常外面都不好買,所以下次要改成兩種版本都能用的
第三就是那個耳機接頭,真的___難搞,下次應該要把耳機接頭腳位也留在上面的
第四我還在考慮的就是要不要把正負電壓產生器也放上去,可能要先量一下整機的耗電量再來看吧
總之,這次是把上次做的Arduino PGA2311音量控制器移動到Attiny去,Code基本上一樣,唯一變化的只有控制器改成用VR,電路基本上和之前的差不多,都是OPA Buffer完之後用PGA2311控制音量,最後由Attiny85控制.
Code Size基本上不到2K,所以其實是可以把85換成25or45,可能之後下一版出來我會把Attiny85挪作他用XD
至於為啥不用VR控制音量就好了這點在之前的作品就有說明了不再重複
然後就是為啥要有第二版?....因為這版悲劇的點不少
第一就是那條跳線很煩..仔細看的話會發現那條是接再VR的輸出,結果我剛接上去發現都沒聲音,還以為PGA2311壞了....
第二就是VR的大小,原先要用的是 比較小的版本,但是通常外面都不好買,所以下次要改成兩種版本都能用的
第三就是那個耳機接頭,真的___難搞,下次應該要把耳機接頭腳位也留在上面的
第四我還在考慮的就是要不要把正負電壓產生器也放上去,可能要先量一下整機的耗電量再來看吧
2014年8月10日 星期日
CC3000 Breakout board
首先是第一版:
這一版就是https://github.com/kuym/TICC3000Breakout
用的是PCB天線,而不是陶瓷天線,可以省下一些找料件的麻煩,但是這一版有很大的問題
那就是天線走線竟然有90度的直角出現 = =" 而且我沒注意到就直接送洗了....
第二版改成用u.fl直接接出來,省的麻煩,天線走線也改了一下
還有就是把I2C接腳拉出來
另外就是電源的部分,
CC3000需要兩個供電,一個是VBAT,是主要的供電,會輸入到內建的Step-down轉成1.8V左右
Input range 是2.7~4.8
另一個則是VIO,主要是供應內建的電平轉換IC將1.8V的通訊轉換成VIO的電平,Input range是1.8~3.6V
結果我看到一堆CC3000 breakout 都是兩個接再一起再用一個3.3V的LDO解決
問題是我現在的使用方式都是接上鋰電池使用,電壓在3~4.2V,那為啥不直接接到VBAT去就好了,還要經過LDO轉3.3V再用DC-DC轉成1.8V?這樣有點浪費了
所以我把3.3V的部分直接導到VBAT,再用一個LDO給VIO使用,中間留有一個Jumpper可以把兩個短接保留原先的電路設計
我想這次重點有兩個,第一個是天線走線的設計,另外一個就是CC3000的焊接了,這次我買了一個熱風槍來焊接,
先在兩個零件都上錫,再用熱風槍吹阿吹的,融化了之後就會發現他沉下去,而且稍微一動一下還會回彈,這時候輕壓一下就焊接完了
重點是錫不能上太多,不然輕壓的時候就會溢到另外一隻腳就短路了
還有最後一個重點,有的時候CC3000沒辦法用不是因為他壞了,有的時候是線的問題......
這害我誤以為我焊接壞了...然後又拿去Rework...
最後一點...光華沒有U.FL的天線座不用找了 = =
2014年8月9日 星期六
PCM5122 DAC for Raspberry pi
這就是上次pcm5122 DAC with RPI的PCB版
首先就是這次把DVCC和電容幫浦的CPVCC接再一起,
而AVCC則是用一個LDO從5V降到3.3V供應
在來就是LDO這次的設計可以支援多種EN,BP的設計,要接VCC或是接GND都可以選擇
大概就只差5V進去的時候有沒有加電感了吧
還有就是PCM5122用I2C控制,所以可以看到板子上比之前的PCM5102a DAC多了兩個i2C的接點,
然後就是這次在i2S的線路上增加電阻damping
Driver直接用IQaudIO的,這樣就比之前的PCM5102a DAC多了音量控制
首先就是這次把DVCC和電容幫浦的CPVCC接再一起,
而AVCC則是用一個LDO從5V降到3.3V供應
在來就是LDO這次的設計可以支援多種EN,BP的設計,要接VCC或是接GND都可以選擇
大概就只差5V進去的時候有沒有加電感了吧
還有就是PCM5122用I2C控制,所以可以看到板子上比之前的PCM5102a DAC多了兩個i2C的接點,
然後就是這次在i2S的線路上增加電阻damping
Driver直接用IQaudIO的,這樣就比之前的PCM5102a DAC多了音量控制
2014年7月24日 星期四
HDD POV prototype
最近東西買太多,所以回頭看看我手上有什麼沉積已久的東西可以搬出來玩一玩
拿了一個HDD出來,想說好久沒用了拿來跑一跑看看狀況,原本用的是HDD機板上讓硬碟轉起來
但是找到個Ti的三相馬達控制器,這樣我就可以用Arduino控制轉速,就只要給PWM訊號而已
3.5"需要外接12V電源,但是2.5"就不用了
再來就是剛好想到我以前做過一個LED燈條,原本就打算要做成POV的,但是因為那時候是打算用手,麻煩到爆,所以沒做,這時候剛好派上用場
所以把以前做的TLC5940 16 LED PCB拿來,和HDD一起做成POV
整台為了簡化線路(翻譯:Arduino mini pro用完惹,不太想拆新的來用),所以用的是Attiny85控制
但是目前的旋轉燈條還是太大個....大都是因為鋰電池和麵包版的關係,不然Attiny85+TLC5940 LED PCB,其實面積不大,之後打算是將鋰電池換成更小的,麵包版去掉,Attiny85直接接上去,連洞洞板都不要接了
2014年7月13日 星期日
正負電壓產生器
原理就是用一個Charge-pump將正電壓轉換成負電壓,再將正負電壓都送到兩個LDO穩壓+去噪音,
接下來檢討一下....
首先是這那個Charge-pump用的電容,當初就該先找好零件,而不是Layout的時候想著說"阿0805怎麼可能沒有47uF的好電容",然後看著僅剩的Y5R想說到底該不該用....
最後當然還是沒買Y5R...只好回家找有沒有可以用的OS-CON可以用,結果就變上圖那樣...慶幸這位置還好焊接...
在來就是電容放在接頭以外實在是很蠢....
最後是Layout如果想用在麵包版上的話,除了插針的間隔要0.254mm的倍數以外,還得要把板子的長度限制在12*0.254mm....不然超過的話是要怎麼插 = =
這板子大概以後會常出現在我的其他電路中了,不然正負電壓實在是很難找,原本的線性正負電壓得要接室電,現在這個可以直接給5V就好了 = =+
2014年6月29日 星期日
IN-9 音量顯示器 試搭
這東西很簡單,如題所示,就是個音量顯示器
所以用耳機接頭接進來之後,先用OPA放大,再用一對OPA控制恆流源
電路圖如下:
一個可變電阻控制放大倍率,一個調整恆流源
現在是搭在麵包版上,所以還滿亂的....
過陣子我可能會用一個Quad OPA和一個洞洞板搭起來
所以用耳機接頭接進來之後,先用OPA放大,再用一對OPA控制恆流源
電路圖如下:
一個可變電阻控制放大倍率,一個調整恆流源
現在是搭在麵包版上,所以還滿亂的....
過陣子我可能會用一個Quad OPA和一個洞洞板搭起來
2014年6月24日 星期二
Arduino 氣象站 Ver4.2 WIFI
簡單來說,我之前做的WIFI氣象站都遇到了一個問題,那就是傳送時間太太太久了,
最初是直接修改Adafruit的Code,沿用.Json的格式,之後為了改進傳送速度,改成了.Csv的格式
但是之後就一直沒有辦法再壓低時間,啟動時間還是將近25s,算下來再耗電量貢獻了90%以上,
待機耗電量的影響幾乎消失,耗電量的主導權也在啟動時間上面,
之後FB上有人推薦用MQTT這個Protocol,可以顯著的壓低傳送的資料量,於是這次改版的重點就是將Xively的上傳資料方式從Http改成MQTT
首先是把程式先宣告
cc3000_PubSubClient mqttclient(ip, 1883, callback, client, cc3000);
再來就是用Adafruit的CC3000 library連上Xively的Server,他提供給MQTT的Port是1883
client = cc3000.connectTCP(ip,1883);
接下來是用MQTT library連接 Xively的HOST:
mqttclient.connect("隨便一個名子", "API_KEY填到這裡", "");
最後就可以用mqttclient.publish("/v2/feeds/FEED_ID填這裡.csv", buf);
要注意的是,檔案格式也有.JSON,.XML還有.CSV, Buf限定Char array
這樣就可以了
於是這樣一改,啟動時間從25s下降變成3~5s,顯著地降低耗電量,接下來就是另外一個問題了,
我的測試中,CC3000似乎不能直接用IP連結HOST,非得要先DNS Lookup才能上傳資料,這大概是接下來要研究的問題了
(Update這個問題,我發現是因為檢查有沒有連上AP的Flag在斷線後沒有清掉,導致還沒連線成功就開TCP Socket就失敗了
最初是直接修改Adafruit的Code,沿用.Json的格式,之後為了改進傳送速度,改成了.Csv的格式
但是之後就一直沒有辦法再壓低時間,啟動時間還是將近25s,算下來再耗電量貢獻了90%以上,
待機耗電量的影響幾乎消失,耗電量的主導權也在啟動時間上面,
之後FB上有人推薦用MQTT這個Protocol,可以顯著的壓低傳送的資料量,於是這次改版的重點就是將Xively的上傳資料方式從Http改成MQTT
首先是把程式先宣告
cc3000_PubSubClient mqttclient(ip, 1883, callback, client, cc3000);
再來就是用Adafruit的CC3000 library連上Xively的Server,他提供給MQTT的Port是1883
client = cc3000.connectTCP(ip,1883);
接下來是用MQTT library連接 Xively的HOST:
mqttclient.connect("隨便一個名子", "API_KEY填到這裡", "");
最後就可以用mqttclient.publish("/v2/feeds/FEED_ID填這裡.csv", buf);
要注意的是,檔案格式也有.JSON,.XML還有.CSV, Buf限定Char array
這樣就可以了
於是這樣一改,啟動時間從25s下降變成3~5s,顯著地降低耗電量,接下來就是另外一個問題了,
我的測試中,CC3000似乎不能直接用IP連結HOST,非得要先DNS Lookup才能上傳資料,這大概是接下來要研究的問題了
(Update這個問題,我發現是因為檢查有沒有連上AP的Flag在斷線後沒有清掉,導致還沒連線成功就開TCP Socket就失敗了
Arduino 蓋革計數器
先解釋一下上圖好了,盒子內有Arduino Pro,一個i2C 1602LCD,蓋格管的電路板,SBM-20蓋格管
左邊的是PocketGeiger,拿來和Arduino蓋格計數器做比較
蓋革管是一種可以檢測輻射線的管子,通一個高壓電之後,如果有輻射線(看管子可以檢測哪幾種)進到管中,會電離內部的氣體,造成瞬間的導通,在另一端產生脈衝的信號,
蓋格計數器就是紀錄這些事件的次數,算出來當下的Count per minute (CPM)每分鐘事件數,就可以利用簡單的式子換算成輻射強度(uSv/h)
現在用的是SBM-20,還算滿普遍的蓋革管,便宜好用XD,可以檢測Beta和Gamma射線
我用http://brohogan.blogspot.tw/2010/02/geiger-counter.html這個人的電路圖,Layout出蓋革計數器最主要的電路板,重點就是,記得用CMOS的555(LM555 or TLC555),NE555是不能用的..Orz
我去光華買的時候到處都找不到QQ,有一家問完LM555拿NE555給我,最後乾脆去RS買TLC555,一個13塊還可以免運費,超棒的
另外就是校正的問題了,基本上這個電路板會產生400v的高壓,但是電流非常非常少,我被電到的感覺沒有Nixie的200v升壓板來的麻.但這也造成再測量電壓的時候需要考慮電表的內電阻,
首先就是先查出來或是量出來電表的內電阻是多少,我自己的電表是10M,
然後量輸出的電壓,量完之後,因為上圖的電路在末端還有兩個共5.7M的電阻,電路圖如下:
Vin是電路板的供應電壓,Vout是電表的電壓,Ra是5.7M歐姆,Rb是電表的內電阻,由此就可以算出來實際的Vin是多少了,蓋革管的電壓太高的話一下子就會故障的
這支SBM-20的建議電壓是400V,調整電路圖的R7就可以了
我自己送洗的電路板長的如下XD,對了,蓋革管千萬別用焊接的,這樣會讓他損壞,用兩個保險絲的Holder剛剛好(我買的是20mm直徑)
不知道為甚麼,這電路做出來有種老儀器老電路的感覺,不知道是不是因為電阻直立看起來滿密集的關係.
左邊的是PocketGeiger,拿來和Arduino蓋格計數器做比較
蓋革管是一種可以檢測輻射線的管子,通一個高壓電之後,如果有輻射線(看管子可以檢測哪幾種)進到管中,會電離內部的氣體,造成瞬間的導通,在另一端產生脈衝的信號,
蓋格計數器就是紀錄這些事件的次數,算出來當下的Count per minute (CPM)每分鐘事件數,就可以利用簡單的式子換算成輻射強度(uSv/h)
現在用的是SBM-20,還算滿普遍的蓋革管,便宜好用XD,可以檢測Beta和Gamma射線
我用http://brohogan.blogspot.tw/2010/02/geiger-counter.html這個人的電路圖,Layout出蓋革計數器最主要的電路板,重點就是,記得用CMOS的555(LM555 or TLC555),NE555是不能用的..Orz
我去光華買的時候到處都找不到QQ,有一家問完LM555拿NE555給我,最後乾脆去RS買TLC555,一個13塊還可以免運費,超棒的
另外就是校正的問題了,基本上這個電路板會產生400v的高壓,但是電流非常非常少,我被電到的感覺沒有Nixie的200v升壓板來的麻.但這也造成再測量電壓的時候需要考慮電表的內電阻,
首先就是先查出來或是量出來電表的內電阻是多少,我自己的電表是10M,
然後量輸出的電壓,量完之後,因為上圖的電路在末端還有兩個共5.7M的電阻,電路圖如下:
Vin是電路板的供應電壓,Vout是電表的電壓,Ra是5.7M歐姆,Rb是電表的內電阻,由此就可以算出來實際的Vin是多少了,蓋革管的電壓太高的話一下子就會故障的
這支SBM-20的建議電壓是400V,調整電路圖的R7就可以了
我自己送洗的電路板長的如下XD,對了,蓋革管千萬別用焊接的,這樣會讓他損壞,用兩個保險絲的Holder剛剛好(我買的是20mm直徑)
接下來就是利用Arduino的外部中斷(INT),當蓋革管有事件時,電路會輸出一的低電壓的脈衝,需要注意的是這張電路板的INT接上Arduino之後,需要一個Pullup才能正常運作
程式就簡單了,架構就是讓每一次INT腳的電壓下降的時候,讓計數器+1
等到一段時間之後計算輸出CPM,再利用下圖的公式計算uSv/h,需要注意的是每一種管子的常數都不一樣,SBM-20的話就用175
程式如下:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
const int alpha = 175;
long count = 0;
long countPerMinute = 0;
void setup() {
lcd.init();
lcd.backlight();
lcd.print("Sbm-20");
digitalWrite(2,HIGH);
attachInterrupt(0,countPulse,FALLING);
Serial.begin(9600);
}
void loop() {
delay(15000);
countPerMinute = 4*count;
float uSv = float(countPerMinute) / float(alpha);
char charBuf[15];
String uSvv = dtostrf(uSv, 5, 3, charBuf);
Serial.println(countPerMinute,DEC);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CPM:");
lcd.print(countPerMinute,DEC);
lcd.setCursor(0,1);
lcd.print("uSv/h:");
lcd.print(uSvv);
count=0;
}
void countPulse(){
detachInterrupt(0);
count++;
digitalWrite(13, HIGH);
while(digitalRead(2)==0){
}
digitalWrite(13, LOW);
attachInterrupt(0,countPulse,FALLING);
}
不知道為甚麼,這電路做出來有種老儀器老電路的感覺,不知道是不是因為電阻直立看起來滿密集的關係.