對多數程式人來說,軟體與硬體是截然不同的領域,隨著Maker運動近來日益興盛,各種單晶片、單板電腦、電路模組也更加簡化而易於使用,程式人若能多從軟體角度來思索這類開發板並多所接觸,會發現能做的事是越來越多,程式人也就不會被這些電子設備控制,而是能反過來掌握這類工具,當個碰到硬體也不至於軟下去的軟體人!

從熟悉的程式語言開始

如果從硬體領域往相關單晶片、單板電腦、電路模組看過來,要選擇一個硬體開發平臺做為開始,可考量的因素將會排山倒海而來,甚至還可以看到Arduino、Raspberry PI這類板子其實有害基礎教育的論調,因為它們跳過了太多基礎電子的理論。然而從軟體領域往相關單晶片、單板電腦、電路模組看過去的話,其實會有不同的考量。

最基本的考量起點就是,從程式人最熟悉的元素開始!

這是因為硬體與軟體在設計上實際有著不同的邏輯,若同時要處理兩套邏輯,在經驗不足而遇到問題時,就很難判定是哪個環節出了問題。

若想從程式人最熟悉的元素開始,可選擇熟悉的語言來切入,因為作為電子電路與程式間介面的單晶片或單板電腦,都有開發時預設的主要語言,像是Arduino預設使用類似C/C++的語言(基於Wiring,而Wiring又基於Processing),Raspberry PI預設使用Python,還有像是支援JavaScript的Tessel等。

有些板子透過不同的技術,可從多種語言中擇一使用,像是Raspberry PI也可以藉由Java Embedded而使用Java語言來開發,Arduino可透過序列埠通訊來支援多種語言(因而有速度上的限制),像是可透過撰寫網頁應用程式,甚至使用S4A、S2A、ArduBlock、mBlock這類圖形語言來操控。我個人就偏好圖形語言,因為語言元素少,有助於專注於學習程式與開發板之間的溝通方式。

從這個角度出發就可以發現,這類產品背後的主要目的,都是希望開發者能以軟體(甚至是數位設計領域),而非硬體開發者的方式來撰寫程式,因此,硬體上一些細節多半被包裝為開發板的標準配備,像是ADC(類比數位轉換)、PWM(以數位訊號調製出類比輸出)等都是Arduino板子上內建功能,因而像是0、1訊號或是類比電壓數值之類的輸出與輸入,程式人就只要從軟體開發角度,撰寫程式處理即可。

從原始碼瞭解電路模組

從程式人來看,開發板主要是用來與實體世界溝通的「介面」,複雜的邏輯多半不會在板子上執行,而是將擷取到的資訊,實送至效能更好的電腦上進行處理,執行結果再透過開發板對實體世界進行輸出,這資訊的輸入與結果輸出,還得透過一些電子電路元件與開發板連接才能達成。若從硬體角度來看,親自學習相關電子電路元件的特性與連接,才是王道,然而,從軟體角度來看,透過現成的電路模組,不但可直接快速地達到目的,也能作為進一步瞭解電子電路元件的入門磚。

舉例來說,S4A可搭配S4A Sensor Board,使用現成的LED、蜂鳴器、可變電阻等元件,進一步地,還可以透過RJ11外接感應器擴充元件,避免電路連接的麻煩。

以軟體來比喻的話,這就好比選擇了S4A Sensor Board作為框架,而其中又得外接相關程式庫來完成應用程式功能,然而,為了達成進一步目的,開發者還是得瞭解程式庫的介面才能撰寫程式,而瞭解這類介面的同時,就可能瞭解了一些電子電路的基本細節。

例如,即使是透過S4A Sensor Board外接LM35溫度感應器,程式方面還是得知道,LM35是電壓變化型的溫度感測器,攝氏0度時為0V,每上升一度會增加10mV,如此才能撰寫程式計算出對應溫度;對於一些簡單的電路模組控制,是可以自行撰寫程式,而對於一些複雜的電路模組,則可進一步考量有無現成的程式庫可支援,以及是否開放原始碼。

若選擇Arduino,在紅外線訊號處理方面,有現成的IRremote可以使用,而如果用到DHT系列溫濕度感應器,也可以下載相關的DHT程式庫;若使用特定廠商感應器,也應有程式庫可使用。

如果程式人有閱讀原始碼的習慣,可試著察看電路模組程式庫中的程式碼,這往往可瞭解許多感應器運作細節,甚至進一步修改程式碼以符合自身需求。因此,能從程式人的角度來解決這類問題,會是程式人涉足硬體時的優勢之一。

例如我前陣子玩步進馬達時,查看相關文件,都說可以使用Arduino IDE內建的Stepper程式庫來控制步進馬達,然而,當時手中的28BYJ-48步進馬達,執行程式時卻是聞風不動,在查看Stepper原始碼之後,才發現建構Stepper實例時,若設定的馬達每圈步進值太高時,程式中的變數step_delay結果就會是0,這會使得馬達根本沒有時間轉動,透過適當修改,手中的28BYJ-48馬達才得以正常運作。

進一步認識基本電子電路

在使用現成的電子電路模組久了之後,慢慢地就會發現,如同程式庫包裝了許多程式細節,而有時程式人會想做一些程式庫做不到的事,這時就有修改或建立自己的程式庫之需求。

電子電路模組也是類似的概念,它包裝了許多電子電路細節,有時程式人想要的功能它沒有時,那麼進一步瞭解細節,尋求自接電路的可能性,就會是一種選項,只是這對程式人來說,會有多難呢?

如同程式是由語言的基本元素,依邏輯、功能逐步堆砌起來,電子電路也有類似的道理,而這些基本元素,是從國中理化就接觸過的電壓、電流、電阻作為出發點,而在介紹開發板與程式設計的相關書籍中,多半也會以此為基礎,甚至有些是從無到有,教導如何連接一個可透過程式控制的基本電路,也會告知一些如何保護電路(或自己)的方式,先從這類基礎開始學習起,慢慢地,腦海中就會逐漸有架構電路時應有的基本邏輯了。

我在這一陣子回顧電子電路基礎的同時,發現現在有許多教導電子電路的書都很生動活潑了,像是《Make: Electronics》就假設讀者完全沒有電子電路基礎做為開始,第一個實驗甚至是讓讀者用舌頭嘗嘗電的味道,而有些書籍甚至以漫畫方式介紹電路學,這對於現今有心想接觸電子電路的程式人來說,都是不錯的起步資源。

程式人研究自接電子電路,不一定是為了成為這領域高手,以我來說,這有助於自己在查看相關電子電路規格書時,更能瞭解其中線路連接之目的,因而更能知道如何使用程式來進行控制,像是先前談到的Stepper程式庫,實際上也不能善用28BYJ-48每轉能達4096步的功能,然而若能瞭解28BYJ-48的激磁方式,實際上修改Stepper程式庫,或自行撰寫程式來支援,對程式人來說並不會是難事。

軟硬兼施的好處?

當然,如果有進一步目的或動機,也可以繼續往下鑽研,像是進一步研究C語言、組合語言、HDL等來控制相關晶片,這麼一來對硬體的認識也就更深,這也許是基於職場上的考量,因為同時瞭解軟硬體,可能創造出新的工作機會,對程式人來說,會是接觸硬體領域時,在實質面上的附加價值。

程式人想要軟硬兼施,也可以出自於想掌控周遭科技產品的欲望,可以試著修理(像是我就試著修理女兒的聲光玩具)或改造身邊的東西,就如同〈Bend it like Beckham〉中提到的:「很多東西若不是受限於生產成本,其實是擁有很多的可能性」,對已經有能力變換軟體元件以達到應用程式效果的程式人來說,這種更換元件的能力若能擴及硬體,將能夠創造出更多的可能性。

作者簡介


Advertisement

更多 iThome相關內容