目前日期文章:201603 (7)

瀏覽方式: 標題列表 簡短摘要


硬體配置與零件:
---------------
IR接收器一個: VS1838B
pin2: 連接 VS1838B OUT pin
GND: 連接 VS1838B GND pin
5V: 連接 VS1838B VCC pin
-----------------


Arduino-IRremote library請至下面連結下載
https://github.com/z3t0/Arduino-IRremote

下載後解壓縮,將目錄名稱更改為 IRremote ,放置到 Arduino安裝目錄下 \libraries\ 目錄
記得要將原本裡面就有的 RobotIRremote 目錄刪除或移到其他位置
不然 Arduino 會因為[Multiple libraries were found for "IRremote.h"] 而會發生 [編譯時發生錯誤]

啟動 Arduino UI,選擇 [草稿碼]->[include library] -> [IRremote]
會include 兩個 header檔案
#include <IRremote.h>
#include <IRremoteInt.h>



開始寫以下程式

軟體設計:
----------------------------------
#include <IRremote.h>
#include <IRremoteInt.h>

  const int irReceiverPin = 2;
  IRrecv irrecv(irReceiverPin);    // 初始化紅外線訊號輸入
  decode_results results;    // 儲存訊號的結構

void setup() {
 
Serial.begin(9600);
  irrecv.blink13(true); // 設為true的話,當收到訊號時,腳位13的LED便會閃爍
  irrecv.enableIRIn(); // 啟動接收
}

void loop() {
 
  if (irrecv.decode(&results)) { // 接收紅外線訊號並解碼
    Serial.print("results value is "); // 輸出解碼後的資料
    Serial.print(results.value, HEX);
    Serial.print(", bits is ");
    Serial.print(results.bits);
    Serial.print(", decode_type is ");
    Serial.println(results.decode_type);
    irrecv.resume(); // 準備接收下一個訊號
  }
}

使用 IR要控器對準 IR 接收器就會輸出接收到的資料了



CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

練習目的:
    按下按鈕亮燈(直到放開),並計算按下的次數(放開才算1次)

硬體配置與零件:
----------------------------------
200歐姆、10K歐姆電阻各1個
pin 7: 連接 按鈕
pin 9: 連接 led 燈


畫面設計:
----------------------------------
當按鈕按下去時,小貓動作會改變、count會加1、push反應按鈕的狀況、hadcount 除錯用


軟體設計:
----------------------------------
stage設計code


Sprites設計code



在此做紀錄!




CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

有了第一篇的環境設定篇之後,我們需要一些好的工具來方便設計
建議大家安裝一套軟體 fritzing,這是一個繪製線路配置圖的好工具,重點是他是免費的、免費的、免費的
很重要所以要說三次

在2016年的現在,免費軟體才是王道,利用免費的軟體來增進硬體的銷售,這才是整個世界所樂見的
冰冷的機器或電子零件沒有軟體的加持,是沒有生命、沒有功用的

fritzing軟體請到以下網址下載
http://fritzing.org/home/

解壓縮後執行 Fritzing.exe 即可

有了這工具,就可以繪製你的線路設計

搭配 Scratch軟體設計
(畫面設計)

(場景的code)


(角色的code)


這樣就可以讓其他人了解硬體與軟體的設計

與大家分享!


CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

Scratch for Arduino (S4A)環境架設(offline

-----

Arduino side:

1.          安裝最新板的Firmata Arduino板子上

. https://www.arduino.cc/en/Main/Software 網站

 下 載安裝最新版本 Arduino IDE Software,目前為止最新的版本為 1.6.8

 我 因為是之前就安裝好的版本為 1.6.5

.因為Scratch Arduino溝通是靠arduino板子上的 Firmata做 溝通

 所 以必須要將 StandFirmata 安裝到 Arduino板 子上

.Firmata 根 據你的Arduino IDE Software 版本不同會有不同版本

如 果你Arduino IDE Software 1.5.x 1.6.x,就必須安裝Arduino-1.6.x-Firmata-2.4.3.zip

如 果你Arduino IDE Software 1.0.x, 就必須安裝Firmata-2.4.3.zip

如 果裝到錯誤的版本,Scratch Arduino是無法溝通的(Scratch會 一直show 紅燈或黃燈)

檔 案請至下面下載

https://github.com/firmata/arduino/releases/tag/v2.4.3

.下載解壓縮後,會看到以下目錄\Arduino-1.6.x-Firmata-2.4.3\Firmata

我將我 Arduino IDE Software 1.6.5目 錄下的 Frimata目錄先備份到其他地方後

將解壓縮後的 \Arduino-1.6.x-Firmata-2.4.3\Firmata 所 有檔案複製到 Arduino IDE Software 1.6.5目錄下的 Frimata目 錄,我猜我的 Arduino IDE Software 1.6.5 Firmata 是舊的。

(我的 Arduino IDE Software 1.6.5目 錄是D:\Program Files (x86)\Arduino\libraries\Firmata

.啟動 Arduino IDE Software 準 備更新 FirmataArduino

 選 擇「檔案」->[範例]->[Firmata]->[StandardFirmata]

 選 擇 「工 具」->[板子] ,選擇自己手頭上的Arduino 型 號(我選Arduino UNO

選擇 「工具」->[序列埠] 選 擇自己Arduino 的序列埠(我選COM12

.之後按下 「上傳」按鈕,完成upload

Arduino這邊已經完成設定了

PC side

2.          安裝 scratch offline

.請至 http://wiki.scratch.mit.edu/wiki/Scratch_2.0_Offline_Editor

 下 載安裝 scratch offline 2.0

 

3.          下載A4S masterScratch Arduino能溝通

因 為我們是採用離線的方式,所以必須到以下網址下載 A4S master 軟體

https://github.com/damellis/A4S

其 網站下方有此軟體詳細的說明,最好閱讀了解一下

下 載解壓縮後,會看到以下檔案,因為我們是在windows下,所以必須新增一個 run.bat檔 案

Run.bat 內容如下(因我的arduino是 在com12,你必須針對你的環境去改COMXX

java -d32 -jar A4S.jar COM12 57600

在 命令列視窗下執行 run.bat(如果看到windows的警告畫面,請按確定),看到以下畫面表示執行 順利

 

4.          測試A4S

執 行 Scratch offline版本,按住 SHIFT」 鍵不放,滑鼠點選 [File],最下方會出現隱藏選單 import experimental HTTP extension」,請選擇上面A4S master 軟 體解壓縮後目錄下的A4S.s2e 檔案

 

畫 面會出現 A4S相關的 Blocks,注意在這邊ArduinoScratch應該可以正常連線(出現綠色燈號)

我 們寫一個程式來測試一下,硬體上將一個電阻與 led燈接在 pin9GND

寫 好之後,按下[綠色旗子]就可以看到 led燈 每一秒亮暗一次。

 

5.          其他備註

l   可 以經由Arduino板上的 TX2燈號來判斷Scratch是 否跟Arduino連線,有連線的話會一直閃。

l   主 要採取offline安裝,是因為 online安 裝的方式很難搞,一些 plugin超級難裝,且如果網路訊號不好的話還會當機。

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()


ATMEL mXT224S data sheet 重點整理
--------------------------------
.Atmel touch IC 內部是由 object 與 message 構成
.通常都先讀 offset為0的information Block,從中得知 object的支援數量
與每一個object 的 起始address 的offset
.當T5 object有message需要 host來讀取時,會拉 interrupt 訊號觸發 CPU來讀
取message資料
.解析度的設定寫在 T9 object的 xrange,yrange
.讀取座標值是讀取 T9 messages的 xposmsb, yposmsb, xyposlsb
.當有執行 t6 object的 BACKUPNV時,就會重新計算NVM的checksum 值
.CHG (interrupt pin)是 level-triggered(準位觸發,大於某個電壓值),不是
edge-triggered(邊緣觸發 low到high,或 high到low)
.CHG有兩種模式,設定在 T18 object 的 MODE bit,區分為 i2c傳輸有無包含
checksum

.failmy ID, Vatiant ID, Version,Build,Matrix X size,Matrix Y size,number
of elements in the object table 資料位於 information Block layout中。
.touch driver必須先讀取 information Block 並得知 其中 byte 6-number of
elements in the object table數量後,才能知道 byte7 後面的 object table
element 1-N


Atmel_maxtouch_ts driver中
----
error = request_threaded_irq(data->irq, NULL, mxt_interrupt,
data->pdata->irqflags | IRQF_ONESHOT,
client->name, data);

interrupt routine為mxt_interrupt,會呼叫 mxt_process_messages
而mxt_process_messages函式中會呼叫 mxt_read_and_process_messages 去讀取
T5 object的messages
函式名為__mxt_read_reg,然後去 parser messages資料,其中 T9類型的
message能得到x,y座標 (for mXt224S series)

如果是 mXT640U series則是去讀取 T100 objct messages去得到x,y座標
---


CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()


之前在Qualcomm平台bring up新 panel ,IC chip 為 HX8394F
其背光控制方式是由 panel 經由一根 pwm pin拉到 host CPU端,HOST端的 led driver IC在根據pwm的強度去控制panel led背光的亮度


以下將可以點亮的 參數做一下備份
===
/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

/*---------------------------------------------------------------------------
 * This file is autogenerated file using gcdb parser. Please do not edit it.
 * Update input XML file to add a new entry or update variable in this file
 * VERSION = "1.0"
 *---------------------------------------------------------------------------*/
&mdss_mdp {
    dsi_ili9806e_fwvga_video: qcom,mdss_dsi_ili9806e_fwvga_video {
        qcom,mdss-dsi-panel-name = "ili9806e fwvga video mode dsi panel";
        qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
        qcom,mdss-dsi-panel-type = "dsi_video_mode";
        qcom,mdss-dsi-panel-destination = "display_1";
        qcom,mdss-dsi-panel-framerate = <60>;
        qcom,mdss-dsi-virtual-channel-id = <0>;
        qcom,mdss-dsi-stream = <0>;

        qcom,mdss-dsi-panel-width = <720>;
        qcom,mdss-dsi-panel-height = <1280>;
       
        qcom,mdss-dsi-h-front-porch = <16>; //<52>;   //
        qcom,mdss-dsi-h-back-porch = <22>; //<100>;  //
        qcom,mdss-dsi-h-pulse-width = <10>; //<24>;  //
       
        qcom,mdss-dsi-h-sync-skew = <0>;  //
       
        qcom,mdss-dsi-v-back-porch = <12>; //<20>;  //
        qcom,mdss-dsi-v-front-porch = <15>; //<8>;  //
        qcom,mdss-dsi-v-pulse-width = <4>; //<4>;  //

        qcom,mdss-dsi-h-left-border = <0>;
        qcom,mdss-dsi-h-right-border = <0>;
        qcom,mdss-dsi-v-top-border = <0>;
        qcom,mdss-dsi-v-bottom-border = <0>;
        qcom,mdss-dsi-bpp = <24>;
       
        qcom,mdss-dsi-color-order = <0>;  //DSI_RGB_SWAP_RGB    0
       
        qcom,mdss-dsi-underflow-color = <0xff>;
       
        qcom,mdss-dsi-border-color = <0>;
       
        qcom,mdss-dsi-on-command = [
            39 01 00 00 00 00 04
               b9 ff 83 94     // check
                39 01 00 00 00 00 07   // set MIPI
                   ba 61 03 68 6b     // 63 for 4 lanes , 61 for 2 lanes
                   b2 c0
                39 01 00 00 00 00 0b
                   b1 50 12 72 09
                   33 54 81 31 69
                   2f
                39 01 00 00 00 00 07
                   b2 00 80 64 0e
                   0d 2f
                39 01 00 00 00 00 16   // set CYC
                   b4 6c 6d 6c 6d
                   6c 6d 01 01 ff
                   75 00 3f 6c 6d
                   6c 6d 6c 6d 01
                   01 ff

                39 01 00 00 00 00 22 //set GIP
                   d3 00 00 07 07
                   40 07 10 00 08
                   10 08 00 08 54
                   15 0e 05 0e 02
                   15 06 05 06 47
                   44 0a 0a 4b 10
                   07 07 0e 40
                  
                39 01 00 00 00 00 2d //set forward GIP
                   d5 1a 1a 1b 1b
                   00 01 02 03 04
                   05 06 07 08 09
                   0a 0b 24 25 18
                   18 26 27 18 18
                   18 18 18 18 18
                   18 18 18 18 18
                   18 18 18 18 20
                   21 18 18 18 18
                  
                39 01 00 00 00 00 2d                //set backward GIP
                   d6 1a 1a 1b 1b
                   0b 0a 09 08 07
                   06 05 04 03 02
                   01 00 21 20 18
                   18 27 26 18 18
                   18 18 18 18 18
                   18 18 18 18 18
                   18 18 18 18 25
                   24 18 18 18 18 

                39 01 00 00 00 00 3b  //set GAMMA
                   e0 00 0c 19 20
                   23 26 29 28 51
                   61 70 6f 76 86
                   89 8d 99 9a 95
                   a1 b0 57 55 58
                   5c 5e 64 6b 7f
                   00 0c 19 20 23
                   26 29 28 51 61
                   70 6f 76 86 89
                   8d 99 9a 95 a1
                   b0 57 55 58 5c
                   5e 64 6b 7f                     
                  
                39 01 00 00 00 00 03
                   c0 1f 73  //set C0
                15 01 00 00 00 00 02   // set panel
                   cc 0b
                  
                15 01 00 00 00 00 02   //set D4
                   d4 02
                15 01 00 00 00 00 02
                   35 00                   
                39 01 00 00 00 00 03
                    b6 7d 7d
             //set address mode , flip hor+ flip vertical
              39 01 00 00 00 00 02        
           36 03 
       //set CABC UI mode
                15 01 00 00 05 00 02  
                   51 66
                39 01 00 00 05 00 08
                   c9 13 00 00 1e  //c9 13 00 2e 1e //change 2e to 00 for PWM 40Khz
                   b1 1e 00
                15 01 00 00 05 00 02  
                   55 01
                15 01 00 00 05 00 02  
                   53 24

               
                05 01 00 00 96 00 02 11 00   // sleep out,delay 150ms
                05 01 00 00 32 00 02 29 00    // display on


               
                ];
               
        qcom,mdss-dsi-off-command = [
            05 01 00 00 0a 00 02 28 00
                05 01 00 00 05 00 02 10 00];

        qcom,mdss-dsi-on-command-state = "dsi_lp_mode";
        qcom,mdss-dsi-off-command-state = "dsi_hs_mode";

        qcom,mdss-dsi-h-sync-pulse = <0>;  //0 = Don't send hsa/he following vs/ve packet(default)
                    //1 = Send hsa/he following vs/ve packet
        qcom,mdss-dsi-traffic-mode = <0>;  //DSI_NON_BURST_SYNCH_PULSE    0,DSI_NON_BURST_SYNCH_EVENT    1, DSI_BURST_MODE            2
       
        qcom,mdss-dsi-lane-map = <0>;  //DSI_LANE_MAP_0123
        qcom,mdss-dsi-bllp-eof-power-mode;
        qcom,mdss-dsi-bllp-power-mode;

        qcom,mdss-dsi-lane-0-state;
        qcom,mdss-dsi-lane-1-state;

   
        qcom,mdss-dsi-panel-timings = [c5 2c 1e 00 5a 5c 22 30 25 03 04 00]; //[79 1a 12 00 3e 42 16 1e 15 03 04 00];   //
   

        qcom,mds-dsi-t-clk-post = <3>; //<0x04>;
        qcom,mdss-dsi-t-clk-pre = <37>; //<0x1b>;

        qcom,mdss-dsi-bl-min-level = <1>;
        qcom,mdss-dsi-bl-max-level = <255>;
        qcom,mdss-dsi-dma-trigger = "trigger_sw";
        qcom,mdss-dsi-mdp-trigger = <0>;  // "none"; ??
        qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs";
    //qcom,mdss-dsi-lp11-init;
        qcom,mdss-dsi-reset-sequence = <1 20>,<0 1>, <1 60>; //<1 20>, <0 2>, <1 20>;
    };
};

===

其中的
---
       //set CABC UI mode
                15 01 00 00 05 00 02  
                   51 66
                39 01 00 00 05 00 08
                   c9 13 00 00 1e  //c9 13 00 2e 1e //change 2e to 00 for PWM 40Khz
                   b1 1e 00
                15 01 00 00 05 00 02  
                   55 01
                15 01 00 00 05 00 02  
                   53 24
---
因為板子硬體設計,必須設定 pwm clock為 40KHz


--

             //set address mode , flip hor+ flip vertical
              39 01 00 00 00 00 02        
           36 03 
--
是將螢幕顯示 flip + mirror (翻轉180度)

以上在此做紀錄


CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

用手機抓拍生活中最美的一瞬間已經成為用戶們的日常需求,一定有細心的小伙伴們發現,為什 麼以iPhone 6 為代表的旗艦機對焦又快又準,這到底是為什麼呢?打開各 種科技網站,激光對焦、紅外對焦、PDAF...這些專業的名詞一定讓大家感到很 困惑,下面筆者就將簡單的介紹下這幾種對焦技術。

 

反差對焦(Contrast Detection

        反差對焦被廣泛的應用於傳統的手機攝像系統當中,它通 過對比鏡頭傳感器傳來的對比度反差來進行對焦。對比度對視覺效果的影響非常關鍵,一般來說對比度越大,圖像越清晰醒目,色彩也越鮮明艷 麗。我們知道當鏡頭漸漸合焦的時候,傳感器得到的相鄰像素間的對比度會越來越高,圖像也就會越來越清晰。所以當我們找到整個圖片對比度最 高的時候鏡頭所處的位置時,也就找到了準確的對焦點。

http://bbs.lenovo.com/data/attachment/forum/201503/31/152935tfqw7ccseaucqpes.jpg.thumb.jpg 

 

反差對焦原理圖

     是不 是看的有點暈?總結一下,對焦過程的五個步驟可以用下圖來簡單表示:

http://bbs.lenovo.com/data/attachment/forum/201503/31/154001h3sx0b830cv2r0w0.jpg.thumb.jpg 

相位對焦(Phase Detection

   經常讓大家聽得云裡霧裡的PDAF其實指的就是相位自動對焦(Phase Detection Auto Focus)技術。這種技術被廣泛利用在單反相機中,現在也被逐漸移植到了智能手機的 攝像系統裡來提升對焦體驗,下圖是一個典型的相位對焦鏡頭系統。

http://bbs.lenovo.com/data/attachment/forum/201503/31/154432h8v3tu0t3r3yeyeu.png.thumb.jpg 

   

相位差對焦(Phase Detection AF) 主要原理是CMOS 感光元 件上畫素(pixel)有兩個光電二極管,因此CMOS不再只是負責接收影像,還要兼顧相位差(Phase Difference)自動對焦的工作。(圖一)Sony 感光元件有放置對 焦使用畫素示意圖,CMOS感光元件的相位畫素會接收到左右不同的光波資訊,進而 判斷出遠近距離產生相位差,Sony感光元件上的"對焦 點區域"設計一排專用的對 焦像素。
http://www.sunnic.com/smarteditupfiles/PDAF-1.png

像素是由L,R兩組像素組成,交錯排列,如 果單看L 與單看R,可 以將這條對焦像素視為兩條獨立的感應器,LR接收同來自一光源的光,Sony的 做法是在對焦用像素上設計兩層交錯的光罩遮光(圖二,), 讓所有L像素只能接收到來自左邊的光,R像 素只能接收到右邊的光。如此一來L,R兩組對焦像素就能接收同一光源不同方向的 光,如(圖二)黃色光線所 示,光 罩遮住一半的入射光源,造成此相位畫素僅能接收到左半邊的光源資訊。
http://www.sunnic.com/smarteditupfiles/PDAF-2.png

(圖三)黃色光線,因光罩遮住一半的入射光源,造成此相位畫素僅能接收到右半邊的光源資訊。

http://www.sunnic.com/smarteditupfiles/PDAF-3.png

因此CMOS把兩個感應器的訊號進行比較,這兩個成像間的距離就是所謂的相位差既然"相位差""光源和焦點的距離"有這層關係便 可參考目前的相位差來驅動對焦馬達,使得焦點可以快速完成。

 

 

顯然,有兩個微型鏡頭捕捉了從主鏡頭兩側傳來的一對光線,並且轉換到了對焦傳感器上。傳感 器通過分析這兩束光的光強相似度(曲線的峰值和谷底值)得到分離誤差,而這個分離誤差就可以用來計算被攝相對於焦點的位置。傳感器不止將 給出對焦環需要運動的方向,還將精確的給出對焦環需要移動的距離,達到快速精確對焦的目的。

http://bbs.lenovo.com/data/attachment/forum/201503/31/154942txlixiaxrtti89rv.png.thumb.jpg       http://bbs.lenovo.com/data/attachment/forum/201503/31/154759wsskwy1x0eo07kkw.jpg.thumb.jpg 

    圖中紫色的圓代表被攝物體,通過鏡片與遮罩mask(黑色),紅色的虛線以及 綠色的實線代表著主鏡頭兩側換來的兩束(L,R)光,黃色的長方形是鏡頭底部的傳 感器。傳感器後面的圖代表著兩束光縣的光強相似度曲線。

    1-4展現了四種常見的對焦狀態下PDAF系統系統的工作情況。(1)略 近(2)合焦(3) 略 遠(4)太遠。分析圖中的光照曲線的誤差可以計算出對焦環應該移動的方向和距離。

    我們可以把PDAF系 統看成一個簡單的閉環系統,如上圖所示。

 

相位對焦、反差對焦的對比

    對比上述兩種對焦方式的原理,我們可以發現PDAF 技術 在對焦速度方面有明顯的優勢。

1.反差對焦需要鏡頭從後端到前端完整的跑一段,通過焦點後發現對比度降低再開始反向。而相位 對焦在跑一小段路程後就可以通過傳感器數據判斷鏡頭該往哪個方向走,判斷時間明顯縮短。

2.反差對焦在越過合焦位置後會再跑一段,返回還需要一段時間。PDAF 在到 達合焦位置後鏡頭會立刻停止。

  另外在拍攝移動中物體以及攝影的過程中,相位對焦憑藉迅速對 焦準確快速的特點明顯能夠得到更好的用戶體驗。

 

市場應用

       三星 上一代旗艦Galaxy S5 是首款搭載了相位對焦技術的智能手機,雖然三星並沒有以此為重點進行宣傳,但是可以明顯感 覺到S5 的對 焦速度和精度比起上一代S4 有了 巨大的提升,但是在微距拍攝對焦的時候會出現對焦不准的情況。iPhone 6 所採取的Focus Pixel 技術 其實就是採用了PDAF 技術 來輔助傳統的反差對焦,在提升了對焦速度的基礎上也保證了微距拍攝的對焦精確度。

      除了 這兩種常見的自動對焦技術外,LG G3 上首 先使用了激光對焦技術。工作原理也比較容易理解,手機背面的發射器產生大量低強度脈衝激光,激光在遇到物體後會反射回來,被同樣在手機上 的紅外接收器接受,從而達到對被攝物體定位的目的。LG 官方 給出達到數據,G3 的自 動對焦時間為0.276 秒, 速度甚至比使用了PDAF 技術 的iPhone6 ​​和三星Galaxy S5 還強。

      紅外 對焦技術可以看做是激光對焦技術的一種變種,諾基亞早在功能機時代就在系列 手機中使用其來輔助對焦,最近MWC 上聯 想發布的Vibe Shot 也是使用了這種對焦技術。

 

     看完 了上面的介紹,大家是不是對PDAF 、反 差對焦以及市場上主流的智能手機對焦情況有所了解了呢?在以後選購手機的過程中,喜歡拍照的各位朋友也應該有了新的選機標準了吧。

 

CuteParrot 發表在 痞客邦 PIXNET 留言(0) 人氣()

找更多相關文章與討論