2013年9月28日 星期六

Arduino範例16:讓超音波量測結果顯示在 LCD 銀幕上

P.S.感謝本次程式由林群鈞指導撰寫

繼「Arduino: 使用 16x2 的 LCD 銀幕」、「Arduino: 測試超音波模組(HC-SR04)
這次要結合這兩項東西,讓量測的結果顯示在LCD的銀幕上。
詳細的LCD 規格與 HC-SR04的規格請參考前面兩篇。

接線圖
LCD端的接法跟上一篇一樣,至於HC-SR04則把Pin腳移到Pin6與Pin7上。


2013年9月26日 星期四

Arduino範例15:使用 16x2 的 LCD 銀幕

實驗目的:本篇要應用Arduino 與 16x2 的 LCD 銀幕連接。

依照經驗,這種網路上買的不知名LCD銀幕至少都可以支援ASCII的文字。而除了顯示訊息外,IDE裡的 example 還有教我們還可以做訊息捲動 (往左和往右捲動)、顯示游標等。

接線圖
以下我整合Pin腳說明與接線圖,特別注意的是Pin 3要接一個可變電阻,來調背光強度,不然程式Loading進去之後,有可能看不到顯示的字。

另外將 LCD 的 RS, Enable, D4, D5, D6, D7 依序接到 12, 11, 5, 4, 3, 2 等腳位上,這是被子程式寫好的腳位,要改就要連 <LiquidCrystal.h>一起改,所以先不要動。


程式碼很簡單,因為<LiquidCrystal.h>都已經寫好了,我們只需要 lcd.write() 或 lcd.print() 就可以把字顯示在上面了。

2013年9月25日 星期三

Arduino範例14:測試超音波模組(HC-SR04)

這次要使用的超音波模組是HC-SR04,這是網拍上最常見的模組。
另外有人可能也會買到3 Pin的模組 (我查不到型號),那就是trig與echo同一個Pin。
回到HC-SR04來看,我找到它的型錄,了解一下它的用法:

Ultrasonic ranging module HC - SR04 provides 2cm - 400cm non-contact
measurement function, the ranging accuracy can reach to 3mm. The modules
includes ultrasonic transmitters, receiver and control circuit. The basic principle
of work:
  • Using IO trigger for at least 10us high level signal. 
  • The Module automatically sends eight 40 kHz and detect whether there is a pulse signal back.
  • IF the signal back, through high level , time of high output IO duration is the time from sending ultrasonic to returning.
  • Test distance = (high level time×velocity of sound (340M/S) / 2. 
  • When tested objects, the range of area is not less than 0.5 square meters and the plane requests as smooth as possible, otherwise ,it will affect the results of measuring.
  • Suggest to use over 60ms measurement cycle, in order to prevent trigger signal to the echo signal.

給trig pin一個10 us TTL pluse, 模組會發射8個40k Hz的聲波出去,然後量測訊號是否回來。如果有收到TTL的高電位訊號,那Echo會送出超音波來回的時間,使用者再自己計算音速換算距離。也就是「距離(cm) = 時間(us) / 2(來回) /29.1 (m/s轉換cm/us)」。其它要注意的是量測物體最好大於0.5公尺平方,而trigger時間最好大於60ms,以免trig與echo干擾。


註:什麼叫TTL pulse可參考以下網址
http://digital.ni.com/public.nsf/allkb/ACB4BD7550C4374C86256BFB0067A4BD

接線圖
接線的方法很簡單,就把 Trig 接上要送 10 us 的Pin腳。Echo 接到要收訊號的 Pin腳。



2013年9月24日 星期二

一些常用的Arduino語法筆記

看了Arduino的範例程式也好一陣子,但最近因為單純一行一行下來的command flow不夠用。
就上網找了一些語法的網站來看,如下:
1. 官方:http://arduino.cc/en/Reference/HomePage
2. 中文語法手冊:http://www.game7777.net/doku.php?id=arduino:arduinoreference

因為自己不太懂,所以給自己留一點筆記:

一般會先做(1) Pin腳的宣告,(2) void setup (),(3) void loop ()
然後跟資料定義有關的:int, unsigned int, log, const, #define
跟loop結構有關的:if...else架構,while迴圈,for迴圈

int
整數是基底資料型別,佔用2位元組。
整數的範圍為-32,76832,767 -2^15 ~2^15)-1
整數類型使用2的補數方式存儲負數。
最高位元通常為符號位元,表示數的正負。
其餘位被取反加1”(此處請參考補數相關資料,不再贅述)

unsigned int
unsigned int(無符號整型)與整型資料同樣大小,佔據2位元組。
它只能用於存儲正數而不能存儲負數,範圍 0~65,535 (2^16) - 1)

無符號整型和整型最重要的區別是它們的最高位元不同,既符號位元。
Arduino整型類型中,如果最高位是1,則此數被認為是負數,
剩下的15位為按2的補數計算所得值。

long
長整數型變數是擴展的數位存儲變數,它可以存儲32位元(4位元組)大小的變數,
-2,147,483,6482,147,483,647

const
const關鍵字代表常數。
它是一個變數限定詞,用於修改變數的性質,使其變為唯讀狀態。
這表示該變數就像任何相同類型的其他變數一樣使用,但不能改變其值。
如果嘗試為一個const變數賦值,編譯時將會報錯。
const關鍵字定義的常數,遵守 variable scoping 管轄的其他變數的規則。
這一點加上使用 #define 的易犯錯誤,使 const 關鍵字成為定義常量的一個的首選方法。

#define
#define它允許程式設計師在程式編譯之前給常數命名。
Arduino中,定義的常數不會佔用晶片上的任何程式記憶體空間。
在編譯時編譯器會用事先定義的值來取代這些常數。
然而這樣做會產生一些副作用, 例如,一個已被定義的常量名已經包含在了其他常數名或者變數名中。 在這種情況下,程式內的常數將被 #defined 定義的數值或字串所取代。
通常情況下,優先考慮使用 const 關鍵字替代 #define 來定義常數。

例子
#define ledPin 3
//在編譯時,編譯器將使用數值 3 取代任何用到 ledPin 的地方。

注意:
#define 聲明後不能有分號。
如果存在分號,編譯器會拋出語義不明的錯誤,甚至關閉程式。
#define ledPin 3; //這是一種錯誤寫法
同樣的,在 #define 聲明中包含等號也會產生語義不明的編譯錯誤從而導致關閉程式。
#define ledPin = 3 //這是一種錯誤寫法

if(條件判斷語句)和 ==!=<>(比較運算子)
if 語句與比較運算子一起用於檢測某個條件是否達成,如某輸入值是否在特定值之上等。

2013年9月23日 星期一

在LabVIEW之中連結Arduino

在單獨使用Arduino的板子一陣子之後,
想說來練習一下用LabVIEW來連接Arduino,把Arduino當作低階的DAQ卡來使用。
所以就上網找了一些參考資料:

題外話:
玩了一陣子之後,發覺網路上的神人實在是太多了
我這種機械底子的人跟本看不到這些寫程式神人的車尾燈……

言歸正傳,參考資料裡其實寫得很清楚了,該如何弄了:

第一,你本來就要有LabVIEW的程式(2009以上) + VISA模組 (這非預設的)
第二,你要有Arduino 的 IDE程式與板子
第三,安裝JKI VI Package Manager (VIPM),這是要給LabVIEW下載Arduino的模組
第四,用VIPM下載LabVIEW Interface for Arduino
第五,Arduino上需要另外安裝一個檔案才能與LabVIEW做序列溝通。
    在<您的LabIVEW安裝資料夾>\vi.lib\LabVIEW Interface for Arduino\Firmware\LVIFA_Base中,
    找LVIFA_Base.ino這個檔案,透過Arduino IDE load到你的Arduino板子上。
第六,最後打開LabVIIW看到下圖,就代表成功了。

不過在開始使用前,要先去裝置管理員或LabVIEW的Max裡看看設備是否都連上線了。
還有LVIFA_Base.ino是否已經load進去了。

首先先來寫一個範例,架構主要分成三個部分:
(1) Initial:定義port、Serial begin、Board type等等初使條件
(2) While Loop:原本程式中void setup ()與void loop ()都在這裡寫
(3) Close:結束loop時,還要再關掉通訊

心得:
1. 有這個東西真的很方便,就可以直接寫LabVIEW做Arduino的及時通訊
    而我也打算用LabVIEW對上次的製作的機械手臂做控制。
2. 基本這個套件的底層還是用VISA在寫的,把Arduino當作通訊序列的裝置在溝通。
    但這樣底層的溝通就容易發生未知的情況,尤其是Data Flow與Command Flow之間的轉換。
3. LabVIEW能夠支授的子程式不多,例如超音波Arduino就有現成有人寫好的Ultrosonic.h
    但LabVIEW只有少少的幾樣,如Servo motor、Stepper motor幾樣常用的。
    對於快速開發將會耗太多時間在自己寫子VI上。
           
以上供各位參考

2013年9月22日 星期日

Teardown: 手動電鑽 & 行星齒輪組

這一篇的主題為拆解手動電鑽,如下圖所示。
這種電鑽好用在有高的減速比,讓使用者不僅僅可以放鑽頭,高速鑽穿東西。
也可以用來鎖自攻螺絲,這種帶有pitch的螺紋而需較慢鑽入的緊固件。

首先打開側邊的外殼,所有的元件就一目瞭然。
對照下面的方塊圖來解說:以電池當作電源,經過開關來決定驅動與否。
電流進入到DC馬達之後,經過行星齒輪組減速,再配上夾頭,就可以轉動鑽頭了。

2013年9月21日 星期六

Tear down: ASUS A8J Notebook (Part III)

再接續前二篇
Tear down: ASUS A8J Notebook (Part I)
Tear down: ASUS A8J Notebook (Part II)
這篇就是把剩下的DVD Player跟銀幕拆開來看看

首先是Player,可以看之前拆過的 Tear down DVD player,都長得差不多。
軌道是一邊驅動,一邊承靠,再用彈簧推向基準一側。
只是筆電的DVD player比較薄,而且try 盤退出的機構是用電磁鐵拉開彈簧,以便彈出。


還有一個地方,就是SD卡按壓彈出的機構,如下圖所示:
把位置"1"的藍色柱子往左邊壓,順著軌道,會繞過倒勾型的路徑彈到的"2"的位置。
同理,在位置"2"的時候,向左邊壓,順著軌道,會繞過倒勾型的路徑彈回到"1"的位置。

2013年9月19日 星期四

Tear down: ASUS A8J Notebook (Part II)

因為筆電的照片太多了,所以分成好幾篇來PO。
上一篇「ASUS A8J Notebook (Part I)」從背後拆了筆電,現在要看正面的鍵盤。

先是按鍵的結構,在「X」型的塑膠結構中間帶有橡膠的按鈕。
按鍵的下方還有微小的Metal Dome。

而整個鍵盤組是可以拆下來成為一個模組的。
(下面另外發現一張音效卡:Intel NH82801GNM)

2013年9月17日 星期二

Tear down: ASUS A8J Notebook (Part I)

這次要拆的是一台液晶銀幕已經壞掉的notebook,ASUS A8J。
不過我知道很多朋友對筆電十分的熟悉,再請各位不吝提出指正。

首先看看四大件,下面是(A) 底座base與 (B) 鍵盤面殼;
上面兩個是(C)銀幕的框與(D)銀幕本身。

先從(A) 筆電的底部開始看起:
左下角是放鋰離子電池的空間,向右邊是Intel Wireless 3945ABG無線網卡;右下角則是硬碟(被我先拿走了)。左上角先是十分扁平的離心扇 (因為離心扇有高靜壓的特性,對流阻很大的筆電內部空間十分適合),同時也用銅做熱導體把CPU的熱也傳出來。CUP為Intel Core2 Duo T5600;最中間的地方是放RAM的空間,右上角蓋子的下方,則是ATM的顯卡。