2016年8月13日 星期六

[ScratchBot開發日誌] 2016/08/13 粉墨登場

ScratchBot 是一個可以畫圖的機器人。



材料清單

1.機構件 * 1
2.Arduino Nano 開發板 * 1
3.Arduino Nano 擴展板 * 1
4.28BYJ-48 步進馬達 * 2
5.步進馬達驅動板 * 2
6.SG90 伺服馬達 * 1
7.2節AA電池盒 * 1
8.DC5521 電源插頭 * 1
9.16500 貍電池 * 2


組裝

整體上大致很好組裝,唯一要注意的是畫筆要先固定在固定桿上面,然後 SG90 伺服馬達維持在 90 度的情況下將固定桿鎖緊。

另外,為了避免輪子卡死,在將輪子鎖緊到 28BYJ-48 步進馬達時,要注意輪軸跟馬達固定板應該留一點空隙,約 0.5mm 即可。



調整 SG90 伺服馬達的角度

調整 SG90 伺服馬達的角度,是為了讓車子行走時畫筆也能夠正確地提筆與下筆。如果沒有調整好伺服馬達轉動的角度,有可能會出現若干狀況,例如畫筆卡住地面影響車子行進,或是畫筆沒有接觸地面以致沒有畫出線條...等等。


測試車子前進、後退的能力

程式採用 Arduino 官方 Stepper 函式庫,經過測試,激磁 512 步可以讓 28BYJ-48 轉動一圈(360度)。

ScratchBot 輪徑為 60mm,如果激磁 5120 步,輪子將會轉動 10 圈。套用公式

圓周長 = 直徑 * Pi

,可以計算出車子會行走如下之距離

車子行走距離 = 60 * 3.1416 * 10 = 1884.96 mm

約 1885 mm。


程式碼

//2016/08/13 輪子各轉10圈,讓車子前進、後退。
#include <Stepper.h>
#include <Servo.h>

const int stepsPerRevolution = 2048;
Stepper mRight(stepsPerRevolution, 2, 4, 3, 5);
Stepper mLeft(stepsPerRevolution, 6, 8, 7, 9);
const int steps = 512;
int laps;

Servo Pen;

void setup() {
  mRight.setSpeed(10);
  mLeft.setSpeed(10);

  Pen.attach(10);
  PenDown();
  laps = 10;
}

void loop() {
  Forward(steps * laps);
  Back(steps * laps);
}

void PenDown() {
  Pen.write(116);
}

void PenUp() {
  Pen.write(90);
}

void Forward(int steps) {
   for(int i=0; i < steps; i++) {
    mRight.step(-1);
    mLeft.step(1);
  }
}

void Back(int steps) {
  for(int i=0; i < steps; i++) {
    mRight.step(1);
    mLeft.step(-1);
  }
}

void Move(int steps) {
  if (steps > 0)
    Forward(steps);
  else
    Back(steps);
}

Upload 上述程式碼到 Arduino,讓 ScratchBot 實際跑一下。用皮尺量一下車子行走的距離,並觀察直線歪斜的程度。


問題

1.如果車子實際行走的距離不等於計算的距離時該怎麼辦?
2.如果原本應該是直線,實際畫出來有偏斜時該怎麼辦?
3.想要畫一條長100mm的直線,程式該怎麼寫?


變更設計

繪圖機構 - 由於繪圖機構目前是整組設置在車體內部,雖然此舉可以讓 ScratchBot 的外觀比較簡潔,但相對地也造成讓玩家不方便更換畫筆。玩家必須先拆開頂板上的螺絲、掀開頂板、取出整組繪圖機構、更換畫筆、放回繪圖機構、蓋上頂板,最後鎖緊螺絲,手續上真是繁雜。



考慮在下一版本將繪圖機構變更到頂板上面,雖然影響車子的外觀,但對於玩家在換畫筆時應該會便利不少。

輪子 - 在測試時發現輪子會打滑,影響繪圖精度。或許應該為輪子加上橡膠外胎,但好像沒有 60 mm 直徑的市售品。雖然市售品有 40mm 的,但如果改成 40mm 的輪子,那麼將會影響到固定在底板下方的電池盒,真是頭痛啊!

有了,繪圖機構組一旦變更位置安裝到頂板上方,那麼在原地方就騰空了,電池盒可以放到那兒,也就可以使用 40mm 的橡膠輪子,這件事情就解決了。


相關連結

控制步進馬達 https://zh.wikipedia.org/wiki/%E6%AD%A5%E9%80%B2%E9%A6%AC%E9%81%94


後記

在用程式調整 SG90 角度時,不慎將 ScratchBot 摔落地上,導致輪子變形損壞,還好後來用快乾膠修復,但已經無法恢復原狀,勢必會影響會圖精度。





2016年7月19日 星期二

自製取代9V方形電池的Arduino電源

我們都知道,可以用 9V 方形電池透過 DC 5521 插頭供電給 Arduino,Arduino 板子上面的電壓轉換 IC 會將 9V 降壓為 5V。然而,9V 方形電池售價並不便宜,在長時間使用 Arduino 的情況下,勢必會花費您大筆的金錢。在這裡我們即將告訴您,如何解決這個問題。




使用鋰電池

沒錯,可重複使用的鋰電池是最佳的解決方案。雖然第一次購買時它的費用會比 9V 方形電池貴很多,但是在您重複幾次使用它之後,您一定會覺得這樣做是值得的。

您可以選擇 18650 鋰電池,但我覺得它的體積太過於龐大,而且必須購買 18650 專用的電池盒,如此的話又要花不少錢。我後來決定選擇 14500 鋰電池,是因為它的體積和重量比起 18650 要小且輕很多,也只比 9V 方形電池稍大一些些,而且電池盒可以與 AA 電池盒共用。


使用 2 節 AA 電池盒

14500 鋰電池單顆電壓約 3.7V,充飽時約為 4.2V,所以 2 顆 14500 串連,電壓最高為 8.4V,這個電壓剛好可以透過 DC 5521 插頭為 Arduino 供電。


自製插頭

以下我們要開始來製作,材料如下:

1. 2節3號AA電池盒 * 1
2. DC 5521 插頭 * 1
3. 14500 鋰電池 * 2


Step1 轉開 DC 5521 插頭,並將塑膠殼穿過電池盒電源線,並將電線端部插入鐵件小孔內(注意正負極)。


Step2 使用銲槍焊接,然後用尖嘴鉗迫使鐵件緊固電線。


Step3 將 DC 5521 插頭與外殼鎖好。



Step4 到這兒就大功告成了。



採購資訊

9V 電池扣 http://goods.ruten.com.tw/item/show?21628075114557

DC5521 插頭 http://goods.ruten.com.tw/item/show?21629129862828

2節5號AA電池盒 http://goods.ruten.com.tw/item/show?21628077392175


後記

有網友問到:「鋰電池若沒過放保護,就完了,是不是要 追加保護板?」
我的回答是,若只是供應 Arduino 板子,當你發現無法正常工作時,此時電壓約為6V,每顆鋰電池約為3V,此時只要趕快拿去充電,還不至於會損壞電池。

Arduino 官方文件說明 6~20V的外部電源可以供電給Arduino UNO 使用,但建議電壓範圍在 7~12V 最為合適,詳 http://arduino.cc/en/Main/ArduinoBoardUno

2016年6月3日 星期五

自製 USB 電源線

不管是自走車或是機器人,如果 Arduino 與馬達共用一個電源,常常會因為馬達的用電量大使得供應給 Arduino 的電流突然降低或不足而重置,這個時候我們就會選擇雙電源的方式供電。一個 5V 電源給 Arduino 用,另一個 3~6V 電源給馬達驅動板用。


目前這個時代人人都有手機,大部分人也都有行動電源,有些人甚至擁有好幾個行動電源,可以隨時幫手機充電。為了要物盡其用,我想使用手上既有的行動電源當作 MeArm.Rover 的電源,一顆行動電源接 Arduino 的 5V,另一顆行動電源接 L9110S 馬達驅動板。

為了把上面所說的東西接線起來,我需要製作 2 條 USB 電源線。以下就是整個製作過程:


準備材料

USB A型 公頭 x 1
USB A型 外殼公與母 x 1
杜邦母排線 x 2
杜邦公排線 x 1



Step1 
將 USB A型 公頭放置到外殼內


Step2
將杜邦公排線尾端去除塑膠裸露銅線,將銅線纏繞到杜邦母排線的尾端。
此處之杜邦公排線是為了後續跟另一條這樣的電源線作共地使用。



Step3
用夾子將杜邦公排線與母排線固定在 USB 座的金屬針上。
此處須注意電源的正負極,此圖白線為 5V,灰線為 GND。



Step4
這是焊好的樣子。



Step5
蓋上另一片外殼,這樣就大功告成了。




我會做兩條這樣的線

由於 Arduino 與馬達是分開供電,在這種情況下兩個獨立的電源必須做共地接線,整體電子回路才會正常運作。因此,電源線我會做一條是杜邦公排線,另一條是杜邦母排線,在需要時可以將這兩條插起來做共地。



使用電源線

將剛剛做好的電源線之 USB 頭插入行動電源,另外兩條杜邦母排線接到 L9110S 馬達驅動板 VCC  與 GND,須注意正負極不可接錯,如下圖:



至於如何在自走車上使用兩組獨立電源,後續將會為您說明。


相關連結

L9110S 馬達驅動模塊 http://pizgchen.blogspot.tw/2016/05/l9110s.html
MeArm.Rover 機械手臂自走車 http://pizgchen.blogspot.tw/2016/05/mearmrover-v10.html


採購資訊

USB A 型公插頭 http://goods.ruten.com.tw/item/show?21638718439888
USB A 型母頭 http://goods.ruten.com.tw/item/show?21638718695107
L9110S 馬達驅動模塊 http://goods.ruten.com.tw/item/show?21628077139062
MeArm.Rover 機械手臂自走車 http://goods.ruten.com.tw/item/show?21621791495670



2016年5月23日 星期一

雙軸按鍵搖桿

雙軸按鍵搖桿有一顆形似香菇的黑色帽子,所以大家都暱稱它為「香菇頭搖桿」。
搖桿


模塊描述

模塊設有二路模擬輸出和一路數字輸出接口,輸出值分別對應(X,Y)雙軸偏移量,其類型為模擬量。
按鍵表示用戶是否在Z軸上按下,其類型為數字開關量。
模塊集成電源指示燈,可顯示工作狀態。
坐標標識符清晰簡明、準確定位;用其可以輕鬆控制物體(如二自由度舵機雲台)在二維空間運動,可以通過控制器編程。


接線

Arduino    搖桿模塊
VCC          +5V
GND         GND
A0             VRX
A1             VRY
D2             SW


程式碼

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
}

void loop() {
  int a0 = analogRead(A0);
  int a1 = analogRead(A1);
  int a2 = digitalRead(2);
  Serial.print("X="); Serial.print(a0);
  Serial.print("   Y="); Serial.print(a1);
  Serial.print("   Z="); Serial.println(a2);
  delay(200);
}


程式說明

檢查一下模塊 PCB 板角落有一個地方是否有焊上電阻,如果沒有,那麼腳位 2 必須設為 PULLUP,否則讀取的值將是錯誤的。

X值,搖桿往左=0,置中=512, 往右=1023
Y值,搖桿往上=0,置中=512, 往下=1023
Z值,搖桿按下=0,平常(放開)=1

上述 X、Y 為大約值,每一個搖桿模塊會有不同的值。


採購資訊

香菇頭雙軸按鍵搖桿 http://goods.ruten.com.tw/item/show?21628077440247




2016年5月22日 星期日

L9110S 直流馬達驅動模塊



L9110S 直流馬達驅動模塊


模塊描述

1. 雙L9110S芯片的電機驅動
2. 模塊供電電壓:2.5-12V
3. 適合的電機範圍:電機工作電壓2.5-12V之間,最大工作電流0.8A,目前市面上的智能小車電壓和電流都在此範圍內。
4. 可以同時驅動2個直流電機,或者1個4線2相式步進電機。
5. PCB板尺寸:2.8cm*2.1cm 超小體積,適合組裝
6. 設有固定安裝孔,直徑:3mm




電路圖

您可以在電路圖裏看到接馬達的 P1、P2 端子旁邊已經有加上 C3、C4 電容 0.1uF,因此在幫直流馬達(註A)焊電線時,就不需要再焊上 0.1uF 電容。


接線

Arduino    L9110S模塊
VCC         (註B)
GND         GND
D5             A-IA
D6             A-IB
D9             B-IA
D10           B-IB


L9110S   外接電源(註C)
VCC       +
GND      GND


程式碼

void setup() {
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop() {
  analogWrite(5,0);
  analogWrite(6,255);
  analogWrite(9,0);
  analogWrite(10,255);
  delay(2000);
  stop();

  analogWrite(5,255);
  analogWrite(6,0);
  analogWrite(9,255);
  analogWrite(10,0);
  delay(2000);
  stop();

  analogWrite(5,0);
  analogWrite(6,255);
  analogWrite(9,255);
  analogWrite(10,0);
  delay(2000);
  stop();

  analogWrite(5,255);
  analogWrite(6,0);
  analogWrite(9,0);
  analogWrite(10,255);
  delay(2000);
  stop();
}

void stop() {
  analogWrite(5,0);
  analogWrite(6,0);
  analogWrite(9,0);
  analogWrite(10,0);
  delay(300);
}


註A:
一般 TT 直流馬達供應電壓為 3~6V,耗電流約 150~250mA。

註B:
L9110S 模塊的 VCC 如果由 Arduino 的 VCC 供電,因為馬達的耗電流很大,將會造成 Arduino 電流不足而當掉,因此 L9110S 模塊的 VCC 應該另外由外接電源供電。

註C:
雖然供給 L9110S 模塊的供電電壓可以是 2.5~12V,然而  TT 直流馬達只能承受 3~6V 的電壓,因此外接電源需要降壓。

您如果使用 1只 18650 鋰電池(約 3.7~4.2V,可以直接將電池正極(+)接至 L9110S 的 VCC。

如果使用 2 只 18650 鋰電池(約 7.4~8.4V),則需要接一個大電流降壓模塊(例如輸出電流 2~3A),將電壓降至 5V ,之後再將 5V 正極(+)接至 L9110S 的 VCC。

如果使用 2 只 18650 鋰電池(約 7.4~8.4V),也不想接接一個大電流降壓模塊,那麼模塊的 IN 腳給 PWM 訊號也可以,把值設定在約 200 以下。


補充

2021/xx/xx 使用 2 只 18650 鋰電池沒有降壓給一片 L9110S 模組當作電源,控制 4 顆馬達,結果他的 IC 很容易被炸開穿孔,尤其是在馬達反轉時。電壓 7.4V 並沒有超過模組容許電壓,可能是單個 PORT 接 2 只馬達的反電動勢太大了吧?

2021/07/11 程式載入 Arduino 後用 PS2X 手柄遙控小車,不經意用手觸摸到 L9110S 模組,包括 IC 和電路板感覺異常發燙。經檢查 L9110S 馬達驅動模組上的插線雖然都正確,但還是先拔除電源比較保險。
在後續的程式編寫當中,發現程式有誤,經改正後異常發燙也消失了。
沒想到程式也會造成 L9110S 模組異常發燙,這一點大家有遇到過嗎?


相關連結

L9110 Datasheet http://www.elecrow.com/download/datasheet-l9110.pdf


採購資訊

L9110S 直流馬達驅動模塊 http://goods.ruten.com.tw/item/show?21628077139062




2016年5月21日 星期六

紅外線避障模塊



紅外線收發 LED,經 IC LM393 處理後,只具有一個數位輸出腳位。
無反射訊號時(黑線) ,OUT 腳位輸出 1;有反射訊號時(非黑線) ,OUT 腳位輸出 0。
可以透過模塊上面的 VR 調整偵測的靈敏度。


接線

Arduino   IR模塊
VCC        VCC
GND       GND
D2          OUT


程式碼

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);
}

void loop() {
  int d2 = digitalRead(2);
   
  Serial.println(d2);
  delay(100);
}


相關連結

LM393 Datasheet http://www.onsemi.cn/pub_link/Collateral/LM393-D.PDF


採購資訊

紅外線避障模塊 http://goods.ruten.com.tw/item/show?21643154195810




TCRT5000 紅外線循跡模塊

TCRT5000 紅外線模塊


TCRT5000 紅外線收發 LED,經 IC LM393 處理後,具有兩個輸出腳位,D0 為數位,A0 為類比。

無反射訊號時(黑線) ,D0 腳位輸出 1,A0 腳位輸出大於 700;
有反射訊號時(非黑線) ,D0 腳位輸出 0,A0 腳位輸出小於 700。

上述 700 之數值非為固定值,會因不同模塊而不同,也可以透過模塊上面的 VR 調整。調整 VR 會影響偵測的靈敏度。


接線

Arduino  TCRT5000
VCC        VCC
GND       GND
D2           D0
A0           A0


程式碼

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);
}

void loop() {
  int d2 = digitalRead(2);
  int a0 = analogRead(A0);
  
  Serial.print(d2); Serial.print(","); Serial.println(a0);
  delay(100);

}


購買資訊

TCRT5000 紅外線循跡模塊 http://goods.ruten.com.tw/item/show?21628077274837