前言:
日前從網路上購得9軸感應器GY-80, 搭配TI MSP430 Launchpad寫有關重力加速度計ADXL345程式下去實測. 若有不周,歡迎批評指教,缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落, 不必交代出處.程式碼的部分是參考網路上arduino的程式改寫成適合MSP430跑的程式,用CCSv6編譯而成,所以相關著作權法律的問題請注意一下!
說明:
高中物理教的靜止狀態下_重力加速度約1g, GY-80板子背後標示X-Y-Z軸方向就是ADXL345的X-Y-Z軸的方向. 加速計能測各種使板子產生加速度的力,含靜止時只受重力. 等下介紹靜止狀態下, 3軸各別只有單一軸受到重力量到的值, 板子測法跟上一篇介紹的一樣.
本板使用i2c通訊:
Vcc(3.3V接launchpad的pin1),
GND(接launchpad的pinpin20 GND),
SCL(接launchpad的P1.6),
SDA(接launchpad的P1.7).
讀值採16bit的2的補數, 程式中直接將X軸,Y軸,Z軸讀值16bit每個bit都秀在HW uart(9600bps)那邊,1分鐘讀一次, 16bit的數值(單位:LSB)依2的補數還原成10進位的數字(不會算的可以用小算盤來算)後還要乘上4mg/LSB(單位:毫g,10的負三次方g),實際測試數據如下:
只有z軸受力(單位:g,所以正常值應該接近1):
1111111111101011 1111111111110010 00000000 11011000
x y(-14*4/1000=-0.056g) z(216*4/1000=0.864g)
----------------------------------------------------------------------------------------
只有y軸受力(單位:g,所以正常值應該接近1):
0000000000000010 0000000011110100 1111111111011000
x y(244*4/1000=0.976g) z(-40*4/1000=-0.16g)
----------------------------------------------------------------------------------------
只有x軸受力(單位:g,所以正常值應該接近1):
0000000100000000 1111111111101000 1111111111100111
x(256*4/1000=1.024g) y(-24*4/1000=-0.096g) z
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9ceHdYSGZYMkF4dkU/view?usp=sharing
2014年11月16日 星期日
2014年10月19日 星期日
Acer Iconia Tab B1-A71重力感應器校正
前言:
最近聽到有人在study 9軸感應器(陀螺儀+加速計+磁力計),也想弄一個來玩玩看!目前先研究手邊剛好有的東西(Acer Iconia Tab B1-A71), 寫程式下去查的結果,這台只有G-sensor(重力感應器或稱加速計). 若有不周,歡迎批評指教,缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落, 不必交代出處.不過程式碼的部分是拿網路上某人寫的Android sample code而寫成的,所以相關著作權法律的問題請注意一下!
過程:
在網上有看到一篇Acer在澳洲官網的技術支援網頁刊登如何校正Iconia Tab B1-A71的重力感應器, 試了一下ok, 步驟如下:
1.設定->關於平板電腦,
2.點一下"裝置資訊",
3.在"重力感應器驅動程式版本"上連續點10下(就是一直點到畫面變到下一張圖為止),
高中物理教的重力加速度約9.8m/s^2(平方表示為^2,就是米/秒的平方),面板就是X-Y軸構成的平面, Z軸是X軸跟Y軸的向量外積(X close Y)後的方向. 加速計能測各種使平板產生加速度的力,含靜止時只受重力.底下示範靜止受重力, 3軸量到的值,下圖表示左手提著平板,在Y軸方向受到一個重力,在X軸跟Z軸沒受到任何重力, 所以得到Y值就是9.8 m/s^2, 其他兩軸約為0 m/s^2.
將平板平放在桌面則會讓平板的Z軸受到重力,在X軸跟Y軸方向不會受到任何重力,所以Z值就是9.8 m/s^2, X值跟Y值就是0 m/s^2,
所以如果從平板螢幕的四個角落用手指捏著,讓平板自然垂落,這時X軸跟Y軸自然受到重力在這兩個方向的分量, X跟Y的值都小於9.8 m/s^2, Z軸因為沒受到任何重力,所以Z值為0 m/s^2.
這邊再附上寫程式去測平板上有哪些sensor的實測畫面:
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9cekJiWlZEblBqc2M/view?usp=sharing
最近聽到有人在study 9軸感應器(陀螺儀+加速計+磁力計),也想弄一個來玩玩看!目前先研究手邊剛好有的東西(Acer Iconia Tab B1-A71), 寫程式下去查的結果,這台只有G-sensor(重力感應器或稱加速計). 若有不周,歡迎批評指教,缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落, 不必交代出處.不過程式碼的部分是拿網路上某人寫的Android sample code而寫成的,所以相關著作權法律的問題請注意一下!
過程:
在網上有看到一篇Acer在澳洲官網的技術支援網頁刊登如何校正Iconia Tab B1-A71的重力感應器, 試了一下ok, 步驟如下:
1.設定->關於平板電腦,
2.點一下"裝置資訊",
3.在"重力感應器驅動程式版本"上連續點10下(就是一直點到畫面變到下一張圖為止),
4.按下"重力校準"依照指示開始校正,
說明:高中物理教的重力加速度約9.8m/s^2(平方表示為^2,就是米/秒的平方),面板就是X-Y軸構成的平面, Z軸是X軸跟Y軸的向量外積(X close Y)後的方向. 加速計能測各種使平板產生加速度的力,含靜止時只受重力.底下示範靜止受重力, 3軸量到的值,下圖表示左手提著平板,在Y軸方向受到一個重力,在X軸跟Z軸沒受到任何重力, 所以得到Y值就是9.8 m/s^2, 其他兩軸約為0 m/s^2.
同理可證,照下圖這種拿法,在X軸受到一個重力,在Y軸跟Z軸方向沒有受到任何重力,所以X值就是9.8 m/s^2, Y值跟Z值都是0 m/s^2,
所以如果從平板螢幕的四個角落用手指捏著,讓平板自然垂落,這時X軸跟Y軸自然受到重力在這兩個方向的分量, X跟Y的值都小於9.8 m/s^2, Z軸因為沒受到任何重力,所以Z值為0 m/s^2.
這邊再附上寫程式去測平板上有哪些sensor的實測畫面:
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9cekJiWlZEblBqc2M/view?usp=sharing
2014年9月4日 星期四
RFID project第二彈_RTC時鐘(下) Tiny RTC DS1307 with MSP430G2553
前言:
本篇是RFID project第二彈的下集, 主要介紹的是RTC時鐘 DS1307, 若有不周,歡迎批評指教,缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落, 不必交代出處.不過程式碼的部分是拿TI官網找到的usci i2c master Library sample code並參考某網站EEPROM sample code的HW uart部分而寫成的,所以相關著作權法律的問題請注意一下!
過程:
其實一開始拿到的是DS1307,還沒coding之前先上網調查一下這塊板子如何使用,結果發現Vcc是接5V,更有網友提問使用此板跟msp430 i2c溝通有問題,參考某網友的改板電路圖後, 決定要將SDA,SCL的pull-up(3.55V)灌電壓的地方跟DS1307 pin8(Vcc:灌5V)斷開來,因為鈕扣電池座擋到太多trace就算對照schematics拿電表量還是出錯,割錯地方,改板圖請參考圖1. 板子改好之後,
開始coding, 一直不成功, 開始懷疑到板子身上,有可能晶振不振(R7沒焊),也有可能ic壞了, 也有可能pull-up電阻不夠大(一般用4.7k,板上才3.3k), 總之很想去買USB示波器來一探究竟!
082214重大突破:
晚上拿昨天試成功的pcf8563 code來改給ds1307用,結果竟然成功了?!但是更詭異的是ds1307的Vcc灌3.55V(out of spec.)也能工作?!只是有的時候會掉秒而已(大概1分鐘掉個2~3秒), 後來發現Vcc接5V也是掉秒!所以更本不用改板子??? 上網查了一下,關於Vbat跟Vcc接多少電壓的原則如下,只要遵守一定能work:
a.SDA,SCL pull-up voltage must be 3.55Volt(msp430 mcu vcc),
b.ds1307 Vcc > 1.25*Vbat, even Vcc out of spec.(4.5V~5.5V),
1.msp430g2553板子上面的J5 P1.6 jumper拿掉, P1.6當SCL,P1.7當SDA, J3調成HW UART,
2.兩塊板子的Vcc,GND,SDA,SCL互相接在一起,
3.程式用CCSv6編譯, rtc先將目前時間日期寫值進去, 再讀出來, 透過uart秀到PC螢幕上,也就是CCSv6內建陽春版的超級終端機, 最後用while-loop 每秒秀一次時間日期(秒:分:時 星期幾 日-月-年),master Library裡面的TI_USCI_I2C_slave_present();拿掉UCTXSTP,因為跟TX_ISR重複!
->083114更新:發現要改start-up delay需加debug msg(uart印0x0D),
090214更新:上電後只需按msp430板子上的reset按鈕就可達到start-up delay幫助ds1307通電後需要一段時間來ready,
改板圖:
接線圖:
成果圖:
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9cRkNOX3l1dk5XZDg/edit?usp=sharing
090814更新:
程式新增DS1307這塊板子上的一顆EEPROM(AT24C32 4KB)的read and write功能,注意write完之後要馬上讀資料的話要delay一段時間,才能接著讀值,
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9cX2k4c3RJb29PcGc/edit?usp=sharing
本篇是RFID project第二彈的下集, 主要介紹的是RTC時鐘 DS1307, 若有不周,歡迎批評指教,缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落, 不必交代出處.不過程式碼的部分是拿TI官網找到的usci i2c master Library sample code並參考某網站EEPROM sample code的HW uart部分而寫成的,所以相關著作權法律的問題請注意一下!
過程:
其實一開始拿到的是DS1307,還沒coding之前先上網調查一下這塊板子如何使用,結果發現Vcc是接5V,更有網友提問使用此板跟msp430 i2c溝通有問題,參考某網友的改板電路圖後, 決定要將SDA,SCL的pull-up(3.55V)灌電壓的地方跟DS1307 pin8(Vcc:灌5V)斷開來,因為鈕扣電池座擋到太多trace就算對照schematics拿電表量還是出錯,割錯地方,改板圖請參考圖1. 板子改好之後,
開始coding, 一直不成功, 開始懷疑到板子身上,有可能晶振不振(R7沒焊),也有可能ic壞了, 也有可能pull-up電阻不夠大(一般用4.7k,板上才3.3k), 總之很想去買USB示波器來一探究竟!
082214重大突破:
晚上拿昨天試成功的pcf8563 code來改給ds1307用,結果竟然成功了?!但是更詭異的是ds1307的Vcc灌3.55V(out of spec.)也能工作?!只是有的時候會掉秒而已(大概1分鐘掉個2~3秒), 後來發現Vcc接5V也是掉秒!所以更本不用改板子??? 上網查了一下,關於Vbat跟Vcc接多少電壓的原則如下,只要遵守一定能work:
a.SDA,SCL pull-up voltage must be 3.55Volt(msp430 mcu vcc),
b.ds1307 Vcc > 1.25*Vbat, even Vcc out of spec.(4.5V~5.5V),
1.msp430g2553板子上面的J5 P1.6 jumper拿掉, P1.6當SCL,P1.7當SDA, J3調成HW UART,
2.兩塊板子的Vcc,GND,SDA,SCL互相接在一起,
3.程式用CCSv6編譯, rtc先將目前時間日期寫值進去, 再讀出來, 透過uart秀到PC螢幕上,也就是CCSv6內建陽春版的超級終端機, 最後用while-loop 每秒秀一次時間日期(秒:分:時 星期幾 日-月-年),master Library裡面的TI_USCI_I2C_slave_present();拿掉UCTXSTP,因為跟TX_ISR重複!
->083114更新:發現要改start-up delay需加debug msg(uart印0x0D),
090214更新:上電後只需按msp430板子上的reset按鈕就可達到start-up delay幫助ds1307通電後需要一段時間來ready,
改板圖:
接線圖:
成果圖:
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9cRkNOX3l1dk5XZDg/edit?usp=sharing
090814更新:
程式新增DS1307這塊板子上的一顆EEPROM(AT24C32 4KB)的read and write功能,注意write完之後要馬上讀資料的話要delay一段時間,才能接著讀值,
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9cX2k4c3RJb29PcGc/edit?usp=sharing
2014年8月21日 星期四
RFID project第二彈_RTC時鐘(上) NXP PCF8563 with MSP430G2553
前言:
繼上回gameduino牛刀小試後,這篇blog要介紹的是RTC時鐘 PCF8563, 若有不周,歡迎批評指教,缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落, 不必交代出處.不過程式碼的部分是拿TI官網找到的usci i2c master Library sample code並參考某網站EEPROM sample code的HW uart部分而寫成的,所以相關著作權法律的問題請注意一下!
過程:
起先板子買錯買成5V tiny rtc ds1307 for arduino,目前已改過板子改成可以3V用的,但是coding還是沒成功, 軟體方面一直受挫,就會懷疑到硬體上, 板子上還有一顆EEPROM 24C32不用改板,3V的msp430g2553也可用I2C跟它溝通, coding ok就證明msp430g2553在usci i2c介面是ok的, 衝動之下又去買了3V專用的rtc nxp pcf8563, 起先用EEPROM coding的方式不成功, 又改用usci i2c master Library coding方式也不成功, 想要用傳統的8051隨便找兩根GPIO pin來用軟體模擬硬體I2C的SDA,SCL訊號, 更差點衝動去買USBee示波器(邏輯分析儀), 有稍微check一下是否是硬體有問題(pull-up電阻雖只有1k,但是查datasheet Rpu公式後發現1k剛好,晶振也接地,晶振電路也ok,程式看的出來硬體並非完全都有問題). 因出差所以暫時放著兩天後, 看書提到msp430g2553 usci i2c 7-bits slave address的值就是看datasheet上面提到的slave address 7bits + R/W bit=1 byte, 整個 byte 右移1位就是msp430g2553在用的slave address, 先前被datasheet提到write就用0xA2, read就用0xA3給蒙蔽, 其實答案是:0xA2(或0xA3)>>1,果然改了之後就成功了!
1.msp430g2553板子上面的J5 P1.6 jumper拿掉, P1.6當SCL,P1.7當SDA, J3調成HW UART,
2.兩塊板子的Vcc,GND,SDA,SCL互相接在一起,
3.程式用CCSv6編譯, rtc先將目前時間日期寫值進去, 再讀出來, 透過uart秀到PC螢幕上,也就是CCSv6內建陽春版的超級終端機, 最後用while-loop 每秒秀一次時間日期(秒:分:時 星期幾 日-月-年),master Library裡面的TI_USCI_I2C_slave_present();拿掉UCTXSTP,因為跟TX_ISR重複!
->083014更新:加入start-up delay幫助pcf8563通電後需要一段時間來ready,新發現:pcf8563會掉秒!
接線圖:
成果圖:
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9cclNvWHFlalNPYUE/edit?usp=sharing
繼上回gameduino牛刀小試後,這篇blog要介紹的是RTC時鐘 PCF8563, 若有不周,歡迎批評指教,缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落, 不必交代出處.不過程式碼的部分是拿TI官網找到的usci i2c master Library sample code並參考某網站EEPROM sample code的HW uart部分而寫成的,所以相關著作權法律的問題請注意一下!
過程:
起先板子買錯買成5V tiny rtc ds1307 for arduino,目前已改過板子改成可以3V用的,但是coding還是沒成功, 軟體方面一直受挫,就會懷疑到硬體上, 板子上還有一顆EEPROM 24C32不用改板,3V的msp430g2553也可用I2C跟它溝通, coding ok就證明msp430g2553在usci i2c介面是ok的, 衝動之下又去買了3V專用的rtc nxp pcf8563, 起先用EEPROM coding的方式不成功, 又改用usci i2c master Library coding方式也不成功, 想要用傳統的8051隨便找兩根GPIO pin來用軟體模擬硬體I2C的SDA,SCL訊號, 更差點衝動去買USBee示波器(邏輯分析儀), 有稍微check一下是否是硬體有問題(pull-up電阻雖只有1k,但是查datasheet Rpu公式後發現1k剛好,晶振也接地,晶振電路也ok,程式看的出來硬體並非完全都有問題). 因出差所以暫時放著兩天後, 看書提到msp430g2553 usci i2c 7-bits slave address的值就是看datasheet上面提到的slave address 7bits + R/W bit=1 byte, 整個 byte 右移1位就是msp430g2553在用的slave address, 先前被datasheet提到write就用0xA2, read就用0xA3給蒙蔽, 其實答案是:0xA2(或0xA3)>>1,果然改了之後就成功了!
1.msp430g2553板子上面的J5 P1.6 jumper拿掉, P1.6當SCL,P1.7當SDA, J3調成HW UART,
2.兩塊板子的Vcc,GND,SDA,SCL互相接在一起,
3.程式用CCSv6編譯, rtc先將目前時間日期寫值進去, 再讀出來, 透過uart秀到PC螢幕上,也就是CCSv6內建陽春版的超級終端機, 最後用while-loop 每秒秀一次時間日期(秒:分:時 星期幾 日-月-年),master Library裡面的TI_USCI_I2C_slave_present();拿掉UCTXSTP,因為跟TX_ISR重複!
->083014更新:加入start-up delay幫助pcf8563通電後需要一段時間來ready,新發現:pcf8563會掉秒!
接線圖:
https://drive.google.com/file/d/0B6EVEd5P2B9cclNvWHFlalNPYUE/edit?usp=sharing
2014年7月20日 星期日
TI Launchpad with Gameduino之牛刀小試
前言:
近日聽到有人提到需要一個rfid讀卡機+PC螢幕(秀一些資訊)+網路功能, 也想來自己做一個, 在此先想到秀螢幕這部分需求的一個solution, 其他功能的solution日後補上, 若有不周,歡迎批評指教,缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落, 不必交代出處.不過程式碼的部分是拿TI板子出廠前preload的demo src code並參考外國網站(google搜尋:launchpad gameduino)而做修改的,所以相關著作權法律的問題請注意一下!
過程:
8051想要接大大的電腦螢幕或液晶電視,不想接陽春LCM模組/LED跑馬燈/七段顯示器/7吋平板電腦/7吋觸控螢幕,又不想花大錢買ARM等級的晶片+linux或DVR板子,該怎麼辦?
survey的結果發現比較便宜的3種解法:
1.'gameduino',
2.picaso uVGA-III(功能更多,價錢更貴),
3.google搜尋8051 vga,照網友提供的做法diy(省更多錢但更費功夫),
這邊我採用的是1.'gameduino':
8051我是用TI launchpad(基本款),然後接gameduino,接法如下表:
p.s.下表所列英文字都是印在板子上的英文字)
launchpad gameduino
--------------------------------------------
VCC 3.3V,+5V
GND GND(有三處)
P2.0(CS) 9(CS)
P1.5(CLK) 13(CLK)
P1.6(LED2)_MISO 12(MISO)
P1.7(MOSI) 11(MOSI)
接線圖:
程式修改的部分:
1.原本出廠板子上會插msp430g2553的IC,裡頭已經預先燒錄程式在裡頭,插上PC端的USB孔,
通電後就會red,green兩個led輪流亮,按下P1.3的按鍵後進入"量溫度模式",量出的溫度是攝氏,
改成華氏,
2.preload程式採用SW UART跟gameduino的SPI介面共用一些launchpad系統資源,導致SW UART失效,所以先將此部分code mark掉,改用gameduino來秀溫度在螢幕畫面上.
3.量出的溫度為兩位數,十位數字跟個位數字分別轉成ascii秀在螢幕畫面上!
成果圖:
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9cQk1nWmh6R2t3a1E/edit?usp=sharing
8/3/2014 update:
經過修改launchpad preload程式的SMCLK_16MHz,除頻為4後, 再將PC端uart設定由原來的2400bps->9600bps,就可以在成果圖看到正確的結果, 另外一端PC端超級終端機也可以看到正確的溫度顯示!
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9cSjBXRmxpQ2FJU00/edit?usp=sharing
近日聽到有人提到需要一個rfid讀卡機+PC螢幕(秀一些資訊)+網路功能, 也想來自己做一個, 在此先想到秀螢幕這部分需求的一個solution, 其他功能的solution日後補上, 若有不周,歡迎批評指教,缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落, 不必交代出處.不過程式碼的部分是拿TI板子出廠前preload的demo src code並參考外國網站(google搜尋:launchpad gameduino)而做修改的,所以相關著作權法律的問題請注意一下!
過程:
8051想要接大大的電腦螢幕或液晶電視,不想接陽春LCM模組/LED跑馬燈/七段顯示器/7吋平板電腦/7吋觸控螢幕,又不想花大錢買ARM等級的晶片+linux或DVR板子,該怎麼辦?
survey的結果發現比較便宜的3種解法:
1.'gameduino',
2.picaso uVGA-III(功能更多,價錢更貴),
3.google搜尋8051 vga,照網友提供的做法diy(省更多錢但更費功夫),
這邊我採用的是1.'gameduino':
8051我是用TI launchpad(基本款),然後接gameduino,接法如下表:
p.s.下表所列英文字都是印在板子上的英文字)
launchpad gameduino
--------------------------------------------
VCC 3.3V,+5V
GND GND(有三處)
P2.0(CS) 9(CS)
P1.5(CLK) 13(CLK)
P1.6(LED2)_MISO 12(MISO)
P1.7(MOSI) 11(MOSI)
接線圖:
程式修改的部分:
1.原本出廠板子上會插msp430g2553的IC,裡頭已經預先燒錄程式在裡頭,插上PC端的USB孔,
通電後就會red,green兩個led輪流亮,按下P1.3的按鍵後進入"量溫度模式",量出的溫度是攝氏,
改成華氏,
2.preload程式採用SW UART跟gameduino的SPI介面共用一些launchpad系統資源,導致SW UART失效,所以先將此部分code mark掉,改用gameduino來秀溫度在螢幕畫面上.
3.量出的溫度為兩位數,十位數字跟個位數字分別轉成ascii秀在螢幕畫面上!
成果圖:
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9cQk1nWmh6R2t3a1E/edit?usp=sharing
8/3/2014 update:
經過修改launchpad preload程式的SMCLK_16MHz,除頻為4後, 再將PC端uart設定由原來的2400bps->9600bps,就可以在成果圖看到正確的結果, 另外一端PC端超級終端機也可以看到正確的溫度顯示!
所有程式碼下載連結:
https://drive.google.com/file/d/0B6EVEd5P2B9cSjBXRmxpQ2FJU00/edit?usp=sharing
2013年4月21日 星期日
android apps範例_Augment Reality(AR)擴增實境
前言:
上次那篇android apps範例_camera就是為了這篇AR(擴增實境)預做準備的, 剛剛完成prototype,
程式碼在Acer Iconia B1 A71上面測過是OK的,相關程式碼以及開發過程稍微整理一下就寫了這篇blog. 若有不周,歡迎批評指教, 缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落, 不必交代出處.不過程式碼的部分是參考日本網站(google搜尋NyARToolkit)而做修改的,拿android 1.0版的老舊程式改成android 4.2版的,所以相關著作權法律的問題請注意一下!
過程:
AR(Augment Reality_擴增實境)近來頗流行的, 就是用攝影機拍攝進來的畫面經過電腦解析後,
將有用的資訊用文字或圖像的方式結合原來實景, 秀在螢幕上, 本範例就是用camera將實景拍攝進來,偵測畫面範圍內是否有mark(標示物)存在,若有的話就以文字方式秀座標在畫面內, 然後整個秀在螢幕上!
所有程式碼下載連結:
https://docs.google.com/file/d/0B6EVEd5P2B9cNDctbHJCVGFwOGs/edit?usp=sharing
5/5/2013補充:
4月22日 (13 天以前)
-整理code改版的心路歷程:
1.首先拿到android1.0版的程式後,匯入eclipse內,補足缺少的部分(target android4.2 project 目錄tree結構跟android 1.0 project差異大),修正紅色打叉的部分,舊function不能用的,用新function替代掉,沒用到的就註解掉是最快的,
2.找到程式執行入口(C語言來說的話就是void main();),觀看整個flow,原先project是利用網路串流取得攝影機畫面,現在改成用Acer Iconia B1 A71本身的前置鏡頭,
->若能成功透過攝影機抓到畫面後,呼叫偵測的部分來偵測畫面範圍內是否出現mark,若出現則用OpenGL ES畫3D cube,這部分因為OpenGL ES也是舊版的,完全不適用,為了減少麻煩,這部分的程式暫時拿掉,改用秀'TEXT文字'取代,
3.build and then run,啥畫面都沒有,只好重頭檢查起,到底camera打開沒有?只好另闢camera專案來研究一下,詳情請見另一篇android apps範例_camera,
4.研究好之後將camera這部分的code套用進來,成功可以預覽畫面,接下來弄capture(Canvas canvas);就是將攝影機畫面抓進來,偵測mark是否存在,然後秀文字的這段,因為畫布canvas無法用holder.lockcanvas產生畫布的物件,所以改成畫布另外自己形成一個view用framelayout.addView的方式疊在camera preview那個view的上面,可以達到畫面合成的目的.
->原先在capture();內要做完畫畫布的動作改成capture();內只要偵測到mark,回傳mark所在位置座標給畫布view透過invalidate();呼叫畫布重繪onDraw();即可!
5.進到capture();內第一件事情就是抓畫面,抓畫面反應要一段時間,所以呼叫takePicture();後要等它一陣子(thread.sleep(500)),才能進行下一階段_偵測mark,
->偵測mark這部分程式沒動過保持原先的code,
->接下來是若偵測到mark要回傳座標,原先是想透過在capture();內呼叫畫布這個view的method(setresultf();)來達成,結果capture();內部無法建立畫布這個view的物件自然無從調用setresultf();只好叫capture();將座標回傳囉,
6.但是又發生setresultf();內無法直接呼叫invalidate叫view重繪(主程序中不能隨便改變view的內容),只好叫holder去處理handlemessage,抓到message來做處理時就可呼叫invalidate();
7.但是又發生setresultf();內部要用傳回message傳回view的物件時,傳回空的view物件,導致錯誤發生,將view這個字換成this就ok了,
->測試ok,偵測到mark就秀紅色座標在畫面上,其實mark也只認黑白相間的四方框,框內文字不一定是要Hiro,
p.s.本軟體使用方法->先去日本網站抓mark.jpg印出來,拿在鏡頭前面晃就會出現一排紅色文字顯示座標,
042713
1.接042213進度,準備利用秀出來的TEXT(座標)畫紅色正方形外框框住mark->failed!因為那根本不是被偵測到的mark的四個頂點座標,而是座標變換矩陣,
->x,y,z 3d座標加上oritation(轉向),是專門餵給OpenGL ES的東西,所以現在直接跳過2D紅框,直接做OpenGL ES,等以後有空再來搞自己的2D偵測引擎,
->弄openGL ES前,先實驗一下,靜態固定座標秀3D 旋轉cube,發現被蓋掉一半,雖然程式是把openGL那層surfaceView疊加到camera preview之上,
042813
1.若只要2D->追code,轉換成opengl座標之前的座標是多少?<-failed!
2.另外一個TEXT mode未傳出的變數是誰?<-這招沒效,還是要去看src或官網,
3.做簡單openGL實驗(原點或是矩陣的影響力多大)<-亂try也不是辦法,還是上網去查openGL繪圖原理比較實在一點,
->昨晚弄3d的弄不出,只好回歸2d,可是座標頂點又弄不出來,
src code,官網(似乎openGL以原點為準,其他都是靠'定點座標'乘上'投影矩陣'或是'MODELVIEW'矩陣?
->先看書(有起始原點,再對照定點座標頂點,是否有乘上其他矩陣就不得而知了),再對照AR原始code有關openGL那段,
->看來還是要先玩會簡單的openGL例子再說了...
->next:
1.做簡單openGL實驗(原點或是矩陣的影響力多大),上網查openGL繪圖原理,
2.解決如何將camera的preview(surfaceView)跟openGL ES(surfaceView)疊在一起?
050113突破_成功疊兩層:
原因在一個異想不到的地方"glView.setEGLConfigChooser(8,8,8,8,16,0);",
050413
1.弄到能將float[16] arp,跟float[16] resultf都能從capture();內傳出來,
- a.先畫固定的cube,
- b.畫出正確位置的cube(站在mark上面),
050513
下午完成a,b兩部分,又微調了一下(mark size跟調整螢幕為橫向),詳細的調整去看華盛頓網站,
p.s.Cube站的位置跟實際的mark所在處仍有些微差距,
所有程式碼下載連結(OpenGL ES版):
https://docs.google.com/file/d/0B6EVEd5P2B9cMVJjTF82WE1wcVE/edit?usp=sharing
上次那篇android apps範例_camera就是為了這篇AR(擴增實境)預做準備的, 剛剛完成prototype,
程式碼在Acer Iconia B1 A71上面測過是OK的,相關程式碼以及開發過程稍微整理一下就寫了這篇blog. 若有不周,歡迎批評指教, 缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落, 不必交代出處.不過程式碼的部分是參考日本網站(google搜尋NyARToolkit)而做修改的,拿android 1.0版的老舊程式改成android 4.2版的,所以相關著作權法律的問題請注意一下!
過程:
AR(Augment Reality_擴增實境)近來頗流行的, 就是用攝影機拍攝進來的畫面經過電腦解析後,
將有用的資訊用文字或圖像的方式結合原來實景, 秀在螢幕上, 本範例就是用camera將實景拍攝進來,偵測畫面範圍內是否有mark(標示物)存在,若有的話就以文字方式秀座標在畫面內, 然後整個秀在螢幕上!
所有程式碼下載連結:
https://docs.google.com/file/d/0B6EVEd5P2B9cNDctbHJCVGFwOGs/edit?usp=sharing
5/5/2013補充:
4月22日 (13 天以前)
-整理code改版的心路歷程:
1.首先拿到android1.0版的程式後,匯入eclipse內,補足缺少的部分(target android4.2 project 目錄tree結構跟android 1.0 project差異大),修正紅色打叉的部分,舊function不能用的,用新function替代掉,沒用到的就註解掉是最快的,
2.找到程式執行入口(C語言來說的話就是void main();),觀看整個flow,原先project是利用網路串流取得攝影機畫面,現在改成用Acer Iconia B1 A71本身的前置鏡頭,
->若能成功透過攝影機抓到畫面後,呼叫偵測的部分來偵測畫面範圍內是否出現mark,若出現則用OpenGL ES畫3D cube,這部分因為OpenGL ES也是舊版的,完全不適用,為了減少麻煩,這部分的程式暫時拿掉,改用秀'TEXT文字'取代,
3.build and then run,啥畫面都沒有,只好重頭檢查起,到底camera打開沒有?只好另闢camera專案來研究一下,詳情請見另一篇android apps範例_camera,
4.研究好之後將camera這部分的code套用進來,成功可以預覽畫面,接下來弄capture(Canvas canvas);就是將攝影機畫面抓進來,偵測mark是否存在,然後秀文字的這段,因為畫布canvas無法用holder.lockcanvas產生畫布的物件,所以改成畫布另外自己形成一個view用framelayout.addView的方式疊在camera preview那個view的上面,可以達到畫面合成的目的.
->原先在capture();內要做完畫畫布的動作改成capture();內只要偵測到mark,回傳mark所在位置座標給畫布view透過invalidate();呼叫畫布重繪onDraw();即可!
5.進到capture();內第一件事情就是抓畫面,抓畫面反應要一段時間,所以呼叫takePicture();後要等它一陣子(thread.sleep(500)),才能進行下一階段_偵測mark,
->偵測mark這部分程式沒動過保持原先的code,
->接下來是若偵測到mark要回傳座標,原先是想透過在capture();內呼叫畫布這個view的method(setresultf();)來達成,結果capture();內部無法建立畫布這個view的物件自然無從調用setresultf();只好叫capture();將座標回傳囉,
6.但是又發生setresultf();內無法直接呼叫invalidate叫view重繪(主程序中不能隨便改變view的內容),只好叫holder去處理handlemessage,抓到message來做處理時就可呼叫invalidate();
7.但是又發生setresultf();內部要用傳回message傳回view的物件時,傳回空的view物件,導致錯誤發生,將view這個字換成this就ok了,
->測試ok,偵測到mark就秀紅色座標在畫面上,其實mark也只認黑白相間的四方框,框內文字不一定是要Hiro,
p.s.本軟體使用方法->先去日本網站抓mark.jpg印出來,拿在鏡頭前面晃就會出現一排紅色文字顯示座標,
042713
1.接042213進度,準備利用秀出來的TEXT(座標)畫紅色正方形外框框住mark->failed!因為那根本不是被偵測到的mark的四個頂點座標,而是座標變換矩陣,
->x,y,z 3d座標加上oritation(轉向),是專門餵給OpenGL ES的東西,所以現在直接跳過2D紅框,直接做OpenGL ES,等以後有空再來搞自己的2D偵測引擎,
->弄openGL ES前,先實驗一下,靜態固定座標秀3D 旋轉cube,發現被蓋掉一半,雖然程式是把openGL那層surfaceView疊加到camera preview之上,
042813
1.若只要2D->追code,轉換成opengl座標之前的座標是多少?<-failed!
2.另外一個TEXT mode未傳出的變數是誰?<-這招沒效,還是要去看src或官網,
3.做簡單openGL實驗(原點或是矩陣的影響力多大)<-亂try也不是辦法,還是上網去查openGL繪圖原理比較實在一點,
->昨晚弄3d的弄不出,只好回歸2d,可是座標頂點又弄不出來,
src code,官網(似乎openGL以原點為準,其他都是靠'定點座標'乘上'投影矩陣'或是'MODELVIEW'矩陣?
->先看書(有起始原點,再對照定點座標頂點,是否有乘上其他矩陣就不得而知了),再對照AR原始code有關openGL那段,
->看來還是要先玩會簡單的openGL例子再說了...
->next:
1.做簡單openGL實驗(原點或是矩陣的影響力多大),上網查openGL繪圖原理,
2.解決如何將camera的preview(surfaceView)跟openGL ES(surfaceView)疊在一起?
050113突破_成功疊兩層:
原因在一個異想不到的地方"glView.setEGLConfigChooser(8,8,8,8,16,0);",
050413
1.弄到能將float[16] arp,跟float[16] resultf都能從capture();內傳出來,
- a.先畫固定的cube,
- b.畫出正確位置的cube(站在mark上面),
050513
下午完成a,b兩部分,又微調了一下(mark size跟調整螢幕為橫向),詳細的調整去看華盛頓網站,
p.s.Cube站的位置跟實際的mark所在處仍有些微差距,
所有程式碼下載連結(OpenGL ES版):
https://docs.google.com/file/d/0B6EVEd5P2B9cMVJjTF82WE1wcVE/edit?usp=sharing
2013年4月13日 星期六
android apps範例_camera
前言:
最近為了某種需要,前置作業必須打通camera這道關卡,程式碼在Acer Iconia B1 A71上面測過是OK的,相關程式碼以及開發過程稍微整理一下就寫了這篇blog. 若有不周,歡迎批評指教, 缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落&程式碼, 不必交代出處.
過程:
想要寫個android apps去開啟裝置本身的鏡頭, 以Acer Iconia B1 A71這個裝置來講, 它的鏡頭就只有一個:前置鏡頭(front-facing,自拍用,視訊會議用,用來拍自己的臉,鏡頭就跟螢幕在同一面,在背面的就叫後置鏡頭back-facing).
首先要搞清楚到底要用哪個鏡頭. 單單寫一行Camera.open();是不行的. 起初就是天真的整個拿書本上的例子來編譯執行,結果畫面空空如也,看不到預覽畫面,去看debug error,不斷的出現startpreview()或setpreviewdisplay(holder) nullpointexception, 換個例子try, 結果使用呼叫系統內建camera apps,竟然成功?!然後開始懷疑acer那台只允許透過呼叫系統內建的去打開camera.
打開camera有兩種方式一種是透過呼叫系統內建的camera介面(android系統的,在螢幕_應用程式集打開就會看到'照相機'),另外一種就是等會介紹的先建立一個Camera物件,然後開始預覽startpreview,用takepicture來拍照,
隔天不甘心去官網看,照著10個步驟去做還是不行,最後檢查到第一個步驟建立Camera物件,然後Camera.open(),他老兄竟然沒open,得到null,叫它怎麼繼續做底下的事情?!最後程式寫麻煩一點, 去掃一遍裝置底下到底有幾個鏡頭,每個的代號是多少, 打開那個front-facing的鏡頭就ok了!
拍照的步驟:
1.建立Camera物件(Camera.open();),詳細的code請參考底下網址.
2.得到目前鏡頭一些設定值(preview畫面的長寬)->getParameters();
3.必要的話可以用 setParameters(Camera.Parameters);來修改設定值,
4.也可呼叫 setDisplayOrientation(int);來改變螢幕畫面的方向,
5.想要有預覽畫面要先 setPreviewDisplay(SurfaceHolder).
6.然後呼叫 startPreview() 開始預覽.
7.想要真正的拍照時,呼叫 mCamera.takePicture(null, null, mPicture); 第三個參數是callback function會幫你處理後續的動作,被鏡頭抓進來的這個frame做何處理之類的,本例是將她轉成bitmap秀在imageView的區域內,若你想額外存檔也行.
8.拍照後,預覽畫面就停格了,再呼叫一次 startPreview() 就可以再繼續預覽畫面.
9.呼叫 stopPreview() 來停止預覽.
10.當關閉apps不想再使用camera這個裝置要記得呼叫 Camera.release();來釋放這個share resource不然整個camera就被佔住了,之後的其它apps想來使用都不行,除非重開機.
11.因為需要Camera的功能, 所以在AndroidMainfest.xml內要加入:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front" android:required="false"/>
第二行跟第三行的android:required="false"意思是在沒有鏡頭的裝置上跑此篇介紹的android apps也是可以的.沒加的話,去google play下載這個apps,檢查到你的裝置沒鏡頭是不給安裝的.
p.s.官網是這樣寫,實際上我沒試過!
12.layout就是一個linearlayout裡面包1個button,1個ImageView,1個framelayout,
所有程式碼下載連結:
https://docs.google.com/file/d/0B6EVEd5P2B9cODVYWVlUak9tZEk/edit?usp=sharing
最近為了某種需要,前置作業必須打通camera這道關卡,程式碼在Acer Iconia B1 A71上面測過是OK的,相關程式碼以及開發過程稍微整理一下就寫了這篇blog. 若有不周,歡迎批評指教, 缺漏的部份日後會慢慢補上. 轉貼或引用本篇blog內文章段落&程式碼, 不必交代出處.
過程:
想要寫個android apps去開啟裝置本身的鏡頭, 以Acer Iconia B1 A71這個裝置來講, 它的鏡頭就只有一個:前置鏡頭(front-facing,自拍用,視訊會議用,用來拍自己的臉,鏡頭就跟螢幕在同一面,在背面的就叫後置鏡頭back-facing).
首先要搞清楚到底要用哪個鏡頭. 單單寫一行Camera.open();是不行的. 起初就是天真的整個拿書本上的例子來編譯執行,結果畫面空空如也,看不到預覽畫面,去看debug error,不斷的出現startpreview()或setpreviewdisplay(holder) nullpointexception, 換個例子try, 結果使用呼叫系統內建camera apps,竟然成功?!然後開始懷疑acer那台只允許透過呼叫系統內建的去打開camera.
打開camera有兩種方式一種是透過呼叫系統內建的camera介面(android系統的,在螢幕_應用程式集打開就會看到'照相機'),另外一種就是等會介紹的先建立一個Camera物件,然後開始預覽startpreview,用takepicture來拍照,
隔天不甘心去官網看,照著10個步驟去做還是不行,最後檢查到第一個步驟建立Camera物件,然後Camera.open(),他老兄竟然沒open,得到null,叫它怎麼繼續做底下的事情?!最後程式寫麻煩一點, 去掃一遍裝置底下到底有幾個鏡頭,每個的代號是多少, 打開那個front-facing的鏡頭就ok了!
拍照的步驟:
1.建立Camera物件(Camera.open();),詳細的code請參考底下網址.
2.得到目前鏡頭一些設定值(preview畫面的長寬)->getParameters();
3.必要的話可以用 setParameters(Camera.Parameters);來修改設定值,
4.也可呼叫 setDisplayOrientation(int);來改變螢幕畫面的方向,
5.想要有預覽畫面要先 setPreviewDisplay(SurfaceHolder).
6.然後呼叫 startPreview() 開始預覽.
7.想要真正的拍照時,呼叫 mCamera.takePicture(null, null, mPicture); 第三個參數是callback function會幫你處理後續的動作,被鏡頭抓進來的這個frame做何處理之類的,本例是將她轉成bitmap秀在imageView的區域內,若你想額外存檔也行.
8.拍照後,預覽畫面就停格了,再呼叫一次 startPreview() 就可以再繼續預覽畫面.
9.呼叫 stopPreview() 來停止預覽.
10.當關閉apps不想再使用camera這個裝置要記得呼叫 Camera.release();來釋放這個share resource不然整個camera就被佔住了,之後的其它apps想來使用都不行,除非重開機.
11.因為需要Camera的功能, 所以在AndroidMainfest.xml內要加入:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front" android:required="false"/>
第二行跟第三行的android:required="false"意思是在沒有鏡頭的裝置上跑此篇介紹的android apps也是可以的.沒加的話,去google play下載這個apps,檢查到你的裝置沒鏡頭是不給安裝的.
p.s.官網是這樣寫,實際上我沒試過!
12.layout就是一個linearlayout裡面包1個button,1個ImageView,1個framelayout,
所有程式碼下載連結:
https://docs.google.com/file/d/0B6EVEd5P2B9cODVYWVlUak9tZEk/edit?usp=sharing
訂閱:
文章 (Atom)




