Quantcast
Channel: CAVEDU教育團隊技術部落格
Viewing all 678 articles
Browse latest View live

[Multisim]簡易電路繪製-音頻電路篇

$
0
0

繼上次感應燈電路後,本篇要帶各位設計雙面板電路
這次選的是利用LM386晶片做一個簡易的擴大機,下圖為參考電路圖。本篇目標是做出一雙聲道電路。

作者/攝影  偉和
時間  20分鐘
成本  100元
難度   * * * *
材料表
  • 1.2K歐姆電阻X1
  • 100uF電容X2
  • 0.047uF電容X2
  • 1000uF電容X1
  • 10K可變電阻X1
  • LM386X1
  • 3.5立體音源公頭X1
  • 8歐姆5W喇叭X1
  • 杜邦針(排)X1
  • 搖頭開關X1

 

1.新增元件Misc>Net

2.選擇NET_8

3.按下OK後放置「元件放置區」任一區域中


4.新增元件Source>GROUND

5.將GROUND接於晶片的第2、4腳位

6.新增元件Basic>POTENTIOMETER>10k,Package選則Generic/LIN POT


7.新增2個元件Basic>CAP_ELECTROLIT>100μ,Package選擇IPC-2221A/2222 /CAPPR250-800X1150

8.將可變電阻(R1)中間腳位接至晶片第3腳位,C1電容正極接於晶片第7腳位,C2電容正極接於晶片第一腳位、負極接於晶片第8腳位

9.新增2個元件Basic>CAPACITOR>470n,Package選擇IPC-2221A/2222 /CAPPR254-500X310X650

10.分別接於晶片的第5、6腳位


11.新增元件Basic>RESISTOR>10,Package選擇IPC-2221A/2222 /RES1300-700X250

12.接於C4後面

13.將GROUND分別接於C1、C3、R2後

14.於C1上方接上VCC

15.新增個元件Basic>CAPACITOR>1μ,Package選擇IPC-2221A/2222 /CAPPR1000-2200X2500

16.對元件按下右鍵選擇Properties,更改數值從1μ→1000μ

17.接於晶片第5腳位

18.新增接頭其中一隻接於C5電容的負極,另一隻接上Ground

19.將剛完成的部分複製一個並至於下方

20.新增一個1X3HDR分別接上R1、R3、Ground

21.新增一個1X2HDR並接上VCC及Ground,作為電源接頭使用

22.設計完畢後,接下來要將電路圖轉成PCB:

Transfer→Transfer to Ultiboard→Transfer to Ultiboard 14.0

23.先簡易的將元件區分為2部分

24.再將其中一部分排列完畢

25.另一邊即可按照已排完的樣式再做一次排列,最後將元件整理並排列整齊

26.將外框縮小至合理大小

27.按下快速佈線後即完成

28.最後可以送給廠商,或者自行將電路製作出來~

 

 

相關文章:


[雷射切割]自己的外殼自己畫LinkIt7697外殼設計 (含完成檔案直接下載)

$
0
0

LinkIt7697剛上市沒有多久,相信有些發燒友已經開始入手了,但是玩它的時候很怕傷害到它,就想著來幫他畫個簡單的外殼。

作者/攝影   陳煜倫
時間   3小時
列印時間   1分鐘(不含設定時間)
難度   * * **
材料表
  • 游標卡尺
  • LinkIt7697
  • 雷射切割機(租用)
  • 3mm壓克力板

這次的設計理念只有兩個字「簡單」,希望不要外加太多體積,製作起來也不要太過複雜,用最簡單的方式完成設計。

 

Step1.開始前準備

使用工具

到DesignSpark官網下載軟體

開啟DesignSpark Mechanical

開啟新設計圖

檔案

新增設計

快捷鍵(Ctrl+N)

Step2.畫出版子外圍

開始設計

量測目標物長度

量測目標物寬度

量測晶片子板與主板落差

前端導角

子板寬度

外圍計算整理

  •     量測數據:
  •     長度:48.85
  •     寬度:26.18
  •     子主板落差:0.97
  •     導角:4.02
  •     子板寬:17.93
  •      繪製數據:
  •      長度:49
  •      寬度:26.2
  •      落差:1
  •      導角:4
  •     子板寬:18

按下正面視圖

點選矩形作圖

拉出矩形時直接輸入長寬

用建構直線畫出定位

利用線段中點向上畫1mm

向左輸入子板寬的一半9

回到矩形作圖

向右下方移動,接觸到原矩形頂端時,在長的部分輸入18

選擇直線

用格線及角度畫出寬度4的導角

用修剪去除多餘線段

移動滑鼠選擇線段,按下後即可刪除

修剪完畢後就完成基本外型

Step3.繪製腳座

底面針腳座寬度

底面針腳座長度

腳座與邊緣距離

腳座上方與邊緣距離

腳座下方與邊緣距離

腳座計算整理

  • 量測數據:
  • 長度:35.38
  • 寬度:2.5
  • 邊緣距離:0.45
  • 上緣距離:4.76
  • 下緣距離:8.6
  • 繪製數據:
  • 長度:參考
  • 寬度:2.6
  • 邊緣距離:0.4
  • 上緣距離:4.7
  • 下緣距離:8.5

用建構線畫出定位點

定出右上左下兩點即可正確畫出矩形

用矩形工具將兩點間圖形完成

同樣方式完成另一邊

點選邊緣線,將部分邊緣改為建構線

畫好了7697底板外型就可開始正式進入想畫的板子外型了。

Step4.畫底板

用直線向外畫出5mm以利固定

完成後就會超出板子可以上螺絲

選擇建立圓角指令

點選角落就能改為圓角,輸入5以確定圓角弧度

對齊圓角底部自腳座孔邊緣計算出孔洞應有距離

定位四個點後用圓形畫出直徑2.8mm的圓

這裡有點要注意,2.8mm是一般要用螺絲攻牙的寬度,但是每台切割機雷射光的寬度不同,因此實際數值應該要依據各個機台自行調整,像我最後切出的機台就需要下修至2.5mm才能使用。

完成後先將檔案儲存並取名

用DEL或修剪將所有建構線去除

選擇[檔案]→[另存新檔]

將存檔類型改為DXF

Step5.製作頂板

重新讀取之前的rsdoc檔,將中間兩矩形也改為建構線

量測晶片子板長

量測板子邊緣至接頭底部距離

量測microUSB寬度

量測按鈕至頂端邊緣距離

量測按鍵至板子側邊距離

量測按鈕寬度

量測按鈕長度

量測針腳至側邊距離

量測針腳寬度

頂板計算整理

• 量測數據:

• 子板長度:22.5

• USB深入長:4.54

•       USB寬:7.69

•       按鈕上緣距離:4.54

•       按鈕側邊距離:1.31

•       按鈕寬:4.18

•       按鈕長:3.33

•       針腳側邊距:0.88

•       針腳寬:0.72

•       繪製數據:

•       子板長度:22.6

•       USB深入長:5

•       USB寬:8

•       按鈕上緣距離:4.7

•       按鈕側邊距離:1.5

•       按鈕寬:4.5

•       按鈕長:3.5

•       針腳側邊距:1

•       針腳寬:1

利用之前畫子板凸出部分,向下畫出矩形

由下方利用線段中點及建構線,畫出USB邊界定點

用定點畫出USB位置

用建構線畫出按鈕定位點

依計畫尺寸畫出按鈕

按鈕需要較大孔才不會擋住手指頭,依喜好適當擴大

用原針腳孔位及外框,定位出針腳孔位置

將下方孔洞多於線路修剪好

底板的螺絲孔有因應螺絲縮小,全部更改回可穿過的大小3.3

用另存新檔避免覆蓋原本檔案

將所有多餘的及建構線都修剪好

將檔案另存為DXF檔

Step6.製作墊片

為免夾傷7697需製作墊片

修剪完成就可以存檔了

 

Step7.下載INKSPACE用來轉檔成PDF

瀏覽網頁選擇中文

下載自己適用的系統版本

完成後開啟進入

開啟INKSPACE就會幫開啟個新檔,使用[檔案]→[匯入]

[物件]→[填充與邊框]

右方出現對話框,選到邊框樣式

選取所有圖案就可以直接更改線粗

切割時大部分需要線粗在0.01以下,但還是要看各廠牌設定

[檔案]→[另存新檔]→存檔類型→PDF

Step8.附註

  • DesignSparker並非沒有PDF格式,但儲存時是以類似照片形態存在,因此並不適用。
  • Inkspace的PDF格式是以向量圖方式儲存,所以可以用在切割。
  • 切割所用程式多有不同,因此使用PDF檔能符合較多程式需求,亦較不易出錯。
  • 完成檔案已發布於Thingiverse(https://www.thingiverse.com/thing:2400953)歡迎自行下載運用。

Step9.結語

  • 各位沒有想到3D軟體也能使用來畫2D向量圖案吧!
  • 不過DXF檔案有些地方的向量圖軟體仍有些侷限性,所以這時候就可以利用之前用過的2D向量圖免費軟體INKSPACE轉為PDF檔。
  • 這次的設計跟之前的很不一樣吧!希望對各位有幫助。

 

相關文章:

 

[放課後活動紀錄] 2017.06.27-06.28 3D應用工作坊好好玩

$
0
0

3D列印已經進入台灣好一段時間了,可是離我們的平常生活似乎還很遙遠,今天讓我們看看有那些可以應用在我們生活中的例子吧!

我們今天沒有要學3D印表機操作,也沒有要電腦繪圖,純粹以3D印出後的成品來利用,完成後自己帶回去,有巧克力、造型吊飾、懷錶造型相框等等。

作者/攝影   陳煜倫/陳煜倫、徐豐智
課程時間  2017 6/ 27 28
課程講師   陳煜倫
課程地點  華山1914放課後3D應用工坊

3D應用工坊是我這次的攤位名稱,或許感覺不出是在做啥。但就像樂團的不插電演唱會那樣,不過也有些不同,只是不用電腦就是。老實說第一次要求上課不用電腦,這要求還真是有點震撼到我,很難想像自己要如何應付過來。但是真的了解目的後也是充滿了期待,拿著自己印製出的列印件,帶著大家一步一步做成成品。

還記得第一次看到自己的活動場地時,第一個感覺是好大的地方,稍微整理一下感覺有些空蕩蕩,畢竟是要教學的地方,還是需要有些較大的空間。像是第一次租房時,房東帶著看房似的。開展當天,一開始還一直擔心沒人,但是最後結果是收費項目幾乎全部售罄,當時確實讓我感動萬分。

會動的東西總是比較會吸引人,我的策略也是如此,每當有人經過,除了駐足觀看3D列印的運作時,我總會順便告知有那些課程可以玩。

或許人本就喜歡湊熱鬧,總是在我忙著教人的時候,有其他人想要學課程,總之常常讓我忙不過來。

自己的作品總是自己最清楚,可是一批批的人來學,進度總是不太一樣,總是需要我不厭其煩地重複講解。

當自己在準備時總是感覺這東西會受歡迎嗎?但是看到大家完成後開心的笑容,真是讓我感動萬分,尤其是有很多人繪畫非常精美,做出來後我都想把作品買回家。

而且我自己認為,像這樣飾品類的東西,喜歡的人應該都是女生吧!可你看這對父子得意的樣子,我想我再累都值得。

這是一個我比較驚訝的客人,雖然用夾鉗時是我幫忙完成的,可是對我製作繪製的過程問得很詳細,甚至有問有沒有教如何繪製。

 

3D列印,配合真空成型機,完成巧克力模,雖然因為比較耗時,現場成品數量不多,但是甜點總是能讓人開心,看到大家的笑容,總是讓我感覺我的巧克力又美味了些。

當然!甜食是小朋友愛吃的東西,有甜點總是少不了小朋友的。

這組朋友是讓我感到最窩心的,雖然這是我第一天快結束時才來,導致影響我休息時間的人。但我依然感覺無比開心,因為她們是與我們一同參展的其他攤位的負責人與策劃人,她們策劃的是密室逃脫,要跟著客人進入密室引導解謎過程,我想沒有人站著一天後是不累的,可是自己的攤位一結束立刻跑來這裡,玩的不亦樂乎,甚至策劃人畫出的東西感覺只能用精美形容,我都懷疑她的志向是不是漫畫家了。

客人手上的是天燈吊飾,雖然天燈吊飾大家都說很難,可是也是最受歡迎,最早斷貨的,當然也是整我整最慘的項目,或許是因為有繩結運用的關係吧!不過看這位太太,一次做完兩個,我想應該也是真心喜歡才做得到吧!

自製行星齒輪配合樂高的項目,或許是我推廣不利,過來想學這項目的人並不多,也有可能是不收費,所以不自覺的影響我推廣的力道吧!可是看著小朋友玩得開心,家長也感到有數學知識結合在內,非常鼓勵小朋友多了解,那我準備這個項目就很值得了,或許我下次該檢討要加強這方面的課程推展了。

這個部分是跟3D應用工坊分開的項目,是配合RS公司的DesignSpark Mechanical 2.0繪圖課程,鉛筆筆套設計,照片上是在畫筆套上人臉造型。

兩位媽媽本來是想將小朋友放著讓小朋友自己畫,經過我的說明知道是以親子共學為目的,為了小朋友不得已才坐下,到最後非常有興趣的自己畫造型,反而是小朋友有點坐不住。或許因為這堂課兩位媽媽以後能自己設計東西了呢^^。

看大家聚精會神,在我這簡陋的攤位製作著自己的東西,感覺還是心理暖暖的,照片下方那是彩蛋繪製,簡單來說就是讓小朋友塗鴉,也沒啥需要教學的,但是能將調色盤跟彩蛋畫成這樣,應該也需要一番慘烈的創作吧!

看這調色盤,雖然說色彩有時候很主觀很個人,我怎麼覺得所有顏色都有點灰暗,也罷!小時候誰不愛將顏色亂加呢?

看這家人每人都製作一個,雖然大家都被繩結搞得暈頭轉向,當完成時依然都有燦爛的笑容。

雖然這次活動真的讓我感覺異常疲累,可是每個離開的人都有著滿滿的笑容,說真的忙得很開心。也許大家離開之後會忘了我。可是人總是會記得自己開心的記憶,期待在下次的活動也能帶給大家一樣的歡樂。

 

相關文章:

[雷射切割一點也不難]使用inkscape畫出精美音樂盒!

$
0
0

歡迎來到雷射切割好簡單系列,今天要帶大家畫出音樂盒!

今天使用的軟體也是Inkscape,不知道如何下載Inkscape或是想認識更多這個軟體,可以參考這裡(連結阿倫老師的文章)。

作者/攝影   陳亭妏
時間   約一小時
難度   * * *
材料表
  • 雷切用密集板
  • 雷切機一台
  • 螺絲螺帽六組
  • 音樂盒機心一個

為了方便轉動音樂盒,我們把盒子最上方的面做傾斜,前方的面縮小了,可以省略不畫。先用完成圖讓大家更快理解~

從後面看音樂盒的樣子。靠著轉動上面的圓板來讓音樂盒唱歌~

事不宜遲,我們趕快開始教學吧

(今天示範的阿圓的電腦是Mac而且軟體是英文版,使用中文版的朋友可以對照一下翻譯,還有也使用Mac的朋友記得也要下載XQuartz才能使用喔!)

 

首先,請先到File中的Document Properties,並且選擇Grids中的Rectangular grid ,按下New之後,就可以開啟格線~格線可以方便我們等等要對齊、畫線等等。

先從簡單的上板開始畫吧~用方形工具隨意拉出一個長方形,在上方Change的地方調整寬(W)跟高(H),這邊使用的單位是mm,右下側的Stroke Style可以選擇線的粗度,本篇文章的線全部都是1pt唷。

那麼梯形的側板要怎麼畫呢?首先,用鋼筆工具畫出一個30-60-90的三角形,請記得要開啟開啟右側的鎖點,就能輕鬆在格子上畫出長寬一比二的直角三角形~

下一步,點回滑鼠並將三角形等比例放大(縮放時按住Control即可等比例縮放),再點一下三角形可以旋轉,要讓斜邊跟上側的高一樣長,可以直接移過去對齊,或是旋轉後直接在上方調整H為100mm,但是要記得按一下H左邊的鎖頭,三角形的比例才不會跑掉喔!

量好之後,把三角形轉回來,在底下加一個長方形,這邊長度也要對齊~

接著把他們聯集成一個梯形,點選path中的Union,交集、差集等等按鈕也都在path底下喔。

(小小提醒,同時選取除了可以用滑鼠拖曳,按住shift再點選物件也可以同時選取喔~)

接著再用矩形工具把後板(較小)、底板(較大)畫出來,這邊要注意後板與底板的寬度要相同,且要略小於上板,因為還要預留鎖螺絲(板厚)的空間,這個後面畫螺絲孔時會再詳細說明~圖上畫線的地方是大家目前注意到要相同的長度。

外觀大致上畫好了,接下來要來加螺絲孔。由於鎖孔所使用的螺絲不同,我們就不在文中詳細介紹尺寸了。大家要先量過使用的螺絲尺寸再來畫圖~

同時選取板子跟螺絲孔公模兩側的小長方形,按下聯集,使板子產生凸出來的地方,才能組裝。中間的十字則是要凹進去的螺絲洞,同時選取板子跟十字,按下Difference,就能順利在板子上剪出十字洞了~

後板也用一樣的方式做好。

在上板也利用相同的方法放置螺絲孔,兩個孔之間的距離要跟底板、後板的寬度一樣,這也是為什麼前面提到上板要略寬於底板跟後板,這樣才能鎖螺絲喔~

最後在側板的地方也加上螺絲孔,將側板的所有元件群組之後複製,就有兩個側板囉~

最後一步,用圓形工具畫出圓盤,再加上自己喜歡的圖案,就完成了!!!!!!

是不是很簡單呢!最後幫大家列出幾個必須注意的地方:螺絲孔要對齊,以免造成組裝上的困難;長度要相同的地方也要注意(可以用軟體內的尺量一下長度,也可以像前面提到將兩個物件重疊檢查);最後孔徑要開多少、要用什麼方式組合起來也是需要先思考的部分!祝大家都能成功畫出音樂盒喲~

 

 

[LattePanda] 使用C# 來做藍牙4.0 iBeacon的門鎖系統

$
0
0

在學這篇教學前必須要先會一些事情,首先必須要會在Lattepanda上使用visual studio

(LattePanda 拿鐵熊貓教學:Arduino與Visual Studio環境設定)。

再來必須已經了解如何在visual studio裡使用C#控制Arduino的I/O

(LattePanda 拿鐵熊貓教學#1:LED 閃爍,使用Visual Studio)。

在這篇教學中會使用visual studio的C#來開發簡單的門鎖系統,一般在藍牙使用上都是使用藍牙傳輸資料,但在這篇是使用藍牙4.0中的iBeacon模式,在iBeacon模式中可以得知接收器與發射器的距離,而這個距離就可以當作我們決定要不要開門的條件,所以這樣連按按鈕的動作都可以省去。

作者/攝影   黃品叡
時間   3 小時 以上
難度   * * * * * * *
材料表
  • Lattepanda
  • USB to UART模組*1
  • HM-10模組(2個以上)*1
  • 電磁鎖*1

[請注意] 這邊教學是必須有一些基礎,首先前情提要中的Lattapanda上使用Visual Studio是基本,再來是必須要會開啟Window Forms C#、會使用基本的工具箱,並且可以編譯程式。最後是對於電路有基本的認識,能夠認識基本電路符號,並且能將簡單電路圖在麵包版上實現。

 

在這篇教學中分成硬體、軟體兩個部分,(1)硬體部分是電路的連接, (2)軟體部分是Visual Studio C#的程式撰寫。

 

(1)=====硬體部分:=====

在硬體連接的電路圖如下圖。

使用的有

  • 兩個<LED>燈(顯示門鎖是開啟還是關閉)
  • 一個12V的<LOCK>電磁鎖
  • 一個<USB to UART模組>
  • 兩個<HM10>的BLE模組,一個安裝至LattePanda,一個由使用者持有

下圖Lattepanda上左方USB孔上接上USB to UART模組(紅色),可接上HM10 BLE模組。

對應電路圖,接在麵包版上電路如下圖

整體看起來會是像下圖

換個角度再放一張圖,如下

在電磁鎖的部分基本上可以任意替換,在這裡我將它鎖在木板上,能夠表示他有鎖住或打開而已,其安裝後的圖如下(上方是一塊木板連結鐵塊,下面則是一個「ㄇ」字形的木板連結電磁鐵的線圈部分)。

(2)=====軟體部分:=====

我使用的程式開發環境是Windows 10、Visual studio 2017、C#,那我們就直接進入程式部分。

程式我分成(1)介面、(2)初始化、(3)Serial連接、(4)開啟backgroundWorker、(5)讀取iBeacon資訊、(6)iBeacon資訊解碼、(7)連結Arduino,這幾個部分。

1.介面

Form1中的介面配置如下圖

在最上面有一個textBox 命名為 textbox_door
中間是一個listView 命名為 listView_door
按鈕左邊是 button_connect
按鈕中間是button_findBeacon
按鈕右邊是button_loopFind
最下面的listBox 命名為 listBox_msg
在背景工具中有
serialPort 命名為 serialPort_beacon
backgroundWorker 命名為 backgroundWorker_findBeacon
timer 命名為 timer1

 

各個介面的命名可以參考下圖:

 

命名如果不一樣,請記得在程式中自行修改。

 

2.初始化

初始化的部分先從 include開始:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.IO.Ports; //serial
using LattePanda.Firmata; //Arduino

以上是所有要用到的namespace。

 

在全域變數裡:

Arduino arduino = new Arduino("COM3", 57600);
bool[] openlist = new bool[3];

(全域變數記得是寫在 class Form1 裡面,但是在一般函式外面)

 

在Form1()建構式裡:

public Form1()
{
InitializeComponent();
ColumnHeader header1, header2;
header1 = new ColumnHeader();
header2 = new ColumnHeader();

header1.Text = "--Time--";
header1.TextAlign = HorizontalAlignment.Center;
header1.Width = 90;
header2.Text = "--ID--";
header2.TextAlign = HorizontalAlignment.Center;
header2.Width = 70;

listView_door.Columns.Add(header1);
listView_door.Columns.Add(header2);

//which ID can open the lock
openlist[0] = false;
openlist[1] = true;
openlist[2] = true;

//arduino setting
arduino.pinMode(5, Arduino.OUTPUT);//pin of red LED
arduino.pinMode(6, Arduino.OUTPUT);//pin of green LED
arduino.pinMode(10, Arduino.OUTPUT);//pin of the lock

//set the door close first
doorOpen(false);
textBox_door.BackColor = Color.Red;
}

(這裡面設定了一些介面的東西,一些初始值還有門鎖狀態)

 

3.Serial連接

Serial 連接在C#中非常簡單,我是用一個按鈕,按下後連結Serial程式如下:

private void button_connect_Click(object sender, EventArgs e)
{
serialPort_beacon = new SerialPort("COM6", 9600, Parity.None, 8, StopBits.One);

if (!serialPort_beacon.IsOpen)
{
try
{
serialPort_beacon.Open();
listBox_msg.Items.Add("Connect");
}
catch
{
MessageBox.Show("Serial open error!");
}
}
else
listBox_msg.Items.Add("Opened");
}

 

(這個COM是USB to URAT晶片的COM角)

 

4.開啟backgroundWorker

首先是按鈕觸發尋找Beacon:

private void button_findBeacon_Click(object sender, EventArgs e)
{
//send DISC
string msgSend = "AT+DISI?";
byte[] buffer = System.Text.Encoding.Default.GetBytes(msgSend);
if (serialPort_beacon.IsOpen)
if (backgroundWorker_findBeacon.IsBusy != true)
{serialPort_beacon.Write(buffer, 0, buffer.Length);
backgroundWorker_findBeacon.RunWorkerAsync();
}
else
MessageBox.Show("already finding");
else
MessageBox.Show("Serial is close");
}

 

(在這裡是開啟一個backgroundWorker,而這裡只是單純地尋找一次Beacon而已)

若是要持續尋找,可以開啟一個timer來持續觸發,程式如下:

private void button_loopFind_Click(object sender, EventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
//send DISC
string msgSend = "AT+DISI?";
byte[] buffer = System.Text.Encoding.Default.GetBytes(msgSend);
if (serialPort_beacon.IsOpen)
if (backgroundWorker_findBeacon.IsBusy != true)
{
serialPort_beacon.DiscardInBuffer();
serialPort_beacon.Write(buffer, 0, buffer.Length);
backgroundWorker_findBeacon.RunWorkerAsync();
}
else
Console.Write("already finding");
else
MessageBox.Show("Serial is close");
}

(這裡開一個Timer讓我們可以每一段時間就開啟backgroundWorker)

 

5.讀取iBeacon資訊

這裡就是backgroundWorker裡所做的事情

private void backgroundWorker_findBeacon_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;

char[] buffer = new char[256];
string msg_read = "";
bool stringCheck = false;
//read data
byte loopCount = 0;

while (true)
{
if (serialPort_beacon.BytesToRead > 0)
{
//serial read to msg_read
serialPort_beacon.Read(buffer, 0, buffer.Length);
for (int i = 0; i < buffer.Length && buffer[i] != '\0'; i++)
msg_read += buffer[i];

//if msg_read end with "OK+DISCE" then stop reading
if (msg_read.Length > 8 && msg_read.IndexOf("OK+DISCE") != -1)
{
stringCheck = true;
break;

}
}
else
{
//timeout
System.Threading.Thread.Sleep(500);
loopCount++;
string dot = "";
for (int i = 1; i <= loopCount; i++)
dot = dot + ". ";

if (loopCount > 1)
this.Invoke((MethodInvoker)(() => listBox_msg.Items.RemoveAt(listBox_msg.Items.Count - 1)));
if (loopCount > 15)
break;
this.Invoke((MethodInvoker)(() => listBox_msg.Items.Add(dot)));
}
}

//if didn't read anything than prient "time out"
if (msg_read == "")
this.Invoke((MethodInvoker)(() => listBox_msg.Items.Add("Time out")));
else
{
if (stringCheck == false)
//if have read something but not iBeacon info
this.Invoke((MethodInvoker)(() => listBox_msg.Items.Add(msg_read)));
else
{
Tuple<int[], int[], int[], int> result = deCodeDISI(msg_read, 2);
this.Invoke((MethodInvoker)(() => listBox_msg.Items.Add("minor : " + result.Item2[0].ToString())));
this.Invoke((MethodInvoker)(() => listBox_msg.Items.Add("RSS : " + result.Item3[0].ToString())));
//if is close enough and it's in open list then open the lock
if (result.Item3[0] > -40 && openlist[result.Item2[0]] == true)
{
this.Invoke((MethodInvoker)(() => textBox_door.BackColor = Color.Green));
ListViewItem item1 = new ListViewItem(DateTime.Now.ToShortTimeString());
item1.SubItems.Add(result.Item2[0].ToString());
this.Invoke((MethodInvoker)(() => listView_door.Items.Add(item1)));
doorOpen(true);
}
else
{
this.Invoke((MethodInvoker)(() => textBox_door.BackColor = Color.Red));
doorOpen(false);
}
}
}
}

 

(這裡的程式包含好多東西,上半部分是在處理Serial read的問題,並且在讀取中有動態的「…」做顯示,若沒有收到資料則會有「time out」的資訊出現。下半部分是將得到的資訊做判斷,判斷要不要開門)

 

6.iBeacon資訊解碼

這裡是「deCodeDISI」副函式的程式部分:

private Tuple<int[], int[], int[], int> deCodeDISI(string serialData, int maxDiviceCount)
{

//OK+DISIS  OK+DISC : Factory ID : iBeacon UUID : Major+Minor+Measured : MAC : RSSI  OK+DISCE
//OK+DISISOK+DISC:4C000215:74278BDAB64445208F0C720EAF059935:11110001C5:88C25532ED1E:-032OK+DISCE

string DataRemain = serialData;
int[] FactoryID = new int[maxDiviceCount];
string[] UUID = new string[maxDiviceCount];
int[] Major = new int[maxDiviceCount];
int[] Minor = new int[maxDiviceCount];
string[] MAC = new string[maxDiviceCount];
int[] RSSvalue = new int[maxDiviceCount];
DataRemain = DataRemain.Substring(0, serialData.IndexOf("OK+DISCE"));
int count = 0;
while (true)
{
int findNum = DataRemain.IndexOf(":");
if (findNum == -1)
{
Console.Write("deCode done!");
break;
}
else
{
//Factory ID (length 8)
string FactoryID_str = DataRemain.Substring(findNum + 1, 8);
DataRemain = DataRemain.Substring(findNum + 9);
FactoryID[count] = Convert.ToInt32(FactoryID_str, 16);

//iBeacon UUID
findNum = DataRemain.IndexOf(":");
string UUID_str = DataRemain.Substring(findNum + 1, 32);
DataRemain = DataRemain.Substring(findNum + 33);
UUID[count] = UUID_str;

//Major
findNum = DataRemain.IndexOf(":");
string Major_str = DataRemain.Substring(findNum + 1, 4);
DataRemain = DataRemain.Substring(findNum + 5);
Major[count] = Convert.ToInt32(Major_str);
//Minor
string Minor_str = DataRemain.Substring(0, 4);
DataRemain = DataRemain.Substring(findNum + 4);
Minor[count] = Convert.ToInt32(Minor_str);

//MAC
findNum = DataRemain.IndexOf(":");
string MAC_str = DataRemain.Substring(findNum + 1, 12);
DataRemain = DataRemain.Substring(findNum + 13);
MAC[count] = MAC_str;

//RSS
findNum = DataRemain.IndexOf(":");
string RSS_str = DataRemain.Substring(findNum + 1, 4);
DataRemain = DataRemain.Substring(findNum + 5);
RSSvalue[count] = Convert.ToInt32(RSS_str);

count++;
}
}

return Tuple.Create(Major, Minor, RSSvalue, count);
}

(這就是解碼iBeacon的資訊的部分)

 

7.連結Arduino

跟Arduino的部分非常簡單,只有控制I/O的部分,D10腳位控制繼電器、D5控制紅色LED、D6控制綠色LED燈,副程式如下:

private void doorOpen(bool open)
{
if (open == false)//door close
{
//lock the door and red LED on
arduino.digitalWrite(10, Arduino.HIGH);
arduino.digitalWrite(5, Arduino.HIGH);
arduino.digitalWrite(6, Arduino.LOW);
}
else//door open
{
//unlock the door and green LED on
arduino.digitalWrite(10, Arduino.LOW);
arduino.digitalWrite(5, Arduino.LOW);
arduino.digitalWrite(6, Arduino.HIGH);
}
}

 

軟體部分就是以上程式了,其中包含了非常多的細節,像是處理Serial的部分,或是執行續(就是backgroundWorker)裡的處理,為什麼用Invoke,Tuple的用法,解碼的處理…等,這些初學的話建議複製副函式,直接用就好,裡面是什麼等對於程式更清楚後再慢慢回來看。

而當然這些副函式並不能稱作完美,例如並沒有對於不完整的iBeacon資訊做處理的地方,只有稍微確認,和在資訊結尾做非常簡單的處理,在這裡主要就是帶大家入門,在深入的部分,就請大家自己研究瞜~

 

 

相關文章:

 

[課程紀錄] 5、6、7月份 LinkIt 7697全台跑透透@全台灣

$
0
0

LinkIt 7697上市到現在大概快四個月,新台幣$500左右的價格就可以擁有 Wi-Fi、BLE的物聯網終端(相較於LinkIt Smart 7688適合扮演物聯網的gateway)。足此之外還有專屬的BlocklyDuino圖形化介面編輯器,可以把圖形化指令轉成Arduino sketch之後再行燒錄(上傳還是需要Arduino IDE,但也正因如此其他的Arduino板子也可以享用Blocklyduino)。

本文是紀錄5 6 7三個月,CAVEDU全台跑透透的紀錄,雖然大部分的照片是阿吉老師,但實際上要在密集三個月中執行這麼多場次,需要許多事前事後的協調與後勤工作,這樣講師上課才能順利。

作者/攝影   曾吉弘
課程時間  2017 5 6 7月份
課程講師   曾吉弘
課程地點
  • 金門大學
  • 東華大學
  • 通推小組辦公室
  • 台中女中
  • 屏東唐榮國小
  • 日新國小

 

CAVEDU的目標是讓更多老師們能運用好用的教材,把實用又有趣的課程帶給小朋友們。其實有些老師們私下都表示對於這領域的課程既期待又怕受傷害,對於學校的網路是否可撐得起欲聯網教學課程也有點擔心。不過,我們都幫大家準備好了,請來電(0223062900)或來信(service@cavedu.com)喔:

歡迎洽詢CAVEDU的物聯網教室基礎設施規劃!

 

以下是我們的投影片,有110頁!

上課用的範例程式與相關檔案下載都在這邊: https://goo.gl/6DRDGA

 

以下是課程大合照,歡迎找我們去辦研習啦~

5/12 7697大專教師研習@台北場,通推小組辦公室

6/6 5/12 7697大專教師研習@花蓮場,東華大學

6/6 7 7697大專教師研習@台中場,台中女中

6/8 7697大專教師研習@高雄場

6/14 7697大專教師研習@金門場,金門大學

6/15 國小教師研習@台北日新國小

6/29 7697研習@屏東縣國中小種子教師,屏東唐榮國小

7/24, 25 教師物聯網研習@台北日新國小

另外還有七月底由臺北市政府與聯發科技基金會所推動的自造札根教育運動,於北市八所國中小使用 LinkIt 7697 搭配 Blockly

(日新國小、社子國小、新湖國小、長春國小、東湖國中、南港國小、萬興國小、龍山國中)

這是小朋友一週所完成的趣味搶答器,程式都是用Blocklyduino完成的喔。外殼是雷射切割紙板,maker課程當然不只是寫程式而已啦~(未來也將在blog文上分享搶答器教學喔~)

 




相關文章:

 

[3D繪圖設計] 3DP筆套設計(下篇)

$
0
0

用筆套簡單表現出自己的心情,既簡單又有趣,馬上就能像社交軟體那樣表現出自己的情緒,利用3D列印簡單製作出自己想要的表情,馬上將呆板的筆套換掉吧!

作者/攝影  陳煜倫
時間   2小時
成本  參考列印時間17分鐘
難度   * * *
材料表
  • 游標卡尺X1
  • 鉛筆X1
  • 3D印表機X1
  • PLA耗材X1

上次大家應該都有畫出主要形狀,這次我們要接下來做些個人化的製作,所以記得這篇所講的東西都可以自己改動,希望大家都能發揮自己創意,做出自己喜歡的筆套。

言歸正傳,我們就準備繼續畫圖吧!

  • 定出相切於圓球的垂直平面

畫好基本圖再來就是比較隨意的造型了,但是在畫出想要的樣子前我們要造出一個適合的畫圖平面。這樣無論是前後拉動切銷,還是旋轉,都能有個基準參考。

以草圖模式回到XZ平面。

選用建構直線。

向右畫至圓球邊緣。

這樣就可以在球面上訂出一個參考點,垂直於直線通過一點,自然可以定義出想要的平面。

畫好圖後直接選3D模式,準備定義平面。

平面指令並非草圖指令,所以需要在3D模式下進行。如圖使用平面指令。

點選圓球邊緣建立平面。

step1. 畫出想要的大概草圖

用草圖模式進入新建立的平面畫圖。

按下正面視圖轉正。

接下來要畫自己喜歡的圖形這裡要畫個臉先以建構直線定位。

利用定點在篇上方畫一對稱中心線段。

選用三點矩形。

用方格定點定出矩形寬度。

向下一格定出寬度。

這樣就是我想要的眉毛樣子,當然這是很個人也很隨意的。依此要領就可以訂出對稱圖形。

用圓形、掃移弧線畫圖,記得圖形要封閉。

 

Step2.依草圖及個人喜好畫出表情

用拉動向本體切割。

眼口都是凹的,選擇後向後拉。

用Ctrl配合滑鼠左鍵可以做到複數選取,在不選擇切銷或增加情況,預設向檢頭後方拉動就是切銷。

拉動前以中鍵向側邊移動以利觀察,這裡利用預覽決定深度,約2mm。

眉毛用拉動長出,用Ctrl配合左鍵複選。

因要項箭頭後方拉出,拉動前要先選新增。

畫超過本體即可。

眉毛太長再次選取長出的平面,向後拉0.5。

用拉動眉角建立圓弧,半徑2.5mm。

回到畫臉的草圖,將鼻子中央畫一直線。

再用拉動旋轉出鼻子。

長出部分就可輸入360。

完成鼻子。

選結構→將前方平面勾選取消,這樣可隱藏平面以利觀察。

選草圖模式。

點選眼睛凹陷處作圖。

用圓形畫出瞳孔。

兩邊用一樣直徑,這裡畫的是1.2mm。

用直線在圓形中央畫線,形成半圓。

選擇拉動旋轉出圓球形。

臉部依喜好用圓角修整。

按下[檔案]→[儲存]輸入自己的檔案名稱。

按[檔案]→[另存新檔]。

按下存檔類型最後的向下箭頭,選擇STL檔。

Step3. 結語

在畫筆套圓柱及臉的圓球形時也能一次畫完,本次主要是想用到投射到草圖,以利教學。

在畫瞳孔及鼻子時也能用球體,大家可以自己試試看。

大家可以試試畫自己喜歡的圖形,或許能創造更有趣的筆套喔!

 

 

相關文章:

 

[Arduino101] 開放資料平台之智慧家電控制

$
0
0

 

 

隨著最近的天氣溫度上升,對住家的環境也會有所影響,所以才想利用政府開放資料平台得到目前台北市氣溫溫度和透過arduino 101 接上 LM35線性溫度感測器得知目前的室內溫度,再與台北市目前溫度和室內溫度比較後,透過藍牙控制電風扇,若室內溫度高於台北市溫度則風扇開啟,反之則風扇關閉。

作者/攝影  許鈺莨
時間   約一小時
成本  NTD 2,000
難度   *  *  *
材料表
  • Arduino 101
  • 繼電器
  • DFROBOT Arduino 擴充板
  • DFROBOT 的 LM 35線性溫度
  • arduino IDE 1.8.1
  • Appinventor 2

 

首先,硬體設備先建置:

  1. 將DFROBOT擴充板接到Arduino101
  2. LM35線性溫度感測器接到A4腳位
  3. 將繼電器接到13號腳位

 

所有硬體接好後會是以下這張圖

再來就是程式撰寫的部分,分別為arduino IDE 和Appinventor 2,先以arduino IDE 環境說明為例:

 

第5行:LM35接DFROBOT 擴充板A4腳位

第6~11行: BLE UUID設定

第12行:設定繼電器腳位為13號腳位

第17~36行:BLE連線開啟

第40~83行:BLE傳輸LM35線性溫度感測器數值至手機畫面,並且Arduino101接收到字元O時則繼電器開啟,收到C字元則繼電器關閉。

完整程式:

#include <CurieBLE.h>

#include <LM35.h>

LM35 temp(A4);
BLEPeripheral blePeripheral;  // BLE Peripheral Device (the board you're programming)
BLEService RelayService("19B10010-E8F2-537E-4F6C-D104768A1214"); // BLE LED Service

// BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEUnsignedCharCharacteristic switchCharacteristic("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);
BLEUnsignedIntCharacteristic LM35Data( "19B10012-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify);
const int  RelayPin = 13; // pin to use for the Relay
char control = '0';
int old_data ;

void setup() {
  Serial.begin(9600);

  // set Light pin to output mode
  pinMode( RelayPin, OUTPUT);

  // set advertised local name and service UUID:
  blePeripheral.setLocalName("LM35");
  blePeripheral.setAdvertisedServiceUuid( RelayService.uuid());

  // add service and characteristic:
  blePeripheral.addAttribute(RelayService);
  blePeripheral.addAttribute(switchCharacteristic);
  blePeripheral.addAttribute(LM35Data);
  // set the initial value for the characeristic:
  switchCharacteristic.setValue(0);

  // begin advertising BLE Relay service:
  blePeripheral.begin();

  Serial.println("BLE Relay service.");
}

void loop() {
  // listen for BLE peripherals to connect:
  BLECentral central = blePeripheral.central();

  // if a central is connected to peripheral:
  if (central) {
    Serial.print("Connected to central: ");
    // print the central's MAC address:
    Serial.println(central.address());

    // while the central is still connected to peripheral:
    while (central.connected()) {
      // if the remote device wrote to the characteristic,
      // use the value to control the Light:
      if (switchCharacteristic.written()) {

        control = switchCharacteristic.value();
        Serial.print("value : ");
        Serial.println(control);
        
        if (control == 'O') {      
          Serial.println("Relay on");
          Serial.println(switchCharacteristic.value());
          digitalWrite(13, HIGH);                           // Open relay
        } else if(control == 'C'){ 
          
          Serial.println(F("Relay off"));
          Serial.println(switchCharacteristic.value());
          digitalWrite(13, LOW);                            // Close Relay
        }
        
      }
      int new_data = temp.cel();
      if(old_data != new_data)
      { 
        LM35Data.setValue(new_data);
        Serial.println(new_data);
        old_data = new_data;
        delay(1000);
      }
    }

    // when the central disconnects, print it out:
    Serial.print(F("Disconnected from central: "));
    Serial.println(central.address());
  }
}

 

接下來是Appinventor2程式說明:

Arduino 101 BLE藍牙連線需要MAC序號才可連線成功,每片MAC都不相同,在Arduino101背後QR code下方即可找到,我使用Arduino101的 BLE 藍牙MAC為98:4F:EE:0F:42,每個Arduino101的藍牙MAC都不同。當程式執行時螢幕便會初始化,手機藍牙開始等待連線,當連上Arduino101時,螢幕標題會寫已連線,開始顯示室內溫度。

當手機與arduino101藍牙連線時,Arduino101會開始送出LM35線性溫度感測器的值。

手機利用OPEN DATA 開放資料平台每10秒鐘抓取台北市溫度的json網頁,資料來源:https://goo.gl/Vz49bi
json網頁: https://works.ioa.tw/weather/api/weathers/1.json
而台北市溫度是使用中央氣象局網站公告的氣象預報資訊作為資料來源,每 20 分鐘更新最新天氣概況。

而抓取json網頁的資料有個技巧就是先將所有的json網頁匯到Appinventor 的ListPicker元件裡,ListPicker元件可以自動將json網頁資料排列好,再利用陣列抓取我們所需資料,台北市溫度在第11行第2列中。

 

ListPicker 元件把json網頁排列好,如下圖所示:

比較台北市溫度和室內溫度,一開始抓取台北市溫度時會出現()為開始要抓取第一筆json資料之符號。而台北市溫度大於室內溫度,則風扇打開;反之, 台市溫度小於室內溫度,則風扇關閉。

 

手機端畫面如下圖所示:

 

結論:
本篇實現出藉由抓取open data 之json網頁得知目前台北氣溫數值和LM35線性溫度感測器測量出室內溫度並作比較,更進一步控制家電,未來可應用於溫室或打造智慧家電,有利於植物栽種,或調節房屋溫度,打造人類更舒適的環境。

 

 

相關文章:


[ 起步學習電子實作新選擇 ] 模組化電子積木BOSON開箱

$
0
0

 

作者/攝影  李政憲
時間   1-2小時
成本  尚未開賣
難度   *
材料表
  • Boson 套件包

一款由DFROBORT打造的人性化BOSON套件問世,這真是令我們感到興奮。

下列影片為Dfrobot針對Boson的官方影片,看起來非常容易上手呢!



,features: ['playpause','current','progress','duration','volume','tracks','fullscreen']

}); });

 

每當新的科技推出,我們不免要花上些許時間摸索、適應。而這一款以小朋友為主的學習電子積木方塊,其實它不僅僅只侷限於小朋友,平常忙碌的大人們也可以在零碎的時間玩上一會,也不用擔心困難重重,就讓我們一窺這一箱BOSON套件帶給我們的驚奇吧!

這是我們BOSON套件箱子的模樣,包裝視覺真是非常的可愛。

打開箱子後裡面有三張範例紙、一張材料紙、各式各樣功能的電子積木、特別設計過的連接線、固定用的螺絲和魔鬼氈、扇葉以及LED燈。如此多種的套件,真是讓人迫不急待地想要拿起來玩呢!

Boson套件最厲害的地方,就是它把各個測試元件和電路全部統一在這一個電子積木裡、無編碼的簡易,還有他特別的設計接口。這可是大大減少我們拿麵包板插上測試元件,然後接上電路之後,所要花的檢查時間。

再來的是Boson套件把四種功能分別用顏色做出區分,每個功能都有屬於自己的顏色,這對於被電子積木化後,是一個非常好的區別方式

輸入:藍色 輸出:綠色 功能:黃色 功率:粉紅色

(此圖片來自DFROBOT官網)

 

電子積木此次還有一個別出心裁的設計,讓他可以不受限制,能在各種地方裝置,那就是在他的後方利用了3種方式作按制裝置。我們可以把它放在樂高積木上、魔鬼氈黏著還有用螺絲固定,每種方式都用磁鐵做相連接。這可是大大的增加它廣泛的使用性。

當我們讓它垂直的時候,還真的是屹立不搖呢


再來就是動手做的時間啦!Boson套件內含三張範例紙,就讓我們來實際的玩一玩它帶給我們的簡單操作和方便性吧。

 

範例一、使用旋轉鈕調節燈的亮滅

上述的解說我們可以知道,藍色方塊是輸入、紛紅色方塊是供電、綠色方塊是輸出。

輸入是旋轉鈕,當我們去轉動它,藉由中間的粉紅色供電使這整組運作,讓輸出顯示出LED燈亮滅。

 

範例二、學習運用NOT邏輯方塊

NOT邏輯方塊是執行相反的動作。

使用按鈕控制兩個LED燈的亮滅來觀察,其中一個前面我們放一個NOT邏輯方塊。當我們還沒按下按鈕的時候,紅色LED燈是不亮的,藍色因為前方有一個NOT邏輯方塊,因此它會亮。按下按鈕後,紅色LED燈發亮,藍色LED燈反而不亮了,顯示出NOT邏輯方塊的確是在做相反的動作。

 

範例三、學習運用OR邏輯方塊

OR邏輯方塊是完成其中一樣條件來達成我要的目標。

我們用兩個按鈕和一個藍色LED燈來表示。我們選擇其中一個按鈕按下,便可以使藍色LED燈亮,因為只要完成其中一樣就可以達成目標。但是也可以兩個同時按下,藍色LED燈也會發亮。

範例四、結合ANDOR邏輯方塊

AND邏輯方塊是必須完成所有條件來達成我要的目標。

這是我個人玩的一點小遊戲,我用AND邏輯方塊和OR邏輯方塊,來控制LED燈的亮和電風扇轉動。同上一個範例,我按下黃色按鈕或者是同時按下藍色按鈕加觸控感應器,第二個條件有點小複雜是我必須要兩個同時達成才算達成目標,再來才會到OR的邏輯方塊,因此成功讓LED燈亮以及風扇轉動。大家是不是覺得這樣接一接,就可以有那多變化,是不是很好玩呢

當然BOSON套件雖說主打無編碼的優勢,但是他仍可以使用簡易的編碼做結合,像是我們大家耳熟能詳的Scratch,不過在未來DFROBOT還可以讓ARDUINO、MICRO:BIT、INTEL來寫入程式。因此其實這一款的BOSON套件可是前途無量,不僅僅是簡易的操作,還有運用的範圍很全面,相信他能帶給我們未來更多的便利性。

(此圖片來自DFROBOT)

 

 

 

[BlocklyDuino] 自製Blockly積木教學,以Linux、 windows10系統製作積木

$
0
0

本文說明Blocklyduino 的檔案架構以及範例:如何自製一個弧度轉角度的數學指令。

※此例為使用Windows 10 操作

 

作者/攝影 翁偉傑
時間   1小時
成本
難度   *  *  *  *
材料表
  • Linux or Windows10作業環境
  • 7697BlocklyDuino環境

環境需求:

  • win執行需運行Ubuntu Linux 的Bash Shell
  • mac可直接在terminal執行
  • 需安裝Python且須使用7以前的版本,需要import lxml 函式庫(Python) 在shell輸入pip install lxml,此函式庫可處理xml & html格式資料 。
  • blockly/apps/blocklyduino/index.html & offline-editor/main.html

切勿手動修改,會被覆蓋可能引發錯誤

 

BlocklyDuino檔案架構:

1.   首先請用 git 下載 MediaTek-Labs的Github。下載完成後,解壓縮到任何你知道的位置。

2.   解壓縮之後有許多資料夾,簡述如下:

  • blockly:是我們主要新增使用到的資料夾
  • example:範例程式,每個資料夾都會有一個同名的 .ino 與 .xml 檔。Blocklyduino 可匯入這個 .xml檔來開啟範例。

  • offline-editor:是將blocklyduino作為Chrome的擴充套件
  • html:會連結至blockly/apps/blocklyduino/index.html,可離線執行網頁版blocklyduino
  • sh:重新編譯時要用到本指令

  1. 進入blockly/blocks資料夾中,在此有對應設定Blocks外觀之程式碼,可以定義版型、顏色、積木連結位置、輸入… (與arduino程式無關,但在此須設定參數以及其類型 )

例如開啟 dht.js 即可看到 dht溫濕度感測器相關指令

常用的函數指令:

  • setHelpUrl:說明文件網址,在IDE中對某指令點選右鍵->說明(HELP)即可進入。
  • setColour:Block的色調
  • setPreviousStatement & this.setNextStatement:決定本指令的上與下是否能再接受其他Block
  • appendDummyInput():告訴程式此處要塞字串
    • appendField 則是引導程式到字串的地方
      • 延伸用法:appendField(new Blockly.FieldDropdown(OPERATORS), ‘OP’);
      • 可以插入圖片 如下: .appendField(new Blockly.FieldImage(Blockly.Blocks.servo.image, 64, 64))
      • 可以輸入值 如下:.appendField(new Blockly.FieldTextInput(“255″),”TOHIGH”);
    • setCheck:確認資料型別
    • setAlign:確認邊界
    • setTooltip:是將blocky\msg資料夾中相關的說明訊息映射至Block中供使用者可以在IDE中參閱。將滑鼠放置某個block上即會顯示,如下圖。

  • FieldDropdown:建立下拉式選單
    • 以appendField(new Blockly.FieldDropdown(OPERATORS), ‘OP’)為例,OPERATORS是變數名稱。在Logic裡面的範例中,OPERATOR會引導到在同一個Block的Tooltip變數中,再轉換成字串

例如數學中的 + 實際上是六個指令的集合,可以透過下拉式選單來切換

  • setOutput:變成Data Block,從右邊插入其他Block
  • setPreviousStatement上方可接其他Block
  • setNextStatement下方可接其他Block

  • appendValueInput:允許該block右側產生輸入欄位你讓Data Block從右邊插入
    • appendValueInput(“VariableName”):VariableName 可在寫轉換Arduino code時使用
    • .setcheck:則是決定輸入的資料型態。 Number, string …

可以允許多個setcheck,不允許的資料型態將無法放入該輸入欄位中。

 

  • appendDummyInput:沒有讓Data Block從右邊插入的功能,但是可以讓你繼續增加Block內部的文字字串,不需要在appendDummyinput()裡面宣告特定的文字,也可以塞一些選項
    • 可加入上述 appendField()之各種用法

 

4.      blockly/generators/arduino資料夾:此資料夾下皆是負責將blocks轉換為Arduino code,Generator 會生成對應 Blocks 的 Arduino code,因此在 BlocklyDuino\blockly\Blocks 資料夾下的檔案或 function,在 Generator 端都要有一個同樣函數名稱的對應。

  • 注意:Blocks[‘function name’] 務必要注意兩邊function name的名稱要相同
  • 最後要 return,以顯示在 IDE 之 Arduino 頁面
  • 還有要注意的是,在同一個Block中,function name 的部分要避免使用相同的名字,否則在轉為Arduino Code中的時候將會產生後宣告的function覆蓋掉前面的同名Function的情形。
  • 關於Arduino.ORDER_ATOMIC,則是會告訴 Blockyduino 現在即將要進到下一個 Block 而不是進到子Block運行。

 

Example:

  • 當item=1000 賦值完畢後,function將會return Blockly.Arduino.ORDER_ATOMIC,並開始執行下一個Block的指令。

5.     blockly/msg資料夾:msg目錄下的js檔案,此功能為將blocks資料下的變數名稱對映到實際的block上,在js資料夾下還有en.js & zh-hant.js需一併更改,功能為將變數名稱改為不同語系。

※在blockly/blocks與blockly/generators中的js檔創建block時,選擇哪個js檔或自行創建js檔案並不會影響在實際使用blocklyduino時的位置,block位置皆是由category.xml設定之。

 

自製一個弧度轉角度的數學指令

1.   更新 Windows 10

Build 14316  微軟從 Windows 10 開始加入原生的 Ubuntu Linux 環境,Linux 的開發者現在可以在 Windows 10 系統中直接使用 bash shell

2.      安裝 bash

點選Wins 10開始 → 更新與安全性 → 開發人員專用 → 選擇開發人員模式

回到設定首頁 → App → 應用程式與功能 → 程式與功能 → 左側點選開啟或關閉

Windows功能 → 將”適用於Linux的Windows的子系統(搶鮮版(Beta))”勾選 → Windows 點選重新開機

重新開機後 → 開啟cmd → 在cmd輸入”bash” → 依照指示步驟安裝Ubuntu

 

3.      設定block外觀:

於/blockly/blocks 新增該 block 的外觀定義,以本指令來說要加在 math.js 中的最底部,(※注意不要放在任何括號中),如下:

Blockly.Blocks['math_radian_to_degree'] = {
 init: function() {
   this.setHelpUrl(Blockly.Msg.MATH_RADIAN_TO_DEGREE_HELPURL);
   this.setColour(Blockly.Blocks.math.HUE);
   this.appendValueInput("RADIAN")
     .setCheck("Number")
     .appendField(Blockly.Msg.MATH_RADIAN_TO_DEGREE_TITLE);
   this.appendDummyInput()
     .appendField(Blockly.Msg.MATH_RADIAN_TO_DEGREE_APPEND);
   this.setInputsInline(true);
   this.setOutput(true, "Number");
   this.setTooltip(Blockly.Msg.MATH_RADIAN_TO_DEGREE_TOOLTIP);
 }
};

4.      設定block之Arduino轉換碼:

於/blockly/generator/arduino資料夾中,新增該 block的邏輯。以本指令來說要加在 math.js 中的最底部(※注意非3. 的math.js,且不要貼於任何括號中) ,如下:

Blockly.Arduino['math_radian_to_degree'] = function(block) {
 Blockly.Arduino.definitions_['const_pi'] = 'const float __MPI = ' + Math.PI + ';';

 var code_radiansFromDegree = '\n' +
'float __radiansFromDegree(float radians) {\n'+
'  return radians * 360 / 2 / __MPI;\n' +
'}\n';
 Blockly.Arduino.definitions_['radiansFromDegree'] = code_radiansFromDegree;

 var argument0 = Blockly.Arduino.valueToCode(block, 'RADIAN',
                                             Blockly.Arduino.ORDER_NONE) || 0;
 console.log(Math.PI);
 var code = '__radiansFromDegree(' + argument0 + ')';
 return [code, Blockly.Arduino.ORDER_NONE];
};

 

5.      更改block上顯示語言:

更改在msg目錄下的js檔案,此功能為將blocks資料下的變數名稱對映到實際的block上,在js資料夾下還有en.js & zh-hant.js需一併更改,功能為將變數名稱改為不同語系。

先依第1步驟搜尋MATH_DEGREE,接著在第2步的位置放入程式碼,英文版亦同。

Blockly.Msg.MATH_RADIAN_TO_DEGREE_HELPURL = "https://en.wikipedia.org/wiki/Radian";
Blockly.Msg.MATH_RADIAN_TO_DEGREE_TITLE = "Radian";
Blockly.Msg.MATH_RADIAN_TO_DEGREE_APPEND = "turn into degree";
Blockly.Msg.MATH_RADIAN_TO_DEGREE_TOOLTIP = "";
Blockly.Msg.MATH_RADIAN_TO_DEGREE_HELPURL = "https://en.wikipedia.org/wiki/Radian";
Blockly.Msg.MATH_RADIAN_TO_DEGREE_TITLE = "弧度";
Blockly.Msg.MATH_RADIAN_TO_DEGREE_APPEND = "轉換為角度";
Blockly.Msg.MATH_RADIAN_TO_DEGREE_TOOLTIP = "";

6.      加入製作的block至目錄:

將新增的Block加入blockly/apps/blocklyduino/category.xml,這裡的順序、category位置就是實際顯示順序。type名稱需與定義block版型之名稱相同。請注意我們在<category math>標籤中加入了一個新的 block:

 <block type = “math_radian_to_degree”></block>

 

7.      build檔案 :

最後請開啟cmd

輸入bash

輸入cd BlocklyDuino-for-LinkIt-master    進入資料夾

輸入ls    確定資料夾內有make.sh

輸入sh make.sh     去建立檔案

 

make.sh 要沒有 error 才會正確產生所有檔案

目前Github最新版本的資料

為 @x43x61x69 修改後之版本

修改過 make.sh 和其他 script

會檢查所需的 command 是否存在

之前的版本沒有檢查

bash
cd BlocklyDuino-for-LinkIt-master 
ls
sh make.sh

成功建立之畫面

 

Blocklyduino畫面

 

Blocklyduino轉Arduino code畫面

常見問題:

  1. 找不到新增的block:可能在xml新增的位置有問題。

或是如果再terminal看到ERROR訊息寫”NameError: name ‘lxml’ is not defined” or “ImportError: No module named lxml.html”,則需要將lxml安裝後,在重新輸入sh make.sh。

  1. block全部重疊在一起:如下圖,可能有更動到html檔,以至於覆蓋掉原本的code導致出錯,請使用sh make.sh重新建立一次。

 

相關文章:

 

[課程紀錄]170724 物聯網教師研習@日新國小

$
0
0
作者/攝影  曾吉弘
課程時間  2017 7/ 24 25
課程講師  徐豐智、趙偉伶、陳煜倫
課程場地   台北市日新國小 / 台北市自造教育示範中心

0724~25 兩天感謝台北市自造教育示範中心邀請許多對於基礎物聯網教學有興趣的老師們,一起來認識如何將 LinkIt 7697 物聯網開發板應用於國中小教學(現場也有景美女中的老師),在此搭配了以 Google Blockly 為基礎的 Blocklyduino 圖形化介面來進行教學。換言之,老師們等於有兩套工具,圖形化介面讓學生快速完成各種專題,相關周邊如各種感測器的指令,還有Wi-Fi / BLE / 雲服務的指令也都有了,可以說是相當完整。

CAVEDU已經開始編寫7697書籍,希望明年初可以出版喔!

這兩天課程主題除了將7697作為Arduino來控制基礎元件、藍牙應用以及結合雲服務等三大面向之外,最重要的是將上課時可能會碰到各種技術性問題都和老師們分享,目的是讓各位老師真的願意把這套課程實際運用在課程中囉!

 

如果學校網路環境不太夠力的話,聯發科也提供了MCS lite 離線版雲服務,只需要一台一般等級的桌上型電腦就可以讓十多片開發板順利連線。這麼多面向都考慮到,也深受最近許多老師上課後的實際肯定。

 

Blocklyduino 各作業系統版本下載頁面

MCS lite 離線版雲服務下載頁面

 

投影片:

 

以下是課程花絮照片:

對於教學場域來說,重點在於如何正確取得資料與資料呈現(甚至分析)的方式,麻煩的網路通訊協定就等到小朋友長大再說吧。這時候MCS提供的檢視歷史資料功能就很有用了。除了可以看到最新一筆資料,也可以用折線圖的方式來呈現歷史資料,馬上知道數值的變化趨勢喔!

 

後續也可以取得單一或多筆資料點的 JSON格式資料:取得 Mediatek Cloud Sandbox 的資料點 (JSON)

有了手機app,就可以設定當感測器值滿足我們所設定的條件時,自動推播訊息給您,或是

寄送email以及透過webhook機智來觸發其他的網路服務(IFTTT, LINE等)

更多照片請參考台北市自造教育示範中心的Facebook粉絲頁,本文部分照片經中心同意只用之,特此感謝。

 

相關文章:

[微笑偵測器] 微軟辨識服務搭配Arduino

$
0
0

本文要介紹微軟辨識服務的Face API,可以偵測照片中的臉孔以及相關參數,包含年齡、性別、情緒、眼鏡、鬍子以及五官座標等。

作者/攝影  曾吉弘
時間   3小時
成本
難度  * * * * *
材料表
  • 個人電腦
  • Arduino Uno 或其他可執行 StandFirmata 之 Arduino相容板
  • LED x 3
  • 線材
  • 麵包板

本範例修改自微軟辨識服務Face API教學而來,您也可以在該頁面找到其他程式語言的教學。

微軟辨識服務

根據官方網站說法:Microsoft 辨識服務具備多種程式語言的API,可以透過自然的溝通方式看、聽、說,以及理解和解讀各種媒體素材,包然文字、語音、照片、影片與搜尋建議等等。分成五大類,每項又各自分成不同細項,本範例將使用辨識下的臉部API:

  1. 辨識
  2. 語音
  3. 語言
  4. 知識
  5. 搜尋

 

註冊Face API

註冊一個新的帳號,需要手機號碼認證與信用卡認證…

  • 這些步驟完成之後選擇您要的API,即可取得金鑰(subscription key),每一個API各自會有自己的流量與次數限制,請注意。
  • 下圖是 Face API 的兩組金鑰,使用任何一組都可以

 

在其頁面就可以看到效果,有一些範例圖片或者您可以自行上傳照片,右側就是偵測結果,格式是JSON,各主要程式語言對於JSON都有現成的函式庫來爬取。

範例程式

本範例是修改自 Face API python 範例程式而來,使用 python 2.7。本範例會使用一張網路圖片(#37)送到 Face API之後取得其辨識結果。

程式#33可指定我們所要偵測的臉孔參數,包含以下:

  • age:年齡
  • gender:性別
  • headPose:頭部姿態,回傳XYZ軸傾斜狀態
  • smile:微笑(0~1之間小數,數字愈高代表微笑愈明顯)
  • facialHair:臉部髮型,例如山羊鬍、八字鬍、鬢角
  • glasses:偵測有無戴眼鏡
  • emotion:情緒,包含生氣、滿足、害怕、驚訝與悲傷等等
  • hair:髮型,包含禿頭、髮色等等
  • makeup:偵測是否化妝
  • occlusion:偵測是否閉合,例如眼睛、嘴巴
  • accessories:配件
  • blur:偵測圖片是否模糊,以及模糊程度參數
  • exposure:偵測圖片曝光程度與曝光程參數
  • noise:偵測圖片中雜訊與雜訊程度參數

 

在此用到的圖片是這位可愛的女生,您可以換成其他的圖片來測試

import httplib, urllib, base64, json

###############################################
#### Update or verify the following values. ###
###############################################

# Replace the subscription_key string value with your valid subscription key.
subscription_key = 'XXXX'   #填入Face API金鑰,任一組都可以

# Replace or verify the region.
#
# You must use the same region in your REST API call as you used to obtain your subscription keys.
# For example, if you obtained your subscription keys from the westus region, replace 
# "westcentralus" in the URI below with "westus".
#
# NOTE: Free trial subscription keys are generated in the westcentralus region, so if you are using
# a free trial subscription key, you should not need to change this region.
uri_base = 'westcentralus.api.cognitive.microsoft.com'

# Request headers.
headers = {
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': subscription_key,
}

# Request parameters.
params = urllib.urlencode({
    'returnFaceId': 'true',
    'returnFaceLandmarks': 'false',
    'returnFaceAttributes': 'age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise',
})

# The URL of a JPEG image to analyze.
body = "{'url':'https://how-old.net/Images/faces2/main0011.jpg'}"

try:
    # Execute the REST API call and get the response.
    conn = httplib.HTTPSConnection('westcentralus.api.cognitive.microsoft.com')
    conn.request("POST", "/face/v1.0/detect?%s" % params, body, headers)
    response = conn.getresponse()
    data = response.read()

    # 'data' contains the JSON data. The following formats the JSON data for display.
    parsed = json.loads(data)
    print ("Response:")
    print (json.dumps(parsed, sort_keys=True, indent=2))
    print parsed[0]["faceAttributes"]["smile"]   #第一張臉的 smile 強度
    conn.close()

except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

 

根據Face API,一張照片最多可以辨識到64張臉,但這樣真的太多了… 在基礎練習最好使用單一臉孔來測試。熟悉之後可以加入更多臉孔甚至連續偵測

參考:[微軟認知服務] 串流影像之臉孔與年齡辨識

執行結果如下,本範例就是把所有JSON結果顯示出來(#50),但為了後續微笑偵測,我們在#51獨立把smile的強度抓出來了,如下圖的 1.0

print parsed[0][“faceAttributes”][“smile”] #取得第一張臉的 smile 強度

上圖可愛小妹妹的完整偵測JSON結果如下,您可以慢慢檢視:

[
  {
    "faceAttributes": {
      "accessories": [], 
      "age": 21.6, 
      "blur": {
        "blurLevel": "low", 
        "value": 0.1
      }, 
      "emotion": {
        "anger": 0.0, 
        "contempt": 0.0, 
        "disgust": 0.0, 
        "fear": 0.0, 
        "happiness": 1.0, 
        "neutral": 0.0, 
        "sadness": 0.0, 
        "surprise": 0.0
      }, 
      "exposure": {
        "exposureLevel": "goodExposure", 
        "value": 0.73
      }, 
      "facialHair": {
        "beard": 0.0, 
        "moustache": 0.0, 
        "sideburns": 0.0
      }, 
      "gender": "female", 
      "glasses": "NoGlasses", 
      "hair": {
        "bald": 0.03, 
        "hairColor": [
          {
            "color": "brown", 
            "confidence": 1.0
          }, 
          {
            "color": "black", 
            "confidence": 0.77
          }, 
          {
            "color": "other", 
            "confidence": 0.46
          }, 
          {
            "color": "red", 
            "confidence": 0.2
          }, 
          {
            "color": "blond", 
            "confidence": 0.06
          }, 
          {
            "color": "gray", 
            "confidence": 0.02
          }
        ], 
        "invisible": false
      }, 
      "headPose": {
        "pitch": 0.0, 
        "roll": -11.5, 
        "yaw": -5.6
      }, 
      "makeup": {
        "eyeMakeup": true, 
        "lipMakeup": true
      }, 
      "noise": {
        "noiseLevel": "low", 
        "value": 0.08
      }, 
      "occlusion": {
        "eyeOccluded": false, 
        "foreheadOccluded": false, 
        "mouthOccluded": false
      }, 
      "smile": 1.0
    }, 
    "faceId": "d87447bd-a4b3-4c87-b92d-736871e8e6d9", 
    "faceRectangle": {
      "height": 166, 
      "left": 175, 
      "top": 197, 
      "width": 166
    }
  }
]
1.0   #獨立抓出來的 smile 強度

您可以使用 jsoneditoronline.org 來檢視 json 結構,會比直接看原始資料來的清楚明暸。

 

pyfirmata

取得臉孔資訊之後就有很多東西可以玩了,例如本範例的微笑偵測器。或是找找看畫面中誰有戴眼鏡。如果是連續偵測的話,還能做到讓攝影鏡頭跟著你的臉孔中心移動(PTZ平台),總之太多應用啦!

pyfirmata 是python透過序列埠來與Arduino溝通的模組,Arduino端只要上傳(請先確認)StandardFirmata 這個程式就可以了,安裝完成請關閉Arduino IDE,後續用不到了~

 

請在 terminal 中使用以下指令來安裝 pyfirmata

pip install pyfirmata

 

Arduino端設定

python透過序列埠控制Arduino LED

 

本範例就是 python 版的 LED 閃爍,您可以比較一下兩者的差異,您只要確定COM port 邊與您電腦上的一致即可。如果是 MAC/ Linux,應該是 /dev/ttyUSB0 這樣的東西。如果是 Raspberry Pi 則應該是 /dev/ttyACM0

#!/usr/bin/python
 
import pyfirmata
import time
pin = 13
port = 'COM5'
board = pyfirmata.Arduino(port)   #對指定序列埠開啟通訊
while True:
    	board.digital[pin].write(1)  #設定指定腳位高電位
    	time.sleep(1)                    #等候1秒
    	print "ON : %s" % time.ctime()  #顯示相關訊息與時間
    	board.digital[pin].write(0)
    	time.sleep(1)
    	print "OFF : %s" % time.ctime()

執行畫面如下圖,除了Arduino D13 會亮暗之外,在console上也有對應的訊息

Python結合Arduino微笑偵測應用

來看一下綜合運用吧!本範例會根據畫面中臉孔的微笑程度來決定LED亮起的數目。

import httplib, urllib, base64, json, pyfirmata
from time import sleep
port = 'COM5'

# Replace the subscription_key string value with your valid subscription key.
subscription_key = 'XXX'   #填入Face API金鑰,任一組都可以

# NOTE: Free trial subscription keys are generated in the westcentralus region, so if you are using
# a free trial subscription key, you should not need to change this region.
uri_base = 'westcentralus.api.cognitive.microsoft.com'

# Request headers.
headers = {
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': subscription_key,
}

# Request parameters.
params = urllib.urlencode({
    'returnFaceId': 'true',
    'returnFaceLandmarks': 'false',
    'returnFaceAttributes': 'age,gender,smile,emotion,occlusion,accessories,exposure,noise',
    #'returnFaceAttributes': 'age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise',
})

# The URL of a JPEG image to analyze.
body = "{'url':'https://how-old.net/Images/faces2/main002.jpg'}"

#connect Arduino
board = pyfirmata.Arduino(port)    #對指定序列埠開啟連線
sleep(3)      #等候3秒來開啟序列連線

try:
    # Execute the REST API call and get the response.
    conn = httplib.HTTPSConnection('westcentralus.api.cognitive.microsoft.com')
    conn.request("POST", "/face/v1.0/detect?%s" % params, body, headers)
    response = conn.getresponse()
    data = response.read()
    # 'data' contains the JSON data. The following formats the JSON data for display.
    parsed = json.loads(data)
    print ("Response:")
    print (json.dumps(parsed, sort_keys=True, indent=2))  #顯示所有資料
    a = parsed[0]["faceAttributes"]["smile"]   #顯示微笑程度
    conn.close()

except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

print "smile value is"
print a                                #顯示微笑程度
if a > 0.75:                         #以下分成三個區間來控制LED,您可以自行修改
    board.digital[9].write(1)
    board.digital[10].write(1)
    board.digital[11].write(1)
    print 111
elif a < 0.25:
    board.digital[9].write(1)
    board.digital[10].write(0)
    board.digital[11].write(0)
    print 100
else:
    board.digital[9].write(1)
    board.digital[10].write(1)
    board.digital[11].write(0)
    print 110

 

執行!

執行時,Moto GP 傳奇車手 Valentino Rossi~ https://moto7.tw/imgs/valentino-rossi-2015.jpg,也可以看到100代表只會亮起一個LED代表 Rossi 現在只有微笑或是沒表情。您可以切分更多條件或是修改Arduino端的呈現效果,一起來微笑吧!

延伸

 

請改用以下語法來將本機端圖檔上傳到FACE API來做辨識,請注意這個圖檔需要與 .py 放在同一個資料夾中,不然就需要指定絕對路徑。為了程式精簡,我們把 Arduino 端拿掉,您可以根據上續範例修改即可。

 

f = open(‘7688.jpg’, ‘rb’)

jpgdata = f.read()

f.close()

 

完整程式如下:

import httplib, urllib, base64
import json

f = open('a006.jpg', 'rb')
jpgdata = f.read()
f.close()

# Request header
headers = {
# Request headers
'Content-Type': 'application/octet-stream',
'Ocp-Apim-Subscription-Key': 'd3d138ceb1f4470286dcaba79f7d2de9',
}

params = urllib.urlencode({
# Request parameters
'returnFaceId': 'true',
'returnFaceLandmarks': 'false',
'returnFaceAttributes': 'age,gender,smile,emotion,glasses',
})   #只需要上述五個參數


body = {
}

try:
    conn = httplib.HTTPSConnection('api.projectoxford.ai')
    #conn.request("POST", "/face/v1.0/detect?%s" % params, json.dumps(body), headers)
    conn.request("POST", "/face/v1.0/detect?%s" % params, jpgdata, headers)
    response = conn.getresponse()
    data = json.loads(response.read())
    print(json.dumps(data, indent=2))   #顯示所有資料
    print data[0]["faceAttributes"]["smile"]   #顯示微笑程度
    conn.close()
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

 

相關文章:

 

 

 

[Python教學] Facebook圖形API測試工具,取得粉絲頁按讚數

$
0
0

本文要介紹微軟辨識服務的Face API,可以偵測照片中的臉孔以及相關參數,包含年齡、性別、情緒、眼鏡、鬍子以及五官座標等。

作者/攝影  曾吉弘
時間   2小時
成本
難度  * * * *
材料表
  • 個人電腦
  • Facebook帳號

本文要介紹如何使用Facebook的圖形API測試工具(Graph API explorer) 取得粉絲頁的相關資料,最常見的應用就是讚數。如果喜歡的話,還可以結合Arduino作出有趣的互動裝置,例如以下:

(註:本影片僅為示意,並非使用Python來取得資料)

 

Facebook開發者平台與圖形API測試工具頁面

請到Facebook開發者網站(請用您原本的Facebook帳號登入即可),在網頁最下面找到 圖形API測試工具(Graph API explorer)。您可以在此查詢您個人的所有資料,查詢結果會以 json 格式回傳,下圖是阿吉老師的Facebook Id 與使用者姓名的查詢結果:

(圖形API語法詳細文件請點我)

請點選畫面右上角的下拉式選單,找到您所要查找的粉絲專頁(您得是該專頁的管理員才行),例如本範例的CAVE教育團隊。下圖查詢了四個項目:id、name、fan_count(讚數)與link。您當然可以查詢其他欄位,只要有輸入資料都可以查得到。

以往的做法是比較寬鬆的,不需要AccessToken,且只需要把粉絲頁超連結www改為graph即可,但現在已經都需要從圖形API測試工具取得才行,這也暗示了您需得是該粉絲頁的管理員才可查找。並且AccessToken會在兩小時之內過期。網路上介紹如何取得永久有效的AccessToken,但不在本篇討論範圍之內。

Python程式碼

 

最後請看一下本範例的Python程式碼,

阿吉碎碎念:Facebook相關的API改動非常快,例如2.6之前,fan_count 原本是叫做 likes。其他雲服務也會常常改,但真的Facebook最愛改就是了,可能和創辦人個性有關吧~

 

本範例的關鍵URL由以下四個項目組成:

  1. facebook api 網址:https://graph.facebook.com/v2.10/
  2. 粉絲頁id:148248725246010 (CAVEr教育團隊)
  3. 要查找的欄位:?fields=id,name,fan_count,link&access_token=
  4. Access token:請由Facebook API圖形API測試工具

 

當然,其他程式語言如C#、Node.js 甚至App Inventor等都可以做到本範例的效果,您可以在取得資料之後直接使用瀏覽器來測試,只要看到以下畫面就是ok的:

 

https://graph.facebook.com/v2.10/148248725246010?fields=id,name,fan_count,link&access_token=XXX

 

FB API 2.10

 

#22是您要查詢的Facebook帳號或粉絲專頁ID。#23則是Access Token

#04是自訂的函式來處理Facebook API回傳的JSON格式結果。

#24~26 則是依序顯示出我們所要查詢的欄位,執行畫面如下圖:

import urllib2
import json

def get_page_data(page_id,access_token):
    api_endpoint = "https://graph.facebook.com/v2.10/"
    fb_graph_url = api_endpoint+page_id+"?fields=id,name,fan_count,link&access_token="+access_token
    try:
        api_request = urllib2.Request(fb_graph_url)
        api_response = urllib2.urlopen(api_request)
        
        try:
            return json.loads(api_response.read())
        except (ValueError, KeyError, TypeError):
            return "JSON error"

    except IOError, e:
        if hasattr(e, 'code'):
            return e.code
        elif hasattr(e, 'reason'):
            return e.reason

page_id = "148248725246010" # username or id
token = "XXXXX"  # Access Token
page_data = get_page_data(page_id,token)

print "Page Name:"+ page_data['name']
print "Likes:"+ str(page_data['fan_count'])
print "Link:"+ page_data['link']

 

相關文章:

[Scratch1.4]從零開始遊戲製作-足球篇

$
0
0

「運動」,一直是遊戲製作中,歷久不衰的主題之一,像是EA SPORTNBA LIVE,還有FIFA,在早期任天堂時代,熱血系列也推出了足球的遊戲。而今天,我們要用Scratch這套軟體,製作出一款足球小遊戲,讓我們先來看一下遊戲的進行畫面吧!

(遊戲圖片來源:

http://www.baike.com/wiki/%E8%B6%B3%E7%90%83%E5%9C%BA%E5%9C%B0

http://www.mathland.idv.tw/fun/football.htm

http://588ku.com/image/sanjiaozhui.html

作者/攝影  郭皇甫
時間   2小時
成本  時間即是成本
難度  * * * *
材料表

<iframe allowtransparency=”true” width=”485″ height=”402″ src=”//scratch.mit.edu/projects/embed/171355158/?autostart=false” frameborder=”0″ allowfullscreen></iframe>

這一款足球小遊戲以人物運球繞過障礙物的同時,吃掉金幣過關,遊戲操作方式相當簡易,使用鍵盤的上、下、左、右鍵操控人物移動。本篇文章會教您製作出這款小遊戲的簡易版,當您上手後就能自行增加關卡的難易度與障礙物的多寡,以下我們針對角色、場景、音樂分別說明如下。

 

角色:

匯入角色

在Scratch中,圖片是相當重要的因素之一,從一開始製作遊戲時,我們就要決定匯入哪些角色?而這裡的角色指的就是圖片,包含人物圖片、物品圖片、介面圖片…等。而在這款遊戲裡,我們需要一位人物圖片,以及三個物品圖片,請先按照以下步驟操作。

Step1在右下角的後台區內,按下「開啟角色檔案」

圖01 開啟角色檔案

 

Step2選擇人物圖片的資料夾,並按下確定後新增。(您可以在網路上搜尋您想要的人物圖片,建議使用png檔,已經去背的圖片會較方便)在後台區與舞台區裡,您就可以看到已新增的人物圖片。

圖02 選擇人物圖片

圖03 新增角色成功

 

以同樣的方式,我們再新增三張物品圖片,分別是足球、三角錐、金幣。

圖04 新增另外三張角色圖片

 

在圖02中,我們可以看到人物有四張類似的圖片,仔細觀察每一張都有些微的不同,這叫作「連續圖片」。在圖片的類型中,有一種GIF的動態圖片,其實就是由一張張連續圖片所組成,您也可以在網路上搜尋關鍵字「.gif」。當您擁有一張動態圖片後,您可以有二種方式將它變成數張靜態圖片。1.匯入至Photoshop後另存圖層為png檔;2.進入網站http://www.zamzar.com/convert/gif-to-jpg/,將圖片轉存成數張png檔。如此一來,我們就能將這些靜態圖片匯入至Scratch中使用。

 

Step3.匯入連續圖片造型。點選腳本區的「造型」,按下「匯入」,將剩餘的人物圖片匯進來。

圖05  在造型中匯入圖片

圖06  匯入其餘三張人物圖片

編寫程式

接下來我們要命令這些角色做一些事情,其實在遊戲製作的過程裡,每位角色要做的事情都各有不同,但都會有一些共同的設定,例如起始位置,這可以讓您的角色在一開始就決定好位置,不管遊戲執行得如何,只要重新開始遊戲,就又會在原本設定的位置上,非常方便,接著請按照以下步驟進行。

 

Step1.設定角色大小。在舞台區最上方有四個圖案,找到並按下最右邊的「縮小角色」,將滑鼠移到舞台區的角色上後,重複點擊滑鼠左鍵,將角色尺寸縮小到適當的比例即可。

圖07  縮小角色尺寸

Step2.設定起始位置。首先在舞台區上,移動滑鼠至人物上並按住滑鼠左鍵,拖曳人物到您想要的位置上後放開,接著點選抽屜區裡的「控制區」與「動作區」,拖曳以下的積木方塊至腳本區。其餘角色的起始位置也是用同樣的方式設定。

圖08  設定起始位置

Step3.按下鍵盤上、下、左、右鍵控制人物移動。在「控制區」中拉進「重複執行」與「如果」,並找到「偵測區」裡的「按下空白鍵」,將其改為鍵盤的上、下、左、右鍵,接著分別在「動作區」與「外觀區」拉進「面向_方向」、「移動10步」、「下一個造型」,並將「移動10步」改為「移動2步」。執行後您會發現移動時圖片翻轉了,這時您只要在腳本區最上面的角色圖片旁邊找到三個按鈕,按下中間的「只允許左右翻轉」,如此一來,圖片就不會再翻轉了。

圖09  設定只允許左右翻轉

圖10  使用上下左右鍵控制人物

Step4.足球造型設定。讓足球在移動的同時能夠有滾動的效果,請先切換至足球的造型區,點選「複製」,在複製出來的足球旁點選「編輯」後,會出現繪圖編輯器,請按下最左邊第四個按鈕「順時針旋轉」,讓足球圖片的角度與前一張不同即可。請再複製二個足球圖片,並按照上述方式旋轉圖片。

圖11  複製出一個足球

圖12  順時針旋轉足球

圖13  作出四個不同角度的足球

Step5.足球動作設定。足球被人物碰到時,會往人物的反方向滾動,所以滾動的條件是「碰到角色一」和「按下方向鍵」,移動方式與人物設定相同。這裡要注意的是,足球被踢到後只會滾動一段距離,並不會一直滾動,所以我們設定固定次數,讓足球可以自己跑一段距離。

圖14  足球移動條件設定

三角錐與金幣

足球設定好之後,接著要設定障礙物與金幣,這二個物品的設置相當簡易,障礙物只要設定成「碰到足球時,讓角色一和足球回到原點」;而金幣只要設定成「碰到足球時,隱藏自己並加分」。

Step1.設定三角錐。除了設定起始位置外,再加入「如果碰到球,則廣播home」,在這裡需要新增一個「廣播」,並命名為home,它的作用是讓角色一和足球接收到廣播後,就會回到起始位置。

Step2.設定廣播home。當角色一與足球接收到廣播home時,便要能夠回到起始位置,所以我們要分別在角色一與足球裡加入以下程式。

圖16  角色一回到起始位置

圖17  足球回到起始位置

 

Step3.設定金幣。我們讓金幣做出「碰到球則隱藏自己,並加10分」的效果。為此,我們在「變數區」裡新增一個變數,並命名為「分數」。接著,加入「重複執行偵測如果碰到足球,則隱藏並加分」。

圖18  新增變數

圖19  將變數命名為分數

圖20  金幣的程式設定

背景:

設定背景

在背景中,除了要匯入圖片外,也要設定計時與計分的功能,同時,開始遊戲與結束遊戲的畫面也會一併在這裡設定。

 

Step1.匯入圖片。點擊後台區的舞台,按下腳本區的「背景」後,按匯入,將背景圖片匯進來。並在繪圖編輯器裡,按下「放大」,將背景圖片覆蓋整個舞台區。另外,我們再使用畫筆在背景的左右二邊,各繪製一條紅色的直線,作為場地的邊界線。

圖21  點擊新增背景的匯入功能

圖22  匯入背景

 

圖23  按下放大背景

圖24  繪製二條紅色邊界線

Step2.背景程式設定。在背景裡我們需要設定「計時器」什麼時候開始計時,什麼時候停止遊戲。在一開始的時候讓計時器歸零,接下來重複偵測「如果計時器大於30秒,則停止遊戲」,分數的設定也可以在這裡加入,即一開始將分數歸零。

圖25  設定時間與分數

Step3.設定開始與結束畫面。在背景裡使用「繪製」或「匯入」來新增二張背景圖,分別代表遊戲開始與結束畫面,在遊戲開始的背景寫上「按下空白鍵開始遊戲」;結束畫面寫上「GAME OVER」,並加入圖26的程式。

圖26  加入遊戲開始與結束的設定

 

Step4.在上一步驟中,我們加入了廣播「遊戲開始」「GAMEOVER」以及「按下空白鍵」的設定,為了讓遊戲執行起來能夠一致,所以在人物與物品裡面,我們也要稍作修改。在一開始按下綠旗與接收到GAMEOVER時,讓人物與物品都隱藏起來,當接收到遊戲開始時,才顯示出來。而在足球裡,也加入「如果碰到紅色,則回到原點」。

圖27  人物設定修改

圖28  足球設定修改

圖29  三角錐設定修改

圖30  金幣設定修改

 

音樂:

最後,我們再匯進背景音樂,讓整個遊戲遊玩起來更有趣。點擊舞台,選擇聲音,點擊匯入,將音樂匯進來後,再切換到程式裡,將「聲音區」裡的「播放聲音」拉進「當接收到遊戲開始」之下即可。(背景音樂您也可以至網路上搜尋可免費分享下載的連結,檔名請使用.wma)

圖31  匯入音效

圖32  加入播放聲音

 

您也可以加入各種變化,例如:使用更多三角錐並排出路線;放置更多金幣或是讓金幣隨機出現;加入不同背景、不同障礙物的關卡增加難度…等,都可以讓您的遊戲表現得更加特別。

 

相關文章:

[ 展覽分享 ] Maker Faire Singapore @新加坡科學中心

$
0
0

今年2017Maker Faire Singapore(以下簡稱sgmakerfaire)舉辦於 Science Centre Singapore(新加坡科學中心),有別於去年的Mini Maker Faire,今年更是擴大舉辦這場自造嘉年華。

 作者/攝影  吳怡婷/吳怡婷、邱楨詒
 活動時間  2017/7/22-7/23
 活動地點  新加玻科學中心

圖1-入口處前的Maker Faire Singapore精神堡壘

新加坡科學中心的腹地非常的大,而策展單位精心安排了八個展區遍佈在整個科學中心內,接下來就來一同重新瀏覽一下各區的攤位面貌吧!

圖2-Maker Faire Singapore提供的平面圖(圖源至Maker Faire Singapore官網)

首先,要先從入口區售票口開始介紹起,這次的sgmakerfaire首次嘗試售票,也算是活動蠻突破性的挑戰,票券的收費是以一日券為主,分為網路購票6.50新幣以及現場購票8.50新幣(想當然網路購票就會便宜一些啦)

圖3-Maker Faire Singapore服務台及售票處

票券的款式是以手環的方式做呈現(與Maker Faire Bay Area作法相同),手環式票券的好處就是方便辨識,也不用在進進出出時還要忙碌的從包包裡翻找票券,第一天手環顏色為白色,第二天的則為紅色(因為我們是活動中的workshop講者,當然就是拿特別的藍色囉!藍色是兩日都可以進出的,提供給受展的Maker們辨識用)

圖4-Maker Faire Singapore手環式票券

接下來介紹一下Zone1(第一區),Zone1很特別的就只有一個攤位,也許是希望讓大家體驗動手做的樂趣,現場有免費的體驗的工作坊-利用毛線以及毛根做出來的小怪獸,現場非常深受小朋友的喜愛,做完造型後前方還有一張桌子提供各式各樣的眼睛讓您選擇,當然我們也湊進去體驗一下製作小怪獸~

圖5-Zone1毛線小怪獸工作坊體驗

圖6-這是我們現場做的毛線小怪獸(可愛吧!)

Zone2(第二區),是在科學中心內的帳篷造型的屋子裡,裡頭安排了許多與手工藝相關的攤位,因為新加坡涵蓋了許多形形色色的國家的組群,在手工藝這部分就可以看出許多不同於台灣的手工特色(如.印度、中國以及歐美等等獨特的混合元素特色)。


圖7-利用細細紙條捲出紙卷做出的藝術創作及飾品們

圖8- Star Wars應該都想要擁有這頂頭盔吧!創作者將紙板作為骨架,在使用報紙白膠水糊上,後續在上色製成的作品(製作過程可說是工耗大阿!)



圖9- 手工藝展區也出現了大型的刺繡機提供給現場逛展的朋友們體驗,這個好棒啊!






圖10- 現場的體驗攤位也不少呢!有做襪子娃娃、馬賽克、皮革製鞋等等各式各樣手工藝相關體驗

 

Zone3為室外展覽區域,在這區裡不外乎還是有許多特色體驗,木工的手作區、化工相關體驗、水火箭以及焊接的展演都是Zone3好玩且體驗性十足的區域,雖然室外溫度炎熱,但卻不減大家動手做的熱情呢!


圖11- 體驗木作展區,使用的機具皆為Bosch的機器,手作之餘也完全能夠讓體驗者了解Bosch的機具性能,是個不錯的行銷方式呢!現場的工作人員也都會一對一的指導以及說明機具使用方式,讓人覺得放心且安心的使用~


圖12-我的木作體驗,選了個暴龍造型(成品前後圖)


圖13-水火箭的體驗,小朋友玩得超開心

圖14-使用電解水在密集板上繪圖的體驗攤位。

圖15-定時定點的焊接展演。

Zone4的展區有許多手作結合科普相關以及兒童相關攤位,另外在此區裡頭的一區規劃了四旋翼的展區,開放的定時定點的避障表演賽,也安排了現場民眾體驗呢!


圖16-四旋翼攤位,在攤位外規劃了電視的投影,增添了不少臨場感

此攤是在新加坡針對兒童教育相關的團隊設置的,攤位上除了這個大大半圓形的足球秘密基地外,還有限定提供給兒童手作的工作坊以及小朋友們的作品展區。

圖17-我想應該一定會有這區吧XD(這完全是小朋友的遊樂場)

圖18-專屬提供給小朋友們的自製皇冠工作坊(小耳朵還會發亮喔!)




圖19-小朋友作品除了靜態展示的以外,還有許多兼具互動性的作品。

圖20- 在攤位入口旁,發現了一攤桌遊的攤位,一問之下才知道其中一個桌遊是關於程式邏輯相關,桌遊名稱「Code Master」,而旁邊的桌遊是與數理邏輯有關的桌遊,相當有趣!

 

Zone5展區結合了數位機台以及相關科技開發板的攤位們,現場有焊接、遙控車、程式設計以及專題等體驗以及作品交流,在展區最內部則安排了許多的論壇節目,就像是Maker們的作品發表會一樣。




圖21- 與開發板結合的專題們

圖23- Little bits的體驗攤位


圖23- Little bits的體驗攤位

圖24- Maker作品分享會

Zone6皆為學生的作品展示,雖然是國小生的作品完成度也是相當的高,令人敬佩的是除了他們會耐心說明之外,他們也會非常主動的與參觀的人攀談交流。



圖25- 學生們都很熱情地分享著他的創作

Zone7則是科學中心的內部區域-The Tinkering Studio,Tinkering Studio是從美國探索館的手作空間出來的,成立的出發點是以「用手作為思考」鼓勵大家藉由動手做以及操作的課程更促動思考。

圖26- Marble Machine的區域,提供給大家以開放性的思考方式,思考機構與結構。


圖27-電器拆拆也是相當熱門的一攤,現場科學中心的工作人員也會在一旁解釋以及指導


圖28- 原先經過時,其實不知道是什麼的工作坊(笑)經由工作人員的示範及說明後,發現是非常有創意的工作坊呢!


圖29-光影的體驗是我蠻喜歡的體驗區域,製作的空間非常開放,不管是小朋友還是大朋友都可以發揮自己的創意或是說出自己的故事~

 

最後一區的Zone8規劃了許多光影、動畫、暗室相關的互動體驗,也是我蠻喜歡的展區之一,現場除了互動裝置外,也有許多與力學浮力相關的體驗,當然還有大家最喜歡的對戰遊戲~


圖30-數位互動式體驗

圖31-逐格動畫的體驗也是相當熱門

圖32-體驗太空人手套打結跟拆結計時挑戰

圖33-很爆笑的格鬥對戰投影

sgmakerfaire 今年的真的是展品非常豐富多元,文章分享的恐怕只是冰山的一小角而已,非常推薦大家明年有機會的話可以一窺sgmakerfaire的活動,除了了解Maker們的創作以及體驗您意想不到的工作坊之外,也不要忘記給予這些努力在展區分享的Maker們實際的鼓勵喔~此次展覽分享就告一段落啦!

 

相關文章:


[課程紀錄]170815~0818 App Inventor物聯網公民營研習@嘉南藥理大學

$
0
0

作者/攝影  曾吉弘
課程時間   2017 8/15~18
課程講師   曾吉弘
課程場地   嘉南藥理學院資管系

App Inventor 結合Arduino的各種應用,這算是招牌課程了吧。從小學生到大學生都可以用App Inventor做到很多有趣的應用。以下是CAVEDU對於App Inventor教學的核心思想:

如果只是換個環境來寫VB,那多沒意思?寫手機app就是要結合手機上各種有趣的感測器、網路功能甚至機器人才好玩啊!

App Inventor中文學習網可以滿足您的各種需求,環境安裝、範例教學、元件說明等等都在這裡喔!

當天課表的 Google doc 在這邊,請和我們一起學習吧!這真的不是我們自誇了,四天要學到這些內容,CAVEDU就算不是唯一也是少數可以涵蓋這麼多範圍的教學團隊啦。有些老師在上課過程中反應太濃縮,腦袋裝太多東西了。畢竟我們是把一個學期甚至一學年的精華放到四天的課程中。各位老師回到學校之後,可以從人機介面、影音多媒體、簡易網頁以及各種輸入輸出的應用來帶學生慢慢進入。一年以上的課程絕對綽綽有餘喔。Pura Vida的網站上也整理好了目前App Inventor可用的外掛,已經快要比原本的元件數還多了!

https://docs.google.com/a/cavedu.com/document/d/1j-gOT9Nbl1wSbvYbLJ6WAKUqDCdp3LcMKqvjAoNLBko/edit?usp=docs_home&ths=true

簡列大綱如下:

8月15日 (二) 8月16日 (三) 8月17日 (四) 8月18日 (五)
Android 發展史與App Inventor 網路應用

結合各種Google 服務

Google地圖

Arduino 開源硬體發展 App Inventor結合opendata

如何取得空氣汙染資料

人機介面設計

如何匯入外部.aix擴充檔

Google街景圖

Arduino 環境建置與基礎I/O 結合微軟認知服務

辨識照片中資訊

午休
資料型態

整數、文字與清單

自行產生QRcode

趣味應用

手機上的感測器

姿態、加速度、GPS與陀螺儀

滾球遊戲

App Inventor BLE 通訊

藍牙(4.0)

控制Arduino

聲控家電

綜合實作練習

最後來看看上課花絮吧,第三天的課程是本次課程的重點,讓手機來控制Arduino 101開發板(雖然Arduino 101好像被Intel放棄了,但相同的課程可以改用其他支援BLE的開發板,例如LinkIt 7697)

主辦單位台南高商致詞

嘉藥資管系歡迎各位老師來上課






相關文章:

[Linklt7697系列] 八校國中小夏令營不藏私大公開-Linklt7697搶答器

$
0
0

前情提要:LinkIt 7697開發板教學]BlocklyDuino圖形化介面 – 環境建置與介面

作者/攝影  趙偉伶
時間   1小時
成本  $1500
難度  * *
材料表
  • Linklt7697
  • 麵包版
  • 公母杜邦線
  • 10 mmLED燈
  • 大型按鈕
  • Mico USB線
  • 連接器
  • 極限開關

透過前篇   [LinkIt 7697開發板教學]BlocklyDuino圖形化介面 – 環境建置與介面   了解了BlocklyDuino圖形化介面後,接著要認識電腦程式是如何運作的。想問問大家,覺得電腦跟人類的思考方式有什麼不同呢?

電腦其實需要我們人類給他非常明確指令去控制,才會順利做事情,例如:媽媽請你拿桌上的水,人類會直接走到水杯前面後拿起來,在這之前如何移動、如何伸出手、張開手指、握住水杯等等幾乎都是身體自發性完成的。而電腦就不一樣了,他需要明確的指令才行。例如:走到座標XYZ哪個位置,機械手臂向下移動到哪個位置,先張開手指再闔上手指等等,一個都不能錯!寫程式就是我們與電腦的溝通方式,你會更了解電腦的思考模式。

 

動動手

要做搶答器,要先將按鈕組裝起來,就跟著圖一起來做吧!

 第一步:組裝連接器與極限開關

第二步:組裝按鈕

第三步:接上LED

接著,將7697開發板插上麵包板,拿出兩顆LED及四條公母杜邦線,將兩顆LED的正極(比較長的腳)分別接到7697開發板的P7與P8腳位,負極(比較短的腳)則接到開發板的GND腳位,完成如下圖:

第四步:接上按鈕

先了解按鈕的電路原理,再將接好的兩顆按鈕拿出來,並依下列圖示接在P3、P4及GND的位置。

動動腦,寫程式

BlocklyDuino圖形化程式有很多不同的抽屜,而每個抽屜都代表了不同功能的程式指令。今天的搶答器會用到〝程式流程抽屜〞、〝邏輯抽屜〞跟〝數位I/O抽屜〞,讓我們一邊認識程式積木一邊完成搶答器的程式吧!

第一步:搶答器動作分解

先了解程式的思考邏輯,再去認識所需積木,一步步將搶答器程式構築出來。

試試看,在了解這些邏輯後,是否可以完成搶答器的程式呢??

 

第二步:認識搶答器所需的程式積木

每個Blocklyduino程式都會有"初始化"跟"重複執行"兩個積木,如果沒有,可以從"程式流程抽屜"找到,就跟小豬一起來認識這兩個積木吧!

 

要如何知道誰先按下按鈕來搶答呢?這時登場的是邏輯抽屜的"如果(if)",它可用來檢查某個條件是否發生了,以搶答器來說就是按鈕被按下了。本次搶答器有三個條件,讓我們來看如何形成三個條件判斷吧!

條件判斷,電腦的邏輯有所不同,請看下圖。

Linklt Smart 7697這塊開發板背面有一根根的針腳,可以用來連接各種不同的電子元件。在程式中會用Pin X代表不同的元件,例如把按鈕接在Pin3的話,在程式鐘就能用Pin3來得知按鈕的狀態。

電腦傳輸資料,有分成兩種訊號:數位訊號跟類比訊號,讓小豬告訴大家這兩種訊號的差別。

搶答器會根據哪一個按鈕被壓下來決定LED要亮或暗,就是先前介紹的數位訊號,所以會使用到數位I/O抽屜的程式積木。

讓LED燈亮跟暗,代表要讓7697開發板對某一支針腳提供高電位或低電位。在此,如同按鈕,可用腳位編號來表示LED。

認識了這些積木,應該可以寫出搶答器的程式了吧?

還沒還沒~因為程式的速度跑很快,如果只用LED亮燈指令的話,實際上是看不清楚地,所以要加入"時間抽屜"的"延遲積木"來決定LED到底要亮或暗多久時間。

知道這些積木作用之後,將這些積木阻合起來就是搶答器的程式了吧!!

完整的程式,如下:

 

可以找同學一起玩可愛搶答器囉!

相關文章:

 

[LattePanda] OpenCV視覺辨識人臉追蹤

$
0
0

本文說明如何使用 LattePanda搭配OpenCV視覺辨識函式庫來打造人臉辨識機器人。

作者/攝影  袁佑緣
時間   1小時
成本
  • LattePanda
  • 螢幕
  • 鍵盤
  • 滑鼠
  • 喇叭
  • webcam
難度  * *
材料表
  • LattePanda
  • 螢幕
  • 鍵盤
  • 滑鼠
  • Webcam

 

本文說明如何使用 LattePanda搭配 python語言去使用OpenCV機器視覺函式庫來打造一個人臉辨識機器人,本範例的操作環境將以LattePanda的Windows10為主。

 

1. 軟體準備

安裝Python與相關套件

首先請到Python的網站下載最新版的安裝檔,在這邊要提醒一下Python目前有兩種版本,一個是2.7x版,另一個3.x版。Python 2.7x版是比較舊的版本,同時官方也有發出聲明將不會在繼續更新了,而本篇的範例使用的是新版3.x的Python,所以請注意一下不要選錯囉,以本文為例,最新的版本是3.6.1,如下圖。接著請按照以下步驟進行。

 

請在安裝Python時,將下方Add Python 3.6 to PATH勾選起來,意思是要把Python加入windows作業系統的環境變數內。

 

安裝完成後,為了測試我們的電腦是否能正常呼叫Python,請呼叫您電腦的終端機,windows的使用者請按下快捷鍵win+R便會在左下角顯示執行視窗,接著輸入cmd,這樣一來就會叫出windows的命令提示字元。

 

 

接下來請在上面輸入Python,呼叫Python的互動界面,如果能成功看到>>>的符號,那就代表已經成功叫起Python的界面了,而使用者可以直接在上面輸入Python的相關指令,如果沒有正確顯示這個界面的話,可能是您前面的安裝過程有問題,請重新回到前面的安裝步驟,有可能是您沒有勾選系統變數那個選項,所以windows無從呼叫Python。

接下來請輸入exit()跳出這個Python互動界面,回到windows的命令提示字元。

接下來請輸入pip install numpy,使用Python的套件管理員pip來安裝numpy這個套件。

裝完numpy之後,一樣使用pip來安裝OpenCV套件,請輸入pip install opencv-python

最後請輸入pip install pyserial,安裝在python中用來做Serial溝通的pyserial套件。

準備Python IDE

撰寫Python的程式除了要打code之外,還需要執行的環境,所以筆者在這邊推薦一款非常容易上手的Python IDE,請到以下的網站(http://thonny.org/)下載並安裝Thonny。

 

裝完必要的Python套件之後,我們就要來把Thonny的程式路徑設定成我們電腦系統中預設的Python執行程式。請點選Tools然後再點選Options,進入Thonny的偏好設定。如下圖。

接下來選擇interpreter,也就是Python的直譯器為系統預設的路徑,如下圖。

2.硬體架設

 本範例使用羅技C170的webcam作為辨識人臉的攝影鏡頭,另外為了要能夠追蹤人臉的位置,我們還需要架設一個旋轉平台,如下圖,由底下的小型伺服馬達(MG90)來控制鏡頭對到的方位。且注意到下方的小馬達控制訊號線是接到LattePanda左邊的3Pin接頭,記得靠外側是要接深色的地線喔!

 

 

3.軟體實作

Arduino 程式碼

為了要控制旋轉平台的伺服馬達,我們需要使用LattePanda上的Arduino Leonardo晶片,請打開Arduino IDE並打上以下的程式碼,並上傳到LattePanda上的Arduino端(請記得選對COM port)。

Arduino端的控制動作其實很簡單,它會聽取Serial傳來的字元命令,如果是小寫的字母a或b就會分別左右旋轉一度,進而達到轉動鏡頭的效果,而伺服馬達的控制訊號腳位在本範例中用的是9號腳位,接法如上圖,如果想接其他腳位請記得要改一下Arduino程式碼裡的腳位定義(s.attach(9))。

#include <Servo.h>

Servo s;
int degree = 90;

void setup()
{
    Serial.begin(115200);
    s.attach(9);
}

void loop()
{
    if(Serial.available())
    {
        int cmd = Serial.read();
        if(cmd == 'a')
        {
            degree++;
            if(degree >= 180)
                degree = 180;
            s.write(degree);
        }
        else if(cmd == 'b')
        {
            degree--;
            if(degree <= 0)
                degree = 0;
            s.write(degree);
        }
        else
            Serial.println("Press a/b to turn the camrea!");
    }
}

 

Python 程式碼

前面已經準備好Python會需要用到的函式庫跟IDE了,接下來我們就要來實作最後關鍵的人臉辨識以及追蹤,因為需要用到辨識人臉的模型,請去OpenCV的github網站(https://github.com/opencv/opencv/tree/master/data/haarcascades)下載 haarcascade_frontalface_default.xml與 haarcascade_eye.xml這兩個.xml檔,分別是用來辨識人的臉部與以及眼睛。

程式碼的實做可以拆解成幾個重要的部份,以下就讓我們一步一步的來了解吧!

首先我們會由cv2.VideoCapture(0)來讀取Webcam的影像資訊,並且設定初始的解析度是640×480,接下來在連接埠COM5建立一個Serial通道,用來下指令給Arduino端,以控制鏡頭的方向。

而while迴圈裡面則包含了主要的辨識程式,辨識的方法其實很簡單,就是先把鏡頭每一幀的照片先灰階化,再透過前面下載的臉部及眼部辨識模組套進去(face_cascde和eye_cascade)去做最可能的人臉偵測(這裡使用的方法是取最大/近的臉部面積)。

最後為了要追蹤人臉,我們需要計算出人臉的中心位置(position = x + w/2.0),x是標示人臉方框的 角落x座標,w則是寬度,所以取一半的寬度就會得到人中的x座標位置,接下來我們只要跟我們取的影像中線做比較,然後左右旋轉鏡頭去做追蹤即可,而這調中線的位置則可以從前面設定的解析度640×480來算出,取寬的一半就能得到範例程式中的320了,如果說讀者想要嘗試其他的解析度,請記得也要修改鏡頭追蹤的中線喔!

import cv2
import numpy as np
import serial

face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')

cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
ser = serial.Serial('COM5', 115200)

while True:
    _, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 2, 5)
    if len(faces):
        (x, y, w, h) = max(faces, key=lambda face: face[2]*face[3])
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
        position = x + w/2.0
        print(position)
        if position < 320:
            ser.write(b'a')
        else:
            ser.write(b'b')
        
    cv2.imshow('face', img)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

 

示範影片

 

相關文章:

[3D繪圖] 教你自製指尖陀螺不求人

$
0
0

今年暑假的小小自造者營,我們讓高年級的小朋友們挑戰利用Designspark畫出指尖陀螺。不過要完成這個陀螺,除了要會用Designspark以外,前置作業也非常重要!你必須要先知道你所用的軸承(Bearing)的直徑、外圍加重物的尺寸等,所以在做圖之前,記得先把材料備好,再準備一支游標卡尺,就可以開啟軟體畫圖啦!

作者/攝影  陳亭妏(阿圓老師)
時間  小於一小時
成本  無
難度  * * *
材料表
  • 3D列印機
  • 3D列印線材
  • 軸承
  • 加重物

打開Designspark之後,先點選正面視圖,方便畫草圖。

點選草圖工具列中的圓形工具,第一個要畫的是中央放置培林的洞,阿圓的培林是22mm~可以直接在數字欄上輸入想要的尺寸。

接著畫出一個略大的同心圓替陀螺長肉,尺寸可隨意設置,但是不要讓它過瘦(<5mm),不然在塞培林時會很容易斷掉。

在圓的上方畫出一樣的同心圓,中間的圓的尺寸就是你要放進去的重物!阿圓今天要放的是彈珠,尺寸是16mm。

接下來,要畫條脖子把上下兩個圓接起來,但是要畫出對稱的脖子,必須要有條對稱線幫助你。在草圖工具列中點選「建構直線」。

接著畫出一條連心線,長度不限。畫完之後點選右鍵的「設為鏡像線條」

接下來就可以畫脖子啦!用直線或是曲線都可以,我們來試試曲線的效果吧。點選草圖工具列中的雲型曲線,記得曲線的頭跟尾要和上下的兩個圓相連,才能成為有效的平面。

畫好之後就可以把剛剛的建構直線刪掉了,接下來我們要把多餘的線刪掉,點選草圖工具列的修剪,按下之後,你可以發現每條線和其他線條相交的點都會變成斷點,這能便於我們只剪掉該消失的線段,而不會一次刪掉整個圓。

目前我們已經完成一個單元啦,接下來只要再畫出第二個第三個一模一樣的單元就好囉……既然長得一模一樣,當然要用複製的啊,才不要一個一個慢慢畫咧!但是要怎麼環狀複製呢?

先把所有要環狀複製的線條選起來,除了滑鼠拖曳,按住ctrl搭配滑鼠左鍵也可以多選線條,被選中的線條會是綠色的,小心不要漏選囉!

用滑鼠左鍵拖曳直角座標軸(紅圈處),移到要環狀排列的軸的地方,也就是軸承的圓心!

下個步驟是我覺得最好玩的地方!先找到左下角的「建立陣列」並勾選,再按住直角座標中的藍色箭頭,也就是旋轉,滑鼠順著箭頭方向移動,就可以環狀排列啦!而且想變出幾個就有幾個,所以在這個步驟,你可以決定你想要做出什麼形狀、要有幾隻腳的指尖陀螺。

但阿圓的彈珠只有三顆,那我們就複製成三個就好了。

陣列好以後,記得一樣要把多餘的線剪掉。

剪完之後阿圓覺得框線形狀怪怪的,這時候是修正線條的最好時機!可以刪除局部的線條,重新畫上順暢的曲線。

快完成啦!接下來我們要旋轉一下視圖,點選定位工具列中的旋轉就可以旋轉視角,也可以用滑鼠的滾輪輕鬆旋轉畫面。

按下編輯工具列中的「拉動」,我們要來讓平面的草圖長高啦!按下拉動以後,順利形成平面的地方會變成綠色的,所以如果你有任何平面沒有變色的話,可以放大檢查一下圖案哪裡破了洞。

點選我們要拉動的平面,當它順利變成黃色平面時,就可以往上拉動囉~拉動的高度一樣可以直接在數字欄輸入,這時候記得要去量一下你的培林有多高~

接下來我們要把不要的平面刪掉,避免3D列印機誤認那兒有個薄薄的面。

最後,為了避免指尖陀螺變成血滴子,我們要把它導個圓角~按住ctrl選取指尖陀螺的外框線(注意,不要選到面了,只能選邊線喔!)點選拉動,就可以順著圖示的箭頭方向拉動出圓角了~一樣可以自訂尺寸喔!如果沒有成功的話,可以檢查一下畫面左下方的圖示,是否有選到導角。

燈燈燈燈~恭喜你完成了一個等級一的指尖陀螺!

你也可以利用剛剛學到的草圖,用簡單的線條畫出造型,例如這個長出老鼠耳朵的指尖陀螺

最後印出來的成品~阿圓覺得放彈珠加重不僅視覺上美觀,也很省成本吶!(而且圓洞最好畫了呀~)

如果大家有嘗試更好的加重物,也歡迎告訴我們喔!

這樣就完成啦!是不是快速又簡單呢~

祝大家都能順利做出獨一無二的指尖陀螺喔!

 

相關文章:

[ 課程紀錄文 ] 2017.08.07 LattePanda勉強會@東京21Cafe

$
0
0

8/5、8/6參觀完MakerFaire Tokyo,吸收完滿滿的能量CAVEDU東京遠征隊移動到涉谷,應DFrobot與日本在地工程師Hirokazu桑邀約下,我們在日本舉辦兩小時研習營,雖然研習當天還有颱風登陸,還是有不少人參加,真的很感謝。

作者/攝影  徐豐智/郭皇甫
課程時間  2017 年 8 月 7日 (月) 19:00 (開場 18:30) ~ 21:30
課程講師  徐豐智
課程場地  東京都渋谷区-21Cafe

 

這次是在東京澀谷的21Cafe舉辦研習營,主題是製作天氣預報的機器人,截取livedoor提供的日本各區天氣預報資料JSON資料,判斷明日的天氣氣溫是否讓人熱得滿頭大汗。

 

這次分享主題(1)認識LattePanda。(2)使用Python擷取JSON資料。(3)在LattePanda上使用Python控制Arduino。

 

日本の温度取得のチュートリアル (JSON)

http://weather.livedoor.com/weather_hacks/webservice

 

東京の温度のデータ取得のAPI

http://weather.livedoor.com/forecast/webservice/json/v1?city=130010

 

這次的講義,日本限定,感謝Hirokazu桑大力幫忙

 

首先由21Cafe的管理人-寶島春菜小姐致詞,21Cafe是一個工程師與設計師的免費活動空間,可以容納約30人,大家可以使用這個空間進行主題討論、學習課程。

View post on imgur.com

DFrobot本部的工程師-李暘也到現場,向大家介紹DFrobot團隊製作LattePanda的理想,希望在不久的將來,每個家庭都能擁有一個屬於自己的機器人,提供給”不是Linux”開發者”一塊開發板。

View post on imgur.com

隨後附上課程中的照片,目標是做出

View post on imgur.com

 

View post on imgur.com

View post on imgur.com

View post on imgur.com

 

 

相關文章:

Viewing all 678 articles
Browse latest View live