mapleboard on the table

我是楓葉板社群部落格板主Jonas~歡迎大家多發文、多回應,有任何問題歡迎寫信給我Jonas。                                               目前部落格網站有2個更動:1.草稿位置更改為博主首頁之內2.增加Emoji按鈕(按鈕的最左上角)。請大家留意並多加利用~    

DebConf18 group photo

對Linux相關開發愈來愈深入的你,一定會碰到現今最熱門的始祖級distribution:Debian

今年非常難得地DebConf第一次在亞洲舉行,而且就在臺灣的新竹!

今天就來分享一下其中一堂lecture的內容吧~
講者是Thomas Goirand,2010起成為Debian Developer。

我們常常聽到Google Cloud、AWS,不過這些都是由特定公司建立好的Iaas,很可惜的並不是開源。
那如果我們想要建立自己的Iaas以及雲端服務,同時又想擁抱開源與自由該怎麼辦呢?

沒關係,我們有OpenStack!

OpenStack是一套開源的雲端軟體,是一種IaaS可以讓人建立雲端服務,
由Rackspace Hosting和NASA合作開發,聽起來是不是很厲害呢!

關於IaaS與OpenStack更詳細的內容請自行google吧!

首先我們得先提及FSF的人非常反對雲端服務,因為我們的資料總是被其他商業公司所掌控,
所謂儲存在雲端就是儲存在他人的伺服器而已,而且由於這些服務都不是開源軟體,
所以他們會搞什麼鬼我們都不知道的。

不過這堂課的講者認為FSF根本搞錯對象了,該反對的不是雲端,而是這些不自由的雲端服務!
且cloud這個詞可不代表著我們的資料會放在別人的機器上,不能因為討厭SaaS就反雲端啊!
甚至每個會使用Server的人都是潛在的雲端使用者。
看到Debian cloud team跟Gnu大老槓上的郵件紀錄真的很有趣呢!

說到雲端的自由問題,講者認為SaaS是惡魔啊!
絕對不要輕易使用SaaS來進行商業活動與透露個人的資料,
不過我們還是需要Web Service啦,像是遊戲、維基、購物、訂票......

再來從IaaS建立雲端有什麼好處呢?

最吸引人的是可以成本控制,隨著專案的規模隨時可以調整雲端的規模,也可以讓他自動化,
簡單舉例,我們網站目前有多大流量就可以設定多大Storage、CPU、頻寬。
更重要的IaaS是唯一可以在線調整規模的模式喔!
也就是說我們不需要因為需求的變化,就要重開一個新雲端呢!

好啦!今天先到這裡,
剩下包括對OpenStack的一些質疑與講者的回應還有deployment範例,我們就留待下次分享吧!




Debian 使用者的 Debconf 之旅

tony  2018-08-06   留言:0

        接觸Debian 不過一個多月的時間就要參加Debian 開發者年會,我的心中的不安其實蠻重的,因為我連一個熟練的使用者都還稱不上。說好聽一點就是去增廣見聞交交朋友,說難聽一點就是去打醬油。一開始是抱持這種抗拒的心態去參與DebConf,可是在經過六天的洗禮後,我的想法改變了不少,雖然最後離開時還是有點逃離的解脫感。在實際來到交大後,我發現有一群的與會者要麼不會程式,不然也只是Debian 的使用者而已。想對Debain做出貢獻,不一定要有程式背景----做做翻譯,協助宣傳,活動出力等等都可以,頓時釋懷不少。

        好啦,抱怨到這裡,我也該進入正題,聊聊這幾天實際的活動。平常時間在幾個講廳都會安排各種主題的演講,有興趣的可以自行參加。至於不想要去聽的人可以選擇到noisy hack lab或者是quiet hack lab寫程式,休息或者打屁喝酒聊天。

 bar

        我雖然去聽了很多堂課,但絕大部分都有聽沒有懂,不是因為語言的不通,都是概念性的東西比如cross compiler,cflag等等,不知道他們到底是什麼鬼東西。所以我再下面分享一下我比較聽得懂且有興趣的東西。

FAI

起初看到主題提到cloud image,一直誤以為這次的內容和雲端存取有什麼樣的關聯,之後才知道這個project是為了debain的初學者或者是懶人能快速設定並安裝debian os 所設計。

如下圖所示

fai

透過他們提供的網路介面,只要透過勾勾選選與填資料就可以對OS做出初步設定,然後下載iso檔直接安裝,寄省時又省力。




Neo4j 圖資料庫

mark  2018-08-06   留言:0

這次來跟大家介紹一個在Debconf18 演講中學到的資料庫 Graph Database : Neo4j

影片連結

https://www.youtube.com/watch?v=QR4T7xSXrcE&t=8s

這邊他提出了package dependency information 資料很多但很稀疏

使用傳統relational database 不大合適

所以提出使用graph database 來管理的一場演講分享

 

1. 這是一個怎樣的資料庫呢?

簡單來說就是把資料與資料之間關係 以 點(資料)邊(關係)特性(點的詳細資料)紀錄

然後所以資料與資料的關係就會形成一個圖

而在資料查詢的時候只要有點的資料就可以輕鬆查到與這個資料有關係的相關資料

那這樣的資料庫會有哪些好處呢?

根據neo4j官方的說法有以下好處:

1. 可透過圖論分析方法分析資料

2. 圖像視覺化現有資料

會有這個graph database 的原因是:

主要是因為查資料的過程,資料常分散於不同table那勢必要透過join,而join 處理時間相當長,另外維持資料一致性的代價相當高,最後是schema在傳統的database一旦更動,調整代價相當龐大。

 

詳細比較graph database and relational database在這篇文章有畫圖,大家可以看看

https://read01.com/zh-tw/dOBGmO.html#.W2fpQHVuZE4

 

2.好了 那來開始安裝吧

官網︰https://neo4j.com/developer/get-started/

在這一頁有提到 如果不想安裝可以選擇 start a sandbox online

否則就點選 install neo4j 連結 填完基本資料 進入下載頁面

下載好安裝檔後依照建議,將剛剛下載的appimage透過右鍵,屬性,勾選可執行

appimage 介紹 https://zh.wikipedia.org/zh-tw/AppImage

點兩下就可以執行,之後要執行neo4j desktop 可以在Activities 找到,就不用再點選剛剛下載的appimage

neo4j in activities

 

3.安裝好了 然後 看看有哪些功能吧!

一開始運行會要求使用者輸入使用者資訊,這邊小編使用現有的gmail帳號註冊

註冊完後應該會看到類似畫面

Neo4j desktop

首先第一步就是My Project  找到 + New Graph 你就可以建立database

之後按Start 就可以開始了

然後我們到Neo4j Browser 開始玩 graph database 以及 嘗試 cypher 語法

neo4j browser portal

畫面上方可以輸入cypher語法 並可以互動方式看cypher query 視覺化之後的結果

 

4.還是很抽象 有沒有實際例子呢?

一起點下Learn about Neo4j的start learning吧

introduction

在這一部份你會學到和neo4j有關的基本介紹,留給大家自行閱讀

看完之後可以在想關掉的小區塊 右上角的叉叉關掉 

如果想實際操作可以看到畫面最上方有一個地方(console)可以輸入指令
這邊你就可以嘗試cypher 語法來query database, 輸入後按下右側三個按鈕 (星號 /  叉叉 / 三角 )的 三角 來執行

neo4j console

什麼?沒有資料嗎?那就來使用我們期待已久的範例: movie graph

console 輸入 :play movie-graph 就可以看到這一頁

movie graph tutorial

而實用上和原始的資料庫操作一樣

1. 建資料

2. 設條件找資料

那現在來看看怎麼建資料

movie tutorial create graph

程式碼好長~要一行行打嗎?

有注意到第一行的create 前面有一個play的符號? 點下去他就會把這邊的內容 copy到console去了

是不是很方便呢?

create console

最後再來看看程式碼重點順序︰

1. 建立點(電影)以及點內的屬性(片名,上映年,副標)

2. 建立點(人)以及點內的屬性(人名,出生年)

3. 建立關係 ((人)-[在電影中飾演角色[角色名稱]]->(電影))

4. 建立關係 ((人)-[導演]->(電影))

5. 其他節點 與 其他關係建立...

最後可以畫出結果是因為有執行cypher query指令

query after graph created

大意是將有Tom Hanks(a) 演出的電影 並把 電影資訊(m) 導演資訊(d) 名稱一併畫在圖上 並只回報10筆

結果如下

Graph view

movie graph

我們就可以看到以Tom Hanks為圓心 根據上面剛剛搜索要求的導演資訊 電影資訊 把相關內容 連接在一起。

左上角的 紅 藍 綠 小方塊 可以點選 調整 不同節點顯示設定 顏色  / 大小 / 顯示內容 等

左邊一排還可以看不同的結果呈現方式

Table view

將符合條件的結果依照Tom Hanks(a) 演出的電影資訊(m) 導演資訊(d) 依序擺好

movie graph table mode

Text view

把剛剛的table view 換成 text view

movie graph text mode

Code view

這邊如果一開始看太亂 可以點選 像是 Summary 旁的小三角,他會幫你調整內容縮排

movie graph code mode expanded

 

那要怎麼找資料呢?

這邊有簡單示範如何使用cypher 的 match 來完成搜索,後面還有其他範例就留給大家有興趣搜索

neo4j find

neo4j query

最後如果對資料匯入有興趣可以看看northwind 的示範內容

 

其他cypher語法參考連結

https://www.jianshu.com/p/310346976d98

https://blog.csdn.net/qq_34435926/article/details/79934850

 

下次有機會再來跟大家分享如何使用透過spark 使用neo4j

 




 

General-Purpose input/output(gpio)

(他是什麼)簡介:楓葉板是一個強大的單板電腦採用ARM Cortex-A7 高效能處理器更有著許多得擴充槽,支援相機頭,感測,

音效,通訊,控制等多樣化的擴充,提供使用者不論是學生,研究者或者是有志投入相關領域的人開發與測試嵌入式系統的世界。

本次教學涵蓋的內容在利用楓葉板控制Led燈開關與閃爍組合的行為。

1.你會需要:1)楓葉板一片 2)萬用板一片 3)不同顏色發光二極體(Led燈)*4 4)電阻*4 5)小電線*4 6)焊槍與錫條


以上材料皆可於購買楓葉板的網站統一採購。若要自行採購,請注意一下購買電阻的規格(220 Ohm)

    (小知識: 一般 I/O pin 輸出3v的電壓, 而一般Led的順向電壓為2v左右,順向電流5為mA左右,因此要串連一顆(3-2)/0.005=200以上的電阻)

     

    2.GPIO 針腳介紹:

    我們一共有四十隻針腳。為了最有效率的運用每個針腳我們設計每一隻針腳會有不同的功能。而下圖針腳編號(Pin#)旁有有顏色的框框就是我們預設這隻針腳的功能。因此既然我們的主題為GPIO因此我們會用到的部份只有預 設功能是GPIO的針腳。這邊就是編號為11,13,24,26,28,30,32,34的針腳。

    萬用板

     

     

    (如何用)硬體配置:

    這次的示範我選擇使用編號為24,26,28,30的針腳

    依照圖示將LED,電阻與電線焊好後,將背面右上40pin的排針與楓葉板右上方40pin孔的排母結合就完成硬體的配置

     

     

    正面
    正面
    反面
    反面

     

     

    楓葉板
    楓葉板
    完成
    結合圖

     

     

    led

    (範例簡介)python範例:

    以下例子為讓所有LED一起亮一起暗(如果要停止程序請按鍵盤上的任意鍵)

    1.首先我要讓程式知道這是一個python script,在開頭要加上

    #!/usr/bin/python

     

    2.我們要取得那四支pin腳的控制,並設定它們輸出訊號,因此先來了解一下要從哪裡控制,而它們的編號又是什麼。

      以24號pin腳為例:

      首先我們看到 24號pin腳它GPIO那欄的編號有一個數字6(詳細算法請看頁尾*****)那就是我們到時候要選擇這支pin腳時它的編號

      我們在 /sys/class/gpio/ 路徑下的export服務輸入要選用的pin腳編號6,系統就會那隻腳被啟用了

      然後在 /sys/class/gpio6/direction 中輸入 out,就設定完輸出訊號了

     

    自定義函式

    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    

    主程式中

    export_pins(6)
    setpindirection(6, "out")

    (告訴系統我們要控制24號pin腳並將它設為訊號輸出)

     

    3.至於如何使LED暗與亮,我們亦以 24號pin腳的LED為例

      在 /sys/class/gpio6/value 中輸入 1就會亮 0就熄滅

    自定義函式

    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()

    主程式中

    writepins(gpio_pa6, "led_on")

    writepins(gpio_pa6, "led_off")

    我們可以透過編輯不同的LED燈開與關的組合達到自己想要的閃爍模式

     

    4.最後最重要的一點是我們在結束這個程序後要,要告訴系統我們已經使用完這支pin腳,要將使用權還回去

    自定義函式

    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    

    主程式中

    unexport_pins(6)

    完整程式碼:

    #!/usr/bin/python
    # coding=utf8
    ########################################################################################
    #
    # GPIO LED Demo program 
    # Copyright (C) Tony Chen <tony@ces.com.tw>
    # MapleBoard.org
    # 
    # This program is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License version 2 as
    # published by the Free Software Foundation.
    #
    ########################################################################################
    
    import random 
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()
    #random choose LED
    def random_LED():
        randnumber = random.randint(1,4)
        return transfer(randnumber)
    #random choose on or off
    def random_onoff():
        randnumber = random.randint(5,6)
        return transfer(randnumber)
    def transfer(number_chosen):
        pick={
          1: "6",
          2: "7",
          3: "8",
          4: "9",
          5: "led_on",
          6: "led_off"        
        }
        return pick.get(number_chosen)
    #home
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
    
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
        while(1):
            counter=0
            #random1
            while(counter<8):
                a=random_LED()
                writepins(a, "led_on")
                sleep(0.5)
                writepins(a, "led_off")
                sleep(0.5)
                counter=counter+1	
            #random2
            while(counter<16):
                a=random_LED()
                b=random_onoff()
                writepins(a, b)
                sleep(0.5)
                counter=counter+1
            #sequential
            while(counter<24):
                writepins(gpio_pa6, "led_on")
                sleep(0.5)
                writepins(gpio_pa6, "led_off")
                sleep(0.5)
                writepins(gpio_pa7, "led_on")
                sleep(0.5)
                writepins(gpio_pa7, "led_off")
                sleep(0.5)
                writepins(gpio_pa8, "led_on")
                sleep(0.5)
                writepins(gpio_pa8, "led_off")
                sleep(0.5)
                writepins(gpio_pa9, "led_on")
                sleep(0.5)
                writepins(gpio_pa9, "led_off")
                sleep(0.5)
                counter=counter+1
            #two_by_two
            while(counter<32):
                writepins(gpio_pa6, "led_on")
                writepins(gpio_pa7, "led_on")
                sleep(0.5)
                writepins(gpio_pa6, "led_off")
                writepins(gpio_pa7, "led_off")
                sleep(0.5)
                writepins(gpio_pa8, "led_on")
                writepins(gpio_pa9, "led_on")
                sleep(0.5)
                writepins(gpio_pa8, "led_off")
                writepins(gpio_pa9, "led_off")
                sleep(0.5)
                counter=counter+1
            #all
            while(counter<40):
                writepins(gpio_pa6, "led_on")
                writepins(gpio_pa7, "led_on")
                writepins(gpio_pa8, "led_on")
                writepins(gpio_pa9, "led_on")
                sleep(0.5)
                writepins(gpio_pa6, "led_off")
                writepins(gpio_pa7, "led_off")
                writepins(gpio_pa8, "led_off")
                writepins(gpio_pa9, "led_off")
                sleep(0.5)
                counter=counter+1
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    請直接將程式碼複製下來存在製作一個demo.py檔案

    將demo.py丟到 楓葉板的目錄中:

    開啟terminal 連到楓葉板

    $ssh mpl1@your_mapleboards_ID

     

    執行demo.py

    $sudo python /home/mpl1/demo.py

     

    個別範例

    隨機1

    #!/usr/bin/python
    # coding=utf8
    
    import random 
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
            pin.write("1")
        else:
            pin.write("0")
        pin.close()
    #choose random LED
    def random_LED():
        randnumber = random.randint(1,4)
        return transfer(randnumber)
    def transfer(number_chosen):
        pick={
          1: "6",
          2: "7",
          3: "8",
          4: "9"     
        }
        return pick.get(number_chosen)
    #main
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
    
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
        while(1):
          a=random_LED()
          writepins(a, "led_on")
          sleep(1)
          writepins(a, "led_off")
          sleep(1)

    隨機2

    #!/usr/bin/python
    # coding=utf8
    
    import random 
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()
    #random choose LED
    def random_LED():
        randnumber = random.randint(1,4)
        return transfer(randnumber)
    #random choose on or off
    def random_onoff():
        randnumber = random.randint(5,6)
        return transfer(randnumber)
    def transfer(number_chosen):
        pick={
          1: "6",
          2: "7",
          3: "8",
          4: "9",
          5: "led_on",
          6: "led_off"        
        }
        return pick.get(number_chosen)
    #main
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
    
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
        while(1):
          a=random_LED()
          b=random_onoff()
          writepins(a, b)
          sleep(0.5)
          

    依序

    #!/usr/bin/python
    # coding=utf8
    
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()
    #main
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
        
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
        while(1):
          writepins(gpio_pa6, "led_on")
          sleep(1)
          writepins(gpio_pa6, "led_off")
          sleep(1)
          writepins(gpio_pa7, "led_on")
          sleep(1)
          writepins(gpio_pa7, "led_off")
          sleep(1)
          writepins(gpio_pa8, "led_on")
          sleep(1)
          writepins(gpio_pa8, "led_off")
          sleep(1)
          writepins(gpio_pa9, "led_on")
          sleep(1)
          writepins(gpio_pa9, "led_off")
          sleep(1)

    兩個兩個

    #!/usr/bin/python
    # coding=utf8
    
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()
    #main
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
        
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
    
        while(1):
          writepins(gpio_pa6, "led_on")
          writepins(gpio_pa7, "led_on")
          sleep(1)
          writepins(gpio_pa6, "led_off")
          writepins(gpio_pa7, "led_off")
          sleep(1)
          writepins(gpio_pa8, "led_on")
          writepins(gpio_pa9, "led_on")
          sleep(1)
          writepins(gpio_pa8, "led_off")
          writepins(gpio_pa9, "led_off")
          sleep(1)

    全部

    #!/usr/bin/python
    # coding=utf8
    
    gpio_pa6 = 6
    gpio_pa7 = 7
    gpio_pa8 = 8
    gpio_pa9 = 9
    
    #exports the pin that we choose to use  
    def export_pins(pins):
        try:
            f = open("/sys/class/gpio/export","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s already Exists, so skipping export gpio" % (str(pins), )
    #unexports the pin that we choose to use  
    def unexport_pins(pins):
        try:
            f = open("/sys/class/gpio/unexport","w")
            f.write(str(pins), )
            f.close()
        except IOError:
            print "GPIO %s doesn't  Exists, so skipping unexport gpio" % (str(pins), )
    #set the direction of selected pin
    def setpindirection(pin_no, pin_direction):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/direction","w")
        pin.write(pin_direction)
        pin.close()
    #turn on or off the LED of selected pin
    def writepins(pin_no, pin_value):
        gpiopin = "gpio%s" % (str(pin_no), )
        pin = open("/sys/class/gpio/"+gpiopin+"/value","w")
        if pin_value == "led_on":
          pin.write("1")
        else:
          pin.write("0")
        pin.close()
    #main
    if __name__ == '__main__':
        from time import sleep
        unexport_pins(gpio_pa6)
        unexport_pins(gpio_pa7)
        unexport_pins(gpio_pa8)
        unexport_pins(gpio_pa9)
        
        export_pins(gpio_pa6)
        export_pins(gpio_pa7)
        export_pins(gpio_pa8)
        export_pins(gpio_pa9)
    
        setpindirection(gpio_pa6, "out")
        setpindirection(gpio_pa7, "out")
        setpindirection(gpio_pa8, "out")    
        setpindirection(gpio_pa9, "out")
    
        print "press crtl+c to exit"
    
        while(1):
          writepins(gpio_pa6, "led_on")
          writepins(gpio_pa7, "led_on")
          writepins(gpio_pa8, "led_on")
          writepins(gpio_pa9, "led_on")
          sleep(1)
          writepins(gpio_pa6, "led_off")
          writepins(gpio_pa7, "led_off")
          writepins(gpio_pa8, "led_off")
          writepins(gpio_pa9, "led_off")
          sleep(1)

     

     

    ——————————————————————————————————————————————————————————————————————

     

    *****實際上它們編號的算法是數字前面的英文字(A代表1 B代表2  以此類推)-1,乘與32,最後再加上那個數字

            以24號pin腳為例(GPIO-PA6) :                                (A-1)*32+6=6;

            以34號pin腳為例(GPIO-PE15):                              (E-1)*32+15=133

     




    Arm Compute Library是什麼
    Arm Compute Library是針對影像處理、電腦視覺及機器學習的一套豐富的低階函式庫,透過Arm Cortex CPU中的NEON及符合OpenCL的Arm Mali GPU來達成優化的目的。

    Arm Compute Library在MIT授權條款下是能夠免費使用的,它包含以下這些函式:

    ●基本運算

    ●顏色操作

    ●卷積濾波器(Sobel, Gaussian, ...)

    ●邊緣檢測運算(Canny Edge、Harris corner、光流法…)

    ●卷積神經網路(CNN)的相關運算(激活層、卷積層、池化層、完全連接層…)

    ●其他,如GEMM(一般矩陣乘法)、SVM(支援向量機)、HOG(方向梯度直方圖)…

    three main purposes

     

    Arm Compute Library的特色
    近年來,行動運算及智能視覺應用的快速發展,為生活帶來了便利,卻也為開發者們帶來了新的挑戰:

    ●程式碼在不同設備上的可攜性(例如,將程式碼移植到手機或嵌入式裝置時,是否還能使用?)

    ●程式碼在不同架構下的優化(例如,是否有SIMD加速器?是32位元或是64位元的架構?)

    Arm Compute Library的誕生,很大一部份就是為了解決這兩個問題,希望讓基於Arm架構的平台,都能輕鬆實現智能視覺應用的有效運用,以減低成本與設計程式的精力。

    除此之外,Arm Compute Library的效能比起也被廣泛使用的電腦視覺函式庫OpenCV,是有顯著提升的,各種運算都更為快速。

     

    這篇文章將會利用Arm Compute Library提供的程式範例,在楓葉板上玩玩看影像處理。

    照著步驟來,我們將能輕鬆完成如下的效果:

    原始圖片:

    before (helicopter)

    (Photo on VisualHunt)

    卡通化後的圖片:

    after (helicopter) 

     

    1. 下載Arm Compute Library提供的檔案:

    進入Arm Compute Library的github網頁:https://github.com/ARM-software/ComputeLibrary

    download zip

    點選「Clone or download」,再點選「Download ZIP」。下載的同時,可以在github上觀察一下

    Arm Compute Library的架構

    有「arm_compute」、「data」、「docs」等許多資料夾,其中與這篇文章比較相關的,有三個資料夾可以多留意一下,分別是:

    ●「arm_compute」資料夾,它包含了函式庫的所有標頭檔(.h檔)

    ●「examples」資料夾,裡面有幾個可供編譯的範例程式

    ●「src」資料夾,它包含了函式庫的原始檔(.cpp檔)

     

    除此之外,Arm Compute Library的構成,主要分為兩個部份:

    ●「core」:電腦的核心(kernel)被包含在core裡面。核心不會分配記憶體空間,也不會執行多執行緒處理,只會提供工作可以怎麼被切割給不同執行緒的相關資訊。

    ●「runtime」:runtime裡則是函式。這些函式圍繞著電腦的核心,它們會為(多維)矩陣分配記憶體空間,也能利用核心提供的資訊,以多執行緒來運算。

     

     

    2. 將電腦本機與楓葉板連線:

    請先確認已經安裝好你的楓葉板(MapleBoard),並且知道你的楓葉板的IP位址。

    若尚未完成這兩件事,請先參考「MP130楓葉板快速安裝手冊」。

    $ ssh mpl1@192.168.x.xxx

    ssh指令為登入遠端主機,用法為「ssh 使用者名稱@IP位址」。

    楓葉板使用者名稱預設為mpl1。@後面請輸入你的楓葉板的IP位址。

    接著輸入yes(只有在電腦第一次連上楓葉板時才需要)

    接著輸入1234(楓葉板使用者mpl1的預設密碼)

    成功登入後,應該可以看到使用者改變了,如圖:

    mpl1@MPL83

     

     

    3. GUI介面的準備:

    打開GUI介面的家目錄,點選左側的Other Locations,並在圖中紅圈處打上「sftp://192.168.x.xxx(你的楓葉板的IP位址)」,按下Connect。

    enter server address

    接著輸入使用者名稱mpl1及密碼1234,按Connect。

    成功連接上楓葉板後,點選左側新出現的「192.168.x.xxx」,即可看到楓葉板的空白家目錄。

    後面執行各步驟時,可以藉由重新載入目錄,更清楚的看到發生了什麼事情。

    除此之外,我們在查看要處理的圖片檔及處理完畢的檔案時,都將使用到這個目錄。

     

     

    4. 安裝所需的套件:

    $ sudo apt install build-essential unzip scons

    sudo指令為使用系統管理員的身份執行後面的指令,apt install為安裝套件的指令。

    這次會使用到build-essential、unzip及scons這三個套件。

    使用sudo指令時,必須先輸入正確的密碼才能繼續,所以輸入1234

    4.1 檢查將用到的g++是否有安裝成功,及其版本為何:

    $ g++ -v

    若最後一行有出現類似下圖的資訊,

    g++ version

    即代表有安裝成功,及目前版本為何。

     

     

    5. 在楓葉板上建造出完整的Arm Compute Library函式庫:

    5.1 將下載好的檔案移至楓葉板

    使用GUI介面,將步驟1.下載好的「ComputeLibrary-master.zip」檔案剪下(在電腦的家目錄的Downloads資料夾內),並在楓葉板的家目錄貼上。

    註:此步驟亦可在終端機上操作

    $ scp username@computer_IP:/home/username/Downloads/ComputeLibrary-master.zip ~

    scp指令為將遠端資料複製到本地端(或將本地端資料複製到遠端)。~代表家目錄。

    5.2 將下載好的檔案解壓縮

    $ unzip ComputeLibrary-master.zip

    unzip為解壓縮指令。完成後,當前目錄會多出一個「ComputeLibrary-master」資料夾。

    5.3 進入ComputeLibrary-master這個資料夾

    $ cd ComputeLibrary-master

    cd為切換目錄指令。

    5.4 進行編譯,建構出完整的函式庫

    $ scons Werror=1 debug=0 asserts=0 neon=1 opencl=0 examples=1 build=native -j4

    進行編譯。這個步驟約須花費30~40分鐘,請耐心等待。

    完成後,ComputeLibrary-master資料夾內將多出一個「build」資料夾。

     


    6. 測試:

    6.1 設定變數

    $ export LD_LIBRARY_PATH=build/

    export指令為設定環境變數。將LD_LIBRARY_PATH這個變數設定為build/。

    6.2 測試是否已建好環境

    $ ./build/examples/neon_cartoon_effect

    得到如圖的結果:

    test passed

    圖中的「Test passed」代表一切正常,已經可以正確執行。

    而第三行跟我們說明了使用方法為:輸入「./build/examples/neon_cartoon_effect 圖片檔名稱.ppm」

    因此接下來我們要準備副檔名為.ppm的圖片檔。

     

     

    7. 準備欲卡通化的圖片:

    回到楓葉板家目錄的GUI介面,新增一個資料夾並命名為「Pictures」

    將欲卡通化的圖片存入這個資料夾中,請注意必須為.ppm的格式。例如我存了一張「helicopter.ppm」。  

     

     

    8. 將圖片卡通化:

    $ ./build/examples/neon_cartoon_effect ../Pictures/圖片檔名稱.ppm

    「../Pictures/圖片檔名稱.ppm」是圖片的位置,圖片位在上一層目錄(..代表上一層)之中的Pictures資料夾中。

    得到如圖的結果:

    helicopter passed

    「Test passed」代表已經正確執行完畢。

    重新載入一次Pictures資料夾,檔名為「圖片檔名稱.ppm_out.ppm」的檔案,即為卡通化後的影像。

    完成第一張圖片的卡通化後,只要重複步驟7.及8.,就可以繼續處理第二張圖片、第三張圖片…

    8.1 離開楓葉板

    $ exit

    離開mpl1的身份,回到原來的使用者及電腦。今天的玩耍就告一段落囉。

     

     

    9. 日後使用:

    因為今天已經把環境建好(套件安裝了、檔案下載了、程式編譯了…),所以再次登入楓葉板來做影像卡通化時,可以省略許多步驟。

    完成步驟3.,並將欲卡通化的(多個)圖片檔存入Pictures資料夾之後,只需要以下這些指令,即可完成:

    $ ssh mpl1@192.168.x.xxx
    $ 1234
    $ cd ComputeLibrary-master
    $ export LD_LIBRARY_PATH=build/
    $ ./build/examples/neon_cartoon_effect ../Pictures/圖片檔名稱1.ppm
    $ ./build/examples/neon_cartoon_effect ../Pictures/圖片檔名稱2.ppm
    $ ./build/examples/neon_cartoon_effect ../Pictures/圖片檔名稱3.ppm
    $ exit

     

     

    希望大家玩的愉快~

    before (donuts)   after (donuts)

    (Photo credit: ferrysitompul on Visualhunt.com / CC BY)

    before (fountain)   after (fountain)

    (Photo on VisualHunt.com)

    before (goalkeeper)   after (goalkeeper)

    (Photo on Visualhunt.com)

     

     

    參考文章:

    https://community.arm.com/graphics/b/blog/posts/cartoonifying-images-on-raspberry-pi-with-the-compute-library

    https://community.arm.com/graphics/b/blog/posts/arm-compute-library-for-computer-vision-and-machine-learning-now-publicly-available

     




    剪片就算了,還要一直模糊路人的臉,這樣根本弄不完,我看還是明天引咎辭職好了

    同學別急寫辭職信,看完這篇文章再寫還不急

    這邊要跟大家介紹一個簡單好用的人臉偵測函式庫,而他有的功能似乎可以解決我們這位同學的問題︰

    辨識出要保留的人臉+處理其他人臉

    那就來安裝 ageitgey / face recognition

     

    0.介紹ageitgey / face recognition

    這是一個使用dlib 進行影像辨識與深度學習的函式庫,且在Labeled Faces in the Wild (Unrestricted, Labeled Outside Data Results)測試資料中有著99.38%正確率, 作者Adam Geitgey提供了包裝好且易於開發的python 函式庫給大家使用,所以就跟著以下步驟來把我們的楓葉板升級吧。

    作者網站: https://adamgeitgey.com/

    作者git : https://github.com/ageitgey

    dlib 簡介: http://vis-www.cs.umass.edu/lfw/results.html#dlib

    dlib 官網: http://dlib.net/

    lfw 官網:http://vis-www.cs.umass.edu/lfw/

    lfw dlib 結果 :http://vis-www.cs.umass.edu/lfw/results.html#UnrestrictedLb

     

    1. 環境安裝dlib

    Adam 在git 有說明如何安裝

    所以就照著安裝吧

    安裝前環境︰ debian stretch / python 3.5

    接著我們就點到 installing on linux

    這邊需要注意的是 dlib 19.6以後,會有些程式碼需要更高版本的gcc (>6.3)

    但目前的gcc for Debian Stretch 只到 6.3,所以要安裝最新版本dlib的同學們請記得將gcc 手動升級

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install build-essential \
        cmake \
        gfortran \
        git \
        wget \
        curl \
        graphicsmagick \
        libgraphicsmagick1-dev \
        libatlas-dev \
        libavcodec-dev \
        libavformat-dev \
        libboost-all-dev \
        libjpeg-dev \
        liblapack-dev \
        libswscale-dev \
        pkg-config \
        python3-dev \
        python3-numpy \
        python3-pip \
        zip
    sudo apt-get clean

    這邊因為我們列出的是最基本的需要,如果有需要opencv功能記得安裝  libgtk2.0-dev 

     

    2.安裝 face_recognition

    在安裝face_recognition之前,可以先檢查以下library是否已安裝(Pillow是face_recognition 需要的library,而以下這些是Pillow 需要的額外library),因為小編第一次安裝就是因為缺少其中的zlib1g-dev 而compile失敗😭(compile時間約15~25分)

    https://pillow.readthedocs.io/en/5.2.x/installation.html

    sudo apt-get install libtiff5-dev\
        libjpeg-dev \
        zlib1g-dev \
        libfreetype6-dev \ 
        liblcms2-dev \ 
        libwebp-dev \
        libharfbuzz-dev \ 
        libfribidi-dev \
        tcl8.6-dev \ 
        tk8.6-dev \
        python-tk

    在安裝face_recognition之前,記得將swap設定好,因為在這個過程會有程式庫compile,會用掉不少記憶體,如果沒有設定swap 記得暫時先將 swap 設成1G

    sudo nano /etc/dphys-swapfile
    
    < change CONF_SWAPSIZE=100 to CONF_SWAPSIZE=1024 and save / exit nano >
    
    sudo /etc/init.d/dphys-swapfile restart

    設定完就可以安裝

    pip3 install face_recognition

    設定完成記得還原swap設定

    sudo nano /etc/dphys-swapfile
    
    < change CONF_SWAPSIZE=1024 to CONF_SWAPSIZE=100 and save / exit nano >
    
    sudo /etc/init.d/dphys-swapfile restart

    安裝完成應該會看到以下訊息

    Successfully installed Click-6.7 Pillow-5.2.0 dlib-19.13.1 face-recognition-1.2.2 face-recognition-models-0.3.0 numpy-1.14.5

     

    3. 測試

    首先先試試看 python 是否可以正常動作,進入python console 並輸入以下內容

    import dlib
    import face_recognition
    

    如果安裝沒問題應該都可以正常動作,就可以先離開python console

    來跑跑看範例吧

    git clone https://github.com/ageitgey/face_recognition.git

    下載完後,移動到examples 資料夾下,並試跑一個範例

    cd /PATH/TO/GIT/CLONE/face_recognition/examples
    python3 digital_makeup.py

    沒有東西 沒關係 我們改寫範例 輸出結果成圖檔

    打開digital_makeup.py 並將最後一行改寫成以下形式

    pil_image.show()
    pil_image.save( "digital_makeup.jpeg", "JPEG" )

    原始圖

    original picture

    digital makeup 處理後結果

    digital makeup

    太好了 看起來沒有其他問題

     

    4. 實際範例 - 路人馬賽克裝置 (opencv 需要安裝)

    簡單來說就是把明星旁的路人們馬賽克掉

    但這部份涉及肖像權,所以就無法將測試結果放上來

    以下分段說明實做,可以參考以下三個檔案

     

    1. blur_faces_on_webcam.py  

    在找到臉的地方模糊化

    如果不想裝opencv 也可以使用pillow 的imageFilter

    http://pillow.readthedocs.io/en/5.1.x/reference/ImageFilter.html

     

    2. identify_and_draw_boxes_on_faces.py

    將想保留的人臉輸入known_face_encodings

     

    3. facerec_from_vide_file.py

    對每一個frame進行臉偵測並處理

     

    程式核心部份︰

    對每一個frame :

        如果有認得出來的人臉=> 保留

        否則=>馬賽克

    (馬賽克實做方式不限,可以選擇多種filter搭配使用)

    以下是人臉判斷部份程式碼;

    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        # See if the face is a match for the known face(s)
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
        # If a match was found in known_face_encodings, just use the first one.
        if True in matches:
            first_match_index = matches.index(True)
            draw.rectangle(((left, top), (right, bottom)), outline=(0, 0, 255))
    
            # Draw a label with a name below the face
            text_width, text_height = draw.textsize(name)
            draw.rectangle(((left, bottom - text_height - 10), (right, bottom)), fill=(0, 0, 255), outline=(0, 0, 255))
            draw.text((left + 6, bottom - text_height - 5), name, fill=(255, 255, 255, 255))
        else:
            box = (left,top,right,bottom)
            the_face=pil_image.crop(box)
            the_face = the_face.filter(ImageFilter.UnsharpMask(5, 400, 3))
            for i in range(10):  # with the BLUR filter, you can blur a few times to get the effect you're seeking
                the_face = the_face.filter(ImageFilter.MedianFilter(5))
            pil_image.paste(the_face, box)

    但需要注意的是︰只有完全正面沒有被遮蔽的人臉才會被偵測,或許有機會調整其他偵測設定參數來讓人臉偵測也可以偵測側臉部份,但這部份小編輯還不清楚,有嘗試出結果的同學們在下面留言分享你是如何完成的吧。☺️

     

    5. 實際範例 - 假文青產生器

    最後附上的是參考blur_faces_on_webcam.py + identify_and_draw_boxes_on_faces.py

    基本上跟上面做的事情差不多,只是這邊模糊化不會像上面誇張,然後把擷取出的臉

    在下面寫下假文青標語,

    塔搭! 文青感的自拍就完成了

    這邊附上部份程式碼供大家參考

    for top, right, bottom, left in face_locations:
        box = (left,top,right,bottom)
        the_face=pil_image.crop(box)
        the_face = the_face.filter(ImageFilter.UnsharpMask(5, 400, 3))
    
        for i in range(10):  # with the Median filter, you can blur a few times to get the effect you're seeking
            the_face = the_face.filter(ImageFilter.MedianFilter(5))
    
        pil_image.paste(the_face, box)
        draw.rectangle(((left, top), (right, bottom)), outline=(0, 0, 0))
        # Draw a label with a slogan below the face
        text_width, text_height = draw.textsize(slogan)
        draw.rectangle(((left, bottom - text_height*len(lines) - 10), (right, bottom)), fill=(0, 0, 0), outline=(0, 0, 0))
        y_text = bottom - text_height*len(lines)
    
        for line in lines:
            draw.text((left + 6, y_text - 5), line, fill=(255, 255, 255, 255))
            y_text += text_height
    
        output_box = (left,top,right,y_text)
        fake_hipster_selfie=pil_image.crop(output_box)

     

    來看看結果如何吧!

    原始圖

    original picture

    假文青產生器處理結果

    fake hipster selfie generator

     

    下次有機會在分享其他有趣的人臉辨識小程式




     

    General-Purpose input/output(gpio)

    (他是什麼)簡介:楓葉板是一個強大的單板電腦採用ARM Cortex-A7 高效能處理器更有著許多得擴充槽,支援相機頭,感測,

    音效,通訊,控制等多樣化的擴充,提供使用者不論是學生,研究者或者是有志投入相關領域的人開發與測試嵌入式系統的世界。

    本次教學涵蓋的內容在利用楓葉板控制Led燈開關與閃爍組合的行為。

    1.你會需要:1)楓葉板一片 2)萬用板一片 3)不同顏色發光二極體(Led燈)*4 4)電阻*4 5)小電線*4 6)焊槍與錫條


    以上材料皆可於購買楓葉板的網站統一採購。若要自行採購,請注意一下購買電阻的規格(220 Ohm)

      (小知識: 一般 I/O pin 輸出5v的電壓, 而一般Led的順向電壓為1.8v-3.3v左右,順向電流20為mA左右,因此要串連一顆(5-1.8)/0.02=160以上的電阻)

       

      2.GPIO 針腳介紹:

      我們一共有四十隻針腳。為了最有效率的運用每個針腳我們設計每一隻針腳會有不同的功能。而下圖針腳編號(Pin#)旁有有顏色的框框就是我們預設這隻針腳的功能。因此既然我們的主題為GPIO因此我們會用到的部份只有預 設功能是GPIO的針腳。這邊就是編號為11,13,24,26,28,30,32,34的針腳。

      萬用板

       

       

      (如何用)硬體配置:

      這次的示範我選擇使用編號為24,26,28,30的針腳

      依照圖示將LED,電阻與電線焊好後,將背面右上40pin的排針與楓葉板右上方40pin孔的排母結合就完成硬體的配置

       

       

      正面
      正面
      反面
      反面

       

       

      楓葉板
      楓葉板
      完成
      結合圖

       

       

      led

      (範例簡介)script範例:

      以下例子為讓所有LED一起亮一起暗(如果要停止程序請按鍵盤上的任意鍵)

      1.首先我要讓程式知道這是一個bash script,在開頭要加上

      # !/bin/bash

       

      2.我們要取得那四支pin腳的控制,並設定它們輸出訊號,因此先來了解一下要從哪裡控制,而它們的編號又是什麼。

       首先我們看到 24號pin腳它GPIO那欄的編號有一個數字6(詳細算法請看頁尾*****)那就是我們到時候要選擇這支pin腳時它的編號,然後我們

      教照下面的方式輸入:

      echo 6 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio6/direction

      (告訴系統我們要控制24號pin腳並將它設為訊號輸出)

       

      3.至於如何LED暗與亮,我們亦以 24號pin腳的LED為例

      echo 1 > /sys/class/gpio/gpio6/value

      echo 0 > /sys/class/gpio/gpio6/value

      我們可以透過編輯不同的LED燈開與關的組合達到自己想要的閃爍模式

       

      4.最後最重要的一點是我們在結束這個程序後要,要告訴系統我們已經使用完這支pin腳,要將使用權還回去

      echo 6> /sys/class/gpio/unexport

      完整程式碼:

      #!/bin/bash
      ########################################################################################
      #
      # GPIO LED Demo program 
      # Copyright (C) Tony Chen <tony@ces.com.tw>
      # MapleBoard.org
      # 
      # This program is free software; you can redistribute it and/or modify
      # it under the terms of the GNU General Public License version 2 as
      # published by the Free Software Foundation.
      #
      ########################################################################################
      
      #export the GPIO ports PA6,PA7,PA8,PA9 that we want to drive the four LEDs.
      #the index of GPIO pin that we want to export is calculated as follow: 
      #GPIO-PAn ,(the English letter in front of the number(A is 1,B is 2 and so on )-1)*32+n 
      #And in this case it is (A-1)*32+n=n. 
      echo 6 > /sys/class/gpio/export
      echo 7 > /sys/class/gpio/export
      echo 8 > /sys/class/gpio/export
      echo 9 > /sys/class/gpio/export
      
      #Set direction for the GPIO pin
      echo "out" > /sys/class/gpio/gpio6/direction
      echo "out" > /sys/class/gpio/gpio7/direction
      echo "out" > /sys/class/gpio/gpio8/direction
      echo "out" > /sys/class/gpio/gpio9/direction
      iterate=4 
      echo "press 'ctrl+c' to terminate the program"
      while [ 1 ]; do
      	count=0
      	#this section of the program makes LEDs turn on and off altogether
      	while [ $count -lt $iterate ];do	
      		echo 1 > /sys/class/gpio/gpio6/value
      		echo 1 > /sys/class/gpio/gpio7/value
      		echo 1 > /sys/class/gpio/gpio8/value
      		echo 1 > /sys/class/gpio/gpio9/value
      		sleep 1
              	echo 0 > /sys/class/gpio/gpio7/value	
      		echo 0 > /sys/class/gpio/gpio8/value
      		echo 0 > /sys/class/gpio/gpio6/value
      		echo 0 > /sys/class/gpio/gpio9/value
      		sleep 1
      		let "count++"
      	done
      	k=$iterate*2
      	#make LEDs turn on and off two by two
      	while [ $count -lt $k ];do
      		echo 1 > /sys/class/gpio/gpio6/value
      		echo 1 > /sys/class/gpio/gpio7/value
      		sleep 0.5
      		echo 0 > /sys/class/gpio/gpio6/value
      		echo 0 > /sys/class/gpio/gpio7/value
      		sleep 0.1
      		echo 1 > /sys/class/gpio/gpio8/value
      		echo 1 > /sys/class/gpio/gpio9/value
      		sleep 0.5
      		echo 0 > /sys/class/gpio/gpio8/value
      		echo 0 > /sys/class/gpio/gpio9/value
      		sleep 0.1
      		let "count++"
              done
      	#make LEDs turn on and off sequentially
      	k=$iterate*3
      	while [ $count -lt $k ]; do
      		echo 1 > /sys/class/gpio/gpio6/value
      		sleep 0.5
      		echo 0 > /sys/class/gpio/gpio6/value
      		sleep 0.1
      		echo 1 > /sys/class/gpio/gpio7/value
      		sleep 0.5
      		echo 0 > /sys/class/gpio/gpio7/value
      		sleep 0.1
      		echo 1 > /sys/class/gpio/gpio8/value
      		sleep 0.5
      		echo 0 > /sys/class/gpio/gpio8/value
      		sleep 0.1
      		echo 1 > /sys/class/gpio/gpio9/value
      		sleep 0.5
      		echo 0 > /sys/class/gpio/gpio9/value
      		sleep 0.1
      		let "count++"
      	done
      	k=$iterate*4
      	#make LEDs glow randomly
      	while [ $count -lt $k  ]; do
      		rdmN=$(( ( RANDOM % 4 )  + 1 ))
      		case "$rdmN" in
      		1)echo 1 > /sys/class/gpio/gpio6/value
      			sleep 0.5
      			echo 0 > /sys/class/gpio/gpio6/value
      			sleep 0.1
      		;;
      		2)echo 1 > /sys/class/gpio/gpio7/value
      			sleep 0.5
      			echo 0 > /sys/class/gpio/gpio7/value
      			sleep 0.1
      		;;
      		3)echo 1 > /sys/class/gpio/gpio8/value
      			sleep 0.5
      			echo 0 > /sys/class/gpio/gpio8/value
      			sleep 0.1
      		;;
      		4)echo 1 > /sys/class/gpio/gpio9/value
      			sleep 0.5
      			echo 0 > /sys/class/gpio/gpio9/value
      			sleep 0.1
      		esac
      		let "count++"
      	done
      	k=$iterate*6
      	#make LEDs glow randomly
      	while [ $count -lt $k  ]; do
      		rdmN=$(( ( RANDOM % 8 )  + 1 ))
      		case "$rdmN" in
      		1)echo 1 > /sys/class/gpio/gpio6/value
      			sleep 0.1
      		;;
      		2)echo 1 > /sys/class/gpio/gpio7/value
      			sleep 0.1
      		;;
      		3)echo 1 > /sys/class/gpio/gpio8/value
      			sleep 0.1
      		;;
      		4)echo 1 > /sys/class/gpio/gpio9/value
      			sleep 0.1	
      		;;
      		5)echo 0 > /sys/class/gpio/gpio6/value
      			sleep 0.1
      		;;
      		6)echo 0 > /sys/class/gpio/gpio7/value
      			sleep 0.1
      		;;
      		7)echo 0 > /sys/class/gpio/gpio8/value
      			sleep 0.1
      		;;
      		8)echo 0 > /sys/class/gpio/gpio9/value
      			sleep 0.1
      		esac
      		let "count++"	
      	done
      	
      done
      
      
      echo "Thanks for using this script."
      #release the ports that we used
      echo 6 > /sys/class/gpio/unexport
      echo 7 > /sys/class/gpio/unexport
      echo 8 > /sys/class/gpio/unexport
      echo 9 > /sys/class/gpio/unexport
      
      exit 0

      請直接將程式碼複製下來存在製作一個demo.sh檔案存在Documents

      將all.sh丟到 楓葉板的目錄中:

      開啟terminal 連到楓葉板

      $ssh mpl1@your_mapleboards_ID

       

      執行all.sh

      $sudo bash /home/mpl1/demo.sh

       

      個別範例

      請按任一鍵結束程序(請看頁尾####)

      隨機1

      #!/bin/bash
      #random1
      #export the ports that we what to use
      echo 6 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio6/direction
      echo 7 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio7/direction
      echo 8 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio8/direction
      echo 9 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio9/direction
      
      if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
      while [ -z "$keypress" ]; do
      	rdmN=$(( ( RANDOM % 4 )  + 1 ))
      	case "$rdmN" in
      	1) echo 1 > /sys/class/gpio/gpio6/value
      		sleep 0.5
      		echo 0 > /sys/class/gpio/gpio6/value
      		sleep 0.1
      	;;
      	2)echo 1 > /sys/class/gpio/gpio7/value
      		sleep 0.5
      		echo 0 > /sys/class/gpio/gpio7/value
      		sleep 0.1
      	;;
      	3)echo 1 > /sys/class/gpio/gpio8/value
      		sleep 0.5
      		echo 0 > /sys/class/gpio/gpio8/value
      		sleep 0.1
      	;;
      	4)echo 1 > /sys/class/gpio/gpio9/value
      		sleep 0.5
      		echo 0 > /sys/class/gpio/gpio9/value
      		sleep 0.1
      	esac
      	read keypress
      done
      if [ -t 0 ]; then stty sane; fi
      
      #release the ports that we used
      echo "Thanks for using this script."
      echo 6 > /sys/class/gpio/unexport
      echo 7 > /sys/class/gpio/unexport
      echo 8 > /sys/class/gpio/unexport
      echo 9 > /sys/class/gpio/unexport
      
      exit 0

      隨機2

      #!/bin/bash
      #random2
      #export the ports that we what to use
      echo 6 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio6/direction
      echo 7 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio7/direction
      echo 8 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio8/direction
      echo 9 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio9/direction
      
      if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
      while [ -z "$keypress" ]; do
      	rdmN=$(( ( RANDOM % 8 )  + 1 ))
      	case "$rdmN" in
      	1) echo 1 > /sys/class/gpio/gpio6/value
      		sleep 0.1
      	;;
      	2)echo 1 > /sys/class/gpio/gpio7/value
      		sleep 0.1
      	;;
      	3)echo 1 > /sys/class/gpio/gpio8/value
      		sleep 0.1
      	;;
      	4)echo 1 > /sys/class/gpio/gpio9/value
      		sleep 0.1	
      	;;
      	5)echo 0 > /sys/class/gpio/gpio6/value
      		sleep 0.1
      	;;
      	6)echo 0 > /sys/class/gpio/gpio7/value
      		sleep 0.1
      	;;
      	7)echo 0 > /sys/class/gpio/gpio8/value
      		sleep 0.1
      	;;
      	8)echo 0 > /sys/class/gpio/gpio9/value
      		sleep 0.1
      	esac
      	read keypress		
      done
      if [ -t 0 ]; then stty sane; fi
      
      #echo "You pressed '$keypress' after $count loop iterations"
      echo "Thanks for using this script."
      echo 6 > /sys/class/gpio/unexport
      echo 7 > /sys/class/gpio/unexport
      echo 8 > /sys/class/gpio/unexport
      echo 9 > /sys/class/gpio/unexport
      
      exit 0

      依序

      #!/bin/bash
      #sequential
      #export the ports that we what to use
      echo 6 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio6/direction
      echo 7 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio7/direction
      echo 8 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio8/direction
      echo 9 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio9/direction
      
      if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
      while [ -z "$keypress" ]; do
      	echo 1 > /sys/class/gpio/gpio6/value
      	echo 1 > /sys/class/gpio/gpio7/value
      	sleep 0.5
      	echo 0 > /sys/class/gpio/gpio6/value
      	echo 0 > /sys/class/gpio/gpio7/value
      	sleep 0.1
      	echo 1 > /sys/class/gpio/gpio8/value
      	echo 1 > /sys/class/gpio/gpio9/value
      	sleep 0.5
      	echo 0 > /sys/class/gpio/gpio8/value
      	echo 0 > /sys/class/gpio/gpio9/value
      	sleep 0.1
      	read keypress
      done
      if [ -t 0 ]; then stty sane; fi
      
      #release the ports that we used
      echo "Thanks for using this script."
      echo 6 > /sys/class/gpio/unexport
      echo 7 > /sys/class/gpio/unexport
      echo 8 > /sys/class/gpio/unexport
      echo 9 > /sys/class/gpio/unexport
      
      exit 0

      兩個兩個

      #!/bin/bash
      #two_by_two
      #export the ports that we what to use
      echo 6 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio6/direction
      echo 7 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio7/direction
      echo 8 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio8/direction
      echo 9 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio9/direction
      
      if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
      while [ -z "$keypress" ]; do
      	echo 1 > /sys/class/gpio/gpio6/value
      	echo 1 > /sys/class/gpio/gpio7/value
      	sleep 0.5
      	echo 0 > /sys/class/gpio/gpio6/value
      	echo 0 > /sys/class/gpio/gpio7/value
      	sleep 0.1
      	echo 1 > /sys/class/gpio/gpio8/value
      	echo 1 > /sys/class/gpio/gpio9/value
      	sleep 0.5
      	echo 0 > /sys/class/gpio/gpio8/value
      	echo 0 > /sys/class/gpio/gpio9/value
      	sleep 0.1
      	read keypress
      done
      if [ -t 0 ]; then stty sane; fi
      
      #release the ports that we used
      echo "Thanks for using this script."
      echo 6 > /sys/class/gpio/unexport
      echo 7 > /sys/class/gpio/unexport
      echo 8 > /sys/class/gpio/unexport
      echo 9 > /sys/class/gpio/unexport
      
      exit 0

      max-width: 100%; height: auto;

      全部

      #!/bin/bash
      #all
      #export the ports that we what to use
      echo 6 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio6/direction
      echo 7 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio7/direction
      echo 8 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio8/direction
      echo 9 > /sys/class/gpio/export
      echo "out" > /sys/class/gpio/gpio9/direction
      
      if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
      while [ -z "$keypress" ]; do
      	echo 1 > /sys/class/gpio/gpio6/value
      	echo 1 > /sys/class/gpio/gpio7/value
      	echo 1 > /sys/class/gpio/gpio8/value
      	echo 1 > /sys/class/gpio/gpio9/value
      	sleep 1
              echo 0 > /sys/class/gpio/gpio7/value	
      	echo 0 > /sys/class/gpio/gpio8/value
      	echo 0 > /sys/class/gpio/gpio6/value
      	echo 0 > /sys/class/gpio/gpio9/value
      	sleep 1
      	read keypress
      done
      if [ -t 0 ]; then stty sane; fi
      
      echo "Thanks for using this script."
      #release the ports that we used
      echo 6 > /sys/class/gpio/unexport
      echo 7 > /sys/class/gpio/unexport
      echo 8 > /sys/class/gpio/unexport
      echo 9 > /sys/class/gpio/unexport
      
      exit 0

       

       

      ——————————————————————————————————————————————————————————————————————

       

      *****實際上它們編號的算法是數字前面的英文字(A代表1 B代表2  以此類推)-1,乘與32,最後再加上那個數字

              以24號pin腳為例(GPIO-PA6) :                                (A-1)*32+6=6;

              以34號pin腳為例(GPIO-PE15):                              (E-1)*32+15=133

      ####這一部份的程式在感應到按鍵以前會繼續執行迴圈的,而迴圈裡面的內容就是我們要這四顆LED燈閃爍的模式

      if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
      while [ -z "$keypress" ]; do
      	
              #your pattern
          
      	read keypress
      done
      if [ -t 0 ]; then stty sane; fi



      楓葉板維基條目

      jonas  2018-06-29   留言:0

      楓葉板(英語:MapleBoard),是一種採用ARM Cortex-A系列[0]應用處理器及開源Linux作業系統[1]的多面向全方位單板電腦[2],可作為學習板、應用板、開發板[3]、測試板、發想板、DIY板等之用。楓葉板採用Web桌面環境[4][5],可在遠端瀏覽器上,操作楓葉板,讓使用者方便操作。並且擁有規劃完整的社群,能讓使用者一起討論、分享與交換心得。楓葉板開發的初衷,是希望從小學生到退休人員,甚至想開創第二事業生涯的人,不分男女老幼、教育程度、工作經驗及成長背景等,都可學習使用開源楓葉板,培養編寫程式,應用電腦的專長,並在過程中提升資訊科技應用與創新能力。

       

      楓葉板 

                                                MP130楓葉板單板電腦

      楓葉板Web DE

                                                   楓葉板Web桌面環境

       

      MP130楓葉板爲開源楓葉板計劃的第一個產品,其研發設計和軟、硬體整合,均由楓葉板社群成員完成。楓葉板採用ARM Cortex-A7[6]四核心應用處理器,具有高速運算處理能力。豐富完整的IO介面,可以充分支援各種場合所需的輸入、輸出及網路通訊需求。擴充卡插槽,可支援各種顯示、相機、多功能輸出入、控制、感測、遙控、音效、加密解密、通訊等多樣化擴充卡,運用領域廣泛。 

       

      楓葉板正面照

       

      MP130 開放源碼楓葉板硬體規格

      應用處理器 CPU Quad ARM Cortex-A7 (H3)
      Frequency 1.3GHz
      L2 Cache 512KB
      記憶體 Technology DDR3 1600 MHz
      On-board memory 1GB
      顯示器 Display Engine Up to 4096x4096
      Video Engine Up to 1080p@60fps
      GPU ARM Mali400 MP2
      HDMI V1.4 output with HDCP1.2
      影像系統 CSI 5M CMOS sensor support
      Capture Resolution Up to 1080p@30fps
      網路 Speed 10/100Mbps
      Transceiver Internal Phy
      Connector RJ45 with 2 LED
      聲音編解碼器 ADC 2-ch 92dB
      DAC 2-ch 100dB
      I2S/PCM Interface 32-bit 8KHz ~ 192KHz
      聲音輸出入 Input Stereo line-in phone jack
      Ouput Stereo line-out phone jack
      儲存空間 eMMC 8GB, 8-bit I/F, V4.41
      microSD SD2.0 microSD Slot
      串列通訊埠 UART 3-pin Header + 5V-pin
      指示燈 Power ON / OV 1 LED
      Status 2 LEDs
      按鍵與跨接器 Power, Reset, User 3 Buttons
      Uboot 1 Jumper
      擴充插槽 UART 3 ports
      I2C 2 ports
      SPI 1 port
      I2S/PCM 2 ports
      SDIO 1 port V2.0
      CSI 8 bits
      USB2.0 2 ports Host
      GPIO 24 ports
      IR-RX 1 port
      電源 Source DC-IN Jack
      DC-IN 5V 3A
      外觀 Dimensions (W x L) 85 mm x 100 mm
      Height 18 mm
      Weight 58 g

       

      楓葉板體積小、重量輕。長寬高分別爲85mm、100mm、18mm,是小尺寸全功能的單板電腦,可輕鬆靈活的嵌入至各種設備或裝置中。重量58公克,小巧輕便、方便攜帶。輕薄短小的外形與體積,適合行動、飛行等相關裝置設備,例如遙控空拍機[10]之應用。楓葉板之軟、硬體均採開放源碼模式[12],公開軟體的原始碼和硬體的電路設計,鼓勵使用者學習、研究、改良和創新。任何個人、任何團體、任何機構和組織都可加以運用,具有很大的彈性與發揮空間。MP130四核心開放源碼楓葉板也因此能夠持續地改良、更新,在裝置功能與應用上不斷的進步與成長。

      前方連接器

      前方連接器

       

      後方連接器

      後方連接器

      MP130楓葉板40Pin擴充插槽接腳圖

      3rd FUNC 2nd FUNC GPIO Pin# Pin# GPIO 2nd FUNC 3rd FUNC
      GND 1 2 GND
      JTAG-MS UART2-TX GPIO-PA0 3 4 NC
      JTAG-CK UART2-RX GPIO-PA1 5 6 AP-RESET#
      JTAG-DO UART2-RTS GPIO-PA2 7 8 GPIO-PA13 SPI1-CS UART3-TX
      JTAG-DI UART2-CTS GPIO-PA3 9 10 GPIO-PA14 SPI1-CLK UART3-RX
      GPIO-PC4 11 12 GPIO-PA15 SPI1-MOSI UART3-RTS
      GPIO-PC7 13 14 GPIO-PA16 SPI1-MISO UART3-CTS
      DI-TX TWI0-SCK GPIO-PA11 15 16 GPIO-PA18 PCM0-SYNC TWI1-SCK
      DI-RX TWI0-SDA GPIO-PA12 17 18 GPIO-PA19 PCM0-CLK TWI1-SDA
      S-TWI-SCK GPIO-PL0 19 20 GPIO-PA20 PCM0-DOUT
      S-TWI-SDA GPIO-PL1 21 22 GPIO-PA21 PCM0-DIN
      SPDIF-OUT GPIO-PA17 23 24 GPIO-PA6
      SPI0-MOSI GPIO-PC0 25 26 GPIO-PA7
      SPI0-MISO GPIO-PC1 27 28 GPIO-PA8
      SPI0-CLK GPIO-PC2 29 30 GPIO-PA9
      SPI0-CS GPIO-PC3 31 32 GPIO-PE14
      NC 33 34 GPIO-PE15
      VCC-3V3 35 36 VCC-5V
      VCC-5V 37 38 VCC-5V
      GND 39 40 GND

       

      Maple GNU/Linux 作業系統

      Maple GNU作業系統

       

      Maple GNU/Linux作業系統,為一功能完整且針對楓葉板應用需求所設計的作業系統,能連結、整合和管理楓葉板單板電腦的軟、硬體資源。 Maple GNU/Linux作業系統衍生自Debian[13] GNU/Linux 作業系統,故其操作及使用方法和 Debian GNU/Linux 相同。

      Maple 作業系統提供 MapleWebDE網頁桌面環境,可由此進行系統管理設定,啓動應用程式執行,及開發相關應用程式等等。Maple GNU/Linux作業系統也提供標準的文字模式 Unix Shell[14] ,可藉由輸入 Shell 命令,進行系統管理、使用者設定、安全設定、啓動應用程式執行等等。

      Maple 作業系統提供完整的網路連線能力,從實體層的相關驅動程式,到資料鏈接層[15]網路層[15-1]傳輸層[15-2],以及更高層等。 Maple 作業系統支援各種常用的通訊協定[16]網路管理[17]公用程式[19],可隨着不同的應用場合,選擇使用。

      Maple 作業系統提供完整的 GNU 程式開發工具鏈[20]GNU Build 系統[20-1]GNU 除錯系統[21],可用來開發 C/C++ 以及其他程式語言應用程式。 Maple作業系統也支援 Python 、 Java 、 Perl 、 PHP 、 Javascript 等直譯式程式語言[22]開發應用程式。

      Maple 作業系統還提供豐富的公用程式庫[24]中介軟體[25],可供應用程式呼叫使用。

      Maple 作業系統採用Debian套件管理[26]系統,提供三萬多個套件軟體,隨需要可從Maple 套件管理和發行管理[27]伺服器下載安裝。

       

      楓葉板在人工智慧上的應用機會

      楓葉板可以做爲人工智慧深度神經網路[28]推論引擎[31][32](Inference Engine)或是邊緣裝置(Edge Device)。先在大型的深度神經網路訓練系統,經過訓練學習後,得到成功的深度神經網路,然後將此深度神經網路放入楓葉板,即可讓楓葉板執行人工智慧深度神經網路任務,例如圖像辨識分類、智慧感測控制等等。因爲楓葉板體積小功耗少成本低,可將多數個楓葉板組成符合經濟效益之運算叢集[34](Cluster),然後利用深度學習框架的分散平行處理架構,例如Tensorflow[40],成爲高效能之推論引擎或邊緣裝置。人工智慧的應用往往需要龐大的資料,楓葉板很適合設計成各種資料擷取[41]裝備,大量快速採集各種數據,提供給深度學習訓練用。

       

      楓葉板、BeagleBoard樹莓派

      單板電腦的起源,是因為各系統晶片[42]製造廠爲了讓系統設計工程師了解其系統晶片的效能,而推出各種評估板[44]。評估板把系統晶片的絕大部份功能都設計利用出來,因此相當複雜,電路板面積龐大,成本高昻,約在五、六千美元到一萬美元上下。通常很少由個人購買,大部分是公司、機構等購買。系統晶片製造廠之一德州儀器[45]公司相關之BeagleBoard[46]計劃,於2008[46]年推出一精簡版的開源評估板,面積不到10cm x 10cm,價格不到一百美元。BeagleBoard的推出,立刻引起工程師們個人的購買風潮,銷量打破以前評估板想像不到的大量,產生很多工程師個人的開發計劃,形成開源BeagleBoard社群。社群成員間相互技術支援,不再需要依靠原廠,徹底改變了評估板的遊戲規則。英國的樹莓派基金會[48]基於全面推廣數位應用的目標,於2011[48]年推出售價三十元上下的單板電腦樹莓派,打破過去評估板限於工程師使用的領域,讓一般社會大衆廣泛學習利用單板電腦。樹莓派開創了電腦應用的新局面,帶來劃時代的影響。

      楓葉板社群鑑於BeagleBoard和樹莓派的成功及影響,深入瞭解到其中最精彩的部分包括利用開源力量,集衆志開發單板電腦及相關之作業系統,以及開源系統晶片[50]之開發設計,和在地社群的建立與經營,而不止是應用單板電腦而已。楓葉板社群因此展開設計製作一系列楓葉板單板電腦,開發Maple GNU/Linux作業系統和楓葉板Web桌面環境,建立楓葉板軟體套件伺服器,並計劃將來加入開源系統晶片開發專案。

       

      楓葉板社群

      楓葉板社群是由一群對開源嵌入式系統之技術、應用、行銷、企劃等有興趣的人士所組成,包括工程師、教師、學生、發明家、藝術家、創業家及各類專業人士等。目的在於推廣、提昇、支援開源嵌入式系統的發展。楓葉板社群注重開源的推廣與應用,透過開源的大力推廣,對於個人、社群和整體社會的未來發展產生積極影響。楓葉板社群以科技、開源、創客[51]和教育爲四大主題。藉着網路論壇、部落格、郵件列表[53][54]、即時通訊、各種定期、不定期研討會、訓練課程、工作坊、年會等活動連結一起。藉着不斷提升自我和群組能力,創造價值,服務人群和社會。

       

      Tag:

      1.楓葉板

      2.樹莓派

      3.開源

      4.Linux作業系統

      5.創客

      6.人工智慧

      7.人工智能

       

      參考資料

      0. "ARM Cortex-A", Wikipedia

      1. "Linux", Wikipedia

      2. "Single-board computer", Wikipedia

      3. "Microprocessor development board", Wikipedia

      4. "Web desktop", Wikipedia

      5. Debian Wiki team, "DesktopEnvironment". Debian 2017年3月5日.

      6. "ARM Cortex-A7", Wikipedia

      10. Lock Sir周亦樂. "一定要知的無人機結構與飛行原理". 航拍機新手必讀!.DronesPlayer2016年5月1日.

      12. "Open-source model", Wikipedia

      13. "Debian", Wikipedia

      14. "Unix shell", Wikipedia

      15.  "Data link layer", Wikipedia

      15-1.  "Network layer", Wikipedia

      15-2.  "Transport layer", Wikipedia

      16. "Communication protocol", Wikipedia

      17. "Network management", Wikipedia

      19. "Utility software", Wikipedia

      20. "Toolchain", Wikipedia

      20-1. "GNU Build System", Wikipedia

      21. "GNU Debugger", Wikipedia

      22. "Interpreter (computing)", Wikipedia

      24. "Library (computing)", Wikipedia

      25. "Middleware", Wikipedia

      26. "APT (Debian)", Wikipedia

      27. "CD180 CeMOS/Cedar 軟體套件管理和發行管理雲端服務". 中鼎嵌入式系統股份有限公司.

      28. "Deep learning", Wikipedia

      31. "Inference engine", Wikipedia

      34. "Computer cluster", Wikipedia

      40. "Tensorflow", Wikipedia

      41. "Data acquisition", Wikipedia

      42. "System on a chip", Wikipedia

      44. "Microprocessor development board", Wikipedia

      45. "Texas Instruments", Wikipedia

      46. "BeagleBoard ", Wikipedia

      48. "Raspberry Pi Foundation ", Wikipedia

      50. "OpenRISC", Wikipedia

      51. "Maker Faire", Wikipedia

      53. "Mailing list", Wikipedia