Wikipedia 維基百科

搜尋結果

2019年3月28日 星期四

Arduino的練習:光敏電阻

之前以可變電阻控制呼吸燈的循環時間,這篇要以光敏電阻(光電阻,光電池,光敏電阻)控制LED的明滅。

電路圖(Fritzing格式)與程式原始碼,可在此下載

電路圖:

LED,長腳接腳位13,短腳接GND。

光敏電阻,一腳接5V,另一腳接到腳位A0與10k ohm電阻,電阻的另一腳接地。// 






從腳位A0讀取光敏電阻的值。// 
以腳位13控制LED。
無效設置(){ 
  Serial.begin(115200); 
  pinMode(A0,INPUT); 
  pinMode(13,OUTPUT); 
 
  digitalWrite(13,LOW); 


int pr_min = 400; 

void loop(){ 
  //以及analogRead()讀取光敏電阻的值,會回傳0~1023之間的值.int 


  pr = analogRead(A0); 

  //並且把值輸出到序列埠,請用手遮蔽光敏電阻,看看變化

  .Serial.println(pr); 

  //若大於這個值,熄滅LED,若小於就點亮。
  //請視需求修改pr_min.digitalWrite 
  (13,pr> pr_min?LOW:HIGH); 
 
  延遲(1000); 


完成後,當外界光線強時,光敏電阻會讀到較大的值,LED就會熄滅;外界光線弱時,會讀到較小的值,LED就會亮起。


參考資料:

Arduino筆記:讀取/寫入SD卡資料

如果要在Arduino紀錄感測元件接收的數值,除了透過網路模組送出以外,開發板本身並不像Raspberry Pi有外接SD或Micro SD卡的介面,可以儲存在記憶卡上,要寫入資料到SD卡上,就必須透過SPI的介面,才能將感測的資料寫入SD卡。

我先測試一下SD卡的模組是否能讀取/寫入檔案,如果可以,再改接網絡擴展模組W5100,看看相同的程式是否能存取W5100擴展板上Micro SD卡的資料?結果如何呢?


[材料]

•Arduino Uno x 1 
•SD卡模組x1 
•連接線x 6條

[接線圖]

•注:上圖DI代表SD卡模組MOSI,DO代表SD卡模組MISO 

•SD卡模組連接線路 
SD 卡模組
Arduino的
GND
GND
+ 5V
5V
CS
針腳4
MOSI
第11針
SCK(CLK)
第13針
味噌
第12針
SPI匯流排規定了4個保留邏輯訊號介面:( 維基百科
•SCLK(串行時鐘):串行時鐘,由
主機發出•MOSI(主輸出,從輸入):主機輸出從機輸入訊號,由主機發出
•MISO(主輸入,從輸出):主機輸入從機輸出訊號,由從機發出
•SS(從機選擇)或片選(CS):由主機發出,低電位有效

有關SPI的說明,可參考這篇:「Raspberry Pi筆記(二):GPIO接腳與I2C及SPI安裝」。

[SD庫]

SD類
•初始設定SD卡及函式庫:SD.begin(cspin)
    cspin(選項):Arduino連接SD卡模組SS或CS的Pin腳

•檢查括號內的檔案名稱是否存在:exists()

•建立目錄:SD.mkdir(filename)

•開啟檔案:SD.open(文件路徑,模式)
   模式:FILE_READ開啟唯讀檔案,從檔案開始處讀取。
               FILE_WRITE開啟讀寫檔案,從檔案最後處開始寫入

•移除檔案:SD.remove(文件名)

•移除目錄:SD.rmdir(filename)

文件類
•關閉檔案:file.close()

•將數據字串寫到檔案中,不跳行:file.print(data)

•將數據字串寫到檔案中,不跳行:file.println(數據)

•將數據字串寫入檔案中:file.write(數據)

[程式]

我參考Arduino IDE的兩個範例cardinfo跟踪文件,試著在SD卡上,顯示SD卡的相關資訊,再建立一個檔案,寫入測試文字後,關閉檔案。以下是執行的測試程式:

#include <SPI.h>
#include <SD.h>

檔案myFile;

//設定SD庫功能變數:

Sd2Card卡;
SdVolume量;
SdFile root;

const int chipSelect = 4;

void setup(){

  Serial.begin(9600); //開啟通訊串列埠開啟
  while(!Serial){//等待串列埠連線
  }

  // -----------寫入檔案
  Serial.print(“\ n等待SD卡就緒......”);

  if(!SD.begin(4)){
    Serial.println(“失敗!”);
    返回;
  }
  Serial.println(“成功!”);

  myFile = SD.open(“card.txt”,FILE_WRITE); //開啟檔案,一次僅能開啟一個檔案
  
  if(myFile){//假使檔案開啟正常
    Serial.print(“寫入card.txt ...”);         
    myFile.println(“測試將數據寫入SD卡......”); //繼續寫在檔案後面
    myFile.close(); //關閉檔案
    Serial.println(“完成!”);
  } else {
    Serial.println(“\ n打開文件錯誤”); //無法開啟時顯示錯誤
  }
  
   // -----------顯示SD卡資訊

  if(!card.init(SPI_HALF_SPEED,chipSelect)){
    Serial.println(“初始化失敗。檢查:SD卡”);
    返回;
  } else {
    Serial.println(“=============卡信息==================”);
  }

  //顯示SD卡類型

  Serial.print(“卡片類型:”);
  switch(card.type()){
    案例SD_CARD_TYPE_SD1:
      Serial.println(“SD1”);
      打破;
    案例SD_CARD_TYPE_SD2:
      Serial.println(“SD2”);
      打破;
    案例SD_CARD_TYPE_SDHC:
      Serial.println(“SDHC”);
      打破;
    默認:
      Serial.println(“不明”);
  }

  //現在我們將嘗試打開'volume'/'partition' - 它應該是FAT16或FAT32
  if(!volume.init(card)){
    Serial.println(“找不到FAT16 / FAT32分區。”);
    返回;
  }

  //顯示類型和FAT空間大小
  uint32_t volumesize;
  Serial.print(“卷類型為FAT”);
  Serial.println(volume.fatType(),DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster(); //簇是塊的集合
  volumesize * = volume.clusterCount(); //我們會有很多集群
  volumesize * = 512; // SD卡塊總是512字節
  Serial.print(“Volume size(bytes):”);
  Serial.println(volumesize);
  Serial.print(“卷大小(Kbytes):”);
  volumesize / = 1024;
  Serial.println(volumesize);
  Serial.print(“卷大小(Mbytes):”);
  volumesize / = 1024;
  Serial.println(volumesize);

  Serial.println(“卡上找到的\ n文件(名稱,日期和大小,以字節為單位):”);
  root.openRoot(體積);

  //列出卡片中包含日期和大小的所有文件
  root.ls(LS_R | LS_DATE | LS_SIZE);

  Serial.println(“=================完成=====================”);
}

void loop(){//在Setup()執行完成後,就等結束 
}

[執行結果]

換上W5100網路擴展板,程式一個字元都不需要更改,可以讀取擴展板上的SD卡資料。我的SD卡上有中文名稱,就會顯示部分中文沒問題,但大多數變成亂碼。檔案列表第一個card.txt就是測試時寫入的檔案。

[參考資料]

•Arduino.cc:SD庫
天花板隨記 Arduino筆記(16):讀取/寫入SD卡資料

Arduino簡介

Arduino簡介

問:Arduino是什麼?
答:Arduino是個open-source electronics prototyping platform,含有容易使用、擴充性強的硬體與軟體,提供給藝術家、設計師、業餘愛好者、任何有興趣的人,建立打造互動式的科技藝術裝置作品。

問:啥,open-source electronics prototyping platform是什麼鬼?
答:所謂open-source開放源碼,意思是說Arduino的硬體電路設計圖是開放的,軟體原始碼也都是開放的;electronics代表說創作物是要吃電的;prototyping platform表示運用這套平台可以快速地建構出原型,打造產品。

Arduino的logo。

問:那可以打造什麼產品呢?
答:這就要看你的想像力了。

譬如說可用來人貓互動,只要貓咪跳上專用座椅上,配合Arduino-Android裝置,就會自動在Twitter發訊息,或拍照貼上Facebook。

譬如說手機遙控車


譬如說機器人

譬如說療癒系的電子寵物Gamma羊

問:哦,很不錯嘛,講點Arduino的歷史吧?
答:於2005年,Arduino計畫正式啟動,發源地是義大利北方的Ivrea鎮。在2005那個時候,發起人Massimo Banzi與David Cuartielles覺得市面上可用的素材與零件太過昂貴,學生負擔不起,於是想要打造便宜好用的電子原型平台,這才萌芽了Arduino這樣的想法。

若對緣起與歷史有興趣的人,可以看看這支記錄片Arduino: The Documentary (2010)

問:Arduino?什麼意思啊?怎麼念?
答:Arduino的核心開發團隊成員包括:馬西莫·班齊(Massimo Banzi)、大衛·奎提耶斯(David Cuartielles)、湯姆·伊果(Tom Igor)、贊布羅塔·馬提諾(Gianluca Martino)、大衛·梅利斯(David Mellis)和尼可拉斯·蘭比提(Nicholas Zambetti)。
據說馬西莫·班齊之前是義大利Ivrea一家高科技設計學校的老師。他的學生們經常抱怨找不到便宜好用的微控制器。2005年冬天,馬西莫·班齊跟大衛·奎提耶斯討論了這個問題。大衛·奎提耶斯是一個西班牙籍晶片工程師,當時在這所學校做訪問學者。兩人決定設計自己的電路板,並引入了馬西莫·班齊的學生大衛·梅利斯為電路板設計程式語言。兩天以後,大衛·梅利斯就寫出了程式碼。又過了三天,電路板就完工了。這塊電路板被命名為Arduino。幾乎任何人,即使不懂電腦編程,也能用Arduino做出很酷的東西,比如對感測器作出回應,閃爍燈光,還能控制馬達。隨後馬西莫·班齊、大衛·奎提耶斯和大衛·梅利斯把設計圖放到了網上。保持設計的開放原始碼理念,因為著作權法可以監管開源軟體,卻很難用在硬體上,他們決定採用創用CC許可。創用CC是為保護開放著作權行為而出現的類似GPL的一種許可(license)。在創用CC許可下,任何人都被允許生產印刷電路板的複製品,還能重新設計,甚至銷售原設計的複製品。你不需要付版稅,甚至不用取得Arduino團隊的許可。然而,如果你重新發布了參照設計,你必須說明原始Arduino團隊的貢獻。如果你調整或改動了電路板,你的最新設計必須使用相同或類似的創用CC許可,以保證新版本的Arduino電路板也會一樣的自由和開放。唯一被保留的只有Arduino這個名字。它被註冊成了商標。如果有人想用這個名字賣電路板,那他們可能必須付一點商標費用給Arduino的核心開發團隊成員。
贊布羅塔·馬提諾創立的Arduino Srl被2009年創立的Arduino LLC控告侵犯了他們的著作權,這第二家被控侵權的Arduino(也就是Arduino Srl),原先叫做Smart Projects Srl,以前是在義大利負責生產製造Arduino控制板的公司。而第一家Arduino(也就是我們較熟悉的Arduino LLC)則負責開發控制板,並管理周邊的開放原始碼專題與社群。在之前,原本雙方是合作的關係;2014年馬提諾與另外四位共同創辦人,對於Arduino品牌的發展方向意見不合,導致馬提諾另外請費德里科·穆斯托擔任Smart Projects的新執行長,並把公司名稱改為Arduino Srl。

問:好,那要怎麼開始玩呢?
答:你需要硬體部分與軟體部分。

問:硬體部分呢?
答:你可以買現成的板子或是自己組裝。

初學者大概都是購買現成的,根據Arduino官方網站所寫,台灣地區具有官方合法授權的代理商為藝科資訊 Aroboto StudioPlayRobot 飆機器人/普特企業有限公司iCshop (台灣)電子零件,電子材料,當然啦,還有別的商家,到網路上搜尋一下可找到不少,拍賣網站上也有,甚至也可以到國外網站去買。

購買時要注意的是:價格、出貨速度、退換貨的機制。

從2005年以來,Arduino官方已經出了不少版本的板子,那該買哪一塊呢?以目前來講,以Arduino Uno與Arduino Mega 2560為主,Uno是基本款,而Mega 2560搭配了更強的微控制器(價格也較高)。

(2012.05.28更新,新的板子Arduino Leonardo出來囉,更強更便宜。兩塊開發板的差異,請看Arduino:Leonardo與Uno的差異比較

Arduino Uno

官方還有其他板本的板子,各有其不同特色,有的加入藍牙傳輸能力,有的尺寸很迷你,有的弄成圓形、適用於打造穿配在衣服上的產品。

除了官方的Arduino板子外,因為板子的電路設計圖是開放的,很多人、廠商也相繼推出各種「Arduino相容板」,譬如SeeeduinoSippinoUSBDroid、等等,詳細列表可看這篇。每塊相容板都有它特別的地方,尺寸特別小、低耗電、網路連線、藍牙、等等。

例:Sippino這塊相容板,輸出針腳都弄在同一邊,適合插在麵包板上。

當然啦,因為板子的電路設計圖是開放的,你也可以買零件材料自己拼湊。自己組裝可以得到成就感,也能更進一步了解板子,網路上有某些人是自己組裝板子的,並且加入自己的設計與新功能!

在麵包板上組裝Arduino板。

問:軟體部分呢?
答:需要開發環境、編譯器、連結器、開發工具鏈、燒錄程式、板子與電腦連接所需要的驅動程式、等等等等,這些通通都已經準備好、打包好了,到Arduino官方網站的下載頁面即可下載,可在Windows、Mac OS X、Linux上運行。

Arduino軟體開發環境的畫面

問:什麼是"shield"?
答:這應該算是Arduino的術語吧,中文大概叫做擴充板或擴展板,插在主板上以加入其他功能,也可以被稱為"daughterboard"或"add-on module"。

譬如說:官方的Arduino Ethernet Shield加入以太網路的連線能力,SparkFun的BlueSMiRF加入藍牙連線能力,另外還有各種驅動馬達的擴展板,等等。完整列表可看這裡,真是琳琅滿目啊,有感測光線的、感測聲音的、等等。

例,Arduino官方的Wireless SD Shield,有XBee無線傳輸能力與SD卡插槽。

例,這是一塊Arduino板子插上Ethernet Shield後的樣子。

問:什麼是"sketch"?
答:這應該算是Arduino的術語吧,中文大概叫做程式碼或草稿碼,其實就是"程式"就對啦。

問:什麼是Open Accessory、ADK?
答:Open Accessory是一項標準,Google在2011年的開發者大會所發表,這是為Android裝置打造硬體配件、周邊商品的標準,ADK提供的參考硬體就是基於Arduino的板子。而ADK是Android Open Accessory Development Kit,也就是各種API啦,Android端與Arduino端互相溝通的機制。更詳細的介紹可以看這篇

 相對應地,Arduino官方也推出一塊Arduino ADK板子

(Android與Arduino不要搞混了喔。)

問:總結一下吧?
答:有興趣的話,買塊Arduino板子(不知道哪一塊的話,就買Arduino Uno這塊)、買一條USB傳輸線(一頭是A型插頭,一頭是B型插頭)連接板子與電腦、下載軟體開發環境,就可以動手玩囉。

(2012.05.28更新,新的板子Arduino Leonardo出來囉,比Uno更強更便宜,但跟Uno有些許不同,可參閱官方文件。)

板子到手後,可以看看我寫的Arduino Uno開箱文與安裝設定,安裝驅動程式以及第一支sketch。


參考資料:

參考書籍(中文):

自己組裝Arduino相容板:

Arduino官方網站的Building an Arduino on a Breadboard



搖桿遙控車

 搖桿遙控車 


搖桿遙控車可能是專題中較為簡單的,搖桿模組在教育局提供的材料裡
因此將它放在最前面,此專題使用藍芽連線,藍芽模組可能要自己花錢買
,藍芽模組相對的也較貴,在國內約350至400元左右,X寶上買相對便
日後會有另一個搖桿遙控車專題,是使用nRF24L01無線模組的,此
模組較便宜,X寶上買約15元左右,而且可以一對多,使用起來相當有變
,此模組日後再詳談吧
使用搖桿控制車子的行進,搭配藍芽模組,就成了藍芽搖桿遙控車子
的組裝硬體和程式軟體請參考方向盒遙控車的車子
搖桿端的程式和接線如下
上圖為搖桿模組圖片,搖桿模組價格不貴,在台灣買約8、90元X寶上
買約230元。下圖為組裝好的控制端硬體圖片
二軸搖桿有XY和B三條訊號線,B是按壓接觸開關,在這裡沒使用,所以含電源線
共4條連接線,在幾個遙控程式裡,搖桿遙控程式算是相對簡單的,實作上效果也較明
確.硬體接線:X接類比腳位的A0,Y接A1。藍芽模組的接線為TXD接Arduino的第六
RXD接第五腳,由程式來看腳位是可以變換的



#include <SoftwareSerial.h>   // 引用程式庫
SoftwareSerial BT(6, 5); // 藍芽接收腳6, 傳送腳5
char act = 'e'; //停止
char Oldact = 'e';
void setup() 
  Serial.begin(9600); //監控程式視窗
  BT.begin(9600);
void loop() 
  if(abs(analogRead(0)-503) <= 50)//X軸,減503將X軸中段調整為0
    act = 'e';  //停止
  if((analogRead(0)-503) >= 50)
    act = 'a';  //前進
  if((analogRead(0)-503) <= -50)
    act = 'b';  //後退
  if((analogRead(1)-524) <= -50)//Y軸,減524將Y軸中段調整為0
    act = 'c';  //左轉
  if((analogRead(1)-524) >= 50)
    act = 'd';  //右轉
  if(act != Oldact){ 
    BT.print(act);
    Serial.println(act);
    delay(200);
  }
  Oldact = act;
}

資料來源:龍目國小Arduino C語言 程式教學

http://class.kh.edu.tw/13384/page/view/44