2017年9月26日 星期二

Python 函式使用 (四)


Pyton 函數呼叫

函數定義

def function_name (a,b):
...  
...  
...  return xxxxx


全域變數vs 區域變數


  1. 全域變數: 變數宣告在任何函數外,即為全域變數
  2. 區域變數: 定義在函數內部的變數, 非def 內無法存取此區域變數
  3. Python 函數可以直接存取(直接用或操作)全域變數 (不必傳參數)
  4. 小心: 若宣告區域變數與全域變數的名稱相同, 則以區域變數為主, 若函數內要使用外部的全域變數, 必須用global 關鍵字, 表示其參考外部的全域變數,而非重新定義的區域變數


# 全域變數vs 區域變數

x1=[2,4,6]
a=5

def func1():
    x1[1]=100   #存取會更改x1

def func2(): 
    x1=[1,2,3]    #初值設定,宣告變數x1 (和global x1相同, 故此為Local Variable )
    print(x1)    #[1, 2, 3]
    
def func3():
    a=10     #屬初值設定而非更改變數,因為是宣告, 則變數a為Local (雖然和global a相同
    print(a)

    
def func4():
    global a
    a=10      #初值設定為local, 但global明確定義a是global
    print(a)  #10

    
def func5():
    global x1
    x1=[1,2,3]    #初值設定:x1是local

 
func1()
print(x1)   #[2, 100, 6]
func2()
print(x1)  #[2, 100, 6]
func3()
print(a)   #5
func4()
print(a)  10
func5()
print(x1)  [1, 2, 3]


lambda Function
 
Python提供了一個簡易的function define:lambda,用完即丟,不著痕跡。讓你實作出很簡單的function (只處理一個運算式)


語法:
ambda argument_list: expression 

def func(x, y, z):
    return x + y + z

func2 = lambda x,y,z : x+y+z

print(func(1,2,3))       
print(func2(1,2,3))    


map 
Function

map() is a function which takes two arguments: 
r = map(func, seq)

The first argument func is the name of a function and the second a sequence (e.g. a list) seqmap() applies the function func to all the elements of the sequence seq. Before Python3, map() used to return a list, where each element of the result list was the result of the function func applied on the corresponding element of the list or tuple "seq". With Python 3, map() returns an iterator. 
my_list = [1, 2, 3]
ans=list(map( lambda i: i * i, my_list ))  
print(ans)  


[1, 4, 9]

不定個數參數函數用法


#不定個數參數 * (tuple)


def hello(*names):
    for n in names
        print("Hello, %s."%n)

names_tuple=("Tom","Peter","Bob","Rain")  
hello(*names_tuple)
hello("Tom","Peter","Bob","Rain")



#不定個數參數 ** (dict)

def hello(**names):
    for n in names:
        print("Hello %s, you're %d years old"%(n,names[n]))

names_dict={'John':25, 'Tom':20, 'Bob':33, 'Tony':18}
hello(**names_dict)
hello(John=25, Tom=20, Bob=33, Tony=18)



















2017年9月18日 星期一

SoC FPGA 嵌入式系統晶片?


Why SoC FPGA? 

目前嵌入式系統晶片開發人員必須面對激烈的市場挑戰,被要求更高的單位功耗性能/運算效能、更低的時延以及更短的開發週期來滿足各種的市場需求,因此基於FPGA的SoC已成為最流行且可行的解決方案。簡單來說,就是在FPGA可程式邏輯晶片嵌入了一個「硬核」處理器系統-- SoC (包含了ARM處理器、記憶體控制器、I/O週邊),在Intel (Altera)把這個SoC稱作是HPS (Hard Processor System) 。

在SoC FPGA 架構下可以彈性的設計,單純使用ARM SoC、僅單獨使用FPGA或兩者一起使用。當兩者一起用時, FPGA可以作為ARM週邊的角色,針對大量且須經複雜運算的資料,如數據資料、影像訊號、聲音訊號等,可利用FPGA 硬體並行運算能力設計演算法追求最佳效能。因此,利用SoC FPGA 架構所設計的嵌入式平台,不僅可以突顯了產品優勢,在價格和性能上都可以達到最優,更重要的是產品能夠及時上市。

HPS是屬於hard core 方式, 也可以選擇使用 soft core 的方式. 就是用Intel 自己的CPU--NiosII, 但用Soft core的方式, 就會消秏到原本FPGA的邏輯匣。


HPS 和 FPGA 有自己的Bus系統, HPS 的ARM 是 AXI Bus , FPGA 是 Avalon Bus, , 故需要設計一個Bridge 讓兩邊系統能夠溝通。 





Intel SoC FPGA 開發板 ( 內含Dual Core ARM Cortex-A9@800MHz)

DE10-Nano Kit





更多FPGA的應用領域: 

AI人工智慧的機器學習、5G傳輸速度提升到10Gbps、無人駕駛汽車網路延遲時間需要小於1ms, 這些都已無法再仰賴CPU計算來達成了為了獲得更高的運算效能與功耗、更低的延遲,以及用更短的開發週期, FPGA 將扮演著關鍵性的角色!



資料參考:

  1. https://www.ittraining.com.tw/ittraining/index.php/course/hardware/fpga
  2. https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=Taiwan&No=1047


http://www.ittraining.com.tw/ittraining/index.php/course/hardware/fpga

2017年9月6日 星期三

影像處理的核心技術





進行影像處理演算法的開發與實作驗證。

想影像處理的演算法於嵌入式系統之移植與效能調整。

深度學習在影像處理(如CNN)的研發。
FPGA 影位影像訊號的處理





2017年9月3日 星期日

PH 值感測器校正方法


1. 備好標準液 pH=7、pH=4 (或 pH=10)、蒸餾水及面紙
2. 用兩點的PH值產生斜率, PH Meter得以校正。





2017年9月1日 星期五

EC 感測器校正方式


EC感測器第一次都要校正過, 才能使用. 

感測器有其Domain Knowledge, 代表不同應用下的感測器其所需要學習的領域知識。

例如,  EC 感測器 (用來量測水中的電導度 (單位: ms/cm 或 us/cm) ) , 其校正方式如下

1. 購買原廠校正標準液(較建議,因為數值較精準)或自行配置標準 
的 氯化鉀 KCL溶液(1公升以上,量大比較精準),用於電導度計校正。

2.將電導度電極置於校正標準液內,測量數值是否吻合,若數值有差異
時,請找到電導度計校正數值設定參數,調整校正到正確值。

在25℃下,0.01 M KCl溶液導電性為1413μΩ-1/cm(單位即μS/cm)


參考資料:
http://104lab.blogspot.tw/2011/12/conductivity-controller-use-and.html

=======================
回憶高中化學: 

1) 氯化鉀 : 白色結晶或結晶性粉末,易溶於甘油,難溶於,不溶於丙酮


2) 莫耳濃度定義:以1升溶液中所含溶質莫耳數來表示溶液的濃度,稱為容積莫耳濃度,簡稱莫耳濃度,常以M表之,其單位為莫耳/升(mol/L 或M)

莫耳濃度(M) = (溶質重 / 溶質分子量) / 溶液體積(以公升L為單位)
又溶質莫耳數=溶質重 / 溶質分子量
18公克的葡萄糖(C6H1206)溶於100ml的水,莫耳濃度=?
(原子量:C=12,H=1,O=16)
葡萄糖分子量 = 12 x 6+1 x 12+16 x 6 = 180,體積100 ml=0.1 L,可得到莫耳濃度 = (18/180) / 0.1 = 1 M

2017年8月30日 星期三

[新手教學] ARM boot Loader 數位課程學習須知



 教學影片內容為ARM 微理機架構解說與ARM Boot Loader 等技術主題的說明並有講師Demo Pi 3影片

目標對象:
  1. 有嵌入式系統開發經驗但並未接觸過底層開機程式碼 (Boot code)

先備知識: 

  1. Linux 系統操作能力
  2. 熟悉的C程式
  3. 會使用gcc, make 的等GNU開發工具
  4. Raspberry Pi 的操作使用經驗
Raspberry Pi 3 環境建置:


請先登入學習平台,在[課程公告]處, 點選下載ARM Files.rar ,解開後內容如下

ARM Files 檔案目錄結構:
├─ADS_code  (ADS 課程範例原始碼)
├─Document (Data Sheet及電路圖等文件)
├─Tools
│  ├─2016-05-27-raspbian-jessie-lite.zip (Raspberry Pi 3官方Image File)
│  ├─ADS12trial.rar (ADS 1.2 試用版)
─pi-boot.zip (Raspberry Pi Bootloader  課程範例原始碼)
├─TOC.tx

其中 pi-boot.zip 要傳送到PC Linux下 (註: 講師用的Linux環境是 Ubuntu 16.04, 但其實只要Toolchain能執行就可以,和使用那一套Linux Distribution並無太大關聯) ( 延伸閱讀: 用VirtualBox 掛載 Linux )





ARM bootloader on Raspberry Pi 3 
=====================================

在 Linux 下 執行 "unzip  pi-boot.zip" , 解開後的內容如下, 請照README.txt 或下方說明, 完成第一個Pi上的範例

  
pi-boot
  │  gcc-arm-none-eabi-5_3-2016q1-20160330-linux.tar.bz2
  │  gcc-arm-none-eabi-6-2017-q1-update-linux.tar.bz2
  │  make.dep
  │  README.txt
  ├─bcm2835_lib
  ├─example
  │   ├─bare_button
  │   ├─bare_button_in
  │   ├─bare_gpio
  │   ├─bare_mailbox
  │   ├─bare_timer
  │   ├─bare_uart_poll
  │   └─uart_interrupt
  └─startup_code
          boot.o
          boot.S
          link.ld
          Makefil
          start.o
          start.S

How to Build
------------------------
step1: untar Toolchain
------------------------
gcc-arm-none-eabi-5_3-2016q1.tar.gz --> for 32-bit Linux host  
gcc-arm-none-eabi-6-2017-q1-update-linux.tar.bz2 --> for 64-bit Linux host


For example, 

tar jxvf gcc-arm-none-eabi-6-2017-q1-update-linux.tar.bz2 

-------------------------
step2: Setup Toolchain Path
-------------------------

export PATH=$PATH:/home/it/pi_baremetal/trunk/gcc-arm-none-eabi-6-2017-q1-update/bin

type "arm-none-eabi-gcc -v"

it will display : gcc version 6.3.1 


-------------------------
step3: make boot code firstly
-------------------------

#modify make.dep to determine which version to use
# 0 for 32bit ; 1 for 64
Host_64=1

cd startup_code ; make


-------------------------
step4: test demo code
-------------------------


cd example/bare_gpio
make

output==>armgpio.bin

-------------------------
step5: put the code to Raspberry Pi 3
-------------------------

 copy 'armgpio.bin' to micro SD card and add one line 

 kernel=armgpio.bin

at the end of the config.txt file. Then, you insert micro SD card into Raspberry Pi,and power on. After booting, you can see LED is blinking.


 Note: code 在Pi 3上測試過
      目前講師所整理的code 僅以Raspberry Pi 3 搭配艾鍗 Raspberry Pi 3 Shield 版本為主







2017年8月23日 星期三

Python 入門學習快速筆記 (六)


例外處理 try: ... excpet:



a=100
b=10

try:
    c=a/b
    print("c=",c)
except:
    c=-1
    print("Divdie by zero")
    print("c=",c)

print("c=",c)

------------------
try-except 也可以和 else 連用, else 後的程式區塊放的是沒有發生例外,程式所執行的工作,例如
try:
    c=a/b
    print("c=",c)
except:
    c=-1
    print("Divdie by zero")
    print("c=",c)
else:
    print("No exception")
-----------------------------------------------
例外的名稱也可以寫在 except 之後,如
try:
    c=a/b
    print("c=",c)
except ZeroDivisionError:
    c=-1
    print("Divdie by zero")
    print("c=",c)
except NameError:
except TypeError:
except IndexError:

-----------------------------
若加入另一個關鍵字 finally ,無論例外有沒有發生都會執行 finally 後的程式區塊
try:
    c=a/b
    print("c=",c)
except ZeroDivisionError:
    c=-1
    print("Divdie by zero")
    print("c=",c)
except NameError:
except TypeError:
except IndexError:
findally:

--------------------------

Raise 觸發Exception Error


try:
raise NameError
     
except NameError:
        print("發生例外,NameError")
except ZeroDivisionError:
print("發生例外,ZeroDivisionError")


print("after exception....")

Python 所有Exception
https://docs.python.org/3/library/exceptions.html#exception-hierarchy



Python檔案處理


file = open('dream.txt', 'r', encoding='UTF-8')

li=file.readlines()
print(li[3],end='')



Python 第三方套件



https://pypi.python.org/pypi?:action=browse&c=533&show=all

安裝 Python 第三方套件-使用pip 工具
C:\Python34\Scripts>pip install pyqrcode

Collecting pyqrcode
  Downloading PyQRCode-1.1.tar.gz
Building wheels for collected packages: pyqrcode
  Running setup.py bdist_wheel for pyqrcode
  Stored in directory: C:\Users\student\AppData\Local\pip\Cache\wheels\03\93\7f\
d3a38165d01798524d99329a6aabba2b378d81da1d46f15b36
Successfully built pyqrcode
Installing collected packages: pyqrcode
Successfully installed pyqrcode-1.1

C:\Python34\Scripts>pip install pypng


#-*-coding:UTF-8 -*-
#  EX08_01.py
#  
#  pyqrcode 使用範例
#  
from pyqrcode import QRCode
url = QRCode('http://www.ntu.edu.tw')
#輸出SVG格式檔案:url.svg ,縮放比為10
url.svg('url.svg', scale=10)
#輸出PNG格式檔案:url.png ,縮放比為10

url.png('url.png', scale=10)