星期四, 6月 08, 2017

Arduino筆記(二十七):土壤濕度檢測YL-38 + YL-69

[2017/06/08]
兒子考完試後,從學校帶一盆仙人掌科的盆栽回來,放了幾天,也不知道什麼時候該澆水,又怕澆太多水或太少,植物會長不好。想用 Arduino 的土壤濕度傳感器來實做一個感測器。原本只用串列埠視窗讀取數值,可是平常哪會開電腦,於是設計一個 LED燈,濕度太低時,就亮燈,表示該澆水了。

感測器採用LM393晶片,這是一個簡易的濕度感測器,可用於檢測土壤的水份偵測,當土壤缺水時,感測器輸出的值變大,反之將降低。如果需要調整靈敏度,可調整圖中藍色電位器調節進行調整。

土壤濕度感測器模組,可以製作成一個自動澆花的裝置,當長時間不在家或需要自動澆水時,這個模組可以偵測到植物是否已經渴了。配合 Arduino 控制器可以讓植物更舒適,花園更智慧。


[材料]

• Arduino Nano x 1
• 土壤濕度檢測模組
• 麵包板 x 1
• 連接線 x 若干條

[接線]

將土壤濕度檢測模組(因找不到 Fritzing相同的兩件式土壤濕度檢測模組圖,只好用單一個的偵測器替代)的 VCC及GND,分別接到 Arduino的 5V及GND,感測器的AO接到 Arduino A2。LED 兩隻腳接地跟 Pin 3。



[程式]

const int sensorPin=2;
int LEDRed = 3;
void setup()
{
  pinMode(LEDRed, OUTPUT);    
  pinMode(sensorPin,INPUT);
  Serial.begin(9600);
}
 
void loop()
{
  int moist;
  moist = analogRead(sensorPin);
  Serial.println(moist);
  
  // 乾燥程度大於 800 時,亮燈
  if (moist > 800) {
       digitalWrite(LEDRed, HIGH); }
  else {
      digitalWrite(LEDRed, LOW);  }
  delay(1000);
}

[執行結果]

從串列介面顯示偵測到的濕度值:


測試的影片,在盆內時濕度是比較乾燥的,LED燈亮;使用濕毛巾接觸感測器時燈熄滅。


[參考資料]

• 廠商提供之範例程式
Share:

Arduino筆記(二十六):控制圓形16位元5050全彩LED

[2017/06/08]
每次走進電子材料行,都會看到各式各樣的LED燈條,想說要買一個燈條來瞭解一下如何運用 Arduino 控制 LED燈。剛好網購一批零件時,發現商家有賣一款看起來還不錯的環形 LED燈,有16個全彩 LED。就來看看如何撰寫程式控制,以下是安裝完成的圖。


[FC-102 Rainbow LED]

型號:16位元圓形5050全彩LED模組
尺寸:直徑60mm
晶片:WS2811(內置於LED
LED5050封裝RGB全彩高亮
電壓:5V



背面有六個接點,兩組VCC & GND是一樣的,本以為要控制 LED需要兩個接點,DIN跟DOUT,後來發現這個 DOUT是可以繼續連接下一個環形 LED的 DIN,只要一條訊號線,就可以控制這麼多個 LED燈的顏色、亮度變化,真是太神奇了。


[材料]

• Arduino Leonardo x 1
• FC-102 環形 LED模組
• 麵包板 x 1
• 連接線 x 若干條

[接線]

將環形 LED DIN接到 Arduino Pin 5,LED燈的VCC及GND,分別接Arduino的 5V及GND。

[安裝FastLED Library]

• 到 GitHub:FastLED 下載 Library,按右邊綠色選項「Clone or download」,再選「Download ZIP」。

• 將下載的壓縮檔解壓縮,放在 Arduino 主程式下的 libraries目錄內,以我的電腦來說,Arduino安裝在 C:\Program Files (x86)\Arduino,點進目錄有一個 libraries的子目錄,下載後解壓縮的目錄,整個放進  libraries 目錄,重新啟動 Arduino即可。

[範例程式]

安裝完成 FastLED Library後,執行 Arduino,就可在「檔案 File」➔ 範例 [Examples] ➔ FastLED  中找到其中一個範例程式:FirstLED,簡要瞭解一下程式的內容:
#include "FastLED.h"

// 有幾個LED燈
#define NUM_LEDS 16

// Arduino的哪個接腳接到LED燈的DIN
#define DATA_PIN 5

// LED 燈的陣列
CRGB leds[NUM_LEDS];

void setup() {
	  	delay(2000);
      FastLED.addLeds(leds, NUM_LEDS);

void loop() {
   // 將白色LED訊號送出 
   for(int whiteLed = 0; whiteLed < NUM_LEDS; whiteLed = whiteLed + 1) {
      // 將 LED 燈顯示為白色
      leds[whiteLed] = CRGB::White;

      // 顯示LED (只有上述陣列中的一個 LED會亮)
      FastLED.show();

      // 等待 0.1秒
      delay(100);

      // 將該LED熄滅
      leds[whiteLed] = CRGB::Black;
   }
}

[參考資料]

• GitHub:FastLED / FastLED
Share:

星期二, 6月 06, 2017

Arduino筆記(二十五):Mini DVD 繪圖機

[2017/06/04]
大概有一、兩個星期,沒有特別製作一些有趣的主題,花了一些時間研究 3D印表機及CNC畫圖/雕刻機,一直想用 42型的馬達製作 CNC繪圖/雕刻機。看到網路上有人將 2個 DVD光碟機拆來當作繪圖機,想說有空也來實做看看,瞭解其原理及程序後,再動手製作較大型的 CNC繪圖機。

利用端午節的連續假期,在住家附近的資源回收商,買了兩個DVD 光碟機跟 6個 42型步進馬達,回家打算研究一下如何透過光碟機的步進馬達,做成X-Y軸式的繪圖機。先看看最後的成品,再來細說過程中遭遇的困難與挑戰。


[製作過程]

(1) 拆開光碟機後,就利用兩個外殼,加上兩個 L型支架,鑽孔鎖上螺絲。


(2) 將步進馬達的延長排線剪斷,上面有 4個接點,將 4條電線分別焊接到這 4個點。


(3) 量好距離,將固定螺絲的位置鑽孔,鎖上六角螺絲,直立的部分是 X 軸(橫向),平面的部分是 Y 軸(直向)。固定時,需要注意 水平與垂直,不可歪斜太多,否則會造成墨水著色不均或歪斜的情況。繼續製作的過程中,發生幾個狀況,讓我不得不對重新調整。例如:

• 其中一個 DVD(X軸橫向) 買來時,上面的支架塑膠已經稍有裂開 (下圖左上角處),還可使用,測試列印幾次後,就卡住完全不動,害我不得已再去買一個舊的光碟機來替換。

• 買來的是  ASUS光碟機,又發生一個插曲:打開外殼一看,真的傻眼了,驅動改用一般的馬達,不是用螺旋桿式的步進馬達。不得已只好再去買一個 TEAC的 DVD光碟機,還好價格非常非常便宜。(原來買的兩個是 SANYO 跟 Samsung兩款,斷裂塑膠片的是  Samsung 那一台)


• 替換的光碟機,因螺絲孔位與前一個不同,需重新鑽洞,剛好卡到 L型支架,不得已將 L型支架轉 90度,變成長邊在水平端,短邊在直立端。還好重新鑽孔,已經熟悉了,不會太難。


(4) 依照下圖連接線路。




(5) 安裝 Y 軸(直向)端平台,這個平台規格是 10cm * 10cm。剛開始,使用珍珠板(圖左)切割一個10 cm正方的平台,也對準光碟機讀寫頭的形狀挖出空心,使用熱溶膠固定。測試幾下,發現太軟了,只好改用較硬的木板(圖右)。



(6) 安裝畫筆的筆架,筆架的穩固跟畫出來圖的品質有很大的關係,我也是在這個地方花很多時間調整。

• 剛開始,將筆放進大小差不多的紙筒內,發現差一點點,就用大吸管,多加幾層當作固定,將紙筒上方切開,放進一截貼有雙面膠的導電帶。看似可以,由於紙筒僅用兩條電線捆住,無法完全固定的情況下,晃的很厲害,畫出來的圖更是亂七八糟。


• 最後因為 X 軸(橫向)的光碟機滑動桿卡住,決定改用另一種畫筆的移動方式。於是將拆下了的光碟機,找到開啟光碟機的機構,將上下部分切開,只留中間一段。兩片塑膠可順利滑動,一片固定畫筆,一片固定在 X 軸(橫向)的讀寫頭上,同時也將 SG-90的伺服馬達固定在這片塑膠上。改良如下圖。

• SG-90的伺服馬達,上下移動時,將另一片塑膠提起/放下,提起時,畫筆離開紙面,放下時畫圖。



• 測試繪圖時,發現 Y 軸(直向)端的平台鎖的太靠近內側,畫出來的圖,剛好畫到圖紙的邊緣,於是加上4個六角螺絲,將X 軸(橫向)的支架向外延伸。


到這裡才算是告一段落,當然後續也有陸續調整,如延長 Y 軸(直向)端的步進馬達電線長度、將畫筆再加以穩固等。

[列印程序]

(1)  先將程式上傳到 Arduino,我參考的是 Electric DIY Lab 網站的程式,您可到 mediafire 去下載。這裡發生一個狀況是,原本該下筆畫畫的,變成提筆不畫,該提筆的變成畫圖,剛好相反,原因是我的SG-90步進馬達的搖臂跟原作者的方向相反,只好將原本上下筆的兩段程式 up 跟 down對調過來,因程式較長,就不放在部落格上。

(2) 編輯圖形產生 gcode,我用 Inkscape 加裝擴充套件  unicorn,輸出gcode時,會產生以下錯誤。找了一下網路文章,還沒解決,改天在另外寫一篇如何使用 Inkscape 產生 gcode的文章。


(3) 執行 GCTRL 程式開始列印,GCTRL畫面如下:


• 先按「P」,選擇串列埠
• 再按「h」,讓筆的位置當作起點
• 再按「g」,選擇 gcode檔案,按下確定後,就會開始列印

以下是列印時的部分影片,讓大家看一下實際運作的情況為何?礙於上傳的檔案受限於100MB,僅傳一小部分列印實況。

[參考資料]

• Electric DIY Lab:How to make Mini CNC plotter machine at home using Arduino, L293d Motor shield & old DVD drive
• Instructables.com:Mini CNC Machine Arduino Based & Adafruit Driver Motor L293D V1 & 2*Mini Stepper CD/DVD Player 

Share:

星期五, 6月 02, 2017

Arduino筆記(二十四):回收商的42型步進馬達

[2017/06/02]
趁著端午節連續假期,將家裡的一些廢紙及回收物品拿到資源回收站去賣,剛好看到幾個 42型的步進馬達,線頭都被剪斷了。問一下老闆可以賣,當下就挑了 6個,以及2部DVD 光碟機。這 6個步進馬達的型號都不太一樣,電壓也不同,但有一個共同的特色就是都是兩相六線式的機種。如果可用,要自製 CNC雕刻機,可節省一點預算。


先挑了一個KH42JM2B140C,電壓 5.16V,由於電子材料行找不到可連接的排線,只好自己買了連接器的銅片及電線自行製作連接頭,只要測試可用,再焊接牢固一點。





有了連接線還不行,因為不知道六條線該如何接?於是找了網路上的一些文章參考,找的測量的方法:
(1) 用三用電表量電阻值,A跟B兩群線路的電阻為無限大
(2) 找出A、B兩群各三條線,分別量電阻,A & COM 及 /B & COM兩組的電阻值相同,我量得的電阻約 4.4 歐姆。A & B 之間的電阻值約 8.9 歐姆。
(3) COM 的兩條線接電池正極 (+5V)。



偷懶想將步進馬達接 Arduino 的 5V電源使用,但是只要轉動幾下,Arduino就會發生不穩定的現象,不是重開機,就是當機,只好加上兩顆 18650電池,電壓 7.4V,用降壓模組降到 5V,外接電源後,步進馬達的轉動狀況就正常了。

[連接電路圖]



參考一下先前寫的文章 Arduino筆記(八):控制步進馬達 ,將程式改寫一下進行測試,一個直接改變電位值,讓步進馬達轉動。另一個則呼叫 Stepper 函式庫。

[程式範例]

// 定義 L298N模組的pin輸出
int Pin_A  = 8;
int Pin_AA = 7;
int Pin_B  = 6;
int Pin_BB = 5;
int delayTime = 5;   // 設定旋轉速度, 數值越小速度越快

void setup() {
  pinMode(Pin_A, OUTPUT);
  pinMode(Pin_AA, OUTPUT);
  pinMode(Pin_B, OUTPUT);
  pinMode(Pin_BB, OUTPUT);
}

// 持續正轉
void loop() {
  digitalWrite(Pin_A, LOW);
  digitalWrite(Pin_AA,HIGH);
  digitalWrite(Pin_B, HIGH);
  digitalWrite(Pin_BB,LOW);
  delay(delayTime);
  digitalWrite(Pin_A, LOW);
  digitalWrite(Pin_AA,HIGH);
  digitalWrite(Pin_B, LOW);
  digitalWrite(Pin_BB,HIGH);
  delay(delayTime);
  digitalWrite(Pin_A, HIGH);
  digitalWrite(Pin_AA,LOW);
  digitalWrite(Pin_B, LOW);
  digitalWrite(Pin_BB,HIGH);
  delay(delayTime);
  digitalWrite(Pin_A, HIGH);
  digitalWrite(Pin_AA,LOW);
  digitalWrite(Pin_B, HIGH);
  digitalWrite(Pin_BB,LOW);
  delay(delayTime);
}

[程式二]

#include <Stepper.h>
// 定義步進馬達轉一圈所需的步數及輸出的腳位
Stepper stepper(200, 8, 7, 6, 5);

void setup()
{
  // 將馬達速度設定為每分鐘80轉(RPM)
  stepper.setSpeed(80);   
}
void loop()
{
  // 馬達行進步數
  stepper.step(100);    //正半圈
  delay(1000);
  stepper.step(-100);   //反半圈
  delay(1000);
  stepper.step(200);    //正1圈
  delay(1000);
  stepper.step(-200);   //反1圈
  delay(1000);
}

[測試結果]



[參考資料]

• Ming's Blogger:步進馬達的介紹
• amoBBS:2相步进电机6线接线方式?
Share: