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

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,但是感覺各種問題啊....