2012/02/07

Arduino簡介

問:Arduino是什麼?
答:Arduino是個open-source electronics prototyping platform,含有容易使用、擴充性強的硬體與軟體,提供給藝術家、設計師、業餘愛好者、任何有興趣的人,建立打造互動式的科技藝術裝置作品。

問:啥,open-source electronics prototyping platform是什麼鬼?
答:所謂open-source開放源碼,意思是說Arduino的硬體電路設計圖是開放的,軟體原始碼也都是開放的;electronics代表說創作物是要吃電的;prototyping platform表示運用這套平台可以快速地建構出原型,打造產品。

Arduino的logo。


問:那可以打造什麼產品呢?
答:這就要看你的想像力了。

譬如說可用來人貓互動,只要貓咪跳上專用座椅上,配合Arduino-Android裝置,就會自動在Twitter發訊息,或拍照貼上Facebook。


譬如說手機遙控車


譬如說超聲波距離感應器


譬如說機器人


譬如說療癒系的電子寵物Gamma羊


問:哦,很不錯嘛,講點Arduino的歷史吧?
答:於2005年,Arduino計畫正式啟動,發源地是義大利北方的Ivrea鎮。在2005那個時候,發起人Massimo Banzi與David Cuartielles覺得市面上可用的素材與零件太過昂貴,學生負擔不起,於是想要打造便宜好用的電子原型平台,這才萌芽了Arduino這樣的想法。

若對緣起與歷史有興趣的人,可以看看這支記錄片Arduino: The Documentary (2010)

問:Arduino?什麼意思啊?怎麼念?
答:發源地是義大利的Ivrea鎮,所以發起人以此鎮的歷史人物Arduin命名。"Arduino"是個義大利的男子名,意思是"strong friend",其義大利語發音,可聽聽看這個,或是官方網站裡此頁面的最下面,有發音檔可以下載

問:好,那要怎麼開始玩呢?
答:你需要硬體部分與軟體部分。

問:硬體部分呢?
答:你可以買現成的板子或是自己組裝。

初學者大概都是購買現成的,根據Arduino官方網站所寫,台灣地區具有官方合法授權的代理商為藝科資訊 Aroboto StudioPlayRobot 飆機器人/普特企業有限公司iCshop (台灣)電子零件,電子材料,當然啦,還有別的商家,到網路上搜尋一下可找到不少,拍賣網站上也有,甚至也可以到國外網站去買。

購買時要注意的是:價格、出貨速度、退換貨的機制。

從2005年以來,Arduino官方已經出了不少版本的板子,那該買哪一塊呢?以目前來講,以Arduino Uno與Arduino Mega 2560為主,Uno是基本款,而Mega 2560搭配了更強的微控制器(價格也較高)。

(2012.05.28更新,新的板子Arduino Leonardo出來囉,更強更便宜。兩塊開發板的差異,請看Arduino:Leonardo與Uno的差異比較

Arduino Uno


官方還有其他板本的板子,各有其不同特色,有的加入藍牙傳輸能力,有的尺寸很迷你,有的弄成圓形、適用於打造穿配在衣服上的產品。

除了官方的Arduino板子外,因為板子的電路設計圖是開放的,很多人、廠商也相繼推出各種「Arduino相容板」,譬如SeeeduinoSippinoUSBDroid、等等,詳細列表可看這篇。每塊相容板都有它特別的地方,尺寸特別小、低耗電、網路連線、藍牙、等等。

例:Sippino這塊相容板,輸出針腳都弄在同一邊,適合插在麵包板上。


當然啦,因為板子的電路設計圖是開放的,你也可以買零件材料自己拼湊。自己組裝可以得到成就感,也能更進一步了解板子,網路上有某些人是自己組裝板子的,並且加入自己的設計與新功能!

在麵包板上組裝Arduino板。


問:軟體部分呢?
答:需要開發環境、編譯器、連結器、開發工具鏈、燒錄程式、板子與電腦連接所需要的驅動程式、等等等等,這些通通都已經準備好、打包好了,到Arduino官方網站的下載頁面即可下載,可在Windows、Mac OS X、Linux上運行。

Arduino軟體開發環境的畫面


問:什麼是"shield"?
答:這應該算是Arduino的術語吧,中文大概叫做擴充板或擴展板,插在主板上以加入其他功能,也可以被稱為"daughterboard"或"add-on module"。

譬如說:官方的Arduino Ethernet Shield加入以太網路的連線能力,SparkFun的BlueSMiRF加入藍牙連線能力,另外還有各種驅動馬達的擴展板,等等。完整列表可看這裡,真是琳琅滿目啊,有感測光線的、感測聲音的、等等。

例,Arduino官方的Wireless SD Shield,有XBee無線傳輸能力與SD卡插槽。


例,這是一塊Arduino板子插上Ethernet Shield後的樣子。


問:什麼是"sketch"?
答:這應該算是Arduino的術語吧,中文大概叫做程式碼或草稿碼,其實就是"程式"就對啦。

問:什麼是Open Accessory、ADK?
答:Open Accessory是一項標準,Google在2011年的開發者大會所發表,這是為Android裝置打造硬體配件、周邊商品的標準,ADK提供的參考硬體就是基於Arduino的板子。而ADK是Android Open Accessory Development Kit,也就是各種API啦,Android端與Arduino端互相溝通的機制。更詳細的介紹可以看這篇

 相對應地,Arduino官方也推出一塊Arduino ADK板子


(Android與Arduino不要搞混了喔。)

問:總結一下吧?
答:有興趣的話,買塊Arduino板子(不知道哪一塊的話,就買Arduino Uno這塊)、買一條USB傳輸線(一頭是A型插頭,一頭是B型插頭)連接板子與電腦、下載軟體開發環境,就可以動手玩囉。

(2012.05.28更新,新的板子Arduino Leonardo出來囉,比Uno更強更便宜,但跟Uno有些許不同,可參閱官方文件。)

板子到手後,可以看看我寫的Arduino Uno開箱文與安裝設定,安裝驅動程式以及第一支sketch。


參考資料:


參考書籍(中文):

自己組裝Arduino相容板:

Arduino官方網站的Building an Arduino on a Breadboard


用麵包板組裝Arduino微電腦實驗板


Dale Wheat寫的How to Build an Arduino-compatible Physical Computing Platform on a Solderless Breadboard


Boarduino, Solderless Breadboard Arduino Clone

79 comments:

  1. Arduino官方開發板演進史
    http://blog.arduino.cc/2013/11/02/evolution-of-arduino-the-family-tree/

    ReplyDelete
  2. 葉先生您好,
    看了您的文章,獲益頗多,我自己也lay了一個板子HandyBuz(Arduino+Adxl345),目前在Indiegogo上募資,希望能成功,再次謝謝您的文章。

    https://www.indiegogo.com/projects/handybuz/
    http://handybuzz.weebly.com

    Ted Lien

    ReplyDelete
    Replies
    1. Mr. Lien您好,
      真厲害啊。
      現在還沒詳細看,可能要週末才有空仔細詳閱。

      希望你能募資成功。

      Delete
  3. Mr. Lien您好,
    我看完了,相當厲害啊,而且募資也已經超過設定目標了,恭喜你。

    ReplyDelete
  4. Mr. Lien:
    恭喜募資成功!
    不過USD500似乎太少了點.
    加油, !!

    ReplyDelete
  5. Anonymous13/8/14 12:58

    葉 r.,
    請教一下, 如果自己買零件兜, 那 mcu 裡是不是要先燒基本的 firmware? (bootloader?) 如果是, 那麼哪裡可以取得這 firmware? 是 binary 嗎? 還是也有 source?
    Thanks a lot!
    Jason

    ReplyDelete
    Replies
    1. Arduino的bootloader已經包含在Arduino的軟體內(從http://arduino.cc/en/Main/Software下載),原始碼在這裡https://github.com/arduino/Arduino。

      要燒錄的話,可使用獨立的燒錄器,例如http://yehnan.blogspot.tw/2013/09/avr-ispadafruit-usbtinyisp.html

      可把一塊Arduino Uno當做燒錄器,例如http://yehnan.blogspot.tw/2013/02/arduino-unoispbootloadersketchatmega328.html

      [廣告] 另外其他詳情,還請參考拙作「Arduino輕鬆入門:範例分析與實作設計」http://yehnan.blogspot.tw/2014/02/arduino_21.html

      Best regards.

      Delete
  6. 板主你好!
    我想要利用 Arduino 來讀取我的一個溫度錶(CHY 生產的 502A 溫度記錄錶) 以 RS232 接口匯出的即時讀值。收到讀值後,顯示當下的讀值及過去10秒的溫差。我想知道這樣的需求會難達成嗎?希望你能指點一下我需要買的配件有那些。感謝你。

    ReplyDelete
    Replies
    1. RS-232規定的訊號電壓介於正負12V之間,而Arduino板一般可接受的電壓是0~5V,
      所以必須購買「RS-232 轉 TTL Serial」的產品,

      硬體準備好了之後,關於軟體的部份,我稍微查了一下,並沒有查到CHY-502A會以何種格式輸出量測到的數值,所以需要向廠商查詢、索取相關文件,
      然後才能寫Arduino程式碼,讀取CHY-502A輸出的東西、解析後得到想要的資料,
      然後再根據需求寫出你想要的功能。

      Delete
  7. 謝謝板主提供建議及幫忙找相關資訊。感謝!

    ReplyDelete
  8. Anonymous19/2/15 14:48

    "sketch"是Arduino IDE沿用Processing程式語言的檔案名稱,我翻做「專案」,「程式碼 」或「草稿(直譯)」也可以,就是一個Arduino專案的程式檔案。

    ReplyDelete
  9. 謝謝。有空的話,也請看看我寫的
    Arduino與AVR微控制器相關詞彙
    http://yehnan.blogspot.tw/2013/01/arduinoterms.html
    若有意見還請留言。

    另外,有意的話可幫助Arduino IDE的名詞翻譯工作,https://www.transifex.com/projects/p/arduino-ide-15/

    ReplyDelete
  10. 您好,我想請問一下
    我想要做語者確認,辨識結果會是一個.txt的文字檔(內容是英文) 結果就是"通過"和"沒通過"兩種
    現在我想要根據文字檔的內容 通過給高電位 沒通過給低電位 丟到Arduino讓LED亮或不亮 或是響蜂鳴器等等的反應
    我應該要用什麼樣的技術 或是 程式如何撰寫?

    ReplyDelete
    Replies
    1. .txt文字檔應該會放在SD記憶卡吧?
      首先要讀取記憶卡,參考官方文件即可http://arduino.cc/en/Reference/SD。

      控制LED與蜂鳴器都是基本的入門課,請參考我的其他文章:
      http://yehnan.blogspot.tw/2012/02/arduino_21.html

      Delete
    2. 請問可以透過串列通訊的方式傳送嗎?
      如果可以的話應該怎麼做呢?

      Delete
    3. 傳送什麼?串列通訊的雙方是誰跟誰?

      Delete
  11. 您好~葉難老師
    我在看了您寫的書之後
    對arduino相當有興趣
    也買了一些材料來玩玩
    但目前有寫出RFID跟溫濕度感測器
    但不知道兩者的程式碼整合在一起...
    想請葉老師幫忙><

    ReplyDelete
    Replies
    1. 謝謝,玩得愉快嗎?

      有問題直接問,盡量幫忙。

      Delete
  12. 葉難老師您好
    我想請問 Uno版子 Digital pins那排
    GND之上還有SDA/ SCL, 請問這兩個pin也可以用來I2C傳輸嗎?
    謝謝

    ReplyDelete
  13. 葉大妳好 最近在使用GPS/GPRS/GSM Module V3.0 這塊板子
    目前在做簡訊發送的部分 使用自己手機的SIM與她的範例程式
    可是一直收不到簡訊 是因為SIM卡有PIN碼的關係 還是有其他原因?
    不知道這方面您是否了解?

    範例程式的網站
    http://www.dfrobot.com/wiki/index.php/GPS/GPRS/GSM_Module_V3.0_%28SKU:TEL0051%29
    簡訊發送的範例影片
    https://www.youtube.com/watch?v=6ryQ-aTnO6I

    ReplyDelete
    Replies
    1. 你有看到輸入PIN解鎖的API嗎?
      沒有的話,那就不行。

      Delete
    2. 話說回來,為什麼不解開PIN碼試試看,不就知道了。

      Delete
    3. 手機裡安全性內的不使用SIM卡PIN碼開機就是解開PIN碼嗎? 還是這個設定只是針對手機?
      如果是針對SIM卡設定,有試過一樣無法發出簡訊。

      Delete
    4. 每支手機的設定都不太一樣,照你說的應該就是了。總之就是手機開機時不需要輸入密碼。

      嗯,沒用過這塊,不清楚。

      Delete
    5. 葉大請問一下 GPS的板子有可能會有挑卡的問題嗎? 或者是那些電信的SIM卡他不接受?

      簡訊發送卡了我好幾天!腦子快炸了..

      Delete
    6. GPS不需要SIM卡。傳SMS屬於GSM的範疇。

      你問我的是一般性問題,我沒有這塊板子,而你需要的是擁有實際使用經驗的人。

      Delete
  14. This comment has been removed by the author.

    ReplyDelete
  15. This comment has been removed by the author.

    ReplyDelete
  16. 葉'S您好 請問這個問題,我新買入一塊主板,經過8小時測試,發現 Linkit one主板有問題
    Linkit one 更新韌體 => 正常

    上傳第一支最基礎的led程式 訊息顯示完成
    usb port都會自動斷掉, 再重新抓取usb port 口
    程式沒任何反應。

    想請問有解決方案嗎?

    ReplyDelete
    Replies
    1. 上傳程式之後,本來就會斷掉usb port,因為板子會重置,
      而且上傳程式跟Serial輸出是不同的COM port,請注意。

      > 程式沒任何反應
      什麼意思?
      上傳的是LED閃爍的程式嗎?
      LED燈有在閃爍嗎?

      若是上傳一次之後,無法再次上傳程式,
      可能性的問題很多,
      1. 更新成最新韌體,也要更新成相對應版本的SDK
      2. 重新安裝USB驅動程式
      3. 換USB線、換USB埠
      4. 打開Windows的裝置管理員,若出現Alcatel Single RNDIS Interface,
      請試著移除,並禁止Windows自動安裝該硬體裝置的驅動程式。

      另可到linkit one論壇發問,找找以前的問題。

      Delete
  17. 沒反應 我的開發環境是LinkIt-ONE-IDE-master 這包 1.5.8 內容都有對應的韌體更新程式與開程式,是主板掛了嗎?
    謝謝

    ReplyDelete
    Replies
    1. 呃,你是從Seeed下載的?
      建議到MediaTek的LinkIt ONE官網下載。

      Delete
  18. https://youtu.be/KgJF5S63eUw
    我是從人家放到git上整包抓下來的。

    ReplyDelete
    Replies
    1. 我知道。
      還是建議你到MediaTek的LinkIt ONE官網下載SDK。
      Arduino IDE則到Arduino官網下載。

      Delete
  19. 問題已解決,開發環境的問題,感謝葉sir提供正確方向。

    ReplyDelete
  20. 不好意思 ,我有一個電壓感測器,我想要把擷取一百次的電壓值取平均,
    不知道要怎樣撰寫

    ReplyDelete
    Replies
    1. 什麼樣的電壓感測器?它的輸出是什麼?要怎麼跟Arduino連接?
      一旦能夠連接之後,在程式裡不斷讀取,一百次後加總、求平均。

      Delete
  21. 葉大你好,因為小弟只有純軟體背景...看板大介紹還是有點懵懂
    依文中所說arduino板子實際就是整合了各種額外模組的微控制器?
    實際上我想嘗試實做這個project的東西
    http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/s2009/kwg8_dmd54/kwg8_dmd54/index.html#
    在文章中,看到它列出來的材料清單是用 Atmel ATMega644 微控制器
    因為我手邊剛好有借到 arduino Mega2560 板子 是否就能用它替代掉呢?

    ReplyDelete
    Replies
    1. Arduino板子是整合微控制器與各種額外模組。

      沒用過atmega644,看了一下,只能說「似乎」可以改用atmega2560。
      兩者都是AVR架構,根據官網spec,2560比較強,所以應該可以。

      該project特別註明開發環境是AVR Studio 4,不知道跟Arduino IDE差多少。
      說明描述裡,常常出現timing的問題以及如何解決,包括transmitter/receiver與微控制器之間,以及微控制器與電腦之間;換了微控制器,不知道會差多少。
      程式碼裡出現較為低階的TCCR0A、TIMSK0等等,而且註解裡還有644字樣,換成2560後不知道要不要改、要改多少?

      所以我認為應該是可以,只不過一旦進入細節,就不知道要改多少了。

      Delete
  22. 葉老師你好
    我有一個聲控模組,我想要用他做一個聲控計算機(整數四則運算)
    http://www.playrobot.com/voice/88-arduino-.html?search_query=中文語音辨識&results=6

    可不可以請葉老師給我一點建議! 謝謝^^

    這是我的程式碼,現在做到能開啟關閉LED
    #include

    #define SUM 2
    uint8 nAsrStatus=0;

    char sRecog[SUM][80] = {"kai deng", "guan deng"};
    int state=7;
    int led=8;


    void finally (unsigned char n)
    {
    switch(n)
    {
    case 0:
    Serial.println( "kai deng");
    Serial.println( " ");
    digitalWrite(led,LOW);
    break;
    case 1:
    Serial.println( "guan deng");
    digitalWrite(led,HIGH);
    break;

    default:
    Serial.println( "error");
    Serial.println( " ");
    break;
    }
    }

    void ExtInt0Handler ()
    {
    Voice.ProcessInt0();
    }

    void setup()
    {
    Serial.begin(9600);
    Voice.Initialise(MIC,VoiceRecognitionV1);//Initialise mode MIC or MONO,default is MIC
    //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield
    //VoiceRecognitionV2 is VoiceRecognitionV2.1 module
    attachInterrupt(0,ExtInt0Handler,LOW);
    pinMode(led,OUTPUT);
    pinMode(state,OUTPUT);
    digitalWrite(state,HIGH);
    digitalWrite(led,HIGH);
    }
    void loop()
    {
    uint8 nAsrRes;
    nAsrStatus = LD_ASR_NONE;

    while(1)
    {
    switch(nAsrStatus)
    {
    case LD_ASR_RUNING:
    case LD_ASR_ERROR:
    break;
    case LD_ASR_NONE:
    {
    nAsrStatus=LD_ASR_RUNING;
    if (Voice.RunASR(SUM,80,sRecog)==0)
    {
    nAsrStatus= LD_ASR_ERROR;
    Serial.println( "ASR_ERROR");
    }
    digitalWrite(state,LOW);
    Serial.println( "ASR_RUNING.....");
    break;
    }
    case LD_ASR_FOUNDOK:
    {
    digitalWrite(state,HIGH);
    nAsrRes =Voice. LD_GetResult();
    finally(nAsrRes);
    nAsrStatus = LD_ASR_NONE;
    break;
    }
    case LD_ASR_FOUNDZERO:
    default:
    {

    nAsrStatus = LD_ASR_NONE;
    break;
    }
    }// switch
    delay(500);
    }// while
    }

    ReplyDelete
    Replies
    1. 沒用過。

      char sRecog[SUM][80] = {"kai deng", "guan deng"};
      這裡面應該是放著想要便是的詞彙「開燈」、「關燈」,文件寫著:Voice Recognition模块支持的中文识别来说,就是用拼音来描述出关键词语。 所以第一步是把想要辨認的詞彙轉成拼音,至於怎麼轉就看文件的說明。

      然後使用Voice程式庫,範例程式裡呼叫LD_GetResult()進行語音辨識,然後就可以接著做相對應的動作。

      不過Voice還有很多其他方法,我沒找到文件說明,可向原廠詢問。

      沒用過這塊板子,也沒有經驗,所以沒辦法給予建議。

      Delete
  23. 這是我的四則運算程式碼,我想把它們融合起來,請老師給我一點建議 謝謝

    int Op_A = 0;// 運算元 A
    int Op_B = 0;// 運算元 B
    void setup()
    {
    Serial.begin(115200);// 設定Serial Port 的Baudrate
    Serial.println("Please enter format : Operand A +(or -)Operand B =");// 傳送指示字串
    Serial.setTimeout(100000);// 設定 Serial.parseInt ();最長等待時間,單位ms
    }
    void loop()
    {
    // 讀取運算元 A
    Op_A = Serial.parseInt();

    Serial.print(Op_A);
    // 讀取運算子
    char opr = Serial.read();

    Serial.write(opr);

    // 讀取運算元 B
    Op_B = Serial.parseInt();

    Serial.println(Op_B);
    if(Serial.read() == '=')
    {
    Serial.print("Ans : ");
    switch(opr)
    {
    case '+':
    Serial.println(Op_A + Op_B);
    break;
    case '-':
    Serial.println(Op_A - Op_B);
    break;
    case '*':
    Serial.println(Op_A * Op_B);
    break;
    case '/':
    Serial.println((float)(Op_A) / (float)(Op_B));
    break;
    default:
    Serial.println("illiegal operator !!!");
    break;
    }// end switch
    }// end if(Serial.read() == '=')
    }

    ReplyDelete
  24. 同上個留言。
    先把想要辨識的詞彙,轉成英文拼音,然後呼叫LD_GetResult()進行語音辨識,接著做相對應的動作。應該要辨識數字0~9,以及加減乘除。
    譬如12 + 34 =,辨識出1後先存著,辨識出2後再合併成12,直到碰見運算子,然後接著辨識下一個數字,等到=時,就進行計算。大概如此吧,沒有經驗,所以沒辦法給予建議。

    ReplyDelete
    Replies
    1. 謝謝老師
      其實我是邏輯的部分比較弱,

      "辨識出1後先存著,辨識出2後再合併成12,直到碰見運算子,然後接著辨識下一個數字,等到=時,就進行計算。"

      其實我不太明白的就是這段程式要怎麼寫,因為"voice的範例"用的是case,這樣該怎麼做?

      Delete
  25. 我改了一下,怎覺得不太對

    #include

    #define SUM 14
    uint8 nAsrStatus=0;

    char sRecog[SUM][80] = {"ling", "yi", "er", "san", "sih", "wu", "liu", "qi", "ba", "jiou", "jia", "jian", "cheng", "chu"};
    int Op_A = 0;// 運算元 A
    int Op_B = 0;// 運算元 B
    int state=7;
    int led=8;


    void finally (unsigned char n)
    {
    switch(n)

    {
    case 0:
    Serial.println( "0");
    //Op_A = 0;

    break;
    case 1:
    Serial.println( "1");
    // Op_A = 1;
    break;
    case 2:
    Serial.println( "2");
    // Op_A = 2;
    break;
    case 3:
    Serial.println( "3");
    // Op_A = 3;
    break;
    case 4:
    Serial.println( "4");
    // Op_A = 4;
    break;
    case 5:
    Serial.println( "5");
    // Op_A = 5;
    break;
    case 6:
    Serial.println( "6");
    // Op_A = 6;
    break;
    case 7:
    Serial.println( "7");
    // Op_A = 7;
    break;
    case 8:
    Serial.println( "8");
    // Op_A = 8;
    break;
    case 9:
    Serial.println( "9");
    // Op_A = 9;
    break;
    case 10:
    Serial.println( "+");
    Serial.println(Op_A + Op_B);
    break;
    case 11:
    Serial.println( "-");
    Serial.println(Op_A - Op_B);
    break;
    case 12:
    Serial.println( "*");
    Serial.println(Op_A * Op_B);
    break;
    case 13:
    Serial.println( "/");
    Serial.println((float)(Op_A) / (float)(Op_B));
    break;

    default:
    Serial.println( "error");
    Serial.println( " ");
    break;
    }
    }

    void ExtInt0Handler ()
    {
    Voice.ProcessInt0();
    }

    void setup()
    {
    Serial.begin(9600);
    Voice.Initialise(MIC,VoiceRecognitionV1);//Initialise mode MIC or MONO,default is MIC
    //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield
    //VoiceRecognitionV2 is VoiceRecognitionV2.1 module
    Serial.setTimeout(100000);//===========================================================
    attachInterrupt(0,ExtInt0Handler,LOW);
    pinMode(led,OUTPUT);
    pinMode(state,OUTPUT);
    digitalWrite(state,HIGH);
    digitalWrite(led,HIGH);
    }
    void loop()
    {
    uint8 nAsrRes;
    nAsrStatus = LD_ASR_NONE;

    //--------------------------------------------------
    Op_A = Serial.parseInt();
    Serial.print(Op_A);
    // 讀取運算子
    char opr = Serial.read();

    Serial.write(opr);

    // 讀取運算元 B
    Op_B = Serial.parseInt();

    Serial.println(Op_B);
    //-------------------------------------------------
    while(1)
    {
    switch(nAsrStatus)
    {
    case LD_ASR_RUNING:
    case LD_ASR_ERROR:
    break;
    case LD_ASR_NONE:
    {
    nAsrStatus=LD_ASR_RUNING;
    if (Voice.RunASR(SUM,80,sRecog)==0)
    {
    nAsrStatus= LD_ASR_ERROR;
    Serial.println( "ASR_ERROR");
    }
    digitalWrite(state,LOW);
    Serial.println( "ASR_RUNING.....");
    break;
    }
    case LD_ASR_FOUNDOK:
    {
    digitalWrite(state,HIGH);
    nAsrRes =Voice. LD_GetResult();
    finally(nAsrRes);
    nAsrStatus = LD_ASR_NONE;
    break;
    }
    case LD_ASR_FOUNDZERO:
    default:
    {

    nAsrStatus = LD_ASR_NONE;
    break;
    }
    }// switch
    delay(500);
    }// while
    }

    ReplyDelete
    Replies
    1. 或許可先簡化問題,先做運算元A與B都是一個位數的數字,譬如5+3。

      Delete
  26. 葉難老師您好,有兩個關於arduino迴圈的問題想請教,因程式碼較長,故貼在論壇上,網址為 http://www.robofun.net/forum/viewthread.php?tid=9915&pid=34623&page=1&extra=page%3D1#pid34623
    還望老師能抽空幫忙 謝謝 !!

    ReplyDelete
    Replies
    1. 當h1 = a;之後,h1就不等於0了,
      於是h1 != 0,於是loop()會一直呼叫temp()。

      Delete
  27. 那請問要如何跳出temp()這個loop呢?

    ReplyDelete
    Replies
    1. 嗯,不清楚你的spec。

      再弄個全域變數當做旗標吧,當修改h1時,設定該旗標為1,
      然後把if (h1 != 0)改成if (flag ==1),進行溫度感測,
      溫度感測完畢後,清除該旗標設為0,這樣下次進入loop()時,就不會再次進入temp()了。

      嘛,感覺不是個好解法,不過...暫時這樣吧。

      Delete
  28. 請問一下
    我目前正在使用RFID-RC522這塊板子
    結合arduino後
    感應已能達到我要的功能
    但我希望能做一個對照組
    請問該從何下手?

    ReplyDelete
    Replies
    1. 什麼問題呢?
      對照什麼?

      Delete
    2. 問題是:無法做出個人化辨識的功能
      我買了兩組RC522
      但不論我用哪個磁片都可運作
      目標是能分別兩者
      正確的卡就運作
      不正確就停止

      Delete
    3. 讀取RFID標籤後,就能得到每個tag獨一無二的碼,不是嗎?然後根據該碼做判斷。

      Delete
    4. 我讀取後無法得知tag的內碼
      請問該如何得知?

      Delete
    5. 抱歉,說的不夠好。

      tag可以讀取、也可以寫入,你可以寫入由你設定的碼,讓每個tag的碼獨一無二。

      Delete
    6. 那請問我該如何自己寫入
      可否給我一些範例?

      Delete
    7. 網路上很多吧,
      看你用哪套程式庫,也都會有附範例吧。
      我有翻譯一本「初探NFC」,
      http://yehnan.blogspot.tw/2014/11/nfcarduinoandroid-phonegap-beginning.html
      參考看看。

      Delete
    8. 不好意思再請教一個問題
      我已經讀取到晶片和白卡的內碼
      但當我換成悠遊卡時似乎被阻擋住
      我可以怎麼更改?

      Delete
    9. 沒有讀過悠遊卡,沒法幫你。

      首先應要確認你的RFID-RC522這塊板子是否能夠讀取悠遊卡。

      Delete
  29. 您好想跟您問個問題,我超音波放在伺服機上程式碼如下:但一直無法做出Flag的效果,就是伺服在動時,馬達不動。
    int sonic_echo =12; // 接到 digital 4
    int sonic_trig=13; // 接到 digital 5
    const byte EA = 3; // 馬達 A 的致能接腳
    const byte motorIn1 = 2; // 馬達 A 的正反轉接腳
    const byte motorIn2 = 4; // 馬達 A 的正反轉接腳
    const byte EB = 6; // 馬達 B 的致能接腳
    const byte motorIn3 = 5; // 馬達 B 的正反轉接腳
    const byte motorIn4 = 7;
    byte flag=0; //判斷旗幟

    #include //伺服馬達
    Servo myservo;



    void setup()
    {
    Serial.begin(9600);//包率
    pinMode(sonic_echo, INPUT); //超音波回授
    pinMode(sonic_trig, OUTPUT);//起始
    myservo.attach(9);
    }

    void loop()
    {
    int distance; // 右方距離
    int distance2; // 中間距離
    int distance3;
    if(flag==0){
    sevo1();
    sevo2();
    sevo3();
    delay(500);
    myservo.write(90);
    delay(500);
    stop();
    flag=1;
    }
    if(flag==1){

    forward();
    if(distance<20){
    turnLeft();
    }
    else if(distance3<20){
    turnRight();
    }
    else if(distance<20 && distance3<20 && distance2<20)
    {
    backward();
    }
    flag=0;
    }

    }

    ReplyDelete
    Replies
    1. > 但一直無法做出Flag的效果,就是伺服在動時,馬達不動。
      從你給的程式碼,看不出為什麼。

      另外,底下這部份不太對吧,
      if(distance<20){
      turnLeft();
      }
      else if(distance3<20){
      turnRight();
      }
      else if(distance<20 && distance3<20 && distance2<20)
      {
      backward();
      }
      如果distance<20為真,就一定會執行第一個if的內容,絕對不會跑進第三個if,應該不是你要的行為。

      Delete
  30. 我想請問你arduino的序列埠監控視窗顯示的字體大小可不可以更改?

    ReplyDelete
    Replies
    1. 不是跟編輯器的一樣嗎?

      Delete
    2. 我的意思是 可以利用程式更改字體大小嗎?還是介面上有功能可以更改?

      Delete
    3. 檔案-偏好設定,

      此外,可到preferences.txt裡找找相關設定,但我想應該沒有。

      Delete
  31. 你好我想請教一些問題
    1.我想利用電容式麥克風收音利用arduino連接藍芽,再利用matlab讀取data
    不知道這樣的想法可不可行
    2.利用電容式麥克風收音arduino本身會將收到的訊號儲存起來嗎 還是他只會讀到資料顯示在視窗序列埠之後就洗掉

    ReplyDelete
    Replies
    1. 1. 可行。

      2.
      > arduino本身會將收到的訊號儲存起來嗎
      不會。 你又沒有命令它儲存訊號。

      > 還是他只會讀到資料顯示在視窗序列埠之後就洗掉
      你命令它輸出到序列埠,它就只輸出到序列埠。

      Delete
    2. 我利用駐集體麥克風收音
      序列埠監控視窗顯示0~1023(digital)再將他轉成類比0~5v
      那我該怎麼將Data儲存起來 讓藍芽來讀取

      Delete
    3. 不是直接經由藍牙、把Data傳送出去嗎?
      你還需要儲存功能嗎?

      Delete
  32. 葉先生您好:
    我將程式編輯好,上傳後,在下方訊息欄出現如下訊息,請問是甚麼意思?要如何處理?謝謝!

    草稿碼使用了 1,848 bytes (5%) 的程式儲存空間。上限為 32,256 bytes。
    全域變數使用了 186 bytes (9%) 的動態記憶體,剩餘 1,862 bytes 給區域變數。上限為 2,048 bytes 。

    avrdude: no programmer has been specified on the command line or the config file
    Specify a programmer using the -c option and try again

    ReplyDelete
    Replies
    1. > no programmer has been specified
      沒有指定燒錄器。

      你用哪一版Arduino IDE?
      照理說,Tools-Board選好後,就會自動選擇適當的燒錄器設定。

      Delete
    2. 恩,剛剛上網搜尋,你這問題是arduino ide造成的,
      試著升級板子定義吧,
      到選單tools-board-board manager,
      把Arduino AVR board的版本,升級到別的版本。

      Delete
    3. 改成1.6.9就可上傳了,謝謝葉先生!

      Delete
  33. 葉老師您好:
    小弟玩Arduimo有3個月了,基礎都會了,都感謝老師您的文章。
    最近我在做一個小實驗,遇到瓶頸,請問老師一塊Arduino可以接收3個以上的溫度感測器的數值嗎?

    ReplyDelete
  34. 可以。

    哪個溫度感測器?

    ReplyDelete