Python可以這樣玩(12):Arduino + Python


要瞭解arduino就先要瞭解什麼是單片機,arduino平臺的基礎就是AVR指令集的單片機。



1、什麼是單片機?它與個人電腦有什麼不同?
一台能夠工作的電腦要有這樣幾個部份構成:中央處理單元CPU(進行運算、控制)、隨機記憶體RAM(資料存儲)、記憶體ROM(程式存儲)、輸入/輸出設備I/O(串列口、並行輸出口等)。在個人電腦(PC)上這些部份被分成若干塊晶片,安裝在一個被稱之為主機板的印刷線路板上。而在單片機中,這些部份全部被做到一塊積體電路晶片中了,所以就稱為單片(單晶片)機,而且有一些單片機中除了上述部份外,還集成了其它部份如類比量/數位量轉換(A/D)和數位量/類比量轉換(D/A)等。

2、單片機有什麼用?
實際工作中並不是任何需要電腦的場合都要求電腦有很高的性能,一個控制電冰箱溫度的電腦難道要用酷睿處理器嗎?應用的關鍵是看是否夠用,是否有很好的性能價格比。如果一台冰箱都需要用酷睿處理起來進行溫度控制,那價格就是天價了。

單片機通常用於工業生產的控制、生活中與程式和控制有關(如:電子琴、冰箱、智慧空調等)的場合。

下圖就是一個Atmega328P-PU單片機,基於AVR指令集的8位元處理器,頻率20MHz,記憶體空間32KB





什麼是 Arduino

Arduino是一個能夠用來感應和控制現實物理世界的一套工具。 它由一個基於單片機並且開放源碼的硬體平臺,和一套為Arduino板編寫程式 的開發環境組成。

Arduino可以用來開發交互產品,比如它可以讀取大量的開關和感測器信號,並且可以控制各式各樣的電燈、電機和其他物理設備。Arduino項目可以是單獨的,也可以在運行時和你電腦中運行的程式(例如:FlashProcessingMaxMSP)進行通訊。Arduino板你可以選擇自己去手動組裝或是購買已經組裝好的;Arduino開源的IDE可以免費下載得到。

Arduino的程式設計語言就像似在對一個類似於物理的計算平臺進行相應的連線,它基於處理多媒體的程式設計環境。

準備IDE開發環境

Arduino軟體是開源的,對於有經驗的程式師可以對其進行擴展。Arduino程式設計語言可以通過C++庫進行擴展,如果有人想去瞭解技術上的細節,可以跳過Arduino語言而直接使用AVR C 程式設計語言(因為Arduino語言實際上是基於AVR C的)。類似的,如果你需要的話,你也可以直接往你的Arduino程式中添加AVR-C 代碼。

Arduino軟體可以運行在WindowsMacintosh OSX,和Linux作業系統。大部分其它的單片機系統都只能運行在Windows上。首先我們要下載 Arduino IDE,請進下面的網址:https://www.arduino.cc/en/Main/Software



安裝非常容易,由於我目前使用的是 Windows 作業系統,所以選擇第一個,下載完畢檔案如下,執行:



我們選擇 Default 安裝選項就可以。


安裝完畢之後,會出現下面三個額外安裝的選項,建議全部都選取安裝:





很好,這樣就安裝完畢了。接下來我們就來介紹 Arduino UNO 開發版,建議一開始可以買套件,裡面會有所有基本的模組可以使用,價格大約在 1000 元以內,UNO的構造很簡單,先介紹五個部分,PIN腳有三組,14個數位PIN腳,六個類比PIN腳,再加上8個電源相關PIN腳。左上角有一個 RESET按鈕,接著就是USB接頭。


請參考下圖,有明確的說明:


Arduino板基於 Atmel ATMEGA8 ATMEGA168/328 單片機。Arduino基於Creative Commons 授權合約,所以有經驗的電路設計師能夠根據需求設計自己的模組,可以對其擴展或改進。甚至是對於一些相對沒有什麼經驗的用戶,也可以通過製作試驗板來理解Arduino是怎麼工作的,省錢又省事。

利用這塊小小的開發本,再加上例如下面的模組,你就可以輕鬆開發出你想要的電子儀器。


IDE UNO 都準備好之後,第一步請將您的UNO連接上電腦的USB插座,這時候,UNO就自動開機了,你會發現在UNO右上角附近有一個 ONLED綠燈亮起,然後第13 PIN腳下面有一個黃色LED等在閃爍,就代表開機成功並開始執行了。


接著打開你的 Arduino IDE,就是我們寫程式並且燒錄到 Arduino UNO的工具,介面很簡單,如下圖,一開始會顯示空白的程式,裡面有兩個 Block,分別是 setup() 以及 loop()setup() 是指我們要對 UNO 做的設定,會在RESET的時候執行一次,然後就會進去loop() 一直執行循環的指令,直到我們關機為止,這裡所使用的語言是 AVR C


第一次使用IDE的時候,請完成下面三個動作:

首先打開 [檔案][偏好設定],會出現下面的畫面,建議有幾個地方可以打勾,在編譯和上傳的時候顯示詳細輸出;顯示行數以及啟用程式碼摺疊功能。

接下來,打開 [工具][開發板],請選擇你所買的開發板,我這裡用的是 Arduino UNO,所以選擇 UNO

最後,打開 [工具][序列埠],當我們沒有把UNO連接上電腦的時候,這裡是灰色的無法選擇,插上UNO之後這裡就會看到一個 COM3 ….. UNO 的選項,選取這個就對了。


一切準備就緒,到目前為止我們並沒有上傳任何程式到UNO中,不過UNOLED燈卻一直閃爍,這是為何?其實現在UNO已經在執行一個內建的程式,也就是我們接下來要說明的第一個程式。


UNO內建的第一個程式,其實就在範例裡面,請打開 [檔案] [範例] [Basic] [Blink],顯示如下圖,這整段程式碼裡面,出現了下面三個指令,我們先來解釋第一個指令:

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                    // wait for a second


pinMode(LED_BUILTIN, OUTPUT)

pinMode 是用來設定PIN腳的狀態用的,LED_BUILTIN代表UNO內建的LED燈,它連接到13PIN腳,所以其實 LED_BUILTIN 的數值就是 13,想要測試的話你可以直接把它改成13然後重新上傳執行便知。

第二個參數 OUTPUT 就是將第13PIN腳設定成輸出,每個PIN腳都可以是輸入或輸出,因為我們是要讓LED燈亮,所以是輸出5V的電壓。

digitalWrite(LED_BUILTIN, HIGH)

degitalWrite digitalRead 是相對的,由於PIN腳設定成 OUTPUT,自然就要使用 digitalWrite 把它寫出去,寫什麼呢?其實就是寫一個 5V 的高電壓,UNO的電壓輸出不是5V – HIGH 就是 0V – LOW。這個意思就是寫出一個 HIGH電壓到 13PIN LED亮起來。

delay(100)

停滯時間,這裡的單位是毫秒,1000等於一秒鐘。

Hello World!

前面小節直接使用了 Blink 範例草稿,其實我們還沒有真的寫自己的程式,所以,按照慣例,在進入每一個新的領域之前,我們都必須寫一個 Hello World! 程式,這是絕對必須的,如果沒有 Hello World,你會搞不清楚到底開發環境是不是正確可用的。我本身有一個例子,在我第一次研究 OpenGL 的時候,就真的找不到 Hello World! 這樣的程式,第一個範例就是一個非常複雜的程式,結果一直出現編譯失敗,花了兩天的時間,才把接連產生的十幾個問題解決,這對初學者而言是件慘事。

要寫Hello World 之前,請先確定Arduino IDE安裝無誤,Arduino UNO開發板已經連接到你的電腦主機上。請開啟IDE,從 [檔案] [新增] 建立一個新檔案,輸入右方的程式碼:

接著打開 [工具] [序列埠監控視窗],確定控制視窗的下面狀態列也是 9600 baud,回到IDE上傳程式。

由於這是一個新的草稿檔(程式檔)IDE會要求你輸入檔案名稱以及儲存目錄,請輸入 "HelloWorld" ,不需要附加檔名,因為IDE會使用這個名稱建立一個目錄,然後把相關檔案存在目錄之中。
PS1: 如果你沒有把 UNO 連接上電腦,監控視窗是打不開的。
PS2: 監控視窗會占用電腦的COM Port,當你日後使用 Python 控制UNO的時候,不須把監控視窗關閉,否則 Python 程式無法執行。



看到上面的畫面,就代表你成功了。


Hello Switch

之前我們是透過PIN 13 來讓UNO板子上面的LED閃爍,接下來,我們可以寫一個由PIN7 作為INPUT,並加上一個Switch,當SwitchON的時候,我們透過上拉電阻讓它的到一個HIGHINPUTSwitchOFF的時候,透過GND PIN讓它得到一個LOWINPUT,再透過判斷式去開關PIN 7 LED


上拉電阻原本要靠一個20歐姆的實際電阻,讓PIN 7維持高電位,但是這裡可以靠下面的指令來達成,請參考下表,理論上只有Mode=OUTPUT才可以使用 digitalWrite() 指令來做做兩件事情,輸出HIGHLOW電壓,但是如果我們把 digitalWrite(HIGH) 用在Mode=INPUT的地方,原本是不合邏輯的錯誤用法,但在這裡成為一個特例,形同使用上拉電阻:



了解原理之後,我們不需要裝實際電阻了,但是在setup() 第二行必須多加一行 digitalWrite(7,HIGH)。完整程式碼輸入如下,特別說明,digitalRead(7) 只有一個參數就是PIN腳編號:



接下來要插線路在麵包板了,麵包板的外觀如下圖:


基本上必須了解麵包板內部線路,如下圖,按照電路圖判斷,SWITCH必須插在斷路的兩端,SWITCH的內部是類似一個H的電路,沒按它的時候中間是不通的,按下之後中間便為通路:



因此,沒按SWITCH的時候,紅線與藍線不通,PIN 7由上拉電阻保持高電壓HIGH,當我們按下SWITCH,則由GND得到低電壓LOW,請按照下圖完成電路,然後就可以上傳程式了,當按下SWITCHLED燈滅:


另外要注意紅藍線中間是否有斷開,有些麵包板的紅藍線是連續的一條線,那就代表裡面的線路是相連的。

留言

這個網誌中的熱門文章

Python可以這樣玩(16):共陰/共陽七段顯示器

Python可以這樣玩(11):數學繪圖

Python可以這樣玩(15):蜂鳴器與音樂