Category Archives: 技術交流

[科技新訊] 2018.08.14- C的速度、Ruby的動態、Python的好用、R的處理統計能力、Perl的處理字串能力、學習曲線極致簡單 新的程式語言Julia 1.0誕生!!

翻譯

Julia Taiwan社群成員

紀錄攝影

CAVEDU教育團隊、pixabay

講師訪問地點
授權

轉載自julia官方網站,由Julia Taiwan社群成員協助翻譯,特此致謝!

眾所期待的 Julia 語言 1.0 版是近十年的心血結晶。在 JuliaCon 2018年會上,Julia 社群歡慶並共同正式將該版本升級為 1.0.0

 

Julia 語言第一次公開發佈,並有不少強烈的期待:

我們想要一個開源的語言,擁有自由的版權。我們想要 C 的速度及 Ruby 的動態。我們想要有一個語法與內在表示有一致性(homoiconic)的語言, 並且像 Lisp 一樣擁有真的macro,但是擁有像 Matlab 一樣熟悉好懂的數學符號。我們也想要像Python 一樣好用的泛用型程式語言, 處理統計要和 R 一樣,處理字串要和 Perl 一樣地自然,要有和 Matlab 一樣強大的線性代數功能,串接程式要如同 shell 一樣好用。要學習的東西極致簡單,同時能讓大多數嚴苛的黑客寫起來開心。我們希望它是互動式且也是可編譯的。

圖1

 

一個充滿活力和繁榮的社群圍繞著這樣的語言成長起來,來自世界各地的人們都在為這個目標而努力不懈改進並塑造 Julia。 超過 700 人對 Julia 做出貢獻,更多人創造了上千的開源的 Julia 套件。總而言之,我們創造了這樣一種語言:

  • 快速:Julia 一開始就是為高效能設計的。Julia可藉由 LLVM 被編譯成不同平台的高效機器碼。

  • 泛用:Julia使用多重分派(multiple dispatch)作為程式典範(paradigm),可以更容易表達物件導向和函數式的設計模式。標準函式庫提供了非同步I/O、行程控制、日誌記錄、效能分析、套件管理器⋯⋯等等。

  • 動態:Julia是動態型別的,用起來像腳本語言,並且很好支援了互動式的操作方式。

  • 技術:Julia擅長數值運算,有非常貼近數學的語法,支援多種數值型別,並且支援平行運算。Julia 的多重分派,結合數值和陣列相關的資料型別,可說是渾然天成。

  • 選擇性的型別標註:Julia有豐富的資料型別描述,型別宣告可使得程式更加清楚且穩固。

  • 組合性:Julia的套件可以很和諧地一起運作。矩陣的單位數量或是資料表中一行的貨幣和顏色可一起運作,並且擁有良好的效能。

圖2

 

現在可下載 Julia 1.0 版本來試試 Julia。若您現在從 Julia 0.6 或更早的版本開始升級程式碼,我們建議您先使用過渡的0.7版本, 其中包括了棄用警告(deprecation warning)來指導您升級的過程。一旦您的程式碼無警告通過, 那麼您可無痛將程式碼更改為1.0版本。 已註冊過的套件可利用這個作為墊腳石,並發佈與1.0相容的版本更新。

 

當然,在Julia 1.0版本中一個最重要的新特性,是對語言API穩定性的保證:您為 Julia 1.0撰寫的程式碼,將可繼續在Julia 1.1、1.2中執行。這種語言是足夠成熟的。基於這樣一個穩固的基礎,核心語言的開發者與社群,皆可集中於第三方套件、工具及新特性的開發上。

 

但是 Julia 1.0 並不只意味著穩定,它也引入一些新的、強大的及新穎的語言特性。其中一些新的特性是0.6版就有的:

  • 一個全新的內建套件管理器。它比過去的套件管理器效能更好,在安裝套件上也比以往更加簡單。它也為每個專案支援虛擬環境,並記錄目前工作環境的狀態,然後將它分享給其它開發者或者是自己。最後重新設計的套件管理器,也帶來了私有套件和repository的無縫銜接。您同樣可使用開源套件的方式,管理並安裝自己的私有套件。這個JuliaCon 的演講展示了套件管理器的新設計。

  • Julia 具有新的遺失值(missing value)的正式表示法。能表示及處理遺失值是統計學及資料科學一項基本能力。在典型的 Julia 寫法(Julian fashion)內,新的解決方案是具有廣義性、組合性,也是高效能的。任何一般的集合型別(collection type)皆可以簡單地使用預先定義好的 missing 變數有效支援遺失值。而這種集合型別的效能在過去的 Julia 版本裡可能會很慢,但現在編譯器已可使得 Julia在遺失值的表示上,達到類似C或C++的速度,然而遠比C或C++更廣義且靈活。

  • 內建的 String 型別可安全地使用並處理任意的資料。您的程式不會因一個無效 Unicode 字元而壞掉好幾個小時或好幾天。所有的字串資料會保留,同時指出哪些字元是有效的,哪些是無效的。這樣允許您的應用程式,安全且方便地執行在不可避免缺陷的真實世界的資料中。

  • Broadcasting已成為語言的核心特性,並且有著方便的語法支援。現在,它將比過去更加強大。在 Julia 1.0 裡,賦予自定義型別 broadcasting 特性,以及在 GPU 和向量化硬體上實作最佳的運算皆更加容易, 這是為未來更多的效能提升鋪路。

  • Named tuples是一個新的語言特性,它允許高效且方便地表示和存取資料的名字以獲取資料。例如,你可以這樣表示一列資料 row = (name=”Julia”, version=v”1.0.0″, releases=8) 並且透過 row.version 存取 version 資料,而這和 row[2] 有著同樣的效能,卻更加方便。

  • 點運算子現在可被重載,並且允許型別使用 obj.property 的方式來存取物件資訊,而不是用額外撰寫欄位setting和getting function的方式。 這有助於將以類別為基礎的語言,例如Python或Java更加流暢地翻譯至Julia。屬性存取器的重載讓存取一行資料與named tuples的存取語法一致:您可以寫 table.version 來獲取表格中的 version 這一行,就如同 row.version 會取得 version 這一列的這個欄位一樣。

  • Julia 語言的最佳化器在多個方面皆更加聰明,我們無法全部羅列,但有值得列舉的一些重要的特點。最佳化器現在可在函式呼叫間傳遞常數,這將使得編譯器可有比過去更好執行死碼刪除(dead-code elimination)和靜態求值。編譯器現在也能避免對短期封裝(short-lived wrappers)的長期物件(long-lived objects)做記憶體配置,這讓程式設計師可用方便的高階抽象,而不會有效能損失。

  • 參數化型別(Parametric type)的建構子(constructors),現在將使用和宣告同樣的語法進行呼叫,這將減少一些對語法的困惑。

  • 迭代器協定被重新設計。新的迭代器協定更加簡單,不需要定義三個不同的函式:startnextdone。現在只需定義一個參數和兩個參數的 iterate 函式即可。這允許我們可簡單定義一個帶有預設值的函式給出一個初始值。更重要的是,這也實現了一個只有在嘗試回傳失敗後就結束的迭代器。這種迭代器可以非常普遍使用在I/O、網絡及生產者-消費者模型中;而Julia現在可更直接並正確地撰寫這樣的迭代器。

  • 作用域的規則被簡化了。引入區域作用域的結構提高了一致性,而不需要管全域的命名綁定是否已經存在。 這將消除之前的「軟/硬作用域」的區別,也意味著現在 Julia可靜態地確定變數是區域的還是全域的。

  • Julia 語言本身變得更加輕量級,很多部分皆被從核心分離至標準函式庫中。這個標準函式庫將與Julia一起發佈,但是不會作為語言的基礎。 若您需要他們,只需引入這些函式庫即可(不需再安裝),但是不會強制使用。在未來,這些標準函式庫將會獨立被標記版本和更新,以達成更快的改進和升級。

圖3

 

我們仔細地審查了Julia的API,並且提高了它的一致性和可用性。許多費解的命名和低效的實作皆被重新命名和重構, 能夠更優雅地發揮Julia的能力。這樣的改變促使集合的使用方式更加一致和連貫,確保在整個語言中,遵循一致的參數的順序, 並且將關鍵字參數(現在更快了)整合至API中。

  • 我們特地創建了一些新的外部套件相容於Julia 1.0的新特性,例如:

    • 資料處理相關套件已經改版並支援新的遺失值

    • Cassette.jl 提供了Julia程式碼轉換至編譯器中的強大機制,允許post-hoc analysis和拓展既有程式碼。除了提供profiling和debugging這樣的工具之外, 甚至可用於實現機器學習任務的自動微分。

    • 異質架構(Heterogeneous architecture)的支援被大大提高,並且從 Julia編譯器中解耦了出來。Intel KNL系列硬體上可直接使用 Julia。而Nvidia的GPU 也可透過CUDANative.jl直接編寫程式(不需撰寫 CUDA 程式碼), 而支援 Google TPU的介面也正開發中。

還有無數個大大小小的改善。你可以查看0.7 NEWS 文件當中的完整的更新。在我們 2012 年的“為什麼我們創造 Julia” 文章內,我們寫到:

它還沒有完工,但是是時候發佈一個 1.0 版本了(其實歷時 6 年才發布)—— 我們創造了一個語言叫做 Julia。

 

雖然對1.0的發佈,我們放了大家好幾次鴿子,但這一次我們終於正式發佈了。 我們真心為上千位,以各種形式貢獻給這個真正的數值計算,和泛用程式設計的現代語言的人,感到自豪及無比欣喜。

圖4

 

相關文章

[教學文] What!智能寶比可遙控!!沒錯,用超級搭檔LinkIt 7697 + Robot Shield達到(文末有彩蛋喔)

作者/攝影

文:Mason Chen (Mason亦為遙控智能寶比的作者,特此致謝!)

圖:Mason Chenfreepik (主題圖片背景)

文字潤飾:CAVEDU 宗諭

文章分類教學技術文
時間

成本

難度

材料表
  • LinkIt 7697*1

  • Robot Shield*1

  • 寶工智能寶比*1

  • 用來遙控的手機 *1

近來,不少Maker皆喜愛把現成的套件、模組加以改裝,置入開發板,例如LinkIt 7697、Arduino系列⋯⋯等等,使改裝後的套件、模組有更、更聰明的應用。比如之前我門曾專文介紹過的Wall-E機器人,便是一個很好的例子。

 

接著這股趨勢,本文所要介紹的,是由Mason Chen大大所改裝,可用手機的低功耗藍牙遙控的AI智能寶比。

 

寶工(Pro’s Kit)出品的「AI智能寶比」是一款智慧型機器人,能與8歲以上的小朋友一起互動、遊玩。它配有紅外線感應器,因此具備避障的功能,經過Mason的改裝後,把原先的紅外線感應玩法,改換成以手機的低功耗藍牙( BLE )進行遙控。

圖1 卡哇伊的智能寶比

 

小知識:什麼是低功耗藍牙(Bluetooth Low Energy,簡稱BLE)?

低功耗藍牙是一種個人區域網路技術,多應用於醫療保健、運動健身、家庭娛樂⋯⋯等領域。顧名思義,低功耗藍牙跟經典藍牙相比,目的在於保持同等通訊範圍的同時,顯著降低功耗及成本。根據藍牙技術聯盟(SIG)預測,至2018年,高於90%有藍牙的智慧型手機將支援低功耗藍牙。

 

接下來,我們就要進到硬體改裝部分:

 

Step1:把寶比的頭部拆下來,並且以斜口鉗或適當工具,把原先的電池檔板破壞掉。這部分會需要花點時間,且要小心處理,只破壞裏面,外殼要保留好。 處理完後可試擺LinkIt 7697與MiniPlan出品的Robot Shield,看看是否可以完全置入。

圖2

 

圖3

 

圖4

 

Step2:把原先的馬達插頭,按照圖5中所標示的,連接至 Robot Shield 中。

圖5

 

Step3:再把寶比的頭部小心地裝回去。這樣,硬體部分就完成了。

 

再來,是軟體開發部分:

Step1:我們使用 LinkIt 7697 arduino 進行開發。

  • 設定好Arduino IDE的環境,並燒錄已經寫好的程式至LinkIt 7697 中。
圖6

 

Step2:手機端請下載LinkIt Remote APP

  • 請打開手機藍芽,以及Robot Shield的電源。
  • 開啟 LinkIt Remote APP,順利的話,便可以找到已改裝好的寶比。
圖7

 

  • 按住Joystick移動,便可遙控寶比了。
圖8

 

文末彩蛋:透過Scratch 3.0遙控智能寶比

還記得之前的一篇文章,教大家運用Scratch 3.0連接micro:bit嗎?在Masen Chen大大的努力下,現在Scratch 3.0也可連接LinkIt 7697,進而控制智能寶比囉!其基本原理仍是運用Scratch Link連接Scratch 3.0與LinkIt 7697,然而,因Scratch 3.0並不支援LinkIt 7697,所以在運用Scratch Link之外,LinkIt 7697的韌體及Scratch 3.0上的指令積木皆必須重寫。至於如何撰寫、操作,就請各位讀者多跟Mason Chen大大交流了。

 

備註:若想購買相關開發板,請點這裡,謝謝。

 

相關文章

[介紹文]以LinkIt7697搭配LinkIt Remote打造智慧門禁系統 6項功能、6大特色一次帶您看!!

作者/攝影

智慧門禁系統作者:曾希哲老師

文字整理:CAVEDU 宗諭

圖片:曾希哲老師、pixabay

文章分類介紹文
時間

成本
難度
材料表
  • LinkIt 7697*1(若欲購買,請洽機器人王國商城)

  • RC522 RFID讀取器*1

  • 電磁鎖*1

  • LCD*1

  • 蜂鳴器*1

  • Mifare S50 Card*1

  • 智慧型手機*1

因長期致力於科技教育,CAVEDU團隊認識許多老師,但慢慢地我們才發現,教師當中真是人才濟濟,高手藏身於教育界。對科技、程式教育,有熱忱又富能力的老師其實相當多,例如熱衷於四軸飛行器教學的洪雅慧老師,還有對於Micro:bit深有研究的劉正吉老師⋯⋯等等,而花蓮的曾希哲老師也是其中之一。

圖1 各路高手在教師界

 

若仔細瞧瞧曾希哲老師的臉書頁面,上面幾乎都是他各種學習程式、物聯網、開發板的心得、照片及影片,例如,他最近就在玩LinkIt 7697的擴充板,不斷發出新的貼文,真感受到他的樂此不疲!為將所學得的技術充分教導給學生,曾老師也架設一個網站「曾希哲的學習天地」,上面有他學習物聯網、LinkIt 7697、Arduino⋯⋯等等心得,讀者們記得抽空去逛逛喔!

圖2 曾希哲老師的個人網站

 

本文的主角是曾希哲老師一手打造的「智慧門禁系統」。當初,曾老師有做過RFID的門禁系統,並於2017年以此系統參加過「花蓮創客賽物聯網組」,卻一直找不著適合的按鍵輸入方式。

 

因此,曾希哲老師便逐漸萌生以手機當作藍牙鍵盤的想法,並想透過LinkIt Remote實現。後來,他在手機上實做出藍牙鍵盤,並加入原有的門禁系統中,再把幾項一直想做出的功能實現,最後「智慧門禁系統」就大功告成。(噹啷~~)

圖3 智慧門禁系統

 

讓我們先看看曾希哲老師親自錄製的介紹影片:

 

這個「智慧門禁系統」包含哪些單元呢?請見下圖:

圖4

 

智慧門禁系統的功能與特色

系統是以LinkIt 7697為核心建立,有以下幾項功能:

  1. 可用RFID刷卡輸入

  2. 可以藍牙鍵盤輸入

  3. LCD顯示輸出

  4. 蜂鳴器輸出

  5. 若使用者兩次輸入錯誤,系統就會透過Line即時訊息通知屋主。

  6. 假設使用者受威脅必須開門,可輸入威脅密碼,門一樣會打開,但會在威脅者無法察覺情況下,以Line即時訊息通知屋主,使屋主能盡快報警。

 

這個系統又有哪些特色呢?

  1. 以手機作為藍牙鍵盤,使用起來相對方便。

  2. 使用者受威脅需開門時,可使用威脅密碼。

  3. 同時使用藍牙與WiFi功能,LinkIt 7697是以IFTTT網路服務,透過Wi-Fi傳送Line即時訊息。

  4. 不需使用App Inventor撰寫手機程式,只要撰寫7697程式即可。

  5. 使用LinkIt 7697 BlocklyDuino,程式撰寫比較容易。

圖5

 

圖6 圖5、6為曾希哲老師運用LinkIt 7697 BlocklyDuino,所撰寫的程式碼。

 

6.可透過這個系統,學習RFID的概念。

 

進一步交流

關於如何自造智慧門禁系統,應是因製作步驟較複雜,曾希哲老師只簡單提及,就是拆解系統各部分功能,然後進行各單元製作、測試,逐步組成為一個完整系統。若讀者閱畢本文,有興趣進一步了解此系統,歡迎直接至曾希哲老師的臉書頁面與他交流。

 

前文提及,曾老師設計、製作此系統很重要的原因,是為了實踐把手機當成藍牙鍵盤。而他是用BlocklyDuino撰寫藍牙鍵盤的程式,若讀者想更多了解,可點此下載原始程式碼。

 

結語

總之,曾希哲老師目前正積極測試LinkIt 7697擴充板的各式功能,若後續有任何消息、成果,CAVEDU教育團隊也會成為報馬仔,透過技術部落格或臉書粉絲專頁,跟讀者們分享,敬請期待!

 

附錄:

曾希哲老師以BlocklyDuino撰寫藍牙鍵盤的程式碼

/*
 * Generated using BlocklyDuino:
 *
 * https://github.com/MediaTek-Labs/BlocklyDuino-for-LinkIt
 *
 * Date: Wed, 27 Jun 2018 18:58:00 GMT
 */

#include <LRemote.h>

int SetPasswd;

int PhonePasswd;

int c;

String S1;

String S2;

String S3;

String S4;

String InputPsaawd;

String OpeningDoor;

String PasswdError;

LRemoteLabel label1;
LRemoteButton button7;
LRemoteButton button8;
LRemoteButton button9;
LRemoteButton button4;
LRemoteButton button5;
LRemoteButton button6;
LRemoteButton button1;
LRemoteButton button2;
LRemoteButton button3;
LRemoteButton button0;
LRemoteButton button10;

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  LRemote.setName("LinkIt 7697");
  LRemote.setOrientation(RC_PORTRAIT);
  LRemote.setGrid(3, 5);
    label1.setPos(0, 0);
    label1.setText("Input Password");
    label1.setSize(3, 1);
    label1.setColor(RC_ORANGE);
    LRemote.addControl(label1);

    button7.setPos(0, 1);
    button7.setText("7");
    button7.setSize(1, 1);
    button7.setColor(RC_BLUE);
    LRemote.addControl(button7);

    button8.setPos(1, 1);
    button8.setText("8");
    button8.setSize(1, 1);
    button8.setColor(RC_GREEN);
    LRemote.addControl(button8);

    button9.setPos(2, 1);
    button9.setText("9");
    button9.setSize(1, 1);
    button9.setColor(RC_BLUE);
    LRemote.addControl(button9);

    button4.setPos(0, 2);
    button4.setText("4");
    button4.setSize(1, 1);
    button4.setColor(RC_GREEN);
    LRemote.addControl(button4);

    button5.setPos(1, 2);
    button5.setText("5");
    button5.setSize(1, 1);
    button5.setColor(RC_BLUE);
    LRemote.addControl(button5);

    button6.setPos(2, 2);
    button6.setText("6");
    button6.setSize(1, 1);
    button6.setColor(RC_GREEN);
    LRemote.addControl(button6);

    button1.setPos(0, 3);
    button1.setText("1");
    button1.setSize(1, 1);
    button1.setColor(RC_BLUE);
    LRemote.addControl(button1);

    button2.setPos(1, 3);
    button2.setText("2");
    button2.setSize(1, 1);
    button2.setColor(RC_GREEN);
    LRemote.addControl(button2);

    button3.setPos(2, 3);
    button3.setText("3");
    button3.setSize(1, 1);
    button3.setColor(RC_BLUE);
    LRemote.addControl(button3);

    button0.setPos(0, 4);
    button0.setText("0");
    button0.setSize(1, 1);
    button0.setColor(RC_GREEN);
    LRemote.addControl(button0);

    button10.setPos(1, 4);
    button10.setText("Clear");
    button10.setSize(2, 1);
    button10.setColor(RC_ORANGE);
    LRemote.addControl(button10);
  LRemote.begin();
  SetPasswd = 10;
  PhonePasswd = 0;
  c = 0;
  digitalWrite(LED_BUILTIN, LOW);
  S1 = "*";
  S2 = "**";
  S3 = "***";
  S4 = "****";
  InputPsaawd = "Input Password";
  OpeningDoor = "Opening Door";
  PasswdError = "Password Error";
}


void loop()
{
  LRemote.process();
  if (button0.isValueChanged()) {
    if (button0.getValue() == 1) {
      c = c + 1;
      if (c == 1) {
        PhonePasswd = PhonePasswd + 1;

      }

    }

  } else if (button1.isValueChanged()) {
    if (button1.getValue() == 1) {
      c = c + 1;
      if (c == 2) {
        PhonePasswd = PhonePasswd + 2;

      }

    }
  } else if (button2.isValueChanged()) {
    if (button2.getValue() == 1) {
      c = c + 1;
      if (c == 3) {
        PhonePasswd = PhonePasswd + 3;

      }

    }
  } else if (button3.isValueChanged()) {
    if (button3.getValue() == 1) {
      c = c + 1;
      if (c == 4) {
        PhonePasswd = PhonePasswd + 4;

      }

    }
  } else if (button4.isValueChanged()) {
    if (button4.getValue() == 1) {
      c = c + 1;

    }
  } else if (button5.isValueChanged()) {
    if (button5.getValue() == 1) {
      c = c + 1;

    }
  } else if (button6.isValueChanged()) {
    if (button6.getValue() == 1) {
      c = c + 1;

    }
  } else if (button7.isValueChanged()) {
    if (button7.getValue() == 1) {
      c = c + 1;

    }
  } else if (button8.isValueChanged()) {
    if (button8.getValue() == 1) {
      c = c + 1;

    }
  } else if (button9.isValueChanged()) {
    if (button9.getValue() == 1) {
      c = c + 1;

    }
  } else if (button10.isValueChanged()) {
    if (button10.getValue() == 1) {
      label1.updateText(String(InputPsaawd));
      c = 0;
      PhonePasswd = 0;

    }
  }
  if (c == 1) {
    label1.updateText(String(S1));

  } else if (c == 2) {
    label1.updateText(String(S2));
  } else if (c == 3) {
    label1.updateText(String(S3));
  } else if (c == 4) {
    label1.updateText(String(S4));
    delay(500);
    if (SetPasswd == PhonePasswd) {
      label1.updateText(String(OpeningDoor));
      digitalWrite(LED_BUILTIN, HIGH);
      delay(5000);
      digitalWrite(LED_BUILTIN, LOW);

    } else {
      label1.updateText(String(PasswdError));
      delay(5000);

    }
    label1.updateText(String(InputPsaawd));
    c = 0;
    PhonePasswd = 0;
  }
  delay(100);
}

 

相關文章

[教學文] 快說!怎樣不用Arduino也能做出電子鐘!!(555 IC篇)

  現在是微處理器盛行的時代,許多東西皆簡化成以一顆MCU取代所有電路,但要編寫MCU需要的不僅僅是程式語言編寫能力,還要有很多基本程式觀念及門檻,以及要有一台電腦才能作業。想像一下70年代的矽谷,電腦一台要價4,700,000美金,這可不是人人負擔得起的,那麼那時的電子鐘要怎麼製作出來呢?

 

本系列專題就要帶大家不用Arduino做出電子鐘。電子鐘分成三個部分:

  1. 頻率為1Hz的時脈
  2. 計算時脈的計數器
  3. 顯示數字的七段顯示器

本篇重點在於介紹1Hz時脈的產生。

作者/攝影

CAVEDU實習生 陳俊霖

文章分類教學技術文
時間

30mins

成本

約20元

難度*
材料表
  • 麵包版X1

  • IC555  X1

  • 杜邦線或單心線

  • 剝線鉗x1

  • 電池組x1

  • 51k電阻 x1

  • 47k電阻x1

  • 10u電容x1

(若想購買相關材料,請洽機器人王國商城)

  對於沒有學過電子電路的讀者想必對555這組數字很陌生,有人說555的名字是來自於使用三顆5KΩ的電阻,所以就直接取名為555,也有人說555只是當時老闆喜好的一組數字而已。

 

  當時工程師Hans R. Camenzind花費好幾周的時間想出方法,運用簡單的電晶體與電阻,做出可任意調整周期與空占比的電路,使用時只需外加電阻與電容,便可完成相似於能夠程式化編寫的時脈產生器。雖然現今電腦普及,但我們仍可用不到10元的價格從網路取得555計時晶片,現在就讓我們看看怎麼使用這顆「經典IC」吧!

 

  555的功能主要分成三種:單穩態模式、雙穩態模式及無穩態模式。我們這次使用的是無穩態模式,這種模式用在產生方波,如同它的名稱,無穩態表示不會穩定下來,會一直震盪。至於其他的使用模式在先前文章有提過,不妨參考看看:[ 電路設計軟體Multisim Blue ] 自己來設計一個腳踏車方向燈吧!

圖1 555IC外觀

 

Step1:首先,我們拿出麵包板,並將555 IC、電阻、電容如圖連接。

圖2 麵包板電路

 

圖3 接線圖

 

小提醒:

  麵包板模擬圖上的電阻值與我們要使用的不同,圖2只是給位置參考而已,實際電路元件數值如圖3所示。

 

  在這裡跟大家補充介紹555的腳位及對應功能,以及IC腳位識別:

圖4 IC接腳辨認

 

  第一次看到IC時,請仔細觀察它的表面會有一個小圓點在IC的邊角(有的IC其中一邊有一個缺口)。那個圓點的位置,就是IC的第一隻腳(若是只有一邊有缺口的,就把缺口朝向自己的左手邊,左下的腳就是第一隻腳)。若腳位接錯會使電路無法作動,嚴重一點會使整顆IC燒壞。

圖5 555 接腳圖

第1腳(接地GND):接至電源負極

第2腳(觸發TRI):當此腳位電壓低於1/3Vcc時,會使第三隻腳(OUT)輸出高電位,且讓第7腳(DIS)對地開路。

第3腳(輸出OUT):555IC的輸出腳,受到2、4、6腳控制產生對應的輸出。

第4腳(重製RST):若此腳電壓低於0.4v時,會使第三腳(OUT)輸出為低態。

第5腳(控制 CTRL):控制晶片的閾值電壓,一般使用都接一顆0.1uF電容後接地。

第6腳(臨界 THR):當此腳位電高於2/3Vcc時,會使第三腳(OUT)輸出為低態,且讓第7腳(DIS)對地短路。

第7腳(放電 DIS):與第3腳(OUT)同步動作,第3腳輸出高態則第7腳對地開路;第3腳輸出低態第7腳對地短路。

第8腳(電源Vcc):接至電源正極

 

  以TI生產的 NC555為例,最高可接至18V電源,輸出腳可輸出200mA,使用時也要注意負載有沒有超出額定功率。而這次元件和工作模式都和上面提到的文章:[ 電路設計軟體Multisim Blue ] 自己來設計一個腳踏車方向燈吧!一樣。

 

  頻率公式 f = 

 

  我們將頻率設定成1Hz,並使用常見的電子元件得到元件數值:R1=51kΩ、R2=47kΩ、C=10μF。(由於電阻與電容的製造誤差,出來的時間無法太精準。)連接完成後接上電源,LED燈就會一秒一秒閃爍了!

圖5 成果

 

成果影片:

 

  為什麼我們在今日仍需要555 IC呢?因為,555的發明讓只想產生簡易時脈功能的Maker,不必仰賴MCU去編寫一個相似於Arduino裡的「Blink」程式,更能降低生產成本且電路也很簡單。而555的應用還不只這些,許多有關脈波的應用,例如伺服馬達(Servo motor)控制電路;以及頻率應用,例如音調產生器(Tone Generator)⋯⋯等等,讀者們還可以發揮創造力與想像力來運用555 IC。

 

延伸挑戰:

  1. 既然頻率可由公式計算出來,我們是否可把R1、R2以可變電阻取代呢?會產生甚麼變化呢?

  2. 若把可變電阻改成光敏電阻、熱敏電阻,又有什麼應用呢?

  3. 若把第3腳(OUT)連接至小型揚聲器上,會有甚麼事情發生呢?

 

相關文章

[教學文]坦克18步:手把手教您組裝Robot Shield v2坦克車

相信大家對開發板可用來控制車子、手臂、機器人⋯⋯等等,已玩得不亦樂乎。前陣子,在Thingiverse上看見用3D列印出來的坦克,且還能以開發板來控制它,覺得非常有趣,於是下載了3D檔,並準備相關材料進行組裝,大家可由此TANK GO下載列印件,原作者MiniPlan也非常貼心地放上了組裝影片及材料說明連結喔!

作者/攝影

坦克車原作者:MiniPlan

文字整理/圖片:CAVEDU教育團隊郭皇甫

文章分類教學技術文
時間

成本
難度*(1~10)
材料表
  • Robot Shield*1

  • LinkIt 7697*1

  • 坦克3D列印件

  • N20馬達X2

  • M2X8螺絲10顆、M2X4螺絲4顆

  • DFMP3 Player MINI模組X1

  • SG90伺服機X1

  • 紅外線接收器X1、紅外線發射器X1

  • 8歐姆0.25瓦喇叭X1

  先看一下原作者MiniPlan拍攝的組裝影片:

  小編也替讀者們寫了圖文版的組裝步驟,說明如下:

材料準備:

  1. 坦克3D列印件

  2. N20馬達X2

  3. M2X8螺絲10顆、M2X4螺絲4顆

  4. DFMP3 Player MINI模組X1

  5. SG90伺服機X1

  6. 紅外線接收器X1、紅外線發射器X1

  7. LinkIt 7697開發板X1

  8. 8歐姆25瓦喇叭X1

  9. Robot shield v2控制板X1

圖1 材料準備

 

工具準備:

  • 螺絲起子(十字、一字)

  • 熱熔膠槍、熱熔膠條。

 

Step1:首先連接車身與胎框。這裡會有四個大小一樣的胎框,但其連接軸的圓洞有大小之分,請先拿出二個最大圓洞的胎框,並裝至車身卡榫上,如圖2所示。(PLA較無彈性,所以將胎框壓進卡榫時,要邊轉動胎框邊施力壓進。)

圖2 將胎框壓進卡榫

 

圖3 二邊胎框安裝完成

 

Step2:接下來拿出兩個N20馬達,並將其安裝至車身內,馬達的軸對準車身的小圓洞,即可向外推到底,如圖4所示。

圖4 安裝N20馬達

 

Step3:拿出F部件,並將其對準I部件的上、下方凹槽後,壓進凹槽內。(這裡要特別注意,I部件上、下方的邊框有些微不同,F部件的紋路也不一樣,請依照圖5的方向及位置安裝。)

圖5 安裝F部件

 

Step4:拿出C部件,並將其安裝至N20馬達軸上。(在這裡,作者非常貼心將孔洞設計成與N20馬達的輪軸形狀相同,如此一來,安裝時就不會搞錯了。)

圖6 安裝C部件

 

圖7 四胎框安裝完成

 

Step5:將喇叭焊線後,分別接上MP3 Player mini的SPK_1、SPK_2,使用熱熔膠將喇叭固定在I部件中心的圓孔上。(也請在MP3 Player mini的VCC、RX、TX腳位另外接上三條杜邦線。)

圖8 固定喇叭

 

Step6:用四顆M2x4螺絲,將Robot Shield v2對準C部件圓柱上的孔位並鎖上。(如果在這步驟對不到孔位的話,您可稍微扳動C部件的圓柱,對準後鎖上。在此步驟,您就可以將馬達線鎖上Robot Shield的端子台上了。)

圖9 使用M2螺絲固定Robot Shield v2

 

Step7:車身的下半部先告一個段落,接著拿出D部件,左右半部對準後壓緊固定。

圖10 壓緊D部件

 

Step8:拿出四顆M2x8螺絲,對準E部件上的四個孔洞,將螺絲先鎖一些進去。

圖11 將螺絲先鎖一點進E部件

 

Step9:再將E部件對準D部件上的螺絲孔位,用螺絲起子鎖緊後固定。

圖12 鎖緊D、E部件。

 

Step10:接著拿出B部件,並將一字舵片使用熱熔膠固定至凹槽。(注意,舵片中正央圓形凸起的地方朝上。)

圖13 固定舵片在B部件上

 

Step11:將B部件以四顆M2X8螺絲鎖緊固定在D部件上方四個孔洞。

圖14 固定B部件在D部件上

 

Step12:將焊好線的紅外線接收器,穿過H部件的方形孔洞,並使用熱熔膠固定在方形凹槽內,同時將G部件也以熱熔膠固定在H部件的圓形凹槽。(請特別注意,G部件上有四個小方孔,請將小方孔對齊紅外線接收器的位置後再固定。)

圖15 將紅外線接收器穿過H部件孔洞

 

圖16 將G部件固定在H部件上

 

Step13:請將焊好線的紅外線發射器,從線端穿過A部件前方的炮口。

圖17 紅外線發射器穿過炮口並固定

 

Step14:把A部件翻過來後,將SG90以圖18的位置,以M2X8的螺絲固定。(請特別注意,A部件上只有一個螺絲孔,您也可以使用熱熔膠固定SG90沒有鎖螺絲的一邊,或是使用鑽孔工具再多打一個孔。)

圖18 固定SG90

 

Step15:接下來把SG90與紅外線發射器的線,分別穿過A部件下方的兩個方形孔洞,並將多餘的線整理好。

圖19 將線穿過A部件的方形孔

 

圖20 將多餘的線整理好

 

Step16:將H部件固定在A部件上方的方形洞。(請特別注意,請按照圖21的H部件方向固定。)

圖21 將H部件固定在A部件上

 

Step17:接著請將A部件的SG90對準B部件上舵片的圓孔,往下壓緊固定。(請特別注意,在固定前,請先校正SG90的位置,讓您的炮台能夠左右各旋轉約90度為最佳。)

圖22 固定炮台

 

Step18:最後,將SG90接在P5腳位,其餘感測器按照網站文件上註明的腳位接上後,並將D部件壓緊至I部件上即可。

 

  至此,組裝步驟就完成囉!接下來,您便可將網站上給的程式上傳至7697開發板,並且使用手機下載LinkIt Remote後,試試看,坦克車是不是能順利動起來了呢?

 

備註:若讀者想購買相關的開發板,歡迎洽詢機器人王國

 

相關文章

[教學文] 從Zero到Hero,給想實做動力小車的你——軟體篇

作者/攝影

動力大腳車製作者、資料、圖影片提供:游允赫

文字整理:CAVEDU 宗諭

文章分類教學文
時間

成本
難度
材料表

 

  接著上一篇「從Zero到Hero,給想實做動力小車的你——硬體篇」,這次我們將繼續介紹,完成動力大腳車硬體設施後,軟體層面該如何部署。

 

  首先介紹所需要的配備:

  • 開發板:LinkIt 7697 + RobotShield

  • 顏色感測器:TCS3200

  設定方式:

Frequency Scaling 20% (S0-H,S1-L)

Photodiode Type Clean (S2-H,S3-L)

  • 手機遙控app:LinkIt Remote

  • 程式編輯器:Arduino IDE

圖1

 

  先讓我們打開Arduino IDE,然後寫好將顯示在LinkIt Remote上的各項物件,等之後LinkIt Remot與7697透過藍牙連接時,LinkIt Remote將自動抓取這些物件。如下:

//設定爬坡按鈕

  LRemoteButton buttonClimb;

//設定折返按鈕

  LRemoteButton buttonGoAndBack;

//設定計時器

  LRemoteSlider Timer;

//設定顏色極限值

  LRemoteSlider Limit;

//上方標籤

  LRemoteLabel  BigFoot;

//設定狀態欄

  LRemoteLabel  LabelS;

//設定顏色感應器偵測值欄

  LRemoteLabel  LabelLight;

 

  接下來,讓我們為著之後的主程式宣告一些變數,如下:

//馬達分別接於13、17

  int M1A = 17;

  int M1B = 13;

//宣告變數T(時間-0.1秒為單位)

  int T;

//宣告變數F(顏色感應器讀數)

  int F;

//宣告變數S(車輛狀態)

  int S = 0;

//宣告變數L(顏色極限值)

  int L;

//宣告變數button=6(7697內建USR按鈕)

  int button = 6;

圖2

 

  現在來到主程式部分,首先是setup函式,如下:

void setup() {

  Serial.begin(9600);

  Serial.println(“Start configuring remote”);

  pinMode                  (13, OUTPUT);

  pinMode                  (17, OUTPUT);

  pinMode                  ( 2,  INPUT);

  pinMode                  ( 4,  INPUT);

  pinMode                  ( 6,  OUTPUT);

  digitalWrite             (13, 1);

  digitalWrite             (17, 1);

 

//這部分是LinkIt Remote介面上各項物件的進一步設定

//藍牙名稱,介面分割

  LRemote.setName          (“BigFoot”);

  LRemote.setOrientation   (RC_PORTRAIT);

  LRemote.setGrid          (3, 5);

 

//上方標籤

  BigFoot.setText          (“!大腳車!”);

  BigFoot.setPos           (0,0);

  BigFoot.setSize          (3,1);

  BigFoot.setColor         (RC_GREY);

  LRemote.addControl       (BigFoot);

 

//爬坡按鈕

  buttonClimb.setText      (“爬坡!”);

  buttonClimb.setPos       (0, 2);

  buttonClimb.setSize      (1, 1);

  buttonClimb.setColor     (RC_BLUE);

  LRemote.addControl       (buttonClimb);

 

//折返按鈕

  buttonGoAndBack.setText   (“折返!”);

  buttonGoAndBack.setPos    (2, 2);

  buttonGoAndBack.setSize   (1, 1);

  buttonGoAndBack.setColor  (RC_BLUE);

  LRemote.addControl        (buttonGoAndBack);

 

//時間設定滑桿

  Timer.setText             (“Timer=( 10 ~ 150 )”);

  Timer.setPos              (0,1);

  Timer.setSize             (3,1);

  Timer.setColor            (RC_ORANGE);

  Timer.setValueRange       (10,150,10);

  LRemote.addControl        (Timer);

//光感極限值設定滑桿

  Limit.setText             (“LIMIT”);

  Limit.setPos              (0,3);

  Limit.setSize             (3,1);

  Limit.setColor            (RC_GREEN);

  Limit.setValueRange       (100,360,225);

  LRemote.addControl        (Limit);

 

//光感值顯示標籤

  LabelLight.setText        (String(F));

  LabelLight.setPos         (0, 4);

  LabelLight.setSize        (2, 1);

  LabelLight.setColor       (RC_PINK);

  LRemote.addControl        (LabelLight);

 

//狀態顯示標籤

  LabelS.setText            (String(S));

  LabelS.setPos             (2, 4);

  LabelS.setSize            (1, 1);

  LabelS.setColor           (RC_GREY);

  LRemote.addControl        (LabelS);

 

  LRemote.begin();

  Serial.println(“begin() returned”);

}

 

  關於LinkIt Remote如何設定,讀者們可以進一步參考這篇文章:使用LinkIt Remote

圖3 在手機的LinkIt Remote上,介面如此呈現。

 

  再來是loop函式的部分,如下:

void loop() {

  if(!LRemote.connected()) {

    Serial.println(“waiting for connection”);

    delay(1000);

  } else {

    delay(15);

  }

  LRemote.process();

//獲取極限值設定

  L = Limit.getValue();

//獲取時間值設定

  T = Timer.getValue();

//獲取顏色感測器讀取值,感測器訊號接於4號腳位上

  F = pulseIn(4,LOW);

//顯示讀取值於光感值標籤

  LabelLight.updateText(String(F));

 

 

//當爬坡按鈕按下,狀態值設定為5,狀態欄顯示為”已選爬坡”

  switch (buttonClimb.getValue()){

    case 1:

    S = 5;

    LabelS.updateText(“已選爬坡”);

    break;

    case 0:

    break;

   }

 

//當爬坡按鈕按下,狀態值設定為1,狀態欄顯示為”已選折返”

  switch (buttonGoAndBack.getValue()){

    case 1:

    S = 1;

    LabelS.updateText(“已選折返”);

    break;

    case 0:

    break;

   }

 

 

//若狀態值為1(已選折返)且7697 USR按鈕被按下

//狀態列顯示為”下坡”,馬達反轉,持續秒數依滑感設定

//持續時間設定值過後,狀態值切換至2

if (digitalRead(button) == 1 && S ==1 ){

    LabelS.updateText(“下坡”);

    digitalWrite(M1A,0);

    digitalWrite(M1B,1);

    delay(T*100);

    S = 2;

   }

 

//若狀態為2且顏色感應器偵測值小於極限值(判定為尚未過黑線)

//馬達持續反轉,狀態欄顯示為”偵測中”

    else if(S == 2 && F < L){

      digitalWrite(M1A,0);

      digitalWrite(M1B,1);

      LabelS.updateText(“偵測中”);

    }

 

//若狀態為2且顏色感應器偵測值大於極限值(判定為過黑線)

//狀態值切換至3,狀態欄顯示為”已偵測”

    else if(S == 2 && F > L){

      S = 3;

      LabelS.updateText(“已偵測”);

    }

//若狀態為3,則狀態欄顯示為”上坡”,馬達正轉

//持續時間為設定值+2秒(上坡所需時間較長),時間到達後狀態值切換至4

    else if(S==3){

      LabelS.updateText(“上坡”);

      digitalWrite(M1A, 1);

      digitalWrite(M1B, 0);

      delay(T*100+2000);

      S = 4;

    }

//若狀態為4且顏色感應器偵測值小於極限值(判定為尚未過黑線)

//馬達持續正轉,狀態欄顯示為”偵測中”

    else if(S == 4 && F < L){

      digitalWrite(M1A,1);

      digitalWrite(M1B,0);

      LabelS.updateText(“偵測中”);

    }

//若狀態為4且顏色感應器偵測值大於極限值(判定為過黑線)

//狀態欄顯示為”已偵測”,馬達持續正轉一秒

//一秒後狀態值切換至0,狀態欄顯示為”停止”

    else if(S == 4 && F > L){

      LabelS.updateText(“已偵測”);

      digitalWrite(M1A,1);

      digitalWrite(M1B,0);

      delay(1000);

      digitalWrite(M1A,1);

      digitalWrite(M1B,1);

      S = 0;

      LabelS.updateText(“停止”);

    }

 

//若狀態值為5(已選爬坡)且7697 USR按鈕被按下

//狀態值切換至3

    else if(S ==5 && digitalRead(button) == 1){

      S = 3;

    }

}

圖4

 

  程式完成後,最後一步就是把程式燒錄至LinkIt 7697上。

 

  軟體部分簡單介紹至此,若讀者有不了解的地方,歡迎詢問允赫老師,E-mail:yhyu@cavedu.com,謝謝。

 

相關文章

[教學文]MIT App Inventor Codi Bot 設計發想

作者/攝影曾吉弘
文章分類教學
時間
成本
難度
材料表

 

  對於會寫程式的人來說,不同程式語言有著極大不同,但對於不會的人來說:

 

都一樣啊!哪有什麼不同,看起來都像咒語⋯⋯

 

  因此需要一個符號或吉祥物來與這種語言產生連結,例如Linux的小企鵝、Arduino的無限符號,或Scratch的小貓⋯⋯等等,在各式場合都能看到代表各自的logo。App Inventor 以往的logo太像Android,為搭配即將推出的App Inventor iOS版,MIT App Inventor小組推出了新的logo,CAVEDU也很高興能設計 MIT App Inventor Codi bot(選購連結)

圖1

 

  之前已經寫過一篇介紹Codi Bot的各類功能教學文件也都出來了:

  • 單機執行:直接執行 (影片)

  • LED:使用按鈕、滑桿來控制翅膀與底座的LED (影片)

  • 翅膀:使用按鈕、滑桿來控制翅膀(伺服機) (影片)

  • 聲音:控制蜂鳴器發出各種音符或自訂義頻率與時間長度 (影片)

  • 完整app:整合上述功能 (影片)

 

  本篇要與大家分享 Codi Bot的設計發想,分成核心、外觀及燈光⋯⋯等等(感謝設計師:游允赫大大):

 

一、核心:

 

  MIT App Inventor在阿吉老師去MIT擔任訪問學者前,藍牙BLE支援的板子只有Arduino 101,但大家知道的⋯⋯Arduino 101已停產,所以自然要有一款平價好用的控制板補上,那便是LinkIt 7697。為方便腳位和電源管理,我們再搭配 Robot Shield for LinkIt 7697 V2.0 好放進Codi bot的肚子裡。

 

  Robot Shield 背面有兩個電容,並且是專門為機器人應用所設計,所以把許多腳位都用 3 pin 的方式接出來,也有兩個直流馬達的螺絲接口。兩者只要疊在一起就好了,並且可用 Robot Shield 來為 7697供電。另一個很棒的地方是 Robot Shield上就有一個蜂鳴器,可讓機器人發出簡易音效。

圖2

 

圖3

 

  把超音波感測器、LED、servo接上後,Robot shield的腳位都快用完了呢⋯⋯,再以螺絲固定即可。

圖4

 

所有內部的線路走法大致如此,要準備組合了。

圖5

 

是不是塞得很滿呢?

圖6

 

二、外觀

超音波感測器裝在Codi bot頭部,線路走脖子接到擴充板上。

圖7

 

就是眼睛啦,很可愛吧!深度是有測試過的,不會影響距離偵測的效果。

圖8

 

我們設計了一個背包,驅動翅膀的兩顆servo 就放在裡面。

圖9

 

Codi bot 底部,很容易就能撥動開關來開機。

圖10

 

組合身體前後兩片零件的螺絲會被條紋(牛皮)遮起來。

圖11

三、燈光

  為了順利呈現MIT App Inventor logo 兩個翅膀的紫色與綠色,又要有互動效果,我們選用LED燈條,從servo的背包孔位拉出線來。

圖12

 

把LED燈條放入翅膀零件的溝槽,這一步難度比較高,小心不要壓到線。

圖13

 

  Codi Bot背包上有一個孔,可以讓壓克力支撐架扣入以固定。底部的RGB LED 則是安裝在壓克力底座的孔,伸進去一點有很不錯的燈光效果喔!

圖14

 

圖15

 

相關文章

[IBM Watsonbot ] Facebook粉絲頁聊天機器人

有了線上客服與聊天機器人結合不孤單!!

本文將介紹WatsonBot,這是一個Facebook粉絲頁聊天機器人(當然不需要實體的機器人啦),由台灣IBM所開發。

 

作者/攝影  曾吉弘
時間  馬上開始
成本  $0
難度  * (簡單,別上癮)

您想和他講什麼都可以,他能回覆天氣,搜尋電影美食還有分析照片內容喔。更多內容就一起來玩玩看吧。想了解這項技術的朋友,歡迎報名3/17 的 [IBM x AI 機器人實作坊],帶您用Raspberry Pi 做出一台語音輸入(麥克風)來控制語音輸出(外接喇叭)與LED的機器人,當然會用到 IBM 的相關雲服務啦~   請參考以下影片:

請打開Watsonbot的頁面,開始閒聊吧~ 基本的天氣與關鍵字都沒問題,講一些有的沒的也不至於雞同鴨講。

也會提示使用者如何輸入,例如[地點 + 美食],但我用南機場夜市沒成功。鋼彈倒是有不錯的結果。

可以請WatsonBot幫你找電影,直接回傳網頁連結,但搜尋來源是豆瓣網(https://movie.douban.com/

上傳照片也沒問題,會回傳 image tag 以及基本顏色分析(感謝阿吉老師家的發發當model)

 

相關文章:

 

[Intel RealSense 3D攝影機]_使用SDK看雙手骨架與紅外線深度影像

除了使用深度攝影機以外,各家的深度攝影機公司也會推出其產品的SDK (Software Development Kit)供我們使用者作開發使用。這次要介紹的是Intel的RealSense SDK。安裝可以看這一篇[Intel RealSense 3D攝影機]_一開始安裝到試玩小遊戲

本篇目標是教大家如何使用RealSense的SDK。所以在使用SDK之前必須要成功安裝好RealSense camera。我們分別介紹兩種SDK裡的範例程式(1)利用C++來取得攝影機的深度影像(2)利用C#來辨識手的骨架。

作者/攝影  黃品叡
時間  約1小時
成本
  • RealSense F200
  • Windows 7 / 8 / 10
  • 電腦需有USB3.0
難度  * *
材料表

 

按照上一篇的介紹,應該成功的安裝驅動與確認能夠使用RealSense Camera了,那這次要介紹要如何更進一步使用Intel RealSense SDK來跑一些範例程式和看看程式是怎麼寫的。

1.利用C++來取得攝影機的深度影像

▼ 在Intel RealSense SDK中的資料夾打開Sample Browser ▼

2.接著你就會看到很多可以試試看的範例(如下圖)

▼接著你就會看到很多可以試試看的範例(如下圖)▼

(左側可以選擇語言)

(上面可以選擇相機的種類)

 

那我們馬上測試一下其中一個程式:

  1. 選擇左邊的C++
  2. 選擇上面的Common Samples
  3. 找到第一個Camera Viewer(C++)
  4. 按下後面的Run


執行後會看到以下畫面分別為占滿整個螢幕的彩色畫面。

(我的螢幕解析度是1920×1080,所以就會剛剛好是全螢幕)



 ▼ 還有一個深度圖 

OK到這裡可能會發現一個現象,就是能照到的深度很短,下圖是我的實際安裝的環境,左邊攝影機到右邊的底端也才90cm,而攝影機的規格表卻說有120cm的距離!?

然後深度圖看起來怎麼那麼爛,這部分就要說明一下了,我本身用過其他深度攝影機,深度攝影機其實會有很多因素影響效果,例如物品材質、打入角度,這個跟深度攝影機本身的原理有關係,有興趣就自己去查查瞜,要說這個效果如何? 這個效果當然不好,但是卻足夠了,效果跟口袋深度當然是有關係的嘛。

再來,這個也要看你要做什麼,我們只是要「大概的輪廓」就可以了做出手的辨識與人臉的辨識,所以也不需要多好的畫質,也不需要多遠的距離。

(2)利用C#來辨識手的骨架。

我們試完第一個範例後馬上來玩玩下一個吧!

  1. 左邊換成C#
  2. 上面選擇F2000 Samples
  3. 找到Hand Viwer(C#)
  4. 按下後面的Run

選擇Full Hand Tracking後按下Start。

開始後就伸出你的手就會看到手的骨架拉!

成功了解如何看範例之後就開始來看看程式的部分吧!

那我們回到C++的Camera Viewer範例,只是這次是按下Sources。

這時就會看到這個

那用Visual Studio打開其中的 .sln檔 就可以看到程式拉

可能有人會困惑什麼Visual Studio? (畢竟這是大眾向的教學,所以還是得顧慮一下剛接觸的新手摟)

這部分我會有另一篇的教學,其中會有Visual Studio的基本介紹如何開啟C++專案或是C#專案……等的介紹。

 

這裡就放上一張進入成功看到原始碼的圖做為結束

至於程式部分在這裡就先不解說拉~

因為這可能要有點程式基礎與興趣的支持才能夠繼續下去的事情啊~

相關文章:

[Intel好物分享及教學] Intel RealSense 3D攝影機,一開始安裝到試玩小遊戲

深度攝影機已經開始越來越普及,而在有些筆電上面也已經開始應用,深度攝影機可以用在人臉辨識、手勢辨識和一些體感遊戲(例如Xbox上的Kinect)。這次要介紹的是Intel的RealSense Camera F200。開箱可以看這一篇[Intel® RealSense™ Camera F200 開箱文]

作者/攝影  黃品叡
時間  約1小時
成本 Intel RealSense Development Kit 目前暫無販售
難度  *
材料表 ❊RealSense F200

❊Windows 7 / 8 / 10

❊ 電腦需有USB3.0

RealSense最被看好的有那些東西呢? 參考文章

  1. F200擁有三種鏡頭:傳統RGB鏡頭、紅外線鏡頭、 紅外線雷射投影機
  2. 可以進行3DMe – 3D人物臉部掃描
  3. 玩Space Astro Blaster – 體感遊戲
  4. 可以結合Scratch-圖形化語言程式

本篇目標是教大家如何入門使用RealSense。

我們分成兩個部分分享(1)從安裝驅動到安裝SDK,最後會有可以用來(2)測試的遊戲可以用RealSense玩玩看

(1)從安裝驅動到安裝SDK

Step1:首先在Intel RealSense網站上下載Camera F200驅動,安裝完成後會再裝置管理員裡看到RealSense的相機,在左下角windows鍵上按右鍵→裝置管理員 (若有成功安裝驅動,可跳過此步驟)

Step2:

(若有成功安裝完成SDK,或者是只是要安裝驅動而不是要進階功能的人,可跳過此步驟)

首先先下載Intel RealSense SDK(連結)

▼輸入email與國家▼

❊注意:在註冊的地方要注意的是密碼的部分,密碼必須要包含符號「# $ %」、英文、數字各一個,長度8~15

Step3:完成後就會有兩種下載可以選,上面是下載器,下面是直接瀏覽器下載(我是用這個)

Step4:下一步 loop (這就不多解釋摟)


▼完成▼

=================================================================

(2)測試的遊戲可以用RealSense玩玩看

Step1:

開始使用:那現在來玩玩這台攝影機的遊戲吧!

▼[一波遊戲][Warrior Wave] 載點 ▼

▼那下載完,安裝完。(注意你安裝的位置!!)▼

  

▼就開始吧! (開啟資料夾裡的Warrior Wave.exe 應該很明顯吧!)▼

 

Step2:

遊戲開始後選擇語言,當然是最有親和力的繁體中文拉

▼那就開始吧!▼

▼劇情…(pass)▼

▼開始拉~▼

▼這個時候把手放到攝影機前,就有手的輪廓,再來就看你怎麼玩拉▼

▼OK~簡單的第一關~之後就慢慢玩吧~▼

這篇也就是教大家怎麼使用RealSense而已,那接下來會進入到SDK的部分,也就比較進階的應用,而進階應用會關係到程式語言(C++, C#, java…等),所以下一篇在詳細說明。(敬請期待喔~)

 

❊感謝臺灣Intel提供。

 

相關文章:Intel® RealSense™ Camera F200 開箱文,感謝台灣 Intel 支援

 

MCS 連通 IFTTT 基礎教學

聯發科 Mediatek Cloud Sandbox 現在可與 IFTTT連通了,來看看怎麼做吧 (MCS原廠教學)

MCS 的虛擬裝置與IFTTT 連通之後,就能與其他 IFTTTT 平台上的許多 IoT 與社群服務互動,例如 Google 與Facebook。

請注意:MCS目前是透過IFTTT 的 Maker Channel 來與IFTTT互動。更多資訊請點我

本教學要告訴您如何將MCS連到IFTTT,建立一個recipe,當MCS的溫度資料頻道(temperature data channel)高於30度時,就會啟動switch data channel。請在MCS建立一個原型,並完成以下設定:

1.整數型態的 display data channel,名稱為temperature

2.On/Off型態的 controller data channel,名稱為switch,完成如下圖:


a01

3. 建立一個測試裝置

4. 到MCS 的Profile頁面,點選Apply for appId and appSecret,如下圖

a02

Continue reading

499人民幣的小米米兔積木機器人,手機遙控、圖形化介面與多種感測器

我只能說,小米這次出手好像太重了…  米兔積木機器人來了!這張圖道盡千言萬語啊…

001

樂高我想不會太擔心,但在對岸很紅的能力風暴應以及這個價格帶的機器人應該會緊張囉。先不談與樂高EV3幾乎完全相同的外型以及相容的插銷系統,光看這499人民幣的售價,我買來當EV3的零件擴充包都很划算啊。有在玩樂高的朋友應該看以下的圖就知道有哪些零件可以用。

米兔會在 11/11 雙十一 0:00 開賣,有興趣的朋友可以等實際開箱評測之後再下手

%e6%9c%aa%e5%91%bd%e5%90%8d

c_02
能力風暴

米兔積兔機器人共有978個零件構成,操作支援手機遙控和模組化圖形程式設計。

003 002

小米商城連結

T客邦相關報導

最後來看看規格(資料引自小米官網):

  • 外觀

包裝規格:380*320*90 mm

結構搭建方式:積木搭建

  • SoC

CPU:STM32

主頻最大:72MHz

處理速率:32 bite (這好像打錯字了?)

  • 存儲

容量/類型:32 MB Flash

擴展存儲:不支援

  • 通信

藍牙傳輸:支援

2.4G 無線:支援(連接感測器)

無線 Wi-Fi:支持 Type-C 拓展 Wi-Fi 適配器 (要外接才有Wi-Fi)

  • 電源

供電:1700 mAh 鋰電池

充電適配器:12 V/5 V輸出,智慧識別

  • 電機

類型:伺服電機

個數:2

  • 感測器

介面拓展感測器:支援

無線拓展感測器:支援

陀螺儀感測器:主控內置

紅外感測器:可外接(不包括)

超聲感測器:可外接(不包括)

顏色感測器:可外接(不包括)

可程式設計 RGB 真彩燈:支援

  • 軟體

移動終端遙控:支援

語音辨識遙控:支援

規劃路徑遙控:支援

重力感應遙控:支持

程式設計控制:支援

移動終端程式設計:支援

另外還有一款樂博士,也是外觀做的和EV3非常類似,但採用所謂的卡片編程,我想應該是沒有程式設計環境而是用刷卡的方式來控制機器人動作,給大家參考一下囉

14601025_1821578351452857_9139733018056681774_n

14908306_1821577878119571_1285408509679528720_n

ESP8266 結合 IFTTT #1 – IFTTT recipe 建置、trigger 與 action

咱們部落格介紹過許多雲服務的應用,例如 Temboo 就是一個串聯許多雲端服務的綜合性 API 大全,在免費方案下很容易就能做到相當豐富的應用,例如結合 Gmail、dropbox 與 Facebook 等等。今天要介紹的是如何使用ESP8266 結合 IFTTT,讓感測器能寄 email 給您。

本篇會先介紹如何在 IFTTT上建好對應的頻道(Channel)、觸發條件(Trigger)與動作(Action),請跟著本文操作吧

1.請先註冊一個 IFTTT 帳號

a01

2. 在畫面右上角的 Channels 中搜尋 “Maker” 會看到以下結果:

a02

3. 點擊之後,再點選 “connect
a03

4. 完成之後,您會看到您的帳號在 Maker Channel 下有一個 key,請接著點選 “Create a New Recipe”,要來建立事件了。

a04

5. 由於我們要觸發的動作是寄送 email,所以請回到 Channel 去搜尋 “email“,會看到這個選項,一樣點選”connect

a05

6. 接著要完成觸發欄位,請為這個事件取一個名字,在此我取名為 “hello“,完成請按 “Create Trigger” 即可

a06

7. 接著設定事件觸發之後的動作,請選擇方才連過的 Email Channel,由下圖可看到 IFTTT 也有 Gmail 與 Office 365 Mail 的選項,相當豐富

a07

8. 在此填入信件主題與內容,完成之後點選”Create Action

a08

9. 點選 “Create Recipe” 就完成了,下一篇就要教大家如何讓 ESP8266的感測器資料來觸發這個 recipe囉!

a09

QNAP 將與 Arduino 為 IoT 開發者推出私有雲服務

QNAP 將與 Arduino 為 IoT 開發者推出私有雲服務,真是好消息。對CAVEDU這種常常去學校上課的單位來說,學校的網路由於安全性、學生積極搜尋資訊以及社群網路的需求,必須要做一些限制,有時候會造成教課時某些服務不可用或回應太慢,例如 7688 npm install module 時就會一直等等等…   造成上課節奏不順暢。更可怕的是,學校的網管可能當天請假或公差外出,想到就冷汗直流…

總之以 Qnap 專攻NAS的角度來說,如果能在NAS上放一些常用的服務,這樣就能在區域網路下運作,可以省掉很多網路的問題。

來源:http://www.iotconnectivitysolutions.com/news/2016/10/20/8439833.htm, IoT Tech Expo, Santa Clara, CA, Oct. 20, 2016 (GLOBE NEWSWIRE)

以下翻譯部分內容,完整內容請參考以上連結

QNAP 將與 Arduino 合作,針對 IoT 開發者使用相關產品服務來處理、存放本地端資料,並加強與 Arduino 相關硬體的連結性。QIoT Suite Lite software (container) 會在 2017 Q1 準備好支援 Arduino。

“Arduino 提供的低成本、開放微控制器技術,被愈來愈多 maker 採用來製作各種IoT裝置”YT, Lee QNAP VP表示 “我們會不斷提供資料存放與高端資料處理的服務,搭配易用的介面,讓顧客得以連結並視覺化其 IoT 專案所產生的資料。不管是IP攝影機、家庭音響系統、智能家電感測器、居家保全與各種聯網裝置都會產生許多資料,有些需要長時間保存,有些則只要數天。資料存放雖然是在背後的事情,但對於 IoT 來說卻至關重要

“這項合作可讓 IoT maker 們得以自製或下載可執行在 Qnap 私有雲上的第三方應用程式” Kathy Giori, Arduino VP of Operations表示。 “IoT 開發者們需要連接並存放多種類型的資料;但在生態系統上的標準仍不一,並害怕把所有東西丟上網路的擔憂,以上兩項顧慮催生了開放原始碼與本地端處理與存放資料的需求。除了 QNAP 的 Ethernet 與 USB 接口之外,開法者可透過 Arduino Yun 或 Tian 透過 Wi-Fi 與 Bluetooth Low Energy (BLE) 來連接 IoT 裝置。其他像是 LoRa 等通訊方式則需透過擴充板即可使用。… (後略)”

QIoT Suite Lite 具備多種通訊協定與儀表板,讓使用者能取得接在開發板上的各種感測器,並將像是 Node-RED 與 Freeboard 等應用程式發佈到QNAP NAS上。從感測器收到資料可透過多種通訊協定(MQTT, CoAP等) 回送到 QNAP NAS,使用者透過儀表板就能遠端監控所有東西。

Arduino Yun 與 Tian 支援 Wi-Fi 與 BLE,Qnap 目前則支援 Ethernet 與 USB。新款的Arduino Uno Wi-FiStar Otto 與 Primo 等開發板則可經由 Wi-Fi 與 Yun 與 Tian通訊,這樣開發者可更彈性運用這些開發板來開發所需的專案。

(阿吉老師補充:Arduino.cc 與 .org 分家之爭已落幕,但 Tian、Uno Wi-Fi、Star Otto 與 Primo 等經搜尋結果還歸在 Arduino.org 下)

 

Inventec AVATAR開發板 (微軟Azure IoT認證裝置與 Qualcomm 四核心處理器)

還記得前幾年水果拼盤(各類型 Raspberry Pi 相容板、有香蕉橘子蓮霧鳳梨喔) 開始流行的時候,光有板子就很開心了,但現在大家的胃口被養大了,光有板子是不夠的,有沒有什麼更方便的應用呢?例如,直接打通了某些雲服務,聽起來就很吸引我。

最近英業達 Inventec 有一片 Avatar (阿凡達?) 出來了,主打項目應該是 Microsoft Azure IoT Certificate 與採用 Qualcomm 四核心處理器

085

 

目前 Inventec 在 hackster.io 所放上的專題應用有智慧小玩具、居家助手與監控攝影機等三個專題。也提供了完整的作法,就等拿到板子之後來玩玩看囉。

最後是目前可看到的規格

  • CPU:Quad Cortex-A7, up to 1.094 GHz / Qualcomm APQ8009
  • Memory:8GB eMMC + 1GB LPDDR2
  • Communications:Dual-band 2×2 802.11ac + Bluetooth 4.1 / Qualcomm QCA6174A
  • Audio Codec:Standalone Hi-Fi audio codec IC / Qualcomm WCD9326
  • Speaker AMP:Class-D smart speaker AMP up to 2W/8Ω / WSA8810
  • Microphone:-38dB, Wide bandwidth, Low noise-38dB / A-Mic
  • Camera:1/2.9″ color CMOS 1080p HDR HD image sensor / OmniVision OV2718
  • GPU:O.S. Support

比較令我感興趣的是這個:Microsoft Azure Certified for IoT。不知道可以幫開發者省掉哪些步驟呢?如果只要登入之後就可以直接使用一些範例程式就太棒啦(許願中…)