《超圖解Arduino互動設計入門》第二版補充說明

本文旨在補充《超圖解Arduino互動設計入門》第二版的更新內容與勘誤。

更新Webduino程式庫

書本光碟的Webduino程式庫,僅適合用於Arduino 1.0.5版以下的編輯器,若使用新版編輯器(如:1.6.x版),程式會在編譯階段出現錯誤訊息:

Webduino程式編輯錯誤

請下載、更新Webduino程式庫來解決這個問題。詳細步驟:

1. 前往Webduino程式庫網頁,按一下右下角的"Download ZIP"。

下載Webduino程式庫

2. 將下載後的Webduino-master.zip解壓縮到「文件」(或「我的文件」)資料夾,Arduino\libraries路徑底下。

解壓縮Webduino-master.zip

3. 把Webduino-master資料夾重新命名成Webduino

重新命名成Webduino

4. 重新開啟Arduino編輯器,即可成功編譯程式。

成功編譯Webduino程式

建立DHCP(動態IP位址)的網路程式

網站伺服器通常都是基於固定IP位址,不過,許多人的住家以及校園內的網路,都是採用動態IP(也就是由IP分享器指派IP位址)。為了方便執行Arduino網路程式實驗,程式可改成動態IP模式。

底下是採用Arduino內建的Ethernet.h程式庫,基於固定IP的乙太網路程式寫法:

基於固定IP的Arduino乙太網路程式

底下則是動態IP的寫法:

動態IP的網路程式

主要差別在於初始化乙太網路連線時,動態IP(DHCP)連線的程式,只需提供網路卡的實體(MAC)位址,其餘部份的程式碼無須修改。

同樣地,Webduino網路程式也可以改用動態IP:

Webduino動態IP網路程式

在Mac OS X 10.10.x (Yosemite) 中打開Arduino編輯器

若在Mac OS X 10.10.x系統下,直接雙按從arduino.cc(或arduino.org)官網下載的Arduino軟體,會出現底下的錯誤訊息:

Mac OS X無法打開Arduino

初次執行非Mac App Store下載的應用程式時,請在軟體上按滑鼠右鍵(或者按著Ctrl鍵,再按滑鼠左鍵),選擇「打開」:

按右鍵打開Arduino

再按下「打開」鈕:

按下打開鈕

日後就能直接雙按Arduino啟動了。

若開啟Arduino時,出現底下的訊息:

需要安裝舊版Java SE 6執行階段

請按下「更多資訊」鈕,連結到Apple公司的網站下載Java SE 6執行階段,即可順利執行Arduino。

Posts created 467

97 thoughts on “《超圖解Arduino互動設計入門》第二版補充說明

  1. 趙老師您好:
    從幾年前就開始買您的書(FLASH MX網頁動態教學, Flash MX與XML)直到最近超圖解Arduino互動設計入門(第一版)
    很喜歡老師寫的書的風格, 總是從中看到一些不同的想法

    最近遇到個arduino程式上設計的問題想請教老師, 我想從外部按鈕累加的數值來執行不同函數
    例如:
    數值是1, 則執行task_1()
    數值是5, 則執行task_5()
    數值是15, 則執行task_15()
    數值是x, 則執行task_x()

    請問除了用if 或shitch 判斷式外, 有沒有其他方式可以完成?
    我有想到陣列, 但陣列怎麼跟函數(task_1 ~ task_x)連在一起用, 沒頭緒, 也許不可行
    煩請老師指導, 感謝萬分

  2. 趙老師,你好:
    我目前用Max7219在做一個專案(供電5V),但是LED(3.6V/20ma共30顆)限流電阻按8-16頁(超圖解Arduino互動設計入門2)建議選擇22.6k歐母,但是 LED都太暗,我想請問這個表是如何計算而來? 我利用一般LED串聯電阻計算器都只得出70歐母,我實際將同一個LED接5V並串70歐母,LED亮度可以接受也沒有燒掉,請問我電路直接改成70歐母會不會有其他沒有評估到的風險?

    1. 書本8-17頁上方的Iset限流電阻表,取自MAX7219技術規格書第11頁的表11。規格書第10頁有提到,MAX7219每一段(segment,也就是IC的Seg. A, Seg. B, … Seg. DP腳位)建議最大輸出電流為40mA,此限流電阻值的最小建議值為9.69KΩ。

      依照你的實驗結果看來,你採用的應該是高亮度LED。如果需要驅動較大電流的LED顯示器,你可以參考Maxim晶片設計公司的”Using the MAX7219/7221 to Drive Higher Voltage or Current“技術文件說明,在MAX7219的每一段(segment)輸出腳位連接電晶體電路,放大驅動電流。

      thanks,
      jeffrey

  3. 感謝,我先K看看是否可以理解? 另外請問單位轉換的問題,在APP上輸入的TextBox應該是TEXT型態,如果我要傳過去Arduino是數字(Byte,0~99)的話(因在Arduino此接收到的Msg要拿來運算),要如何處理?

    1. Arduino控制板接收到的是字串格式,你可以透過atoi()函式轉換成數字,相關範例請參閱10-12頁的「動手做10-14」。

      thanks,
      jeffrey

  4. 趙老師,你好,那個文件我嘗試要消化,實在功力不夠。再來請教幾個問題。
    照文件,我的狀況用第一個圖的電路就可以解決(電壓5V下,要增加每個Segment的最大電流到100ma(原本只有40ma), 這個PFET電晶體的型號有建議嗎? 我不知道如何計算。
    圖一中的DIGI0-7是接到Max7219的腳位嗎? Anode digit drive(1-8)代表接到LED的陽級嗎?
    文件圖一是用共陽案例來說明,碰巧我是共陰設計,這線路要如何調整? 感謝您的指教

    1. MAX7219用於驅動共陰極LED,請參閱設計文件的圖4:

      電晶體B腳接MAX7219的segment輸出,電晶體選用9013或2N2222就夠了,依照你的需求,R1值為100Ω。此設計文件建議,搭配此電晶體電流放大電路時,MAX7219的限流電阻可提升到150kΩ。

      thanks,
      jeffrey

  5. 趙老師,感寫您耐心的回覆,有關圖4有幾點不明白,所謂0V代表是接地嗎? Cathode segment drive代表是LED的負極嗎? 請先看一下我的原理圖,如果把原本Segment A-DP接到每個電晶體的B極,那原本所有LED的陽極是否要另外提供不經過Max7219的5V接上去??
    電晶體的C極按上圖如果是是接到LED的負極,我不確定該如何接,因為每欄LED的陰極都接分別接到DIG 0-7去,好像不太對? 這部份的線路是否可以再描述清楚點~
    我的LED(5列各6個)理論上是否只需要用6個電晶體來放大?
    你提供的文件裡面有標Digit Drivers及Segment Drivers這是什麼意思? 我現在的設計是要看Segment Drivers這部份嗎?

    原始圖:
    https://www.dropbox.com/s/3e4p39emwmzh9ma/%E6%93%B7%E5%8F%96.JPG?dl=0

    1. segement(段)指的是七段顯示器的一段,或者LED矩陣裡的一個圓點;一個MAX7219可以連接8個七段顯示器,控制每個七段顯示器(或者LED矩陣中的一行,如8-18頁所示),是由digital(數字)決定。

      共陰極七段顯示器

      為了便於解說,我把電路簡化成連接一個LED的情況。驅動大電流或大電壓LED時,需要透過額外的電晶體或IC電路驅動;由於MAX7219也不能引入大量電流,所以SEG和DIG腳位,都需要連接電晶體或FET。

      MAX7219驅動大電流

      我昨天仔細閱讀此技術文件,它提到該文件裡的電路會將控制訊號反相,因此這個電路僅適用於「共陽極LED」七段或矩陣顯示器。

      MAX7219大電流驅動電路

      連接DIG腳的電路有三種選擇(圖1~圖3),你可以任選一個,SEG腳則連接圖4的電路;每個DIG和SEG接腳都要連接上圖的電路,總共需要連接8組。

      若要驅動大電流共陰極LED,你可以搜尋”MAX7219 ULN2803″關鍵字,即可找到相關電路圖和說明。

      thanks,
      jeffrey

  6. 老師您好 我想請問有沒有全書的實驗材料零件表彙整

    我現在看到的零件表是在章節的動手做旁邊 可是我想要一次把全書會用到的零件買齊

    請問有類似像這種的實驗材料數量彙整表嗎? 謝謝

  7. 老師您好,我想請教您如何把ds18b20溫度感測器的資料寫進webduino的網頁當中?

    1. 在網頁上顯示ds18b20溫度值的程式,概念和DHT11相同。

      假設你採用的是Dallas Temperature Control Library,根據該專案網頁上的範例程式,底下的敘述將能輸出ds18b20的感測值:

      sensors.getTempCByIndex(0)

      因此,以書本diy16_1.ino範例檔為例,你只要把defaultCmd()函式裡的DHT11相關部份,替換成ds18b20相關敘述即可,例如,關鍵輸出部份改成(註:if (chk == 0) … 部份的敘述也不需要了):

      server << "<h1>溫度計</h1>";
      server << "<p>溫度:" << dtostrf(sensors.getTempCByIndex(0), 5, 2, buffer)
             << "°C</p>";
      

      thanks,
      jeffrey

  8. 趙老師,你好
    http://embedded-lab.com/blog/high-voltage-seven-segment-led-display-driver-with-spi-interface/
    這篇文章是我認為與我線路最接近的的設計,它使用共陰LED,也是要改良可以用max7219來驅動高電壓的LED。但是它這個線路是驅動高電壓的LED(範例是14V),但是我的狀況是要驅動DC5V較高電流,因為Max7219限流40mA(我的專案是LED是3.6V/20mA六個Segment,每個Segmentu有5個),有幾個問題再請老師協助釐清:
    1.我的狀況如果要30個全亮其限電流算法是20mAx30=600mA還是以每個Segment計20mAx5顆=100mA??
    2.IC規格看不太懂,以上述網頁範例所用之Source driver,UDN2981來看,Input Voltage, VIN=15V(UDN2981 spec page 1)是等於pin腳的Vs嗎? 如果是,如果Vs是15V,那如何驅動Output Voltage Range, VCE到50V??
    3.這規格書內哪個規格是寫使用UDN2981會有多少壓降? 可以大概提一下看規格書的重點嗎? 真是太多數據了~~
    4.我用DC15V當Input,我計算要給到我的LED(3.6V/20mA)其限流電阻為570歐(範例中之R2-R9),但是我今天接上後發現改造後LED亮度居然沒有比單用Max7219亮,請問這會是哪裡有問題? 此時我嘗試拉高電壓到24V,確實亮度會跟著變亮(沒有管LED 限流電阻還是570歐),但是出現另個問題,就是沒有點亮的LED會溢光(微亮但是不應該亮),這又是何問題造成?
    以上問題還煩請老師指導一下,謝謝

    1. LED的電流要用單一segment計算,假設驅動一個LED需要20mA,點亮7段,就需要20mA x 7個電流量。

      我大致看了一下你提供的網頁,以及UDN2981技術文件,我覺得該作者有個地方算錯了。根據這份UDN2891規格書第3頁的數據,Vf最大電壓降為2V不是6V。所以,假設UDN2981的電源是6V,扣掉Vf的2V,輸出為4V,你的LED為3.6V/20mA,那限流電阻只需要20Ω。

      至於LED溢光,應該是UDN2981沒完全截止,請先嘗試在它的一、兩個輸入端(In)各連接一個4.7KΩ的下拉電阻(亦即,電阻另一端接地)測試看看,若沒有問題,再替所有輸入端連接下拉電阻。

      thanks,
      jeffrey

  9. 趙老師,您好,感謝這麼晚還在幫忙看問題。如果我解讀您的意思是,我的狀況是每的Segment(有5個LED)需要20mAx5=100mA。
    如果UDN2981 Vf是2V,那我把電壓提高到7V,輸出為5V,限流電阻還是可以用70Ω。但是結果還是一樣不夠亮,我實際去量UDN2981的Segment電壓輸出居然只有1.46~1.48V(當然LED就不會太亮)。所以我用電表接上去其中一個Segment量電流,如果要拉到100mA的話,UDN2981的輸入電壓需要到19.4V,這時每的Segment的電壓也約2.94~2.97V,這數據蠻符合LED廠商的規格(min forward voltage:2.9V/20mA)。只是我不太懂為何會這樣?? 為何 UDN2981輸入電壓為7V,經過限流及本身消耗外,經過Segment的電壓不是5V反而降到1.46V???
    如果按照這樣提高電壓到19.4V實驗結果,原本最怕LED壽命會減少,但是測量數據都在廠商的安全數據內,亮度也在可以接受下,直接用此架構出去,不曉得是否有其他沒看到的風險??
    以上還煩請老師指點,謝謝

    1. 請問你有另一個UDN2981可供實驗對照嗎?我覺得你目前連接UDN2981應該是故障了。

      或者,你先獨立測試UDN2981,輸入端先不要接其他IC,直接將其中一個輸入端連接5V或接地,對應的輸出端連接一個電阻和LED,測量它的輸出結果,輸出端的電壓降應該介於1.5V~2V之間。

      thanks,
      jeffrey

  10. 趙老師:
    請問我用範例如下面:
    結果網頁只出現以下反應:
    ————————————-
    這是微網站的首頁_bb。
    ————————————–
    // 使用Webduino程式庫建立微網站,增加faq.html頁面
    // 詳細的程式說明,請參閱第十六章,16-7頁。

    #include “SPI.h”
    #include “Ethernet.h”
    #include “WebServer.h”
    #include “Streaming.h”

    static byte mac[] = { 0xF0, 0x7B, 0xCB, 0x4B, 0x7C, 0x9F };
    IPAddress ip(192, 168, 1, 25);
    IPAddress subnet(255, 255, 255, 0);
    IPAddress gateway(192, 168, 1, 1);

    WebServer webserver(“”, 80);

    P(htmlHead) =
    “”
    “”
    “Arduino 微網站_伯特利”
    “” ;

    P(htmlFoot) = “”;

    P(homePage) = “這是微網站的首頁_bb。”;

    void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
    {
    server.httpSuccess();

    if (type != WebServer::HEAD)
    {
    server.printP(htmlHead);
    server.printP(homePage);
    server.printP(htmlFoot);
    }
    }

    P(faqPage) =
    “”
    “”
    “微網站FAQ”
    “這是FAQ網頁_伯特利”;

    void faqCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
    {
    server.httpSuccess();
    if (type != WebServer::HEAD)
    {
    server.printP(faqPage);
    }
    }

    void postCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
    {
    char name[16];
    char value[16];
    server.httpSuccess();

    if (type == WebServer::POST)
    {
    server.printP(htmlHead);
    while (server.readPOSTparam(name, 16, value, 16)){
    server << "參數 ” << name << " 的值是" << value << "”;
    }
    server.printP(htmlFoot);
    }
    }

    P(FORM) =
    “”
    “訊息:”
    “燈光: 開”
    ” 關”
    “”
    “”;

    void formCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
    {
    server.httpSuccess();

    if (type != WebServer::HEAD)
    {
    server.printP(htmlHead);
    server.printP(FORM);
    server.printP(htmlFoot);
    }
    }

    void setup() {
    Ethernet.begin(mac, ip, gateway, subnet);
    webserver.setDefaultCommand(&defaultCmd); // 處理「首頁」請求
    webserver.addCommand(“faq.html”, &faqCmd); // 處理「faq頁面」請求
    webserver.addCommand(“sw”, &postCmd); // 處理「sw表單處理頁面」請求
    webserver.addCommand(“form.html”, &formCmd);
    webserver.begin();
    }

    void loop() {
    webserver.processConnection();
    }

  11. 趙老師:
    對不起!發現自己的錯誤,因為沒有把後面參數/FORM.HTML放進去,才沒出現,現在已經可以了。

  12. 趙老師您好:
    這幾天試著用有i2c界面的lcd1602接上arudino, 按照網路上的說明,下載LiquidCrystal_I2C函數庫到arduino的library,接著執行範例中的helloworld時,先跳出win的錯誤訊息「”ox0048293b” 指令參考的”0x0160d478″記憶體。該記憶體不能為”read”」,接下來編譯就出現錯誤訊息
    「collect2.exe error: ld reutrned 5 exit status」
    「exit status 1」
    不知道老師是否知道可能是哪裏出錯了呢?
    註:作業環境為winxp,arduino 1.6.7,還有arduino的板子應該沒有壞,因為執行範例中的blink程式一切正常。

    1. 感謝趙老師的解答,這樣搭配果然沒問題,大成功。^^
      不過經測試後發現函數庫只適用於arduino 1.6.5,1.6.6-1.6.8執行都有問題,有點可惜。

  13. 趙老師,你好:
    我用APP inventor 透過藍牙(指令為SendByte-list)傳送一個不固定長度”數字”陣列(在APP inventor 是List)過去給Arduino後放入到另一個Array, 我整個傳收方式試好久都收不起來,可以請老師指點一下嗎? 重點就是APP inventor的一個list(數字)要透過藍牙傳到Arduino變成一個Array(byte)~~
    PS:我不太想一個一個傳,怕資料會lose,其次,傳過去的陣列的每個數字我都已經指定功能了,ex:1,2,..,10都已經指定其他程序,所以我要一次傳(1,2,5),希望不會啟動1,2,5這三個的個別程序

  14. 趙老師:超圖解arduino一書第18章存儲與比對RFID編碼一節,我在用標籤靠近讀卡器時,串口監視窗口總是會重複顯示多條相同紀錄值,出現這個問題的原因我想是因為標籤在靠近讀卡器過程中,讀卡器重複讀取了,如何才能避免合格問題呢?我用了趙老師的源碼也出現同樣的問題。

    1. hi lee:

      RFID讀取器的設計,本來就是會不停地發送感應到的RFID值。請嘗試底下的方法解決:

      1. 在循環代碼中,加入間隔時間判斷,大致像這樣:

      unsigned long preMillis = 0;
      const long interval = 2000;  // 假設讀取間隔時間為2秒
      
      void loop() {
        if (Serial.available() && ((millis()-preMillis) > interval)) {
          preMillis=millis();
      
          // 讀取RFID碼
          rfidData=Serial.read();
           :
        }
      }
      

      2. 將讀取到的RFID碼存入數組(array),新讀入的RFID值跟前一次讀取的RFID比較,如果相同,就略過不處理。比較數組的代碼示例,請參閱第18章的memcmp()函數說明。

      thanks,
      jeffrey

    2. 謝謝趙老師給了我思路,我終於做出我想要的效果了,讀卡器在讀取標籤時,不會重複讀了,即使需要重複讀,必須等待2s以後才可以再讀。而光盤中的代碼思路是只要有數據就讀,這樣會造成同一個標籤在靠近讀卡器的過程中,被讀卡器多次讀取,從而顯示多條重複記錄。
      // 负责读入 RFID 编码值的自定义函数,传回值型别为「布林」
      boolean readTag() {
      // 代表是否读入数据的变量,预设值为 0,代表没有
      boolean ok = 0;

      if (RFID.available()) { // 如果读卡机传入新的数据…
      delay(100); // 等 0.1 秒,让其余数字都传进来

      // 执行 14 次循环,读取缓冲区里的数字
      for (byte i=0; i<TAG_LEN; i++) {
      temp[i] = RFID.read();
      }
      RFID.flush(); // 清除缓冲区
      if(memcmp(temp,old_temp,14)!=0) //如果此次讀取的數據與上次的不同,則把此次的數據更新到old_temp數組中,ok返回1
      {
      for(byte i=0;iinterval) //如果此次讀數據時間距離上次讀取時間間隔超過2s,可以認為此次讀取有效
      {
      ok=1;
      preMillis=millis();
      }
      else //若兩次讀取時間間隔小於設定的2s,則認為此次讀取無效,ok置0
      ok=0;
      }
      }

      return ok; // 传回 0 或 1
      }

  15. 趙老師您好

    1.我試著直接在setup裡存動態IP並且用Ethernet.begin(mac)來初始化
    也的確可以連上微網站 但是Serial.print出來的ip確是255.255.255.255 請問我是哪裡出錯了嗎..
    2.看了老師Ethernet Shield的介紹 , 我的筆電連無線路由器,筆電用跳線接shield卻無法連上微網站,於是我試著用跳線接路由器才成功,但這卻不需要設定subnet跟gateway
    對不起還是初學者 不懂網路 問題有點多..

    1. hi 陳兄:

      WOW~看到您的e-mail是”rocketmail.com”,想到當年我第一次註冊使用的web免費電郵也是rocketmail~

      設定乙太網路連線裝置的IP位址,有「手動」和「自動」兩種方式。為了方便使用和管理,多數人都採用DHCP(動態主機設定通訊協定),讓裝置自動從網路基地台取得IP位址。

      以DHCP方式連線時,新加入區域網路的裝置尚未取得IP位址時,它會以”0.0.0.0″位址,朝向”255.255.255.255″傳遞請求IP位址的訊息。255.255.255.255是一個特殊的IP位址,代表「廣播」。

      區域網路裡的每個聯網裝置,都能收到:
      1. 傳給自己的訊息(亦即,傳給某特定IP的訊息)
      2. 傳向255.255.255.255的廣播訊息

      因為新人加入,不知道誰是群組裡的老大,所以它用廣播的方式把需求傳給區域網路裡的每個裝置。在群組裡負責分配IP位址(DHCP服務)的裝置,也將用廣播方式回應(因為新人尚未取得有效的IP位址):

      DHCP服務分配IP位址的流程

      從DHCP服務的廣播訊息中,新人得知老大哥的IP位址,並向它回應確認訊息,就能從DHCP服務正式取得IP、網路遮罩(netmask)、閘道器(gateway)和DNS伺服器等位址。以上這些步驟,都是自動完成的,我們的應用程式不用介入。

      當Arduino採用DHCP方式連線時,只需要設定乙太網路晶片的MAC位址,不需要額外手動指定IP和其他位址設定。

      乙太網路的「跳線」,用於「一對一」連接兩個裝置,中間不透過路由器(閘道)交涉,因此,兩端的連線裝置只需要手動設定IP位址和網路遮罩(用於設定兩者位於同一群組)。

      thanks,
      jeffrey

    2. 謝謝趙老師回應!! 話說那個rocketmail的信箱是我國中去雅虎辦帳號剛好有這個選項 也不知道這個郵件伺服器主機是誰提供的 現在好像無法申請了?

      1.再請問老師,網路卡用跳線接筆電(筆電使用WiFi連上網路),這樣會連不上微網站耶,不知道我還是有那裡誤解? 因為路由器離我有點距離 , 我希望可以接筆電

      2. 上次的程式找到問題點了
      Ethernet.begin(mac);
      IPAddress ip = Ethernet.localIP();
      這兩行我的次序顛倒了,但是可以連上微網站,卻無法print出正確IP XDD

      3.連上網站後 我確定HTML的部分有加上 雙引號內的雙引號也有加上反斜線 然而中文字卻還是亂碼

    3. 如同上一則留言提到的,跳線僅用於一對一連線,所以你應該把Arduino連線到路由器。或者,你可以嘗試把有線和無線網路都改採固定IP再測試看看。

      至於網頁中文亂碼的問題,你可以剪貼書本diy15_3.ino檔裡的loop()函式,我確定該檔案的中文網頁沒問題,或者,你可能需要確認一下瀏覽器的文字編碼設定。

      thanks,
      jeffrey

  16. 趙老師你好,

    我是個arduino的新手,您的書對我來說深入簡出淺顯易懂,有這本超圖解Arduino互動設計入門2真是幫了我大忙!

    我目前想利用LilyPad同時接上NFC和BLE,但LilyPad上只有一組TX/RX,不知道這種需求該怎麼做?用兩片LilyPad??

    我有找到一片板子 LilyPad Simblee BLE Board 有整合了BLE進去( http://www.playrobot.com/rfduino-simblee/1400-lilypad-simblee-ble-board-rfd77101.html?search_query=Simblee&results=4 ),不知道這塊板子適合我的需求嗎?

    謝謝~

    1. hi rex:

      可以用SoftwareSerial(軟體序列埠)把一般的數位腳模擬成序列埠,連接序列通訊模組,你可以參考14-10頁的「使用軟體序列埠連接Arduino與藍牙模組」單元。

      thanks,
      jeffrey

  17. 老師您好:
    我目前正在研究一套系統,流程如下:
    PC→ARDUINO UNO→FTDI FT232RL(USB TO TTL)→TES-1394S(電磁波探測器)
    PC透過串列埠傳送指令給ARDUINO,ARDUINO再透過FT232RL傳送指令給TES-1394S(電磁波探測器),然後PC端顯示TES-1394S的資訊
    目前測試都無法順利傳送指令出去,當然也無法收到TES-1394S的資訊內容!
    想請老師指點一下學生,謝謝!!

    1. 如果Arduino和電腦端的序列連線沒問題,請確認感測器的序列通訊格式(如:傳輸速率)和指令格式(如:是否需要\n字元結尾)。

      thanks,
      jeffrey

  18. 老師您好:
    PC→ARDUINO序列埠的部份,我下指令123給他,他回傳123給我,表示這部分連線應是沒問題的!
    但是ARDUINO要透過FTDI FT232RL(USB TO TTL)抓取TES-1394S(電磁波探測器)的資料卻是失敗的!
    學生看了很多文章,發現FTDI FT232RL模組通常是做在ARDUINO前端,PC燒入程式至ARDUINO中,而學生是將FTDI FT232RL做在ARDUINO後端,做為ARDUINO跟TES-1394S(電磁波探測器)的訊號轉換,不知道這個流程做法是否有錯?
    另外想請問老師,如果我要從序列埠下4個BYTE的指令(HEX),並且希望收到的資訊是6個BYTE的(DEC),不知道老師是否可提供學生,這部份的類似範例呢?
    麻煩老師了,謝謝!!

    1. 1. Arduino之所以要搭配FT232RL之類的晶片,是因為微控器本身只支援TTL的UART序列介面,要透過晶片轉換成USB的序列訊號,才能與電腦相連。
      2. 你提到的感測器,我不知道它的電氣訊號規格,無法回答。
      3. 送出4bytes,收到6bytes?那多出的兩個bytes是什麼?你不用管訊號是16進位還是10進位,那些沒有意義,電腦只認得2進位,不同的進制多半只是為了方便人類描述。

      thanks,
      jeffrey

  19. 老師您好:
    1.由於TES-1394是用USB傳輸訊號,所以按照老師說的意思,使用FTDI FT232RL(USB TO TTL),不管是在前端還是後端,是沒有差別的囉? 因為前端是PC (USB TO TTL) ARDUINO,後端是ARDUINO(TTL TO USB)TES-1394 這樣的接法是沒有問題的囉?
    2.TES-1394 資料並不多
    https://www.youtube.com/watch?v=gec5Bq6ULEM
    http://docs-europe.electrocomponents.com/webdocs/12c3/0900766b812c3d8d.pdf
    3.會送出4個BYTE,是因為TES-1394S(電磁波探測器)他提供的協議,而為什麼是送回6個BYTE,是因為他有XYZ三軸,會顯示X LOW BYTE,X HIGH BYTE….六個資訊! 所以在序列埠下指令時,是輸入2進制方式,在經由程式去轉為其它進制嗎?

    1. oh, 原來那個電磁波探測器是一個儀表啊~
      既然它已經內建USB介面,為何你不直接接電腦,要用Arduino轉接?
      抱歉,我幫不上忙~

      thanks,
      jeffrey

  20. 老師您好:
    因為會用到將近百台的電磁波探測器,所以無法每一台都搭配一台PC,才會改用ARDUINO來轉接!

    1. 了解。我覺得比較好的解決方式,不應該是透過Arduino轉接訊號,而是要讓Arduino當作「開關」…假設你把10台儀器的USB線剪斷,一端連結儀器,另一端連到一個開關,由開關決定哪一台要連到電腦,Arduino控制的是開關,不涉及當中的訊號傳輸,有點像是「交換器」的感覺。

      good luck!
      jeffrey

  21. 老師您好:
    目前的狀況卡在一對一的時候也無法成功讀取到TES-1394S(電磁波探測器)的數據呢!!所以還沒到多對一的測試!
    而且這個系統無法照老師建議的那樣做,理想狀態是希望輸入一個指令,就能收到全部TES-1394的數據資料!
    另外我想請問老師,ARDUINO內有這種函式或寫法嗎? USBSerial usb = new USBSerial( “VID_2341”, “PID_0043” );

  22. 老師您好:
    想請問老師使用過 Arduino + USB Host Shield 的模組嗎?
    現在我可以讀取到USB(電磁波探測器),但是不知該怎麼下達指令控制他回傳資訊!
    讀到的資訊如下:
    0000: 05 FF 09 FF A1 01 05 01 19 00 29 FF 15 00 25 FF
    0010: 75 08 95 40 81 02 05 02 19 00 29 FF 15 00 25 FF
    0020: 95 08 75 40 91 02 C0
    Usage Page Undef(FF)
    Usage
    Collection Application
    Usage Page Gen Desktop Ctrls(01)
    Usage Min(00)
    Usage Max(FF)
    Logical Min(00)
    Logical Max(FF)
    Report Size(08)
    Report Count(40)
    Input(00000010)
    Usage Page Simu Ctrls(02)
    Usage Min(00)
    Usage Max(FF)
    Logical Min(00)
    Logical Max(FF)
    Report Count(08)
    Report Size(40)
    Output(00000010)
    End Collection

    麻煩老師指導我一下! 謝謝~

    1. 不好意思,我沒用過USB Host Shield,也沒用過電磁波偵測儀器。

      thanks,
      jeffrey

  23. 老師您好,請問:
    1. Ch9 ( LCD ) 當中,有背光模組的LCD採並連,再加上DHT11作溫濕度數據顯示,發現LCD背光接腳不能加電阻,因為我加了220Ω的電阻後背光功能顯得不佳。老師有試過嗎?
    2.我把麥克風和LCD串連及DHT11的程式和電路整合了,但程式上傳後Arduino的電源指示燈慢慢熄掉了。為什麼?

    1. hi 阿泰:

      1. 我的LCD顯示器的背光LED有加限流電阻,並沒有功能不佳的問題。
      2. 麥克風放大器、LCD顯示器加上DHT11的消耗電流,並不會超過Arduino板的上限,請檢查是否某個模組的正負電源接反了或者短路。

      thanks,
      jeffrey

  24. 老師你好:
    Ch10控制直流馬達一節,我手邊目前沒有0.1uF-25V的陶瓷電容,只在家中找到剩餘的:鉭質電容0.1uF、麥拉電容0.1uF-100V、麥拉電容0.1uF-25V、積層電容0.1uF、法拉電容0.1uF-16V、電解電容0.1uF-16V而已。請問這些電容可以用嗎?

  25. 趙老師您好:
    因我不是本科系,電子電路初入門,對老師書中所述有迷惑之處還請老師釋疑一下…
    《超圖解Arduino互動設計入門》第二版書中
    (1)[P.10-29頁的L298N接腳圖]及[P.10-30頁中間的L298N電路板圖]與
    (2)[P10-29頁最後一段話:一組馬達都有三個控制接腳,除了「致能 A」還有「輸入 A」和「輸入 B」]及[P.10-30頁的表10-5]
    感覺(2)中的表格及說明很像和(1)中的圖片有衝突,有點看不明白;為何在(2)的說明及表格中,對A馬達的控制是[致能 A]、[輸入 A]、[輸入 B],而不是[致能 A]、[輸入 1A]、[輸入 2A]?

    1. WOW~那個圖表我翻閱了N遍都沒看出問題,非常感謝你!!我標錯了,是1A和2A,不是1A和1B,謝謝!

      thanks,
      jeffrey

  26. 老師好,請教老師一個問題:
    《超圖解Arduino互動設計入門》第二版書中
    我依「動手做9-3串列連接LCD顯示模組」,接好麵包板線路後,依P.9-17頁所說,實做了幾次,本該顯示出的字是「LiquidCrystal_SR」,但結果第一次卻顯示出[LiquidCrystal]+[亂碼],拔掉USB線再接也是一樣,只是[亂碼]顯示不同,然後我將麵包板線路拔掉重新再接一次,結果更慘…螢幕顯現的都不是該顯示的字,不知老師是否知道這是哪邊出錯才會產生這種結果?

    1. 這…我自己測試電路沒問題,也將它焊接在PCB洞洞板上,除了接錯和雜訊干擾(IC的電源有接100nF電容嗎?),我也不知道原因。

      之前有台中高工的老師跟我說,他的學生接麵包板電路時,用肉眼檢查N遍都沒問題,但是電路就是無法運作,把IC拔到其他同學的板子上也沒問題。
      後來用三用電錶逐一測量線路…發現某一條導線接觸不良,因為導線塑膠皮外觀正常,所以沒發現。

      thanks,
      jeffrey

    2. 我當時有按圖接上電容,但聽老師這麼一說…
      我用的麵包板有一片很像是十幾二十年前的,難道是麵包板接觸不良的關係!有空時我再試一次看看…
      謝謝老師~^_^

  27. 老師您好:
    再請教老師幾個問題:
    《超圖解Arduino互動設計入門》第二版書中
    (1)依書中附錄B的方式所燒錄出來的ATMega328P-PU內的Bootloader,和市售Arduino UNO R3板子中的ATMega328P-PU裡面的Bootloader有一樣嗎?目前市售Arduino UNO板子有到R3的版本,請問Arduino UNO和Arduino UNO R3這兩種板子中的ATMega328P-PU裡面的Bootloader有一樣嗎?
    (2)依書中附錄B的燒錄方式,第B-3頁中的第4項:從「工具/板子」選單選擇要燒錄的Bootloader版本,請選擇「Arduino Duemilanovew/ATmega328」,但目前的ARDUINO IDE開發軟體1.6.12版本中沒這個選項?請問老師該選哪個較恰當?(我用的是Arduino UNO R3的版子)
    (3)「動手做10-2隨機數字與燭光效果」,因顯示不是很明顯,所以我改了數字…
    void loop() {
    analogWrite(ledPin, random(255));
    delay(random(1000));
    }
    我分別使用市售的Arduino UNO R3板子和依書中附錄B所做出的Arduino板(燒錄時板子我選擇[Arduino/Genuino Uno]),去實做,同樣的程式,但執行程式時顯現出的結果不太一樣耶…
    自己燒錄出來的Arduino板LED的變化只是明暗長短時間上的變化,無法像市售Arduino UNO R3板接的LED還能顯現出明暗之間的漸層亮度的變化?請問老師怎會有如此差異?是我燒錄出了什麼問題嗎?

    1. 1. Arduino UNO和UNO R3版的主要差異在於USB轉TTL序列晶片不同,還有電路設計上的些微差異(例如,Reset電路新增一個二極體),Bootloader應該是一樣的。
      2. Arduino UNo的前一代是Duemilanove,兩者的主要差異仍是USB轉TTL序列晶片。自製的Arduino板通常搭配現成的USB轉TTL序列模組,整個電路同於Duemilanove板,所以麵包板的Arduino才會使用這一款Bootloader。

      我剛剛使用UNO板的Bootloader燒錄(亦即,燒錄韌體之前,板子類型選成Uno),使用USB轉TTL序列模組連接自製的Arduino板,上傳Blink閃爍程式測試,也可順利執行。

      3. 這個問題我也覺得很神奇,不解,我明天測試看看。

      thanks,
      jeffrey

    2. 老師抱歉…
      第(3)問題剛剛我才發現…原來是我從電腦將Arduino程式傳輸到麵包板做的Arduino板後,忘了把100nF(104)電容裝回去了,裝回去後就正常了…
      但現在又多個疑惑…
      不好意思,再請問老師一下…
      若依P.B-6頁的圖做成Arduino板後,要使用P.B-9頁或P.B-10頁的方式從電腦將Arduino程式傳到自製的Arduino板上去執行,但是若不把P.B-6頁自製的Arduino板上面的10K歐姆電阻、330歐姆電阻、100nF電容等拔掉就直接傳輸,這樣可以嗎?會不會有什麼影響?

    3. B-6頁電路的330歐姆電阻,是LED的限流電阻,如果你的程式沒用到13腳的LED,可以不用接。
      10K歐姆是Reset腳的限流電阻,其目的是不讓微控器重置,可直接連5V;但是!!!如果你打算替Reset腳設置一個開關,這個電阻不可少,請參閱4-7頁說明。
      100nF是抗雜訊用的電容,拿掉它,微控器可能無法穩定運作。

      thanks,
      jeffrey

    4. 老師不好意思,因我想依老師的書也焊一塊Arduino板,但我還是不知該怎做…
      (1)10K歐姆電阻可否直接焊死在電路板上?
      若10K歐姆電阻跨接在ATMega328P-PU的第1腳與+5V電源端,將其直接焊死在電路板上,並加焊個小開關來做Reset使用…
      若將此Arduino板用B-9頁的方式來傳輸Arduino程式時,不拔除10K歐姆電阻,而直接接一條線連接ATMega328P-PU的第1腳與市售的Arduino板的[數位2腳]可以嗎?
      (2)100nF(104)電容可否直接焊死在電路板上?
      因P.B-9頁及B-10頁的兩個傳輸方式,圖上都沒接100nF(104)電容,若依P.B-6頁的接線將元件焊死在電路板上(含100nF(104)電容),將此自製的Arduino板用B-9頁或B-10頁的方式來傳輸Arduino程式時,不拔除100nF(104)電容可以嗎?
      麻煩老師了…謝謝!…^_^

  28. 老師您好:
    >>之前的LCD+Mic+DHT11還是相同的結果。有替換方法嗎?
    >>我打算自己燒ATMEL的AT MEGA 328P-PU空白晶片的Bootloader的程式,但手邊的石英震盪器是不同型號(就是比書上的還要厚一些的那種),這樣也可以嗎?

    1. 1. 請問你有測量過Mic電路有無短路嗎?
      2. 可以,只要是16MHz即可。

      thanks,
      jeffrey

  29. 老師您好:
    1:麥克風電路檢查完均未短路,是否需要改成外部電源供電?
    2:之前的電容均正常,謝謝!

  30. 老師您好:
    1.我使用行充:5V/1A,USB A─B接頭及9V外部電源皆有改善,謝謝!
    2.實際使用鉭質電容時,它是有分極性的。所以鉭質電容是極性電容,Ch2中電容介紹可以修正。謝謝!

  31. 您好!個人在讀Arduino互動設計入門(第二版)
    發現書裡面有程式錯誤!
    在第17-21頁

    現在新版的Arduino(1.6.12)對String的一些功能有做些小修正!
    (以下為個人實測)
    比如書上寫 hello Worl d !
          012345678910 11

    但是現在已經更改為 hello wor l d !
              12345678910 11 12
    書上寫字串額取 ello 是:
    str.substring(1,5)
    但現在是:
    str.substring(2,6)

    書上寫字串取出字元d是:
    str.charAt(10)
    現在是:
    str.charAt(11)
         
    這是一個蠻重要的問題的!所以再次分享出來!
    希望不要有人用了新版Arduino程式就寫不出來!XDDDD

    1. hi unrealin:

      我剛剛在1.6.11和1.6.12測試,字元的編號都是從0開始,如果從1開始,不符合C語言的慣例。

      測試程式:

      String str = "hello world!";
      
      void setup() {
        Serial.begin(9600);
        String temp = str.substring(1,5);
        Serial.println(temp);  // 輸出 ello
      }
      
      void loop() {
      
      }
      

      thanks,
      jeffrey

  32. 老師您好:
    我用CD附的範例做Webduino練習, 中文都會出現亂碼. 後來發現將範例的中文字刪掉(句點也要), 再重打一次就好了. (不懂為什麼)
    另請老師指點方向, 我想做個加熱器的監控. 類似動手做16-1與16-4的合併. 在一個page下, 能顯示溫度值(二秒更新一次), 並可手動開啟或關閉加熱器.
    麻煩老師了, 謝謝.

    1. hi nick:

      1. 應該是編碼的問題;我之前遇到的情況是,開啟原始碼,裡面的中文全是亂碼,
      選擇「工具→修正編碼並重新載入」就解決了。
      2. 比較好的方法是透過jQuery (JavaScript) 動態更新頁面。

      thanks,
      jeffrey

  33. 那我這邊發生甚麼事……..
    程式是(以下)
    這個程式是用來控制 R L 馬達 255 -255 的程式
    比如我從電腦端送出R-255

    我測試的結果是check如果要=R的話 要 charAt(1)
    擷取-255擇要subString(2,6)

    我的測試結果就是如此………?敬請賜教
    謝謝Thank you~~~
    String strIn = ” “;
    boolean lineEnd = false;
    char check;
    int speed_left,speed_right;

    int strToint(String s){
    char buf [s.length() + 1] ;
    s.toCharArray(buf,sizeof(buf));
    return atoi(buf);
    }

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

    }

    void loop() {

    while(Serial.available()){
    char s = Serial.read();
    strIn += s;
    if(s == ‘\n’){
    check = strIn.charAt(1);
    if(check == ‘L’){
    speed_left = strToint(strIn.substring(2,6));
    Serial.println(speed_left);
    } else if(check == ‘R’){
    speed_right = strToint(strIn.substring(2,6));
    Serial.println(speed_right);
    }
    strIn = ” “;
    }
    }
    }

  34. 有一块Arduino UNO WiFi的板子,怎么通过WiFi传输数据。可以举个例子就通过WiFi传个字符串到电脑的某个端口。

  35. 有一块Arduino UNO WiFi的板子,怎么通过WiFi传输数据。可以举个例子就通过WiFi传个字符串到局域网中电脑的某个端口(例如 192.168.43.211的8080端口)。你的回复看到了,谢谢,但是自己还是不会写,写的大多都有问题,能不能帮我写个简单发送字符串的程序。

    1. 你好, 作者的二本超圖解我都有購買, 裡面的內容都很淺顯易懂, 連我不是本科系的人都看得懂, 所以我想你應該也能從裡面學習到很多東西.
      分享給你我學習這二本書的經驗 : 並不需要一開始就要從頭開始寫程式, 除非你真的有相關的底子. 建議你可以先將書本的範例跑過一遍, 確定在你的環境下執行都正常, 這個時候你就可以從範例裡的程式一點一點的變更, 然後看看結果有什麼差異. 這樣一步一步累積經驗, 慢慢的寫出你自己需要的程式就很簡單了. 至少看完這二本超圖解, 我可以很順利的寫出我需要的程式. 也希望你能試試看~~~

  36. 你好, 最近自己在做一個用LED種植物的作品, 想運用行動電源來當作電源供應Arduino和LED. LED的規格為1W紅光LED(2.1~2.2V, 350mA), 根據書中”用歐姆定律計算出限流電阻值”來計算需要使用的限流電阻, 發現LED以2.2V來計算, 需採用8 ohm的電阻, 但消耗功率卻高達0.98W, 實用上則需選為將近2W的電阻(依書中建議, 需選用一倍)! 這樣應該是很耗電. 後來想到PWM這個東西, 又回頭查了一下第10章PWM的定義, 發現PWM可以調節電壓的變化. 所以我想請問一下:
    1. 假如我利用analogWrite(5,153), 理論上會得到3V, 限流電阻選用2 ohm, 消耗瓦數0.28W(實際上選1/2W), 這樣的理解是正確的嗎?! 還是有其它更適合或更省電的方法?!
    2. 我對PWM的理解是(假設以要得到2.5V的電壓為例):以5V的電壓輸出0.5秒, 然後關閉0.5秒. 不知道是否正確?! 如果正確, 是否會有短時間5V的電壓通過LED而燒毀?!
    不好意思, 因為我不是電子相關科系的, 所以不是很確定我對書中的理解是否正確~ 再麻煩你幫忙解答一下~~~謝謝~~~

    1. 你的需求似乎是要把5V電壓降轉成2.1V,如果是的話,建議購買DC-DC(直流電壓)轉換模組,價格低廉、體積小,而且轉換效率也很好(同樣採用PWM變頻技術)。行動電源、手機、電腦…等產品,都有搭載這種電源轉換晶片。

      我以前有買過最高可輸出32V, 4A的直流電壓升壓板,提供你參考(你需要的是降壓板)。

      至於第2點,我覺得高脈衝電壓長久下來還是會影響到電子元件的壽命,像5V的電壓經過PWM模擬成2V,極短時間內的脈衝輸出訊號仍是5V。最好是銜接電容、電感之類的濾波電路,把脈衝轉變成比較平滑的電壓輸出。

      所以用現成的電壓轉換模組是最佳方案,只要確認轉換的輸出電壓和最大電流即可,直接連接LED就好。

      thanks,
      jeffrey

    2. 你好, 感謝你的回覆.
      假設我用降壓模組將電壓調成2.1V, 最大輸出電流1A, 那我限流電阻應該如何選擇呢?! 因為這樣算起來, 跨在電阻二端的電壓為0V, 所以用之前的計算方式算出來是0 ohm. 還是如果電壓是2.1V, 就不用加限流電阻了?!

    3. 沒錯!就像行動電源把3.7V電池升壓到5V,即可直接供電給手機一樣。

      thanks,
      jeffrey

  37. 超图解arduino一书第4章充电知识 “LED的正确接法” 有点疑惑,向赵老师请教:若直接把LED接在8脚,8脚设为高电平,LED会烧毁吗?您在书中指出arduino每只脚位可输出20mA,指的是脚位直接对地短接的时候达到20mA吗?在接有负载时输出电流小于20ma?
    期盼赵老师能给予解答,谢谢!

    1. 可输出20mA,代表最大能驱动20mA的外设,实际消耗的电流取决于你连接的负载。直接连接LED,但是不串连电阻,LED的寿命会减短(我没有长时间测试过)。

      thanks,
      jeffrey

    2. 谢谢赵老师耐心回复,我的理解是引脚直接接地,并且输出高电平,此时输出电流我认为是最大的,赵老师说的最大可输出20ma,与我前面描述的情况,是一样的吗?老师说的输出20ma时,引脚应该还保持在高电平状态吗

    3. 假如输出脚接地,然后输出高电位,那就短路了,那个接脚应该会烧毁。换个角度思考,连接负载之前,你要先阅读技术文档,如果该负载消耗电流小于20mA,你就可以直接用微控制器驱动;否则,就需要透过晶体管或其他芯片驱动。

      thanks,
      jeffrey

  38. 您好,我依照上述更新了函數庫,執行16-4結果出現以下訊息,我使用的版本是18.4
    請問要如何修改呢?

    D:\蝭??ch16\diy16_4_switch\diy16_4_switch.ino: In function ‘void setup()’:

    D:\蝭??ch16\diy16_4_switch\diy16_4_switch.ino:117:42: warning: invalid conversion from ‘void (*)(WebServer&, WebServer::ConnectionType)’ to ‘void (*)(WebServer&, WebServer::ConnectionType, char*, bool)’ [-fpermissive]

    1. 請問你的控制板有選擇Arduino Uno嗎?
      程式庫可直接使用光碟裡的「程式庫」檔案,將它們複製到「文件\Arduino\libraries」路徑。
      我測試編譯沒有問題。

      thanks,
      jeffrey

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top