《超圖解Arduino互動設計入門》補充資料、勘誤及目錄大綱

本文補充《超圖解Arduino互動設計入門》書籍的技術文件資料下載連結、勘誤以及目錄大綱。

《超圖解Arduino互動設計入門》書籍封面

《超圖解Arduino互動設計入門》的目標是讓高中以上,沒有電子電路基礎,對微電腦、電子DIY 及互動裝置有興趣的人士,也能輕鬆閱讀,進而順利使用Arduino 控制板完成互動應用。因此,實驗用到的電子和程式觀念,皆以手繪圖解的方式說明。

書中涉及某些較深入的概念,或者和「動手做」相關,但是在實驗過程中沒有用到的相關背景知識,都安排在各章節的「充電時間」單元(該單元的左上角有一個電池充電符號),像第三章 3-26 頁「記憶體類型說明」,讀者可以日後再閱讀。

充電時間

《超圖解 Arduino 互動設計入門》基本資料:

各大網路書店與購物商場連結:

內容勘誤

【2013/04/07 更新】

  • 9-25頁:第二段,600µs (毫秒…,正確的單位名稱是微秒
  • 13-4頁:表13-1上方的說明文字,「對照表(單位.png) Hz)」,當中的 ".png)" 是多餘的。
  • 14-12頁:內文提到的AccessPort軟體,並未收錄在書本DVD光碟,請讀者到AccessPort的官網(sudt.com)下載
  • 15-27頁:底下的程式片段:

    正確是:

  • D-13頁:4N25電路圖底下的「接TRIAC的T1腳」,正確是「接TRIAC的A1腳」。有些廠商的TRIAC元件用A1和A2來標示陽極腳位,有些則標示成T1和T2(代表Terminal 1, 終端腳1)。

【2013/04/08 更新】

  • 5-4頁,第一行「序列埠通訊視窗」,正確是「序列埠監控視窗」。
  • 14-10頁,實驗說明裡的「序列埠通訊視窗」,正確是「序列埠監控視窗」。
  • 18-10頁,RFID麵包板電路組裝圖中的蜂鳴器元件是多餘的。
  • 附錄E,"BTRobotControl.apk"(藍牙遙控機器人APP)無法送出「左轉」訊息,請參閱這篇文章,下載修正之後的APP和原始檔。

【2013/04/20 更新】

  • 10-24頁,倒數第二段最後一行,「反電動式損害電晶體」,正確是「反電動勢…」。
  • 10-31頁,第一段第一行中的「表 10-4 」,正確是「表 10-5」。

【2013/04/27 更新】

  • B-7頁:第一段倒數第二行,「參閱動手做 B-2」,正確是「動手做 B-1」。

【2013/04/30 更新】

17-34頁:書本裡的程式是正確的,但是光碟的”接接樂Firmata.fla”程式有誤(main場景的34~38行):

function receiveData(e):void  // 接收Arduino的資料
{
   var n:Number = Number(e.data);
   bian.moveX(n * 0.54);
}

請將上面的敘述改成書本17-34頁的敘述:

function readAnalog(e:ArduinoEvent):void  // 接收Arduino的資料
{
   var n:Number = Number(e.value);
   bian.moveX(n * 0.54);
}

然後,在25行的這一行敘述:

var a:Arduino = new Arduino("127.0.0.1", 5331);

後面新增底下的敘述(請參閱17-33頁說明):

a.addEventListener(ArduinoEvent.ANALOG_DATA, readAnalog);

【2013/05/13 更新】

第九章並接式LCD中,初始化LCD程式庫,設定接腳的程式有誤,9-5頁的接線圖是正確的。9-6的程式碼有誤:

錯誤的初始化LCD程式庫,設定接腳的程式。

正確的LCD資料腳位設定敘述如下:

正確的初始化LCD程式庫,設定接腳的程式。

影響的內文(頁數):9-6, 9-7, 9-12, 9-18和9-23。

【2013/05/19 更新】

  • 5-10頁,中間的圖說「封包(package)」,正確是「封包(packet)」。
  • 10-22頁,NPN型的電晶體將負載接在C腳(集極),PNP型電晶體…,應改成「NPN型的負載接在電源端;PNP型的負載接在接地端。」

【2013/06/29 更新】

  • 8-16頁8-17頁的MAX7219矩陣LED麵包板的第7腳,接線有誤,正確是:

組裝MAX7219 LED矩陣電路麵包板

  • B-4頁補充:使用UNO板燒錄Bootloader(開機啟動程式),在插上10uF電容之前,請先上傳B-3頁說明的ISP程式。上傳ISP之後,執行燒錄之前,請從Arduino軟體的「工具→板子」選單,選擇要燒錄的bootloader版本,以B-2的範例而言,請選擇Arduino Duemilanove w/ATmega328

【2013/07/18 更新】

  • 10-9頁,timer 2 對應的腳位是數位311腳,其PWM頻率設定語法為:
    TCCR2B=TCCR2B & 0b11111000 | 0×02;
  • D-13頁,4N25的橋式整流電路正確是:

    4N25零交越檢測電路

    為了避免橋式整流器部分接錯,同時減少接線,可以採用現成的「橋式整流器」,如下:

    4N25零交越檢測電路

    橋式整流器有多種耐電壓和安培規格,選購時,至少選用400V/1A。它的外觀有圓有扁,上面有交流和+, -符號。

【2013/07/21 更新】

【2013/08/28 更新】

  • 2-3頁,第二段最後的單位”mA”,正確中譯為「毫安培」。
  • 3-18頁,表3-1,類型boolean佔用記憶體大小寫著「1位元」,實際是佔用8位元。
  • 4-20頁,倒數第三段第二行,「源流(Source Sink)」正確是「源流(Source Current)」。
  • B-12頁,圖片中的”DTS”標示,正確是”DTR”。

【2013/09/10 更新】

B-9頁,電路圖的正確接法如下:

【2013/11/07 更新】

7-6頁,中間的圖解,"abcdefg"的順序有誤,更正如下:

在Arduino的埠D輸出七段LED訊息

8-10頁,MAX7219的要點補充說明:需要搭配「共陰極」LED;在MAX7219的規格書「一般說明」(第一段文字)寫著:”common-cathode display drivers”(共陰極)驅動器。

8-35頁,「動手做8-6」的LED矩陣逐字捲動效果程式,並無法顯示文字,請在此下載更新後的diy8_6程式,程式修訂說明請參閱此留言

補充說明:使用MemoryFree.h程式庫檢查剩餘的主記憶體空間

Arduino有個MemoryFree.h程式庫,可檢查目前可用的記憶體量。下載並存入libraries資料夾之後,可在程式中透過MemoryFree.h的freeMemory()函數,傳回可用的主記憶體位元組(byte)數。如範例程式所示:

#include <MemoryFree.h>   // 引用程式庫

// 佔用14位元組的字串資料(含結尾的null字元)
char str[] = "Hello, world!";

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

void loop() {
   Serial.println(str);
   Serial.println(freeMemory());  // 顯示剩餘的記憶體量
   delay(1000);
}

用類似的方式,執行舊的diy8_6程式,序列監控視窗將顯示負值,代表記憶體空間不足:

剩餘的記憶體數量

在更新後的程式上測試,則得到如下的結果:

剩餘的記憶體數量

D-12D-14頁的動手做D-1單元,所採用的「零交越檢測元件」,正確的編號是H11AA1(書本內文多寫了一個1),接MOC3020M第1腳的電阻是它內部LED的限流電阻,電路圖上畫的是180Ω,但我實際在板子上焊接的是1KΩ電阻(如下圖)。其實跟外部的LED一樣用470Ω電阻或330Ω就好了,180Ω也可以。

焊接在萬用PCB板的交流電調光器

更新後的調光器電路圖:

交流電調光器電路圖

資料文件與視訊影片下載

  • 最新版本的Arduino開發工具軟體,請到Arduino官方網站下載。
  • 第五章提到的ASCII字碼對照表,請參閱維基百科的ASCII條目
  • Arduino創始人在TED大會的演說 (Massimo Banzi: How Arduino is open-sourcing

  • 導演Rodrigo Calvo和Raul Alejos拍攝了一部紀錄片Arduino: The Documentary(有英文和西班牙文字幕),由Arduino的創始者訴說Arduino的誕生過程,還有運用Arduino製作出開放軟/硬體原始碼的3D印表機"MakerBot"的創辦人Zach Smith,和其他互動設計師的訪談紀錄,以及在工廠大量生產Arduino微電腦的片段。

電子零組件的技術資料下載

原本計畫收錄在書本光碟鋰的技術資料文件,為避免涉及著作權問題,在此提供連結(皆為PDF格式)。

第三章「Arduino互動程式設計入門」,ATMEL公司的"Efficient C Coding for AVR"(直譯為:AVR 晶片的高效 C 程式設計)技術文件

第六章「類比信號處理」,運算放大器(OP-Amp)技術文件:LM358LM741

第七章「LED七段顯示器」,8位元位移暫存器(shift register)74HC595

第八章「LED矩陣與SPI介面控制」,SPI介面的8個七段顯示器,或者一個8×8 LED矩陣顯示器驅動ICMAX7219

第九章「LCD顯示器+溫濕度感測器+超音波感測器」:

第十章「變頻控制LED燈光和馬達」

第十二章「紅外線遙控與縮時攝影控制器」,紅外線遙控訊號接收元件TSOP4838

第十三章「製作光電子琴與MIDI電子鼓」,TCRT5000紅外線反射型感測器

附錄C,光耦合元件PC817

附錄D,TRIAC元件BTA12-600B

《超圖解Arduino互動設計入門》目錄

第一章 認識Arduino

  • Arduino 微電腦板
  • Arduino 的相關軟體
  • Arduino 開發環境安裝
  • 上傳「LED 閃爍」範例程式

第二章 認識電子零件與工具

  • 電壓、電流與接地
  • 微電腦板的電源供應器
  • 電阻
  • 電容
  • 二極體
  • 發光二極體(LED)
  • 看懂電路圖
  • 電子工作必備的量測工具:萬用電錶
  • 用麵包板組裝實驗電路

第三章 Arduino 互動程式設計入門

  • Arduino 程式設計基礎
  • 動手做 3-1 寫一個 LED 閃爍控制程式
  • 用「變數」來管理程式碼
  • 認識數字系統
  • 不變的「常數」

第四章 開關電路與LED跑馬燈效果

  • 認識開關
  • 讀取數位輸入值
  • 改變程式流程的if條件式
  • 動手做 4-1 用麵包板組裝開關電路
  • 動手做 4-2 跑馬燈範例程式一
  • 撰寫迴圈程式
  • 動手 做4-3 跑馬燈範例程式二:使用for迴圈
  • 認識陣列
  • 動手做 4-4 跑馬燈範例程式三:使用陣列變數
  • 使用埠口操作指令與位移運算子製作跑馬燈程式
  • 動手做 4-5 跑馬燈範例程式四:使用位移運算子

第五章 序列埠通信

  • 並列與序列通訊簡介
  • 處理文字訊息:認識字元與字串資料類型
  • 從Arduino傳遞序列訊息給電腦
  • 動手做 5-1 從序列埠監控視窗觀察變數值
  • 從 Arduino 接收序列埠資料
  • 動手做 5-2 從序列埠控制LED開關
  • switch…case 控制結構

第六章 類比信號處理

  • 讀取類比值
  • 動手做 6-1 從序列埠讀取「類比輸入」值
  • 認識光敏電阻與分壓電路
  • 動手做 6-2 使用光敏電阻製作小夜燈
  • 壓力感測器與彎曲感測器
  • 電容式麥克風元件與運算放大器
  • 動手做 6-3 自製麥克風聲音放大器(拍手控制開關)
  • 動手做 6-4 拍手控制開關改良版

第七章 LED七段顯示器

  • 七段顯示器
  • 動手做 7-1 連接 LED 七段顯示器與Arduino板
  • 使用積體電路簡化電路
  • 動手做 7-2 序列連接七段顯示器

第八章 LED矩陣與SPI介面控制

  • 建立自訂函數
  • 動手做 8-1 建立自訂函數
  • 認識變數的有效範圍
  • LED矩陣簡介
  • 認識SPI介面與MAX7219
  • 動手做 8-2 組裝LED矩陣電路
  • 顯示單一矩陣圖像
  • 動手做 8-3 在矩陣LED上顯示音符圖像
  • 動手做 8-4 在序列埠監控視窗輸出矩形排列的星號
  • LED矩陣動畫與多維陣列程式設計
  • 動手做 8-5 在矩陣 LED 上顯示動態圖像
  • LED 矩陣跑馬燈
  • 動手做 8-6 LED矩陣逐字捲動效果程式
  • 將常數保存在「程式記憶體」裡

第九章 LCD顯示器+溫濕度感測器+超音波感測器

  • 認識文字型 LCD 顯示模組
  • 動手做 9-1 在 LCD 顯示器上顯示一段文字
  • 動手做 9-2 在 LCD 上顯示自訂字元符號
  • 動手做 9-3 串列連接 LCD 顯示模組
  • 數位溫濕度感測器
  • 動手做 9-4 製作數位溫濕度顯示器
  • 認識超音波
  • 動手做 9-5 使用超音波感測器製作數位量尺

第十章 變頻控制LED燈光和馬達

  • 調節電壓變化
  • 類比輸出(PWM)指令和預設頻率
  • 動手做 10-1 調光器
  • 動手做 10-2 隨機數字與燭光效果
  • 動手做 10-3 透過序列埠調整燈光亮度
  • 動手做 10-4 使用atoi()轉換字串成數值
  • 認識直流馬達
  • 齒輪箱 / 滑輪組和動力模型玩具
  • 認識電晶體元件
  • 動手做 10-5 電晶體馬達控制與調速器
  • 控制馬達正反轉的H橋式馬達控制電路
  • 動手做 10-6 自動迴避障礙物的自走車

第十一章 使用Wii搖桿控制機械手臂

  • 認識伺服馬達
  • 動手做 11-1 自製機械手臂
  • 認識Wii左手把的通訊介面:I2C
  • 動手做 11-2 透過I2C介面串連兩個Arduino板
  • 動手做 11-3 在I2C介面上傳送整數資料
  • 動手做 11-4 讀取Wii左手把的搖桿、按鈕與加速度計值
  • 動手做 11-5 使用Wii左手把控制機械手臂
  • 改造伺服馬達成連續360°旋轉

第十二章 紅外線遙控與縮時攝影控制器

  • 認識紅外線
  • 動手做 12-1 偵測人體移動
  • 紅外線遙控
  • 動手做 12-2 使用IRremote程式庫解析紅外線遙控值
  • 動手做 12-3 使用紅外線遙控器控制伺服馬達
  • 動手做 12-4 從Arduino發射紅外線遙控電器
  • 運用紅外線遙控照相機
  • 動手做 12-5 遙控照相機拍攝縮時影片

第十三章 製作光電子琴與MIDI電子鼓

  • 發音體和聲音
  • 使用tone()函數發出聲音
  • 動手做 13-1 演奏一段瑪莉歐旋律
  • 使用#define巨集指令替換資料
  • 認識反射型與遮光型光電開關
  • 動手做13-2 光電子琴製作
  • 認識MIDI
  • MIDI訊息格式
  • 動手做 13-3 透過 Arduino 演奏 MIDI 音樂
  • 動手做 13-4 透過「虛擬 MIDI」介面演奏音樂
  • 動手做 13-5 製作 MIDI 電子鼓

第十四章 手機藍牙遙控機器人製作

  • 電波、頻段和無線傳輸簡介
  • 認識藍牙(Bluetooth)
  • 動手做 14-1 使用軟體序列埠程式連接Arduino與藍牙模組
  • 動手做 14-2 用Android手機藍牙遙控機器人

第十五章 網路與HTML網頁基礎+嵌入式網站伺服器製作

  • 認識網路與IP位址
  • 網域名稱、URL網址和傳輸協定
  • 動手做 15-1 認識網頁與HTML
  • 網路的連線標準與封包
  • 認識HTTP協定
  • 連接乙太(Ethernet)網路卡
  • 建立Arduino微型網站伺服器
  • 動手做 15-2 建立微型網站伺服器

第十六章 網路家電控制

  • 使用Webduino程式庫建立微型網站
  • 自訂錯誤訊息網頁與超連結設定
  • 動手做 16-1 監控遠端的溫濕度值
  • 傳遞資料給網站伺服器
  • 動手做 16-2 建立網頁表單
  • 認識傳遞資料的 GET / POST 方法和查詢字串
  • 動手做 16-3 建立接收 POST 表單資料的自訂命令
  • 動手做 16-4 從瀏覽器控制遠端的燈光開關
  • 控制家電開關
  • 動手做 16-5 使用繼電器控制家電開關

第十七章 Arduino +Flash整合互動應用

  • Arduino + Flash = 多元互動媒體
  • 動手做 17-1 測試Arduino與Flash連線
  • 動手做 17-2 「接電子零件」互動遊戲
  • 認識Arduino的String(字串)程式庫
  • 動手做 17-3 Flash燈光開關和調光器
  • 使用Firmata在Flash和Arduino之間傳遞資料

第十八章 RFID無線識別裝置與問答遊戲製作

  • 認識條碼與RFID
  • RFID 模組介紹與標籤讀取實驗
  • 動手做 18-1 讀取RFID標籤
  • 儲存與比對RFID編碼
  • 動手做 18-2 使用RFID控制開關
  • 動手做 18-3 使用RFID進行Flash問答遊戲

附錄A 認識焊接工具:焊錫、電烙鐵及焊接助手

  • 焊接工具
  • 動手做 A-1 基礎焊接練習
  • 動手做 A-2 焊接鱷魚夾
  • 印刷電路板及萬用板
  • 動手做 A-3 焊接電路板
  • 動手做 A-4 活用USB電源供應器

附錄B 燒錄ATmega微處理器的開機啟動程式(boot loader)

  • 動手做 B-1 使用Arduino控制板燒錄ATmega328韌體
  • 動手做 B-2 用麵包板組裝Arduino微電腦實驗板

附錄C 改造 3C 小玩意的控制鈕

  • 認識光電耦合元件

附錄D 中斷處理與交流電調光器製作

  • 輪詢 VS 中斷
  • 調整交流電的輸出功率
  • 動手做 D-1 交流電調光器電路

附錄E 使用App Inventor開發Android App

  • 準備App Inventer開發環境
  • 建立第一個App Inventor專案:聲音播放程式
  • 藍牙遙控機器人App的程式碼說明
Posts created 483

264 thoughts on “《超圖解Arduino互動設計入門》補充資料、勘誤及目錄大綱

  1. Dear jeffrey
    很高興看見你在製作這些精緻的細工件
    想到20年前我也是拿著鉗工刀,車刀,M6,M10~MX鑽孔組裝
    可做出唯一工件的過程很有趣!

    我目前正在實作一個系列的東西 大致架構是這樣子的
    sensor -> A/D unit -> MCU -> Communication interface(Zigbee, BT, WIFI,NFC, RFC ,GSM/3G/ LTE chip set) ,TCP/IP, SERVER(PHP,MYSQL, Linux), -> end user (IOS, ANDROID)
    先是單向之後雙向
    最後我計畫讓物件自己溝通做到optimal operation.
    其中 包含 晶片選用,功耗,供電,雜訊控制,bom cost,easy to use等議題,
    其中德儀這套工具的概念倒是不錯!
    分享http://www.ti.com/ww/tw/analog/webench/index.shtml?247SEM

    這蠻有趣的!
    good night!
    jimmy

    1. 我看了一下德儀的影片,感覺和國家半導體的Multisim電路模擬軟體很像(以前好像叫做Electronic Workbench),更早之前還有OrCAD和PSpice(這兩套軟體不知道是否安在),OrCAD好像還出過Mac版。

      科技進步真是神速,像CircuitLab網站,只要用瀏覽器就能搭建模擬電路,就連製圖軟體的老大哥AutoDesk也極力搶進diy領域,和Circuits.io聯手推出可線上模擬Arduino的123D circuits服務

      電子DIY真的越來越方便有趣了 😀

      thanks,
      jeffrey

  2. Dear Jeffrey
    哇!
    剛剛去看了下123 這也實用阿
    我很好奇 你是怎麼知道這些東西的呢?
    可以分享下 你都去什麼網站嗎
    感謝
    我也來去看看

    1. hi jimmy:

      我是在Make的Newsletter上看到的。

      另外,如果你在Instructables網站註冊,他們也會定期寄送跟DIY相關的Newsletter到你的信箱,像這個月的主題都跟萬聖節的裝扮相關,幾乎每一期編輯都會挑選跟Arduino相關的DIY作品。

      thanks,
      jeffrey

  3. hi Jeffrey
    您好
    為了把Serial buffer清空
    剛剛試了下Serial.flush()的功能,
    官網上寫說
    [quote]Description
    Waits for the transmission of outgoing serial data to complete. (Prior to Arduino 1.0, this instead removed any buffered incoming serial data.)[/quote]
    看來不能清空buffer區內的資料阿
    只好用
    [code]while(Serial.available!=0){
    Serial.read();
    }[/code]
    來把buffer清乾淨

    想請問您有其他可以clear buffer的方法嗎?
    謝謝

    1. hi jimmy:

      我平常透過序列埠傳給Arduino的數據都只有幾個字元,像RFID那種一次十幾個字元的情況是少數,所以我並沒有清空序列埠的習慣,有的話,頂多在接收RFID之前先執行Serial.flush(),至於其他清空序列buffer的方式我倒是沒試過,拍謝~

      thanks,
      jeffrey

  4. Dear Jeffery

    不好意思再請問一下
    您\知道台灣arduino最多人的論壇在哪嗎?

    謝謝

  5. Dear Jeffrey,

    您使用的這個方法
    ====有的話,頂多在接收RFID之前先執行Serial.flush(),====

    在下用下列的程式碼測試,發現當buffer中有1234567890等10個字元,啟動serial.flush()但,buffer裡還是10個字元.
    void setup(){
    Serial.begin(9600);
    }

    void loop(){
    Serial.print(“available1 = “);
    Serial.println(Serial.available());
    delay(5000);
    if (Serial.available()>9){
    Serial.flush();
    Serial.print(“available2 = “);
    Serial.println(Serial.available());
    }
    }
    所以,大家所講serial.flush()可以清空buffer的功能應該是指1.0以前的版本
    1.0之後此功能就像官網所述等待要傳送過來的資料了,沒有清空的功能了

  6. hi Jeffrey
    您的書上5-19緩衝記憶體有128位元組
    但我看arduino.cc網上寫道,是64位元組
    available()

    Description

    Get the number of bytes (characters) available for reading from the serial port. This is data that’s already arrived and stored in the serial receive buffer (which holds 64 bytes). available() inherits from the Stream utility class.

    不知道這部分是….

    Jimmy

    1. hi jimmy:

      Arduino緩衝記憶體的大小,其實是定義在Arduino IDE安裝資料夾裡的”hardware\arduino\cores\arduino”路徑當中的HardwareSerial.cpp檔。

      早期的版本(如:0018)定義如下,依照可用的記憶體而定,最大是128位元組:

      #if (RAMEND < 1000)
        #define RX_BUFFER_SIZE 32
      #else
        #define RX_BUFFER_SIZE 128
      #endif

      剛剛看了1.0.5版的"HardwareSerial.cpp"檔,確實是改成64位元組:

      #if (RAMEND < 1000)
         #define SERIAL_BUFFER_SIZE 16
      #else
        #define SERIAL_BUFFER_SIZE 64
      #endif

      我之前沒有留意到,非常感謝您的指正!如果程式執行時的主記憶體仍有餘裕,可以將它改成128甚至更高,但除非程式忙到無法顧及序列資料處理,就書本的例子來說,其實64或128都沒有差別。

      thanks,
      jeffrey

  7. Dear Jeffrey,
    thanks ,
    有個問題想請教
    外接的GSM模組,要一次丟500 Bytes的資料過來的話,
    您提到serial buffer最大只能128 Bytes,
    我可以再調大一點嗎?

    謝謝

    1. Dear Jeffrey

      請問serial buffer 的大小是占用主記憶體
      在您書上主記憶體是指1-11頁中的SRAM 2048 bytes(2KB),這裡面的嗎?

      謝謝

    2. Dear Jeffrey,
      不好意思,沒說清楚
      我的意思是
      我調成512會發生什麼問題嗎?
      P.S我去arduino.cc的forum上看,有個高手建議要讀快一點…..不要調bufffer size,但要讀快這也要想想該如何做….哈哈,是成功了再告訴你

      謝謝

    3. 假設Arduino是一間小餐館,老闆預期用餐時間會有500人次上門,他不會把大門加寬,也不會把桌椅數量一次增加到500人,因為客人是陸續、分批進入。

      我沒用過GSM模組,但我相信重點不在於緩衝區的大小,因為資料並非「一次」傳入500bytes。你可以嘗試先定義一個500bytes大小的陣列,暫存接收到的資料。

      倘若來不及處理大量資料,就像辦喜宴,需要大空間、很多廚師和服務生來應付大批的人潮,那你可能需要換一塊更高效能處理器的微控制板。

      thanks,
      jeffrey

    4. Dear Jeffrey
      今天測試出來,等待GSM模組回傳資料並及時把資料從buffer中讀出來,可以用的程式碼如下

      do{
      while(Serial.available()==0);
      data[x]=Serial.read();
      x++;
      }while(!(data[x-2)==’A’&&data[x-1]==’B’)); // 假如回傳的字串中有包含AB兩個字元 ex 123AB123

  8. Dear Jeffrey
    不好意思
    能否請教一下

    在下使用millis()時發現,當執行一個GSM模組的AT commad後
    大約才經過10秒的時間
    從83566
    變成795108739
    我已經把相關運算是變成unsigned long,
    還是一樣,

    您知道大概會是什麼樣的問題呢?(記憶體或….)

    1. Dear Jeffrey
      我把問題定義得更清楚一下
      什麼樣的狀況會讓millis在十秒內從8000變成1000000000?(millis的上限是50天,大約是5000000000)?

      我推想導幾個可能的點
      記憶體
      電壓電流穩定性…等等

      這個問題有冷僻
      請見諒

    2. 剛剛看了官方的GSM擴充卡的說明以及GSM程式庫,還有撥打電話收發簡訊瀏覽網頁等範例程式碼,並沒有看到一次接收500bytes的訊息。

      它的序列埠主要用於控制板子上的M10通訊晶片。在數據傳輸上,它是透過GSMClient與GSMServer類別來收發資料,和Ethernet(以太)網路卡的Client, Server類別相似。

      至於為何millis()會在10秒內暴增到極大數字…因為millis()使用到處理器內部的Timer0,也許是其他程式碼變更了Timer0的設定。

      thanks,
      jeffrey

    3. Dear Jeffrey
      謝謝提供方向
      剛剛我試著調整前面設定的字串大小
      char duta[256]; //miils 10秒內會爆衝,從8000變成1000000000
      char duta[1024];//編譯可完成,但millis 消失
      char duta[512]; // ok正常

      看來記憶體管理相當重要,需要好好研究一下,Michael Margolis的Arduino Cookkook中有一章討論這個部分.
      http://shop.oreilly.com/product/9780596802486.do#tab_04_0

      我去研究研究.

      謝謝你

  9. Hi,
    最近正在 follow 超圖解 Arduino 互動設計入門 安裝Arduino UNO R3 and set up the environment 不幸的 第一次上手就碰上了 Page 1-30 的 Error, 上網 google 一下, 原來 這個 Bug 早已困擾了一大堆user, 我已試了一大堆網友的建議, 結果還是無法可解! 想請問台灣有沒有Support Center? 如果沒有, 真的不再考慮花時間研究這本書了! It doesn’t work!

    1. 山不轉,路轉。除了替自製的Arduino板燒錄boot loader之外,我手邊各種Arduino板,在Windows 7和Mac OS X 10.8,並沒有遇過類似的錯誤訊息。

      Arduino最酷的一點,就是能讓我們自由改造。

      如果原始的方案不行,換個方法試試看吧:

      1. 借親朋好友的電腦測試。
      2. 花幾十塊錢,到露天網拍買一塊USB轉TTL傳輸線,用類似B-10和B-12頁的方法接到Arduino板,也就是改從這個USB傳輸線上傳程式碼(註:板子的選項要選擇Arduino Duemilanove),比較麻煩一點,但我相信可以解決這個問題(除非ATmega晶片沒有燒錄Arduino Bootloader)。

      我今天晚上再畫個連接電路圖給你。

      3. 詢問代理商。

      thanks,
      jeffrey

  10. Hi, Jeffrey,

    感謝你的快速回電, 我的電腦作業系統是 Win8, 特別再看了一下書的P1-30 結果發現….. 有Error 的板子是 UNO, 正確的是 Duemilanove w/ATmega328 ( Page 1-26). 可能得買這個板子試試! 嗚嗚…….!

    1. 不,書本上的錯誤訊息,是我故意選錯板子所營造出來的。

      你可以用UNO,只要板子選擇正確即可。

      不知道是不是驅動程式所造成的問題,我沒有用過Win8,剛剛搜尋了一下,看到已經有大大分享Windows 8的Arduino UNO驅動安裝解決方案

      這是YouTube上的視訊示範:

      have fun!
      jeffrey

  11. Hi, Jeffery,

    Thank you for your quick response! I saw this video before. It doesn’t work for my case. Actually, I follow all the steps to select the modem as USB driver. The Win8 complete the installation procedure and come out error message. The device fail to run on this device! Did you have any better solution? Thanks!

    Best Regards,
    Phillip

    1. 如果是Windows 8系統的問題,那恐怕USB轉TTL訊號線的驅動程式也不行~不如乾脆建立一個分區,安裝Windows 7,或者用VirtualBox虛擬一個Win7或Linux,甚至用隨身碟準備一個開發Arduino用的開機系統, 一勞永逸。

      thanks,
      jeffrey

  12. Dear Jeffrey
    今天看了一本書
    提到arduino的基本架構,原來如此阿!!
    int main(void)
    {
    init(); //初始化硬體
    setup();
    for(;;) //永不停止的loop()
    loop();
    return();
    }

  13. Hi, Jeffrey,

    前一陣子的 Arduino UNO Rev3 程式上傳 問題, 我後來向中美資訊買了 Arduino LEONADO 結果問題就消失了, 我的下一步是結合 LEONADO and Datalogger Shield ( with Micro SDcard) 做 BMP085 ( 大氣壓力, 溫度, 海拔高度 量測資料儲存). 目前發現 BMP085 正常, 但 Micro SDcard 無法正常操作. 我懷疑腳位接錯, 請問何者為正確接法? 底下是我目前的接法:

    D10: SS , D11: MOSI, D12 :MISO, D13: SCK ( for both of the Arduino LEONADO and Micro SD card Datalogger Shield )

    麻煩你了!

    Phillip

  14. 老師您好,

    我用Arduino Uno產生了一序列的短脈衝(TTL pulse sequence)脈寬約30us,持續2ms。可是,接收的儀器似乎吃不進去所有的訊號序列。由於我手邊沒有示波器,可供測試訊號產生的情況。想請問的是,Arduino Uno 是否能用delayMicroseconds 產生連續這麼短時脈的訊號?如果可以,那是不是我需要考慮高頻的電阻匹配問題??或其他頻率響應的問題???

    Regards,
    Ihong

  15. 請問如果我沒用過C語言,請問有推薦搭配的程式寫作的書嗎?
    因為老師的書是以組裝測試為主,語言的部份分散在各單元,不是很好找。
    謝謝

    1. hi polias:

      拍謝,我不是C語言的專家,在學時,老師建議的教材是Kernighan與Ritchie撰寫的《C程式語言》(洗鏡光 譯,儒林圖書出版),不過那是90年代的書,而且那時候我們用的編譯器是Turbo C。

      建議您找個時間,悠閒地逛逛書店,除非您想要開發Windows的應用程式,否則可以略過微軟的Visual C主題。加上現在也有雲端版的C語言編譯器,直接在瀏覽器上就能練習C語言,例如,compileOnLine.com以及codepad.org,所以您只要挑選以C語言為主題,您覺得易讀的書籍。

      thanks,
      jeffrey

  16. 老師您好~

    我買了您的書與L298N套件練習動手做10-6 自動迴避障礙物的自走車

    遇到一些問題想請教老師,依您圖上的接線方式接上硬體

    我測試時功能都正常紅外線測距離(>10公分時)正常可以前進,

    (<10公分時)右轉都沒問題

    但是在馬達速度控制上遇到奇怪的問題,

    您speed原始設定100,

    我改為0時反而轉得更快,

    當speed設定成255時馬達反而不會動。

    我修改您原本的程式讓(<10公分時)變成停止,但發現馬達仍然繼續前進~

    將stop()部分之analogWrite(EA,0)改成analogWrite(EA,255)後

    距離小於10公分時才會停止。

    還有我看您書上寫L298N套件需要供給電源給馬達電源及控制器電源

    但我不會接,因此將2個電源部分都接到麵包版之+極與Arduino版之5V接在一起

    不知道會不會有影響?

    可以請老師幫我解決疑問嗎?

    謝謝您~

    1. hi Brian:

      我星期四再詳細查看您的問題;用於馬達的”+”電源,請接在馬達控制器的”+”,不要接在麵包板的”+”,接地則和Arduino的接地(-)相連。

      thanks,
      jeffrey

  17. 老師您好~

    我所用的為10-31頁下方的那種L298N控制器

    附上我當初購買的網頁
    http://goods.ruten.com.tw/item/show?21110116129218

    依照您10-33頁的接法,我同學也是說結果跟我一樣~

    speed=0速度較快… speed=100較慢… speed=255馬達不會動

    只是他是量speed=0時供給馬達的電壓與speed=255時的電壓做比較
    反而卻是speed=0時電壓較高,speed=255時電壓卻較低…
    這個部分與您10-5頁的電壓值計算方式的結果有出入…
    所以我們還是覺得有點困惑~
    請老師給予建議,謝謝~

    1. 這樣看來,控制板的輸入值與預期相反,如果電路接線保持不變的話,你只要在程式中,用255去減掉PWM計算值,就可以得到相反的PWM值了。

      從商品的正前方照片看來,它的右邊有一排ENA, IN1, IN2, IN3, IN4, ENB的排針,那表示它的電路和運作模式其實是10-31頁的第一種。

      只是它的ENA和ENB這兩個致能腳位,預先用跳線插針固定在某個電位(應該是高電位)。因此,你應該要拔除那兩個跳線插針,然後參考「L298N馬達控制板接線與控制程式補充」文章的說明,將ENA和ENB接Arduino的PWM腳位。

      thanks,
      jeffrey

  18. 老師你好,有個問題想請教。
    8-36頁
    完整程式碼第三行
    byte buffer [8]={0,0,0,0,0,0,0,0}

    8-37頁
    捲動字元函數中
    一開始的buffer不都是0嗎?
    直到buffer[7]=fonts[chr][j]才開始把字元拿進來,
    這樣是不是有點怪?
    是不是一開始就先要把字元放進buffer中,
    然後再開始捲動。
    我是初學者,或許是我解讀程式錯誤,請老師解惑。
    謝謝。

    1. 您好:

      因為我想讓顯示器一開始先呈現空白,再逐行捲進文字,所以將buffer陣列預設為0。

      thanks,
      jeffrey

  19. 您好:
    第十章,10-28最底下的圖,藍色箭頭是否應該往右移動,流過Q4這個電晶體比較恰當?
    另外,10-30,L298N的圖,pin13應該是輸出1B,而不是2B。
    或許下次再版,是否考慮把輸出1A/2A/1B/2B改為Out1/Out2/Out3/Out4?
    一點點小意見,請您參考!
    謝謝!

  20. 老師您好,我可以請教您W5100乙太網路卡的問題
    請問這塊網路卡,可以透由我們一般家裡的網路連線嗎?? 那需要打帳號跟密碼嗎??

    1. hi kevin:

      可以,你的網路交換機或無線基地台需要設定虛擬非軍事區(DMZ,請參閱15-10頁說明),或者虛擬伺服器(Virtual Server)。各家無線基地台的設定方式不一,請參閱產品說明書。

      thanks,
      jeffrey

  21. 感謝老師為我解答,我原本使用網路交換器,但網路交換器無法進入192.168.1.1去設定DMZ,我是換了IP分享器才能讓Z5100能上網

  22. 趙先生您好
    書中第十七章範例程式
    ._接接樂Firmata_CS3
    我用FLASH CS3或FLASH CS6專業版
    都告知
    未知的檔案格式
    而無法開啟
    可否請您試一下如何開啟
    謝謝

    1. hi tanj:

      剛剛使用Flash CS6,測試開啟光碟 “\範例檔\ch17\Firmata練習(Flash原始檔)\接接樂” 路徑底下的 “接接樂Firmata.fla” 檔,可以開啟。

      另外,我將此檔案上傳到網站,您也可以點此連結下載測試。

      thanks,
      jeffrey

  23. 謝謝您測試
    我的CS3還是開不起來
    但另一台電腦的CS6試用版可以開
    可能是軟體版本問題吧
    謝謝

    1. 我想起來的,因為Flash大多只能轉存到前一個版本,例如,CS6版可以存成CS6和CS5版。

      我當時從CS6轉存成CS5,再從CS5轉存成CS4版,就沒再繼續轉存,所以至少得用CS4版開啟。

      thanks,
      jeffrey

  24. 趙先生您好
    引用前面讀者回覆
    “頁數10-30,L298N的圖,pin13應該是輸出1B,而不是2B。”
    所以同一頁的表10-5
    1B是否也要改為2A呢?(這地方我想了好久~~)
    還請參考看看。

    1. 沒錯,馬達的輸出和輸入接腳應該是指同一組,所以是1A和2A,非常感謝!!

      thanks,
      jeffrey

  25. 你好~ 我剛剛買了你的這本書, 我想問 在11-8裏說到的 馬達的外接電源的接地要和ARDUINO的接地相連 我有點不太明白 馬達的接地口已跟外接電源相連 那我要怎樣再連一條線在ARDUINO呢???

    THX!!!

    1. hi tingo:

      我們可以像下圖這樣,在萬用PCB板上焊接兩個排針,一個接伺服馬達,一個接外部電源,這樣就能把它們的接地連在一起了:

      伺服馬達接外部電源

      thanks,
      jeffrey

  26. 哦~ 我明白了 謝謝!!
    另外我想問 我在CODE上是一個新手 但我買了一個EASYVR想聲控伺服馬達 我在哪裏可以學呢??
    THX!!!

  27. 您的書我自去年七月研讀至今,收穫頗多
    決定做為下學年度高職學生專題製作用書
    希望學生也一起體會箇中樂趣啊~

  28. 老師不好意思 我剛買了一個馬達SG90了 但是那個插頭看起來插不進去麵包板 我需要買排針嗎??

    謝謝!!

  29. 老師您好:

    關於書上提到 Vishay TSOP4856, IR 接收器, 因為有些遙控器訊號無法解讀, 所以我去買來試可是它雜訊有點大有時正常有時不正常; 後來詳細看過原廠資料所提供的電路圖, 但是有一點不太清 uC 的部份接法, 是要用 105 獨石電容, 還是電解電容呢? 還有三腳位要怎麼接?
    電路圖: http://circuits.datasheetdir.com/219/TSOP48-circuits.jpg

    還望老師指導, 謝謝!!

    1. hi kenny:

      電路圖上的μC代表Microcomputer(微電腦),也就是把IR感測器的輸出接到微電腦的某個輸入腳。

      thanks,
      jeffrey

  30. 老師您好:
    日前有照著您CH17-3 Flash燈光開關和調光器
    光碟裡面的程式進行測試
    按鍵按下13腳位的LED會亮 但是在按下沒有如您書上的熄滅LED

    以上
    謝謝老師!!!

    1. hi daniel:

      請先在Arduino的序列埠監控視窗測試,輸入”D131″並且以「新行(new line)」結尾,傳送給Arduino,板子上的LED會點亮;傳送”D130″則LED熄滅。

      若測試無誤,再用Flash測試。測試之前,你可以在「調光器.fla」的actions程式中,將swHandler()的判斷條件,加入trace()敘述,觀察按鈕的輸出:

      function swHandler(e:SwitchEvent):void {
         var s:Boolean = Boolean(e.sw);
      
         if (s) {
           a.send("D131\n");
           trace("D131\n");
         } else {
           a.send("D130\n");
           trace("D130\n");
         }
      }
      

      thanks,
      jeffrey

  31. 老師您好:
    我依照您以上的方式
    在序列埠監控視窗測試 正常(之前的即正常)

    但到了與FLASH 反應還是一樣 … @@

    1. 剛剛在Window 8.1系統上,使用Flash CC版本測試,發現它在傳送Socket資料時,會在資料前面多加一個字元。所以我稍微修改了Arduino程式,確認收到的第一個字元是’A’或’D’:

        // 當序列埠傳入4個以上字元時,執行大括號裡的程式...
        if (Serial.available() > 4) {
          char c = Serial.read(); // 讀取第一個字元
          
          // 確認第一個字元是'A'或'D'
          if (c == 'A' || c =='D') {
            str += c;           // 把讀入的字元連結成字串
            
            while (Serial.available()) {
              c = Serial.read();
              str += c;
              
              if (c ==  '\n') {       // 如果讀取到 '\n' 字元...
                lineEnd = true;       // 代表「讀取完畢」,可以開始解析字串了
              }
            }
          }
        }
      

      其餘程式碼不變,完整的loop()函式片段如下:

      void loop() {
        // 當序列埠傳入4個以上字元時,執行大括號裡的程式...
        if (Serial.available() > 4) {
          char c = Serial.read(); // 讀取第一個字元
          
          // 確認第一個字元是'A'或'D'
          if (c == 'A' || c =='D') {
            str += c;           // 把讀入的字元連結成字串
            
            while (Serial.available()) {
              c = Serial.read();
              str += c;
              
              if (c ==  '\n') {       // 如果讀取到 '\n' 字元...
                lineEnd = true;       // 代表「讀取完畢」,可以開始解析字串了
              }
            }
          }
        }
       
        // 解析自訂訊息
        if (lineEnd) {
          type = str.charAt(0);
          pin = strToInt(str.substring(1,3));
          
          if (type == 'A') {
            data = strToInt(str.substring(3));
            analogWrite(pin, data);
      
          } else if (type == 'D') {
            data = str.charAt(3)-48;
            digitalWrite(pin, data);
          }
      
          lineEnd = false;
       
          str = "";
        } 
      }
      

      thanks,
      jeffrey

  32. 老師您好:
    程式修改後已經可以順利進行動作,非常謝謝您撥空處理!!
    順帶 您的書寫得很清楚 對學習幫助很大 會推薦給學弟妹使用!!
    謝謝!! 🙂

  33. 老師您好!
    我想請問要怎麼用RTC做出一個定時的開關,例如我要用arduino控制LED亮3分鐘,3分鐘後會自己關掉,除了delay還有沒有別的更好的用法?能不能做個範例給我參考~謝謝!

  34. 請問 0.01uf (103) 耐電壓400V 塑膠電容 可以用 0.01uf 耐電壓400V 103k 金屬薄膜電容代替嗎?

    1. hi houng:

      主要是容量和耐電壓相同(或者更高耐電壓值),就能替換。

      thanks,
      jeffrey

  35. F4799 超圖解Arduino互動設計入門–第2​板
    範例擋 diy16_01.ino
    編譯時發生錯誤.如何解決?

    “homepage” was not declared in this scope

    1. 我剛剛測試編譯沒有問題。

      “homepage” was not declared in this scope

      錯誤訊息代表編譯器找不到”homepage”這個宣告,請問你的程式碼裡面有包含 P(homePage) 定義嗎?

      另外,也請參閱「第二版補充說明」,下載新的Webduino程式庫,再重新啟動Arduino軟體,重新編譯看看。

      thanks,
      jeffrey

  36. 請問老師
    F4799 超圖解Arduino互動設計入門–第2​板

    範例擋 diy16_01.ino

    編譯時發生錯誤.如何解決?
    “phomepage” not declare ….

  37. 請教老師:

    在diy_4.ino中
    IPAddress ip(192, 168, 1, 25);
    IPAddress subnet(255, 255, 255, 0);
    IPAddress gateway(192, 168, 1, 1);

    我把[(192, 168, 1, 25);]改成我的固定IP(218, 161, 99, xx)後
    輸入網址http://218.161.99.xx/form.html
    出現
    Not Found
    The requested URL /form.html was not found on this server.

    請教老師.這樣如何解決?

    謝謝您!

    1. 請參閱15-10說明,218.161.99.xx是ISP提供給你的IP位址,連結家裡的區域網路設備時,需要使用區域網路的198.168.x.x位址。

      若希望能從外界連結到家裡的Arduino,需要設定網路分享器/基地台,每一個廠商的網路基地台的功能和設定方式都不太一樣,請參考說明書,開啟虛擬伺服器或DMZ,才能把固定IP對應到某個區域網路IP。

      thanks,
      jeffrey

    1. 我幾乎不用AT命令模式,因為ESP8266模組本身內建32位元微控制器。

      若要使用AT命令模式,你可以運用程式庫來簡化程式碼,像iteadStudio的”WeeESP8266“程式庫。不過,我記得這個程式庫預設採用9600bps與ESP8266通訊,而新的ESP8266模組則是採用115200bps。

      AT命令模式的相關問題,再麻煩你請教原作者,謝謝!

      thanks,
      jeffrey

發佈留言

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

Related Posts

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

Back To Top