顯示具有 Arduino 標籤的文章。 顯示所有文章
顯示具有 Arduino 標籤的文章。 顯示所有文章

2015年3月6日 星期五

IV-18 真空管時鐘 RC1


 這次因為成本的關係,我打算再做一組子版,所以這個版本不算是正式版,算是RC版
這次把升壓電路也做進去了,也改用MAX6921 SSOP的IC控制,不過也是因為這個IC所以成本超高.....MAX6921已經夠貴了,SSOP的版本又更上一層樓 Q__Q

這邊可以看到Attiny24 & 升壓電路(電容後來我改用SMD的了)
MAX6921 SSOP

2015年3月5日 星期四

IN-17 Nixie tube portable clock




這是我的第二個Nixie tube clock。
從上次製作到現在大概間隔一年多,自己的PCB設計應該從無到有一點點了,原本想說先弄一個新的IN-14 x 8 的時鐘,沒想到結果是當時去ebay順便買的IN-17先做好了。

Feature:     

  1. Four IN-17 Nixie tube 
  2. Base on Arduino Uno
  3. Power by USB or built-in Li-poly with 2 hrs of battery life
  4. Dock to Charge by contact 
  5. Auto adjust to light             
  6. With Wifi NTP time sync   (to be done)

Functions:
  1. Clock
  2. Timer
  3. Stopwatch
  4. Some animation
這次的設計的要點就是盡可能的小,所以你可以看到其實按鈕有點擠...
四支真空管也是有點擠,其實理由就是因為這寬度剛好5cm,大部分的PCB廠商都是以5cmx5cm為分界點,所以就盡量塞在5x5以內。

架構上分成主板和顯示板
顯示的方式用的是一個74141配上4個高壓開關電路,採掃描式,而掃描的部分交由一個Attiny24負責,將資料由i2C傳入,Attiny就會負責掃描。主要是因為我發現Attiny24便宜到個爆炸(10元)所以多十元減少一堆負擔就做了,上次在做IV-18的時候這問題有點煩,尤其是Arduino不好設定Timer的狀況。
而顯示板還有四個LED以及四個按鈕還有預留的光敏電阻可以用。

主板的架構上
由比較熟悉的Atmega328作主控,另外用CP2102做為uart轉Serial使用,還有DS3231M做RTC,另外將RTC的Clock輸出給MCU Sync,另外還有一個DRV2605震動馬達控制器。
電源的部分,切成三個Power domain分別是系統的3.3V、顯示板需要的5V、還有Nixie的180V
來源有USB的5V以及Li-poly 的3.7V。
滿複雜的....
這個的主板其實設計過兩次,前一次的設計原先採用的是系統電壓5V以及Nixie的180V,
但是這樣一來使用鋰電池的時候就需要先升壓,再降壓給一些IC使用。

另外就是這個可以邊用USB邊充電,電會自己找路線,用電池的時候Nixie升壓會從鋰電池直接供電,5V會由3.3V經過charge pump或是預留的切換式升壓電路上去。
用USB供電的時候,所有的電路都會使用USB供應,包含鋰電池充電還有Nixie升壓,而5V就不用經過升壓電路直接給。

這是使用USB供電的狀態
這是由電池供電的狀態
5V是升壓上來的
這是主板的照片
可以看到那個有點複雜的供電迴路、Atmega328、他的ISP孔、兩種5V升壓電路,最後是power switch以及NP-10 180V升壓版還有RTC IC,另外右下角還有一個震動馬達。

這裡可以看到預留的FM模組以及馬達控制器和震動馬達,電池座,CP2102最後就是兩種溫濕度計HDC1000 & SHT2X。
從電路圖的設計來看的話
我畫的非常糟糕,不過應該還是能看吧,這是核心部分的零件,可以看到Atmega328已經有很多Port被接出來了,大部分都用在LED與Button上面,我下次可能要改用電阻串聯的方式減少Button占用的GPIO數.LED都接再PWM的Pin上面,為了能夠調整亮度,然後左下角有一組USB轉UART的CP2012.而左上角則是有一個I2C的電平轉換電路,因為顯示板的電壓是5V.這也是一個下次如果要再做的修正點,其實Attiny不一定要和74141用5V.另外就是其中一個Analog打算拿來接光敏電阻的.
RTC就沒有甚麼好說的了,只是另外把SQW的clock輸出(要Pullup)
然後就是一團亂的Power,其中我預留了兩組升壓電路,右下角分別是Charge Pump以及切換式升壓.再來就是右上角的鋰電池充電模組,然後左邊就是供電切換的電路,以及左下角的3.3V LDO


FM目前是悲劇的狀態,因為天線沒有辦法拉太長,所以訊號有點糟糕,打算等LNA板子到來試試看狀況。還有就是改用FM Chip antenna 看看有沒有辦法改善,PAM的模組(放大器)已經有了,應該會加個小喇叭當FM收音機。


然後接下來就是IN-17真空管
這是蘇聯製最小的數字管,買不起太多最大的IN-18就改買這個來玩,價格和IN-14差不多
另外這些管也都是蘇聯的軍用管。

接下來就是子版
不過我做太趕忘記照子板的背面了,所以PO電路圖。
可以看到有Attiny24還有他的ISP以及一堆電晶體+LED+按鈕+74141

這次用74141主要的原因是第一個,我手上還有幾個,第二個就是體積的問題。
Nixie的驅動有兩類和很多種
1.掃描
   陽極: 高壓電晶體開關 or 高壓光電器 
   陰極: 74141 or 高壓電晶體 or ULN2003那種的搭配47V Zener 
2.靜態:
   一堆74141 or HV系列IC (HV513....等) or 一堆(比掃描式多幾倍的)高壓電晶體
這次採用的方案現在看來是有點耗電,主要是因為74141滿老的,不如現今的IC來的省電的多,而且限定要用5V,如果能夠採用HV系列的IC的話,應該能夠改進不少電路上的複雜程度(5V升壓電路就不用了)以及面積(SSOP等等)還有焊接,但是成本會多一些出來。
另外就是Attiny的ISP如果可以改用SMD版應該更能縮小體積。

這就是目前使用的solution,四組高壓開關 x 一個74141

至於code的部分(Code都在Github,需要copy的請左轉到那邊,我覺得用Sublime比較好看所以這邊Code用照片的)
Nixie在掃描的時候,需要先把前一個Nixie的陽極關掉,再切新的陰極設定,然後才能打開下一個的陽極,不然上一個Nixie的數字會影響到下一個,畫面就會霧霧的.
然後還有I2C slave的Code,我沒多做考慮把資料濃縮(畢竟只有0~10,實在是不需要一個int,但是也不想改了...)(10是關掉燈管,因為超出74141的範圍=>燈管關閉)
至於本體的Code....我還沒寫完所以留著等Update

還有一些側面照


當初應該多預留一點空間給模組的...
這次的另一個問題點在於兩張板子之間的連接方式,採用標準的2,54pin 厚度會太大,但是不採用的話卻難以維修,但是為了美觀還是直接焊接的方式,修改的空間在於改採1.27mm的pin,不僅面積上的縮減,也得以減少厚度,不知道升壓模組的變壓器塞不塞的下就是了。

顯示的東西這次除了基本的顯示時間以外,還有計時器、倒數、一些小動畫(波浪、亂數、依序)。

波浪
計時器
倒數計時
循序動畫

還有個溫濕度計的顯示,所以是22度C和67% RH ,但是溫溼度計會被慢慢加熱,大概會加熱到32度C,已經放在開關孔附近了竟然還會被影響到....
HDC1000的地方我layout的時候太靠近螺絲孔了,所以就上HTU21D

然後就是外殼設計,我認為我目前最缺的部分就是好的外殼了,第一個的時鐘就是缺少好看的外殼,還有方便安裝的設計。這次多虧黃傑幫我畫這個的外殼,基本上是個上開的盒子,然後側邊有開幾個USB,還有開關孔。

這樣一來就不容易碰到180V然後被電到了....這時候就順便提一下第一版發生的事情
原本第一版的設計系統電壓是5V,想說應該要監控電池電壓,就"直接"把電池接上Analog input,然後做完測試完之後,把5V開關關掉,然後就直接摸到180V輸出的路線
結果被電到才發現怎麼關不掉5V,結果才發現是Analog input 的鋰電池電壓從Atmega328內建的保護二極體倒灌回去VCC,然後升壓板就繼續工作了..現在想起來第一版的電源供應設計真的是很奇怪,開關應該接電池才對.不過第二版做完之後外殼還沒做完之前也是被電到了幾次.現在不要摸到真空管底下的接線應該都還好.

另外就是因為這個真空管的顯示方向是正上方,如果直接擺放的話其實不是很好看,所以還有做一個底座,另外就是原先有打算說把Qi的充電模組做進去底座+時鐘,但是想想用金屬接點就好,就像是Sony防水手機的充電接點差不多,這樣一來其實就夠方便,反正這個的充電電流不大(受限於200mah的鋰電池)應該是夠用,不過要先找到合適的接點先。

另外就是PCB+軟體我就丟Github了
https://github.com/will127534/IN-17-Portable-Clock

TODO:
1.FM搞定
2.加WIFI
3.充電接點

=========================UPDATE 2015/07/18

首先是來講一下FM,一句話就是FM耗電量太高,
在這個Project當中要加入FM需要三樣東西,FM模組,LNA,放大器

FM的天線畢竟用外接的會太醜,而數公尺的電線擠進去效果也非常差,天線的方面我後來改用SMD的版本,結果即使是用SMD天線,效果也是非常差,只好再加一個無線電的放大電路
效果就非常不錯了,但是喇叭還是需要一個驅動器,結果加上去之後測到耗電量
就發現這一組下來爆衝60mA,太高了,只好移除掉這功能

充電接點倒是進展不錯,利用第一次Layout的時候的底板當作彈簧針的基板
配合外殼挖孔並且在背後固定兩片黃銅片,最後接上USB電源的輸入那邊就結束了
只是說彈簧針的彈力還是需要些調整...

下次做的話可能就希望連同USB也能夠用彈簧針吧.


Wifi的話...因為耗電量,可能的方向改成BLE

TODO:
ADD BLE






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);
}



}


2014年11月2日 星期日

IV-18 真空管時鐘 beta2.0

總之這是第二版的試做,這是大概50%的beta版,主要是IV-18的holder加上他所需要的升壓板
這次我加了一個Attiny44來控制MAX6921,專門拿來掃描,這樣一來Arduino就不需要一直去掃描,使得程式速度不一樣而影響到亮度,
所以這次Holder就多了兩個IC,Attiny+MAX6921
不過下次應該還會再做一次,把升壓模組也放上去,因為空間還滿大的,不用白不用
另外就是應該有人發現了,這真空管亮度有點問題,這主要是燈絲的電壓造成的,我一來電阻搞太大,二來這又是用直流電,所以就悲劇了.下一版會用一個MAX628做燈絲電源的極性切換

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的大小,原先要用的是 比較小的版本,但是通常外面都不好買,所以下次要改成兩種版本都能用的
第三就是那個耳機接頭,真的___難搞,下次應該要把耳機接頭腳位也留在上面的
第四我還在考慮的就是要不要把正負電壓產生器也放上去,可能要先量一下整機的耗電量再來看吧

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年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就失敗了