2014年5月31日 星期六

WS2812b 立方體LED

 把之前的立方體和Arduino mini pro焊接在一張洞洞板上,這樣看起來就比較像是個成品
我原本想要用露天找到的Attiny85迷你開發版控制的,但是想到attiny85的code size只能有6K
還是把Arduino mini pro 放上去,可能之後加幾個按鈕或是電容觸控之類的吧,不然只用了一個pin腳有點大材小用的感覺.

Arduino mini pro 焊接在背面,另外就是把一個1000uf的電容和供電並連
還有用一個470歐姆的SMD電阻串聯在Data pin上面,
  
另外就是這個mini pro 是我在Sparkfun的Arduino Day買回來的XD
五張Arduino平均下來一張120元,根本掏寶價,不買可惜阿,我現在後悔沒再買一個原廠的UNO

喔還有一點.....這Arduino mini pro 的PCB本來就那麼薄嗎...........

喔喔還有第二點,如果仔細看的話會發現有一個jumpper,那是新增的功能,可以把板子上的LDO disable掉,免得不用的時候Sleep mode會增加耗電,

喔喔喔還有第三點,Arduino pro 的headder不是UNO R3版的,所以比起來少了幾個pin角,我原本是想要用來替換IV-18 clock的UNO,但是RTC用到SDA SCL(不是接在A4 A5)所以現在還在想要不要接跳線過去(這樣有點醜...),但也因為少了幾個pin,螺絲可以直接鎖上去沒問題,看起來超棒的

最後一點就是,大陸製和美國製的差異最大的地方是那個焊點.......真的有差欸


=====Update=====
我最後在電路加上了一個VR然後用來控制LED的亮度,還有一個Li-ion的充電IC,以及一個USB mini充電孔
整個電路板

充電IC區塊

USB mini 充電孔,我第一次焊接的時候只有接兩個焊點結果一拔就裂了...
最後是乾脆把整殼周圍通通焊接起來

Serial BLE 低功耗螢幕 prototype

 總之是把之前的零件直接焊接在一起,體積可以小一點"看起來"比較像個成品XDDD

不過只有正面像,背面就.....
阿對了,這個鋰電池是1000mah的,拿來測試電池使用時間,我有貼標籤在上面
下一版應該會把Arduino FUSE的BOD改成off,這樣就可以改用CR2032了

2014年5月16日 星期五

Bluetooth Low Energy on Raspberry Pi using Python

之前做的Arduino BLE X Sharp Memory LCD的Display原先溝通是靠主模組去做BLE的連接,我再用一個UART連上主模組丟資料給他
做完是做完了,但是手上唯一一個UART轉USB模組我還需要用阿...總不能一直接在上面,同時無線氣象站Ver 3.0已經把Raspberry pi上面唯一一個UART佔用掉了.
想起來以前曾經買過Blutooth 4.0的USB接收器,剛好發現它可以接收BLE的資料(不是每個4.0都可以收BLE的),所以決定想辦法靠這個把RPI和BLE接起來

於是本文開始~
基本上用的程式語言是Python,用的是http://www.elinux.org/RPi_Bluetooth_LE,BLEPY的library
我需要模組的UART TX的功能
從Datasheet上面可以看到
UART TX的Service UUID為:0000ffe5-0000-1000-8000-00805f9b34fb
 Characteristic UUID為:0000ffe9-0000-1000-8000-00805f9b34fb
基本上設定流程如下:
先用sudo hcitool lescan找BLE裝置

在來就是程式中
p = Peripheral("C4:ED:BA:63:63:53")
先連接上BLE裝置
SERVER = UUID("%08X-0000-1000-8000-00805f9b34fb" % (0x0000ffe5))
CAR = UUID("%08X-0000-1000-8000-00805f9b34fb" % (0x0000ffe9))
再來預先把UUID準備好

p.getServices()
把Service清單拿到
service = p.getServiceByUUID(SERVER)
用UUID開Service
p.getCharacteristics()
拿 Characteristic的清單
ctrl = service.getCharacteristics(CAR) [0]
用UUID開Characteristic

最後用ctrl.write(data)送出資料

顆顆顆,我的模組一次送20byte,更新一個畫面大概40個byte剛剛好

然後有點悲劇的是我已經去露天買了UART轉USB了....
往好處想,我原本的UART轉USB沒有3.3V輸出可以用,這樣可以一個5V一個3.3V了

2014年5月11日 星期日

Bluetooth Low Energy X Sharp Memory LCD with Arduino

線超級亂.....
把玩極低功耗的LCD之後,覺得該拿去做個什麼東西,腦袋一轉,想起來我幾個月前有買過一組BLE UART的模組,於是打算做一個低功耗的無線Serial螢幕

除了上次的Arduino+Sharp Memory LCD以外,另外加入BLE模組
不過這個模組不像仿間的那種只有TX-RX的,而是帶有待機模式的模組,我可以利用他的Pin喚醒Arduino,這樣我就可以在等待下一個資料前保持待機的狀態,而BLE也可以在極低功耗下維持連線.
Arduino端基本上是把UART收到的東西原封不動地丟到LCD上,好處就是我想改畫面的時候動主機端就好,但是缺點就是沒辦法搞圖出來像是天氣圖的符號,而受限於ASCII
最後是我寫了一個Python程式每五秒鐘讓它顯示PC的CPU使用率以及記憶體使用率
心血來潮加個LTC匯率試試
Code:
Python (主機端):
import serial
import time
import psutil
import json
import requests
s = serial.Serial('COM4', 115200)




while 1:
    try:
        r = requests.get('https://btc-e.com/api/2/ltc_usd/ticker')
        c = json.loads(r.text)
    except:
        print("error")
        pass
    CPU = psutil.cpu_percent(interval=1)
    print(CPU)
    m = psutil.virtual_memory()
    price = c['ticker']['buy']
    String = "CPU :\n" + str(CPU)+"%" +"\nRam :\n"+str(m.percent) +"%\n"+"LTC:\n"+str("%.2f" % price)+"USD"
    print(String)
 
    s.write(String)
    time.sleep(5)


s.close()


UPDATE:
我跑了一整晚之後,發現他竟然有殘影惹.....回頭去翻Datasheet,上面有說到這麼一段話:
Sharp recommends keeping maximum time between
VCOM toggles to no more than one second, and
refreshing data every two hours, to prevent stuck pixels.
沒仔細看Datasheet哭哭喔

結果靠著黑白黑白這樣閃,總算是救回來了...(吧
趕快補上每秒reflash的code,希望不會再發生了
最後就是我需要想個辦法量測耗電量....BLE脈衝性的我用電表量不准阿...囧
阿還有就是我需要把SS換個腳位,不然一直閃LED會耗電


UPDATE:測試耗電量
由於脈衝性的耗電量,理論上是要用示波器去看波形啦....
但是我沒有示波器可以用,所以只好拿Arduino佔當我的示波器,
首先測試Arduino的UART+ADC的速度,測試傳送一千次後,總共花了265ms
所以最快間隔就是0.265ms

再來就是讀資料的部分,我在BLE裝置上串了一個10歐姆的電阻,再用OPA放大11倍讀取電壓
,利用Python的程式把資料抓到.txt檔案裡,最後丟到excel分析

分析結果就是

  1. 接收一個Frame 平均電流 6.381mA 耗時85.065ms
  2. Reflesh畫面        平均電流 9.053mA 耗時1.855ms
  3. BLE一個連線週期 平均電流 6.772mA 耗時2.12ms
  4. 待機  平均電流0.0325mA
用以上結果當中的BLE連週期,和原廠的資料(0.41mA(電表),0.0243mA(積分))落差有點大阿...
雖然時間上差不多(2.25ms)
總結的耗電量是0.487mA,但是感覺各種問題啊....

2014年5月10日 星期六

IV-18 Arduino 改裝


改進目標:

  1. 時間準確度,我很懶得校時,而且室內GPS收訊不好
  2. 晚上可以關掉
所以在不大量更動設計的狀況下,解決方法:

  1. 把手邊的DS32KHZ接上DS1307,這樣一來,在不更動變成DS3231的狀況下可以有接近的準確度
  2. 增加一個光感應器
增加DS32KHZ倒是挺簡單的,轉接版剛好放在電池的底下,把線拉一拉就解決了
反而是增加感應器麻煩了不少

基本上光感應器用一個光敏電阻一下子就解決了,但是我找遍了裝零件的盒子都沒找到....
唯一一個光感應器的是Ti的OPT101,只是為了關燈就用這個未免也太好野人所以沒有東西可以用惹,也不想為了一個零件就跑一趟光華或啥的

這時候突然想起來,以前曾經看過有人用LED當光感應器的,於是上網看一下資料,就把一個10mm的LED(越大讀取的值也越大),長的接analogpin A0,短的接GND,直接當作一個光感應器用

於是VFD Clock修改版完成


P.S 電感換成Pansonic的超質感電感


======Update======
經過多天的嘗試之後,我認定LED光度計實在不是很穩定,所以還是找了一個光敏電阻來....
然後把程式寫成這樣:
if(analogRead(A0)>55){
    flag =1;
}
while (flag){
  delay(100);
  if(analogRead(A0)<45){
        flag =0;
  }
如果設成
if(analogRead(A0)>55){
  delay(100);
}
當讀數在55左右的時候就會一直閃阿閃的,有點糟糕


2014年5月9日 星期五

Sharp memory display boosterpack with Arduino

 前陣子Ti特價這東西50%,從20USD直接砍到10USD,單買螢幕都不止這價錢了,立馬訂了一個
這東西個特點就是極低低低耗電量,基本上可以靠電容撐一段時間.
上圖是接Ti的Launchpad測試,這螢幕給我的感覺就像是一個可程式化的鏡子一樣XD
可視角到是還好,但是顯示效果絕對是很棒

再來就接上Arduino,利用Adfruit_GFX和這螢幕的Libary,只是需要把DISP也接上高電位才會動作
接線:
SCK ==>10
MOSI ==>11
SS(CS)==>13
DISP==>拉高

完全不接上電源XD,光靠板子上的0.1uF就可以撐2~3min

2014年5月7日 星期三

IN-14 Breakout

不知道我這個暑假有沒有辦法做完八管Nixie tube,完成世界線變動儀



2014年5月2日 星期五

Wii Nunchuk 轉接版

總之這是一張超小的Wii Nunchuk 轉接版,至於為啥自己做?
當然是因為自己做比那些賣120元的便宜太多了