2013/09/18

Arduino練習:彎曲感測器(flex/bend sensor)

上一篇嘗試了壓力感測器(Force-Sensitive Resistor),這一篇則玩玩看彎曲感測器(flex/bend sensor),用法跟電路都差不多。

基本上它就是個電阻,根據我買的產品資料規格書,平常狀態下電阻值約25kΩ,彎曲後電阻值會上升,大概會到100kΩ。

向Adafruit買的壓力感測器,生產廠商是Spectra Symbol。


電路圖如下,在5V與GND之間串聯彎曲感測器(電阻)與10kΩ,將類比腳位A0接到兩者之間。


實際照片。


底下是程式碼。

#define led_pin 11
#define flex_pin A0

void setup()
{
  Serial.begin(115200);
  pinMode(led_pin, OUTPUT);
}

void loop()
{
  int flex_value = analogRead(flex_pin);
  int led_value = map(flex_value, 0, 1023, 0, 255);
  analogWrite(led_pin, led_value);
  Serial.println(flex_value);
  Serial.println(led_value);
  Serial.println("-------------");
  delay(500);
}

當彎曲感測器在平常狀態下,flex_value的值大概在325,因電路的電壓是5V,Arduino類比腳位的解析度是10位元(0~1023),325 / 1024 * 5 = 1.59,代表該處電壓是1.59,5 - 1.59 = 3.41,也就是說彎曲感測器左右兩端的電位差是3.41。若相信此時彎曲感測器的電阻值是25kΩ,5 / (25000 + 10000) * 25000 = 3.58,嗯,差不多,沒錯。

然後若折彎彎曲感測器,它的電阻值就會上升,那麼flex_value的值就會越來越小,連帶地讓led_value的值越小,LED就會越暗。

Arduino練習:壓力感測器(Force-Sensitive Resistor)

類比輸入的形式非常多,譬如我之前寫過的可變電阻光敏電阻,這一篇則是壓力感測器(Force-Sensitive Resistor),顧名思義,加諸不同的力量(擠壓、重量),便會得到不同的電阻,進而改變從Arduino類比輸入腳位所讀取到的電壓值。

這是我向Adafruit買的壓力感測器,型號是Interlink 402,圓形部分半徑1/2吋可感測壓力,有兩支腳,可插入麵包板。


所謂壓力感測器(Force-Sensitive Resistor),其實就是個電阻,根據施加的壓力,其電阻值會改變,此產品的規格如下,無壓力時電阻幾近無限大,施加壓力後,電阻就會變小。


不過施加壓力的力道與電阻之間的變化關係,並非線性。


底下是電路圖,接法跟可變電阻很像,壓力感測器有兩支腳,其中一支接5V,另一支除了串聯10k歐姆電阻接地外,也接到Arduino的類比輸入腳位A0。

我另外從Arduino數位腳位11(具PWM)接了一個LED,將根據壓力感測器的讀數控制LED的亮度。


線路完成後的照片。


以上是硬體線路部分,底下是軟體程式的部份。

// 首先定義腳位
#define led_pin 11
#define fsr_pin A0

void setup()
{
  Serial.begin(115200);
  pinMode(led_pin, OUTPUT);
}

void loop()
{
  int fsr_value = analogRead(fsr_pin); // 讀取FSR
  int led_value = map(fsr_value, 0, 1023, 0, 255); // 從0~1023映射到0~255
  analogWrite(led_pin, led_value); // 改變LED亮度
  Serial.println(fsr_value);
  Serial.println(led_value);
  Serial.println("-------------");
  delay(100);
}

Arduino類比腳位的解析度是10位元(0~1023),而PWM腳位則是8位元(0~255),所以程式中使用map進行映射。

完成後,平時FSR電阻無限大,A0會讀到接地(電壓0V),所以LED不亮;若輕輕按壓FSR,LED就會微亮,用力擠壓FSR的話LED就會更亮一點。

此種壓力感測器價格低、容易使用,但不精確,不可用來偵測確實的力道或重量,而是應該取出幾個範圍,譬如無壓力、有點壓力、中等壓力、很大的壓力、等等,然後加以運用。

2013/09/17

Arduino練習:傾斜感測器Tilt ball switch

我向Adafruit買了個Tilt ball switch,可用來偵測是否傾斜。金屬小管子有兩隻腳,在管子內有顆金屬球,當管子成直立狀態,也就是腳朝下時,金屬球會落下接觸管子內的兩個接觸點接通兩隻腳,形成通路,若管子傾斜到一定程度後,就會斷路。

這是Tilt ball switch,tilt意思是傾斜、以管子裡的ball球控制、可當做switch開關使用。傾斜時可聽到裡頭球撞擊管子的聲音。


底下是接線圖,其實就跟一般開關沒什麼兩樣。管子的一隻腳接10k歐姆電阻後接5V,這隻腳也接Arduino的數位腳位2,另一隻腳接地。


以下是軟體部分。

int pin = 2;
int ledpin = 13;

void setup()
{
  pinMode(pin, INPUT);   
  pinMode(ledpin, OUTPUT);
}

void loop()
{
  int status;
  status = digitalRead(pin);
  digitalWrite(ledpin, status);
  delay(100);
}

按照這份電路圖與這支程式,平常直立時,形成通路,所以腳位2會讀到LOW,於是LED不亮。若傾斜球開關,裡頭的球離開兩個接觸點,變成斷路,腳位2會讀到HIGH,於是點亮LED。

根據規格書,起作用的傾斜角度是30度,但實際狀況仍須試驗後才知道。這種感測器很便宜,號稱是窮人的加速度感測器,但用起來也不盡理想,並非從某個角度以上都是通路,而從該角度以下都是斷路,實際使用時,管子內的小球可能會亂跑,形成類似一般機械開關的彈跳(bounce)現象。

到YouTube觀看實際使用時的影片

這篇寫的有點簡略,關於「開關」,請參考我之前寫的「Arduino練習:以開關切換LED明滅狀態」。

2013/09/16

Arduino練習:霍爾效應感測器

霍爾效應(Hall effect)由Edwin Hall於1879發現,當電流通過固體導體(或半導體)且放在磁場內,導體內的電荷載子受到勞倫茲力而偏向一邊,進而產生電壓(霍爾電壓)。根據此效應,便可偵測磁場、磁鐵。

這是我買的霍爾效應感測器Melexis US5881LUA。腳位功能圖,1:電源,2:接地,3:輸出。


工作電壓:3.5V到24V
適用溫度範圍:-40°C到150°C

US5881LUA是一個單極(unipolor)的磁力偵測裝置,只能偵測磁鐵的S磁極。

線路圖如下所示,接上5V電源與接地後,US5881LUA的腳位3接一個上拉電阻10k歐姆再接5V,腳位3再接Arduino的數位腳位2。


當US5881LUA處於磁力很弱、磁鐵的S磁極時,Arduino腳位2的狀態將會讀到HIGH,只有在磁鐵S磁極靠近US5881LUA的正面時(據我圖中那個小小的磁鐵而言,必須在1公分之內),Arduino腳位2的狀態將會讀到LOW,所以其作用就如同一個普通的開關,但是是以磁力控制罷了。

底下是測試用的程式碼:

int pin = 2;

void setup()
{
  Serial.begin(115200);
  pinMode(pin, INPUT);    
}

void loop()
{
  int status;
  status = digitalRead(pin);
  Serial.println(status);
  delay(1000);
}

也沒什麼,就是讀取腳位2的狀態,並輸出到序列埠,平常會看到1(HIGH),磁鐵S極靠近就會看到0(LOW)。

這篇寫的有點簡略,關於「開關」,可參考我之前寫的「Arduino練習:以開關切換LED明滅狀態」。

2013/09/14

Raspberry Pi情報彙整(5)

我將網路上看到的、感興趣的、跟Raspberry Pi相關的資訊收集如下。如果您發現任何新奇驚人的新聞或專案,還請告知我。

Video: Making a Raspberry Pi – the full manufacturing process,影片,讓我們一窺Raspberry Pi的製造過程。


電子雜誌MagPi九月份出刊囉,趕緊去看看有什麼內容吧。


i.materialise的Raspberry Pi外殼設計競賽,點進去看看各方好手設計的外殼吧。


Raspberry Pi aids cyber 'safety net' for African rhino,看看Raspberry Pi如何保護犀牛,抓光盜獵者。


Bitcoin-Operated Pool Table,以Bitcoin付錢的撞球桌,裡頭當然是一台Raspberry Pi啦。


Jack the DVD ripping robot,光碟抽取機,結合電子與機械,幫你自動把光碟內容抽取出來。


SF Muni LED Sign at Home with Raspberry Pi,在家在辦公室裡也能擁有公車渡輪的現況,使用Raspberry Pi去讀取舊金山Muni大眾交通運輸工具的狀態。


Pi-Pan, a Pan-Tilt for Raspberry Pi Camera,以兩個伺服馬達控制相機模組的位置,已完成群眾募資。


Build a Raspberry Pi Moisture Sensor to Monitor Your Plants,偵測含水量,可別讓你的植物枯死啦。


RaspyFi,以音樂系統為中心的Linux發行套件,不僅支援Raspberry Pi,也開始移植到其他ARM架構的機器,擁有不錯的網頁操控介面。


PiHub,相當厲害的USB集線器,特別為Raspberry Pi打造,有4個USB埠,可供給3A電流!


PiCon,輕輕鬆鬆修改設定。


CODER,Google的東西,讓Raspberry Pi變成網站開發平台。


openSUSE ARM也開始支援Raspberry Pi了,嗯,又多了一個,我對openSUSE不熟。


Raspberry Pi as an Ad Blocking Access Point | Adafruit Learning System,讓Raspberry Pi作為無線AP,並且擋掉廣告!這樣一來,任何裝置,包括個人電腦、Xbox 360、Android手機,都看不到廣告啦。

2013/09/12

開箱文:Raspberry Pi原型擴充板Adafruit Prototyping Pi Plate Kit for Raspberry Pi

我買了Adafruit的Adafruit Prototyping Pi Plate Kit for Raspberry Pi,是一塊Raspberry Pi原型擴充板,屬於電子套件形式,必須自己動手焊接,原廠也提供了非常詳盡的焊接過程

印刷電路板、插入Raspberry Pi的2x13排針的排母、螺絲終端、一些排母、緩衝墊。


動手焊接吧,滿簡單的。完成後的樣子,中間有類似麵包板的原型區,也有類似洞洞板一個洞一個洞的原型區,還有一個可焊接SMD元件的地方。。


背面,可看到插入Raspberry Pi排針的排母,以及位於網路線插座上方的緩衝墊。


與Raspberry Pi合體,耶。


原廠的產品照片,拍的真漂亮啊。

2013/09/11

開箱文:Arduino原型擴充板Adafruit Proto Shield for Arduino Kit

我買了Adafruit的Adafruit Proto Shield for Arduino Kit,是一塊Arduino原型擴充板,除了原型區之外,還有重置按鈕與ICSP 2x3排針,以及可自由運用的兩個LED與一個按鈕開關,屬於電子套件形式,必須自己動手焊接,原廠也提供了非常詳盡的焊接過程

所有的零件,印刷電路板、排針排母、LED與電阻、按鈕開關、電容,2x3 ICSP排針。


動手焊接吧,沒什麼好說的,經過一番努力之後,結果如下。


背面。


插入一塊Arduino板子後的模樣。


不過有個缺點,這塊擴充板往下插入Arduino板後,上頭的排母並不符合規格,無法再疊上另一塊擴充板,除非使用超長的排針

2013/09/10

開箱文:AVR ISP燒錄器Adafruit USBtinyISP

我向Adafruit買了AVR ISP燒錄器,名為USBtinyISP,屬於套件形式,必須自己焊接組裝

這種AVR ISP燒錄器,如果是Atmel官方原廠的AVRISP mkII,大概要1000元,非原廠的通常500元上下,不過在拍賣網站上有約100元的產品,也有很多高手自行設計並公開在網路上,也可以根據Arduino官方文件描述的Parallel Port Programmer自己製作並列埠燒錄線,或是把另一塊Arduino板子當做ISP燒錄器

外包裝。


內容物,晶片、電阻、電容、陶瓷諧振器、2x3與2x5排線、LED、印刷電路板、外殼、稽納二極體、USB B型插座、等等。


電路板的正反面。


根據文件,逐一焊接。


裝上排線與外殼,完成。


接上Arduino Uno試試看吧。


下載驅動程式並安裝,在裝置管理員裡會出現USBtinyISP AVR Programmer,是一個USB裝置。


可以先用燒錄程式avrdude試試看,以-c usbtiny指定燒錄器,-p指定微控制器,先隨便指定一個,譬如m8是Atmega8。

$ avrdude -c usbtiny -p m8
avrdude.exe: Error: Could not find USBtiny device (0x1781/0xc9f)

avrdude.exe done.  Thank you.

居然說找不到裝置,難道我焊接錯誤嗎,還好拔插USB線後,再執行一次就正常了,如下。

$ avrdude -c usbtiny -p m8

avrdude.exe: initialization failed, rc=-1
             Double check connections and try again, or use -F to override
             this check.

avrdude.exe done.  Thank you.

若以-p m328p指定正確的微控制器,Arduino Uno使用Atmega328P,則會出現如下訊息,代表燒錄器可以與微控制器正常溝通。

$ avrdude -c usbtiny -p m328p

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude.exe: Device signature = 0x1e950f

avrdude.exe done.  Thank you.

雖然也可以自己使用avrdude下指令燒錄,不過還是使用Arduino IDE比較簡單方便,啟動後,從Tools-Board選擇你的Arduino開發板,從Tools-Programmer選USBtinyISP,然後,以File-Upload Using Programmer上傳(燒錄)程式碼,以Tools-Burn Bootloader燒錄bootloader。

燒錄一般程式碼,成功囉。


燒錄bootloader,需要一點時間,也成功囉。


當然啦,燒錄麵包板上的AVR微控制器也是可行的。


耶。

關於Adafruit USBtinyISP的詳細規格,請參考官方文件

2013/09/09

在麵包板上建構Arduino(ATmega328P加USB轉TTL Serial轉接卡)

其實之前的「將Arduino Uno當做一台ISP線上燒錄器,燒錄bootloader或sketch到麵包板上的ATmega328P-PU晶片」,就已經曾在麵包板上建構Arduino,不過那時使用一塊Arduino板子當做ISP線上燒錄器,而這篇使用「USB轉TTL Serial」轉接卡。關於USB轉換功能的相關產品,可參考這一篇

我將在麵包板上插入ATmega328P-PU微控制器晶片,並加入「USB轉TTL Serial」轉接卡FTDI Friend,開發時就跟一般的Arduino開發板完全一樣。我假定微控制器晶片已經燒錄bootloader了。

這是ATmega328的腳位功能圖,跟ATmega168一樣。


電路圖如下,從電腦USB埠、經由FTDI Friend供電給ATmega328,FTDI Friend的TX、RX連接到ATmega328的RX、TX。

ATmega328針腳1(reset),接10k歐姆電阻再接5V;另接開關再接地,燒錄必須手動按開關重置。

ATmega328針腳10(對應Arduino數位腳位13),接220歐姆電阻、串聯LED。將燒錄Blink範例草稿碼測試是否正常。

其他就是基本接法,接電源、接地、接外部石英晶體震盪器。


麵包板示意圖如下。


FTDI Friend的背後。


完成囉,使用時就跟一般Arduino開發板相同,哈哈。

當然啦,也可以轉移到洞洞板上,需要自己焊接線路。

除了使用「USB轉TTL Serial」的轉接卡或轉接線,如果你的電腦還有9針的RS-232序列埠的話,加上「RS-232轉TTL Serial」的產品,也是可以的。但要記得,連接序列介面時要跨接,某端的RX與TX分別接到另一端的TX與RX,但某些產品似乎故意調換這兩個腳位的標示。