Arduino 學習心路...

緣起

敝人大學化學系畢,在學過程從未修習過"程式語言"相關課程;現在身為國中理化老師,在教學現場常有很多新的想法,但礙於對電子電路不熟悉,許多教學探究無法有進一步的開展。難道沒有程式語言基礎學習Arduino就難以入門了嗎? 這是許多朋友常跟我提起的困難點。

學任何東西都要花費很大的心力,身為老師的我們,想想自己為何為人師表,在學習方法與態度上必有值得讓學生追隨學習的地方。那何必害怕學習從未接觸過的新知識、技能呢? 反過來想,這正好是對學生展現學習方法的機會。

Arduino官方建議使用C語言來撰寫控制程式,當然還有其他方式:例如Scratch、mBlock等等使用圖像式、積木式的語言撰寫介面。但經我深思熟慮:

1.包裝過的圖像式介面使Arduino在使用上受限不少,多數的感測器或模組都開發成C語言的函式庫,供用戶快速上手使用。因此沒有理由學習更受

限的Scratch介面。所以我入門時便從C語言下手,文字介面的C語言,才是學習程式語言的正道。

2.將來延伸學習其他程式語言,例如Python、Lua、JavaScript... 等也皆是文字介面的語言。即使使用APP Inventor這種積木式的撰寫介面,也是非

常快就能上手。

3. 另一方面,Arduino不應該成為低價版的樂高EV3或NXT主機的替代品,不應該被套件給綁死。Arduino是一種微處理器(MCU)的介面板,我們的學習不該受限在Arduino上,不管是樹梅派、ESP8266等嵌入式微處理器,都可能成為我們自由運用的目標。因為我們學習的目標是以解決問題為導向,Arduino只是方法之一、而不是唯一。

第一階段 要學習必先投資 (教材與書籍)

一切的累積始於某次逛光華商圈的今華電子,看到他們在賣"Arduino入門套件組"。先有套件組,還是需要一本書來入門。

Arduino入門套件組 購買連結

網站內我常會連結到「創意冷光工作坊」的拍賣網頁,我與商家並沒有任何利益關係,

一開始我都騎著機車直衝光華商場的今華電子買零件,但發現光華商圈的電子零件非常的昂貴,像Arduino UNO 要價280 ,而我在網路上詢價只要180;有次與佑華老師相約光華商場,為了買一塊1602 LCD,我印象很深,當時我們詢價最便宜的店家,1602LCD要價180,沒想到網路只要49元就可以買到一樣的東西。

我買過價差最大的是藍芽HC-05,我在實體店面320元/個入手價,在網路上找到同樣的東西只要100元。

所以漸漸把購買的地點改成網路通路,一方面他們會把賣的零件分類的很好,讓我在學習的過程中可以更上手。對於喜歡動手做或嘗試動手做的人,背後一定有個很大的因素,就是想要省一點錢。回想當初,要買什麼就直奔光華商圈,的確花了不少冤枉錢。另外,在網站上面尋找零件(感測器),其實也是一種學習,隨著對商家賣的商品愈來愈熟悉,尋找靈感時的基模會更大,創意來自各種物件的連結,許多做科展的專家級老師,都是五金大賣場、天水街化工行、光華商場、興城街五金街的常客。

我買的第一本Arduino書籍是趙英傑老師所著的「超圖解Arduino 互動設計入門」,當時,書架上其他Arduino相關書籍對我真的很難,密密麻麻的程式語言,搞不懂的邏輯觀念,實在看不下去。我需要一本圖文並茂的書,而且可以銜接過去所學電學知識。這本書完全符合我的需求,是一本值得令人一讀再讀的書。

這本書我從第一版就購入了,後來推薦學校買了第二版(20本),現在第三版都出來了。除了書面內容,

趙老師也很樂於教學,在網路上不斷更新內容或補充內容 網址 http://swf.com.tw/ ,很樂意解答讀者疑惑。我認為這本書真可以算是學習Arduino 必讀的「聖經」之一。每個版本的修訂,趙老師會把部分網站上的補充收錄到新版,所以建議直接買最新版即可。另外重慶南路的三民書局大概是碩果僅存,專書很齊全的書局了,看在出版業蕭條的今日,我覺得買書支持台灣岌岌可危的書局與印刷業也算投資文化產業吧。有些書雖然圖書館有但是我還是很堅持買回來支持一下。(我大概也買了一二十本談Arduino的書了)學習Arduino的過程很長,只研讀一本書猶如以管窺天,書本是作者幫我們整理好有系統的學習,但網路上常會有許多五花八門的實作與教學,不妨多看看多想想。網路搜尋也是一種技能,key入正確的關鍵字,才能有效率地找到自己需要的資料,另外不要排斥看原文資料。

按: 看看這則新聞吧~~ 出版業寒冬…台北重慶南路書店 又少2家

買了教材,也買了專書,那學習就一帆風順了嗎? 千里之行,始於足下,我常利用瑣碎的時間就抱著超圖解一書,一到電腦前就拿起麵包板,接上Arduino來實驗。從入門時控制LED閃爍、讀取類比腳位電壓,到使用LCD,一開始很慢,每一樣主題都是以「天」為單位在學習。而且,我沒有人可以請教與發問。台南鄉下長大的我,因為學習資源缺乏,從小就學會在發問前,自己一定投入更多的精神去嘗試。而現在有了網路,網路上有很多的資源可以查詢,台灣沒有就找對岸的,例如極客工坊。所幸台灣有好幾位前輩,例如葉難大兵萊恩ProteusCooper Maa小狐狸事務所...。無私地分享他們的實作經驗與程式碼。入門的學習有點漫長,但過程還算美好,蜜月期很長,成就感很大,所以時間飛快。

Arduino 是一種MCU(微控制器),也是一種嵌入式處理器,一個微型電腦,如下圖所示:

MCU早就存在微電腦電器產品,例如電熱水瓶、冷氣溫控、智慧手環、電子錶中,作為控制使用。

學習Arduino也有一定的順序:

1.了解數位腳位、類比腳位的輸出入與控制

2.C語言資料類型的認識

3.控制邏輯與迴圈

4.感測器認識

5.序列埠通訊

6.LCD 顯示與互動

7.動力輸出與控制(伺服馬達、步進馬達)

8.無線通訊(nRF24L01、藍牙、設計APP)

9.網路、物聯網議題(Ethernet、WiFi)

10.資料儲存

因此本分享平台也依這些內容做分類。

我們可以把Arduino腳位當作人體神經的連接位置,了解神經裡面的訊號如何輸入與輸出,再來了解這些訊號的編碼規定與限制(資料類型),接下來在學習感測器如何接收訊息與回傳電腦,感測器如同五官,有偵測光線、聲音、溫度....因應這些感測器回傳的訊息,我們必須學習「邏輯」或「條件迴圈」的方式讓電腦篩選什麼時機作出回應。另外也有與人互動的介面,例如序列埠、藍牙、網路、紅外線...。人類把需求輸入至電腦中,讓電腦作出回應,而回應可以分為動力上的回應或者是語音、顯示回應。

熟悉這些主題後,學會最基本的方法去設置微電腦來輔助我們監控、維持我們設定的狀態等。還有很多延伸應用,但這些方法離真正的電子學仍很遠,使用的零件也是大量生產、很便宜的、體積不小的零件。距離上市的成品仍有一段距離。礙於微控制器的記憶體大小,無法做出很複雜的行為反應。(但是像3D印表機這類機器人則綽綽有餘)

第二階段 教學與分享促使自己學更多

學校裡面總是有些人會期待著新鮮事發生,當我把成果拍下來上傳到Facebook分享,會獲得一些迴響,這些迴響也帶來一些新挑戰,像是資優方案的課程,校長、主任請我開課教導那些gifted children,一開始我是有點慌張。其實我很熱中於研究,但對於還未投入足夠時間的我,真的有能力開課嗎?還有,該怎麼樣去改進實驗器材? 壓力促使人成長,離開舒適圈去探索各種可能讓人成長飛快。

為了教得更有效率,我必須做投影片,每個實驗我必須要確保一定能成功,所以程式碼必須要真的測試過可以正常運作,就算這樣,教學現場會有各種問題發生。例如:

一、編譯失敗無法上傳有很多原因:

1.缺少分號、大括弧

2.不慎插入全形空格

3.未指定正確的Serial Port,更多時候是windows沒抓到Arduino Uno,所以沒指派port

4.未下載函式庫放入Arduino的libraries資料夾內

5.函式庫解壓縮後沒放在第一層的資料夾內

一個字一個字輸入程式碼,對學生而言是有點辛苦的,而且經常編譯出錯,各種可能原因五花八門,上述是我在教學時常遇見的錯誤,所謂三折肱而成良醫,學生在犯錯中不斷學習,而且我也讓學生花時間討論與try,學著解決問題是最好的學習。

二、程式寫作的多樣性:

現場教學時,我通常是先指導學生組織邏輯,再把邏輯轉換成程式語言。但也因為同一種功能可能會有多種寫法與組合,學生寫出來的程式碼可能與自己的設想不一樣,因此,同樣的功能,老師需要去嘗試各種可能,以確保學生學習的彈性,而不是一昧的填鴨。

三、生活上與學習上的話題討論

除此之外,因應時事,也要教導一些數學運算技巧。Arduino對於列舉法或暴力破解數學題目,真的非常有效率,像學生可能在段考時遇到某個數學難題,學生在討論的過程中與激辯中,老師可以展現專業引導學生使用其他方法更有效率的解決難題,例如,本校105學年八上第三次段考數學科的難題:

21.已知b、c皆為正整數,且c小於40的偶數。若一元二次方程式5x2+2bx+c=0兩根的值皆不含根式,則(b,c)的解有幾組? (A)13 (B)21 (C)23 (D)26

這題如果只能用紙筆解,必須配成十字交乘,然後再用列舉法求解,很花時間,

但是,倘若可以用程式語言的方式來求解,這個題目就是幾分鐘以內的事情,

此題很明顯地在考判別式為一個完全平方數,

判別式=4b2-20c=4(b2-5c)

又因為c為偶數,所以判別式可以寫成4(b2-10m) 其中m為1~19的連續正整數

然後交由兩個for迴圈來快速求解:

很難的問題,透過電腦計算變得非常簡單...

程式碼

int i=1;

void setup() {

Serial.begin(9600);

for(long b=1 ; b<1000 ; b++){ //b=1~1000逐一代入

for(long m=1 ; m<19 ; m++){ //m=1~19 逐一代入

long delta = b*b-10*m ;

double ans = sqrt(delta); // sqrt() 為開根號的動作函式

if(ans-long(ans)==0){ // long()為取整數後存成長整數,原數-取整數=小數部分

Serial.print("i="); // i為第幾組滿除條件解的個數

Serial.print(i);

Serial.print(" , ");

Serial.print("b=");

Serial.print(b);

Serial.print(" , ");

Serial.print("c=");

Serial.print(2*m);

Serial.print(" , ");

Serial.print("delta=");

Serial.print(delta);

Serial.print(" , ");

Serial.print("ans=");

Serial.println(ans);

i++;

}}}}

void loop() {

}

這段程式碼上傳之後,答案在兩秒內就計算完並顯示完畢,答案是C!

解決難題的方法會愈多愈好,既然我教導學生Arduino,它不是只能做自走車、多軸、機器人的功能而已,使用程式語言來輔助學習與計算,或解決生活上的問題,才是我終極想要完成的目標。很多學生對於複雜的計算心生恐懼, 80年代時,我受的數學教育偏重於計算,曾經讓我非常害怕學習數學新單元,化學科也充斥著大量的計算作為入門的門檻,我不是說計算不好,而是覺得:土法煉鋼的解法也好、漂亮的解題技巧也好,或透過使用電腦運算的方式也好,都是解決問題的方法,用手算出答案與用電腦解出答案,同樣都能解決問題,不應該有高下之分。我們的教育會被詬病,就是因為學習只為考用,僅極少數人能學以致用。孩子的學習過程中常常學特殊解題法以應付升學考試,這讓我們把解決問題的方法限縮了。發展孩子解決真實問題的能力與方法,是近幾年來很重要的教育思潮,為何不訓練我們的孩子,透過寫程式來解題呢?未來孩子要處理大數據與統計,不可能只靠紙筆計算的,還是必須學習使用電腦軟體工具,利用程式語言來解決問題,並不是唸了大學自然就會了,應該向下紮根電腦程式語言將更有助於他們銜接未來所需。

在此,透過與學生分享,甚至指導他們,也是一種很好的學習方式,正所謂教學相長。

第三階段 累積是一種最好的成長

一、整理方便隨時取用

隨著完成的程式碼愈來愈多,會有混淆與忘記的現象產生。幾十個程式碼檔案,一時要找出來用總是翻遍整個雲端硬碟與好幾台電腦,即使平時作分類,看到檔案名稱仍然有很多問號:

1這個版本是最新的版本嗎?

2.這個專題的程式碼有沒有開發完成?

3.我上次做到哪裡?要怎們加上新功能?

花上大筆時間尋找自己做過的結果,是很浪費生命的事情;有時候靈機一動,對於先前開發的結果,再增加新功能、新應用,沒有自己的學習筆記,常會讓靈感轉瞬消失。另外,放上網站,即使搭捷運的瑣碎時間也可以點進來閱讀與思考。

二、檔案安全需要

放在電腦硬碟或隨身碟中,檔案安全與維護的壓力很大,加密病毒可能會讓大批的文件一夕之間化為烏有;隨身碟遺失也是個不小的損失;電腦硬碟隨時都可能會壞軌,空間愈大的硬碟,一次損失的資料愈多。所以,我幾乎都把資料放上雲端硬碟做為第三方備份。

三、教學平台需要

為了教學需要,我需要一個平台來置放與分類我做過的研究項目,以備往後教學時可以沿用;教學現場時常有新議題,常常都可與過去的主題有連結,從舊主題衍生出新方法。所以我選擇了Google Drive連動的Google協作平台,作為放置我研究成果的空間。

一開始,把自己做過的研究,再花時間寫上網誌,是一件不輕鬆的事,因為會擔心自己寫出來的東西會不會不夠成熟,會不會被批評。但記錄下來也正好可以面對自己的成長,每次貼上程式碼時,可能是自己辛苦搞到深夜、或研究了整個周末後的成果。再過一段時日,可能會有新的感觸與新的突破。隨著程式碼愈來愈長,功能愈來愈多,留下一點文字記錄,摘要一些當初為何這樣寫的原因,或貼上找到的相關資料以備未來延伸時可以使用。

Google協作平台類似一個網誌,但是彈性比網誌還要大一點,可以引用google的表單、試算表、文件,甚至插入簡報,或插入網頁元素、影片、Google地圖都很方便。我在寫網誌會有一些習慣順序:

貼程式碼 --> 貼函式庫 --> 撰寫解說文字 --> 貼上相關照片與圖片

1.先建立空白網頁,再放入分類中

2.先貼上試驗成功的程式碼(放在網頁最下面)

3.把相關的函式庫下載連結放在右上角(建議放在google drivey再引出共用連結)

4.google搜尋一些接線圖,或照片加上說明,放在上半部(注意版權)

5.利用PrintScreen 或 fn + shift+ f11 (Macbook沒有PrintScreen按鈕的替代作法) 截圖,利用小畫家裁

剪再插入網頁畫面。

6.相關的動作函示功能整理成表格

7.加上參考網址