วันจันทร์ที่ 6 กุมภาพันธ์ พ.ศ. 2560

Arduino + Relay Module ควบคุมการปิดเปิดเครื่องใช้ไฟฟ้า

 Arduino + Relay Module
ควบคุมการปิดเปิดเครื่องใช้ไฟฟ้า
 01   02
03
         รีเลย์ (Relay) เป็นอุปกรณ์ไฟฟ้าชนิดหนึ่ง ซึ่งทำหน้าที่ตัดต่อวงจรแบบเดียวกับสวิตช์ โดยควบคุมการทำงานด้วยไฟฟ้า Relay มีหลายประเภท ตั้งแต่ Relay ขนาด เล็กที่ใช้ในงานอิเล็กทรอนิกส์ทั่วไป จนถึง Relay ขนาดใหญ่ที่ใช้ในงานไฟฟ้าแรงสูง โดยมีรูปร่างหน้าตาแตกต่างกันออกไป แต่มีหลักการทำงานที่คล้ายคลึงกัน สำหรับการนำ Relay ไปใช้งาน จะใช้ในการตัดต่อวงจร ทั้งนี้ Relay ยังสามารถเลือกใช้งานได้หลากหลายรูปแบบ
04
 สัญลักษณ์ในวงจรไฟฟ้าของรีเลย์
ภายใน Relay จะประกอบไปด้วยขดลวดและหน้าสัมผัส 
         หน้าสัมผัส NC (Normally Close) เป็นหน้าสัมผัสปกติปิด โดยในสภาวะปกติหน้าสัมผัสนี้จะต่อเข้ากับขา COM (Common) และจะลอยหรือไม่สัมผัสกันเมื่อมีกระแสไฟฟ้าไหลผ่านขดลวด
         หน้าสัมผัส NO (Normally Open) เป็นหน้าสัมผัสปกติเปิด โดยในสภาวะปกติจะลอยอยู่ ไม่ถูกต่อกับขา COM (Common) แต่จะเชื่อมต่อกันเมื่อมีกระแสไฟไหลผ่านขดลวด
         ขา COM (Common) เป็นขาที่ถูกใช้งานร่วมกันระหว่าง NC และ NO ขึ้นอยู่กับว่า ขณะนั้นมีกระแสไฟฟ้าไหลผ่านขดลวดหรือไม่ หน้าสัมผัสใน Relay 1 ตัวอาจมีมากกว่า 1 ชุด ขึ้นอยู่กับผู้ผลิตและลักษณะของงานที่ถูกนำไปใช้ จำนวนหน้าสัมผัสถูกแบ่งออกดังนี้
         สวิตช์จะถูกแยกประเภทตามจำนวน Pole และจำนวน Throw ซึ่งจำนวน Pole (SP-Single Pole, DP-Double Pole, 3P-Triple Pole, etc.) จะบอกถึงจำนวนวงจรที่ทำการเปิด-ปิด หรือ จำนวนของขา COM นั่นเอง และจำนวน Throw (ST, DT) จะบอกถึงจำนวนของตัวเลือกของ Pole ตัวอย่างเช่น SPST- Single Pole Single Throw สวิตช์จะสามารถเลือกได้เพียงอย่างเดียวโดยจะเป็นปกติเปิด (NO-Normally Open) หรือปกติปิด (NC-Normally Close) แต่ถ้าเป็น SPDT- Single Pole Double Throw สวิตช์จะมีหนึ่งคู่เป็นปกติเปิด (NO) และอีกหนึ่งคู่เป็นปกติปิดเสมอ (NC) ดังรูปด้านล่าง
05                      06
SPST คือ Single Pole Single Throw                      DPST คือ Double Pole Single Throw
SPDT คือ Single Pole Double Throw                      DPDT คือ Double Pole Double Throw
07
          จากส่วนประกอบข้างต้นที่ได้กล่าวไป ในบทความนี้เราจะใช้งาน Relay แบบ SPDT (Single Pole Double Throw) หลักการทำงานของ Relay นั้น ในส่วนของขดลวด เมื่อมีกระแสไฟฟ้าไหลผ่าน จะทำให้ขดลวดเกิดการเหนี่ยวนำและทำหน้าที่เสมือนแม่เหล็กไฟฟ้า ส่งผลให้ขา COM ที่เชื่อมต่ออยู่กับหน้าสัมผัส NC (ในสภาวะที่ยังไม่เกิดการเหนี่ยวนำ) ย้ายกลับเชื่อมต่อกับหน้าสัมผัส NO แทน และปล่อยให้ขา NC ลอย เมื่อมองที่ขา NC กับ COM และ NO กับ COM แล้วจะเห็นว่ามีการทำงานติด-ดับลักษณะคล้ายการทำงานของสวิชต์ เราสามารถอาศัยคุณสมบัตินี้ไปประยุกต์ใช้งานได้ 
          ในบทความนี้ เราจะกล่าวถึงวิธีการนำ Relay Module ไปประยุกต์ใช้งานจริง แต่ก่อนอื่นเรามาดูวิธีอ่านคุณสมบัติของ Relay ว่าสามารถรองรับการทำงานที่แรงดันและกระแสไฟฟ้าเท่าไร ใช้แรงดันไฟฟ้าในการทำงานอย่างไรก่อนนะครับ 
08
1. ยี่ห้อ รุ่นของผู้ผลิต (แบรนด์) รวมถึงสัญลักษณ์มาตรฐานต่างๆ
2. รายละเอียดของไฟฟ้ากระแสสลับที่รองรับการทำงานได้ (VAC)
3. รายละเอียดของไฟฟ้ากระแสตรงที่รองรับการทำงานได้ (VDC)
4. โมเดล ระดับแรงดันฝั่งขดลวด ชนิดและโครงสร้าง และข้อมูลด้าน Coil Sensitivity
คุณสมบัติแบบละเอียด ดูได้จากตารางด้านล่างนี้

09
          จากตาราง สามารถสรุปได้ว่าเป็น Relay ยี่ห้อ Songle โมเดล SRD รองรับการทำงานแรงดันกระแสสลับที่ 250V@10A หรือ 125V@10A รองรับแรงดันกระแสตรงที่ 28VDC@10A ฝั่งขดลวดทำงานด้วยแรงดัน 5V โครงสร้างตัว Relay เป็นแบบซีลด์ มีค่าความไวขดลวดที่ 0.36W หน้าสัมผัสเป็นรูปแบบ 1 from C
          หน้าสัมผัสแบบ A (Form A) หมายถึง หน้าสัมผัสของ Relay ในสภาพปกติจะเปิดอยู่ (Normally open) และหน้าสัมผัสเป็นแบบ SPST ถ้าจะเขียนเป็นสัญลักษณ์ได้คือ
10
          หน้าสัมผัสแบบ B (Form B) หมายถึง หน้าสัมผัสของ Relay ในสภาพปกติจะปิด (Normally close) และเป็นแบบ SPST เขียนเป็นสัญลักษณ์ได้คือ
11
          หน้าสัมผัสแบบ C (Form C) แบบนี้เรียกว่า "break, make หรือ transfer" เป็นหน้าสัมผัสแบบ SPDT เขียนสัญลักษณ์ได้ดังนี้ 
12
          หน้าสัมผัสแบบ C จะมีอยู่ด้วยกัน 3 ขา ในขณะที่ Relay ยังไม่ทำงาน หน้าสัมผัส 1 และ 2 จะต่อกันอยู่ เมื่อ Relay ทำงานหน้าสัมผัส 1 และ 2 จะแยกกัน จากนั้นหน้าสัมผัส 1 จะมาต่อกับหน้าสัมผัส 3 แทน พอ Relay หยุดทำงานหน้าสัมผัส 1 กับ 2 ก็จะกลับมาต่อกันตามเดิม
          หลังจากที่เราทราบคุณสมบัติของ Relay กันไปแล้ว ในบทความนี้เราจะยกตัวอย่างการประยุกต์ใช้งานโดยใช้ Relay โดยจะใช้ Relay Module 4 Channels แบบ OPTO-ISOLATED ดังภาพ
13
           Relay Module 4 Channels มี เอาต์พุตคอนเน็คเตอร์ที่ Relay เป็น NO/COM/NC สามารถใช้กับโหลดได้ทั้งแรงดันไฟฟ้า DC และ AC โดยใช้สัญญาณในการควบคุมการทํางานด้วยสัญญาณโลจิก TTL
คุณสมบัติ (Features)
• รีเลย์เอาต์พุตแบบ SPDT จํานวน 4 ช่อง
• สั่งงานด้วยระดับแรงดัน TTL
• CONTACT OUTPUT ของรีเลย์รับแรงดันได้สูงสุด 250 VAC 10 A, 30 VDC 10 A
• มี LED แสดงสถานะ การทํางานของรีเลย์และแสดงสถานะของบอร์ด
• มีจัมพ์เปอร์สําหรับเลือกว่าจะใช้กราวด์ร่วมหรือแยก
• มี OPTO-ISOLATED เพื่อแยกกราวด์ส่วนของสัญญาณควบคุมกับไฟฟ้าที่ขับรีเลย์ออกจากกัน
ขาสัญญาณ (Pin Definition)
14 15
ภาพและตารางแสดงขาที่ใช้ในการเชื่อมต่อของ Relay Module 4 Channels
          ในบทความนี้ เราจะยกตัวอย่างการนำ Relay Module 4 Channels ไปใช้งาน โดยมีไมโครคอนโทรลเลอร์ Arduino UNO R3 ในการควบคุมการสั่งงาน จะยกตัวอย่างการประยุกต์ใช้งาน 2 ตัวอย่างคือ ตัวอย่างที่1 ควบคุมมอเตอร์ DC ให้หมุนได้ทั้งซ้าย-ขวา โดยไม่ต้องการคุมความเร็วรอบ และตัวอย่างที่2 ควบคุมการปิด-เปิดเครื่องใช้ไฟฟ้ากระแสสลับ 220 VAC 
ตัวอย่างที่1 ควบคุมมอเตอร์ให้หมุนได้ทั้งซ้าย-ขวา โดยไม่ต้องการคุมความเร็วรอบ
16   17
มอเตอร์หมุนขวา                                                          มอเตอร์หมุนซ้าย 
          จากวงจรนี้ เราจะเห็นได้ว่าในการจะควบคุมให้มอเตอร์หมุนไปกลับ หรือ ซ้าย-ขวา นั้นจะต้องใช้ Relay 2 ตัวในการควบคุม วิธีการต่อวงจรเป็นดังนี้ 
• นำขั้ว + ของมอเตอร์ต่อเข้ากับขา COM ของรีเลย์ตัวที่ 1
• นำขั้ว – ของมอเตอร์ต่อเข้ากับขา COM ของรีเลย์ตัวที่ 2
• นำขา NC ของรีเลย์ทั้ง 2 ตัว ต่อเข้ากับไฟลบ (GND)
• นำขา NO ของรีเลย์ทั้ง 2 ตัว ต่อเข้ากับไฟบวก (+5VDC)
วิธีต่อใช้งานจริงตามภาพด้านล่างนี้ โดยมีอุปกรณ์ดังนี้ Arduino + Relay Module + DC Motor
18
ภาพแสดงการต่อใช้งาน Arduino + Relay Module + Motor
19
           หลักการการทำงานคือ มีบอร์ด Arduino UNO R3 ในการรับข้อมูลจากคอมพิวเตอร์สื่อสารผ่านพอร์ต Serial แล้วนำค่าที่ได้ไปตรวจสอบว่าตรงกับค่าที่กำหนดไว้หรือไม่ ถ้าตรงกันก็สั่งให้ Relay ทำงานตามที่เราต้องการ 
ตัวอย่างโค้ดโปรแกรม
#define R 13 //กำหนดขาที่นำไปต่อกับรีเลย์
#define L 12
char test ; //สร้างตัวแปรไว้สำหรับรอรับข้อมูล
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
pinMode(R, OUTPUT); // กำหนดโหมดให้เป็น Output
pinMode(L, OUTPUT);
}
void loop() // run over and over
{
if (Serial.available()) // ตรวจสอบว่ามีข้อมูลเข้ามาหรือไม่
test = Serial.read();
else if (test == '1') // ถ้าข้อมูลที่เข้ามาคือ 1, 2, 3 ให้ทำงานตามที่กำหนด
{
digitalWrite(R, HIGH);
digitalWrite(L, LOW);
else if (test == '2')
{
digitalWrite(L, HIGH);
digitalWrite(R, LOW);
}
else if (test == '3')
{
digitalWrite(L, LOW);
digitalWrite(R, LOW);
}
}
ขั้นตอนการทดสอบ
1. ดาวน์โหลดโปรแกรมสำหรับส่งข้อมูลผ่าน Serial (ในบทความนี้ใช้โปรแกรม Terminal.exe
2. เปิดโปรแกรม Arduino นำโค้ดตัวอย่างด้านบน ไปรันและอัพโหลดไปยัง Arduino UNO R3
3. เปิดโปรแกรม Terminal.exe เลือก Com Port และกำหนดความเร็วในการรับส่งข้อมูล จากนั้นกดปุ่ม Connect 
20
4. ทำการส่งข้อมูลให้ Arduino โดยพิมพ์ข้อความลงในช่องด้านล่างของโปรแกรม
a. ข้อมูลที่กำหนดไว้คือ 1 = หมุนขวา, 2 = หมุนซ้าย, 3 = หยุดหมุน
21
ตัวอย่างที่2 ควบคุมการปิด-เปิดเครื่องใช้ไฟฟ้ากระแสสลับ 220 VAC  
22
วิธีการเชื่อมต่อ
สำหรับอุปกรณ์ที่ใช้ไฟฟ้ากระแสสลับ (AC)
• ต่อไฟเส้นที่ 1 จากแหล่งจ่ายไฟไปยังอุปกรณ์ที่ขั้วลบ (ถ้ามีแจ้งไว้ ถ้าไม่มีก็ใช้ขั้วใดก็ได้)
• ต่อไฟเส้นที่ 2 จากแหล่งจ่ายไฟเข้าขา NO ของรีเลย์
• ต่อสายจากขา COM ของรีเลย์ไปยังอุปกรณ์ไฟฟ้าขั้วที่เหลือ
สำหรับอุปกรณ์ที่ใช้ไฟฟ้ากระแสตรง (DC)
• ต่อไฟลบหรือ GND ไปยังอุปกณ์ไฟฟ้าเข้าที่ขั้วลบหรือ GND
• ต่อไฟบวกหรือ VCC ไปยังขา NO ของรีเลย์
• ต่อสายจากขา COM ของรีเลย์ไฟยังอุปกรณ์ไฟฟ้าที่ขั้วบวก
23
         ในการทดสอบนี้ เราจะใช้บอร์ดคอนโทรลเลอร์ Arduino UNO R3 หลัก การการทำงานมีดังนี้ รับข้อมูลจากคอมพิวเตอร์สื่อสารผ่านพอร์ต Serial แล้วนำข้อมูลที่ได้ไปตรวจสอบว่าตรงกับค่าที่กำหนดไว้หรือไม่ ถ้าตรงก็สั่งให้รีเลย์ทำงานตามที่เราต้องการ
ตัวอย่างโค้ดโปรแกรม
#define Lamp1 12 //กำหนดขาที่นำไปต่อกับรีเลย์
char test ; //สร้างตัวแปรไว้สำหรับรอรับข้อมูล
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
pinMode(Lamp1, OUTPUT); //กำหนดโหมดให้เป็น Output
}
void loop() // run over and over
{
if (Serial.available()) // ตรวจสอบว่ามีข้อมูลเข้ามาหรือไม่
test = Serial.read();
else if (test == '1') //ถ้าข้อมูลที่เข้ามาคือ 1 , 3 ให้ทำงานตามที่กำหนด
{
digitalWrite(Lamp1, HIGH);
}
else if (test == '3')
{
digitalWrite(Lamp1, LOW);
}
}
ขั้นตอนการทดสอบ
1. ดาวน์โหลดโปรแกรมสำหรับส่งข้อมูลผ่าน Serial (ในบทความนี้ใช้โปรแกรม Terminal.exe
2. เปิดโปรแกรม Arduino นำโค้ดตัวอย่างด้านบนไปรันและอัพโหลดไปยัง Arduino UNO R3
3. เปิดโปรแกรม Terminal.exe เลือก Com Port และกำหนดความเร็วในการรับส่งข้อมูล จากนั้นกดปุ่ม Connect
244. ทำการส่งข้อมูลให้ Arduino โดยพิมพ์ข้อความลงในช่องด้านล่างของโปรแกรม
a. ข้อมูลที่กำหนดไว้คือ 1 = เปิดไฟ, 3 = ปิดไฟ
25

Arduino and Motor Control

Arduino and Motor Control



วันนี้เรามาพูดถึงการควบคุมมอเตอร์กระแสตรงกันหน่อย  (ขอโฆษณานิดนะครับ ของที่ใช้ในการทำอยู่ใน Arduino Stater Kit 1)  แต่บอกไว้ก่อนนะครับ ผมกะจะเขียนบทความแบ่งออกเป็นตอนๆ โดยจะมีเนื้อหาในการควบคุมมอเตอร์ชนิดต่างๆ ดังนี้ครับ  
  • ง่ายสุดก็ DC motor หรือ มอเตอร์กระแสตรง  ซัก 2 ตอน  โดยว่ากันถึงการควบคุมทิศการหมุน และ การควบคุมความเร็วรอบ
  • ต่อมาก็ Servo motor  ซัก 2 ตอน  
  • และปิดท้ายด้วย Stepping Motor 2 ตอน ครับ
 วันนี้ ก็ดูจะง่ายๆ ไปก่อนนะครับ Sketch ที่ใช้เป็นตัวอย่างผมไปเอามาจาก Arduino Cookbook โดยคุณ Michael Margolis นะครับ  แล้วมาเขียนเนื้อหาใหม่ โดยอธิบายให้ง่าย และลึกขึ้น  บอกไว้ก่อนเดี๋ยวจะมีคนหาว่าไปลอกมาอีก
   DC motor ประกอบด้วย 2 ส่วนหลักๆ ได้แก่ โรเตอร์ และสเตเตอร์ นะครับ  โรเตอร์ก็คือส่วนที่หมุน ส่วนสเตเตอร์คือส่วนที่เป็นขดลวดที่สร้างสนามแม่เหล็ก  
   หลักการทำงานของ DC motor คร่าวๆ ก็คือการนำกระแสตรงมาตัดผ่านสนามแม่เหล็ก ทำให้เกิดทอร์กขึ้นในทิศที่เหมาะสม และสร้างให้เกิดการหมุนของแกนโรเตอร์  ถ้าอยากดู Animation เท่ห์ๆ ของ Professor ใจดีที่ทำเพื่ออธิบายหลักการทำงานของ DC motor ก็ไปที่นี่เลยครับ
http://www.walter-fendt.de/ph14e/electricmotor.htm

  ทีนี้ในงานส่วนมาก เราต้องการควบคุมทิศทาง และ ความเร็วรอบของมอเตอร์  ไม่ว่าจะเป็นการขับเคลื่อนสายพาน หรือ ล้อของหุ่นยนต์   เพราะเราคงไม่ต้องการให้หมุนแบบอิสระควบคุมไม่ได้  ดังนั้นก็เลยมีคนคิดวงจรที่ใช้ในการควบคุมมอเตอร์ขึ้นมา  แบบที่นิยมใช้กันเรียกว่าวงจร "H-Bridge"
วงจรที่เห็นนี้ทำหน้าที่ได้ทั้งคุมทิศทางและความเร็วของมอเตอร์นะครับ   มาว่ากันทีละส่วน  เริ่มจากการคุมทิศทางการหมุนก่อนครับ
โดยปกติหากต้องการกลับ ทิศการหมุนของมอเตอร์กระแสตรง วิธีนึงที่ทำได้คือ กลับทิศแหล่งจ่าย  ทีนี้ลองดูที่รูปวงจร H-Bridge ด้านบนนะครับ
  • หากต้องการให้หมุนตามเข็ม (Clockwise :CW) ก็ให้ S1 และ S4 ปิดวงจร  และให้ S2 และ S3 เปืดวงจร
  • หากต้องการให้หมุนทวนเข็ม (Conter Clockwise :CCW) ก็ให้ S2และ S3 ปิดวงจร  และให้ S1 และ S4 เปืดวงจร
จะเห็นว่าสวิตช์จะทำงานเป็นคู่นะครับ S1 คู่กับ S4 และ S2 คู่กับ S3 คู่แรกทำงาน คู่สองต้องเปิดวงจร และในทางตรงข้ามก็คือคู่สองทำงาน คู่แรกต้องเปิดวงจร   
ทีนี้จะทำอย่างไรให้การ เปิดปิดเป็นแบบที่ง่ายกว่านี้  คำตอบก็คือ ใช้อุปกรณ์สารกึงตัวนำเช่น MOSFET หรือ IGBT หรือ อื่นๆ แล้วแต่ความเหมาะสม เช่น ขนาดกระแส แรงดันที่ต้องการควบคุม ครับ
 
 Schematic ขอวงจร H-Bridge ก็ตามนี้ครับ  จะใช้วงจรนี้ก็ต้องเชิญไปบ้านหม้อและซื้ออุปกรณ์ตามลิงค์นี้มาต่อวงจรกันเอานะครับ   แต่โชคดีที่เรามีทั้ง Motor Shield L293D  Motor Shield L298P    และ IC ที่มีวงจร H-Bridge ให้ครับ  ที่มีขายในบ้านเรามีให้เลือก 2 แบบ หลักๆ คือ L293D และ L298P ครับ  สองตัวนี้ต่างกันอย่างไรเหรอครับ  ก็ที่ขนาดของกระแสที่รับได้  ซึ่งหมายถึงขนาดของมอเตอร์ที่ใช้นะครับ  
ถ้า มากกว่านี้เหรอครับ  คงต้องต่อกันเอาเองแล้วครับ แต่จริงๆ ก็ไม่ได้ยากอะไรขนาดนั้นครับ แค่ต่อตาม Schematic เท่านั้น  แต่แหม เลือกได้คงไม่ต่อเองใช่รึเปล่าครับ
วันนี้ลองมาใช้ L293D ทีให้มาใน Arduino Stater Kit 1 ของร้าน Arduitronics เพื่อทดลองคุมทิศทางการหมุนดูนะครับ
   ก่อนอื่นเริ่มจากการต่อวงจรก่อนครับ ก็ต่อตามภาพด้านล่างนี้ครับ (ภาพจาก Arduino Cookbook by Michael Margolis)




ในตัวอย่างนี้ผมใช้ถ่าน 9 V เป็นแหล่งจ่ายนะครับ  อย่าใช้ 5 V จาก Board เป็นแหล่งจ่ายนะครับ เพราะ Port ของ Arduino จ่ายกระแสได้แค่ 50 mA เท่านั้น  อาจจะทำให้บอร์ดพังได้ครับ
Sketch ก็ตามนี้นะครับ

/*
 * Brushed_H_Bridge_simple2 sketch
 * commands from serial port control motor direction
 * + or - set the direction, any other key stops the motors
 */
const int in1Pin = 5;  // H-Bridge input pins
const int in2Pin = 4;
const int in3Pin = 3;  // H-Bridge pins for second motor
const int in4Pin = 2;
void setup()
{
  Serial.begin(9600);
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(in3Pin, OUTPUT);
  pinMode(in4Pin, OUTPUT);
  Serial.println("+ - sets direction of motors, any other key stops motors");
}
void loop()
{
  if ( Serial.available()) {
    char ch = Serial.read();
    if (ch == '+')
    {
      Serial.println("CW");
      // first motor
      digitalWrite(in1Pin,LOW);
      digitalWrite(in2Pin,HIGH);
      //second motor
      digitalWrite(in3Pin,LOW);
      digitalWrite(in4Pin,HIGH);
      
    }
    else if (ch == '-')
    {
      Serial.println("CCW");
      digitalWrite(in1Pin,HIGH);
      digitalWrite(in2Pin,LOW);
      digitalWrite(in3Pin,HIGH);
      digitalWrite(in4Pin,LOW);
    }
    else
    {
      Serial.print("Stop motors");
      digitalWrite(in1Pin,LOW);
      digitalWrite(in2Pin,LOW);
      digitalWrite(in3Pin,LOW);
      digitalWrite(in4Pin,LOW);
    }
  }
}
ถ้าทุกอย่างถูกต้องไม่มีปัญหา จะได้หน้าจอ Serial Monitor ดังนี้ครับ  โดยจะเห็นมอเตอร์หมุนทิศนึงตอนกด "+" และทิศตรงข้ามถ้ากด "-"  ถ้ากดอย่างอื่นจะหยุดหมุนครับ

Arduino ไฟวิ่งฝนดาวตก

Arduino ไฟวิ่งฝนดาวตก

หลังจากได้ซื้อบอร์ด Freeduino V1.16 จากป๋าช้างมา ผมว่า Arduino มันเล่นง่ายจริงๆ นะ สไตล์การเขียนโค๊ดเหมือนพวก processing ผมไม่แน่ใจว่าเค้าเรียกการเขียนโค๊ดแบบนี้ เค้าเรียกว่าอะไร รู้แค่ว่า Arduino มันมีฟังก์ชั่นหลักอยู่ 2 ฟังก์ชั่น คือ void setup() และ void loop() แค่สองฟังก์ชั่นที่เค้าบังคับ เท่านั้่น ก็สามารถสั่งให้ Arduino ทำงานได้แหละ

แบบนี้ ก็ลองกันสักหน่อย แน่นอนครับ โค๊ดแรกเลย ต้องทำไฟกระพริบให้ได้ก่อน เพราะจะได้เป็นการเช็คว่า เราสามารถโปรแกรมลงบนบอร์ดได้จริง แต่วันนี้ พิเศษสักหน่อย เราจะมาทำไฟวิ่งฝนดาวตกกันครับ

Arduino มีโค๊ดที่เป็นตัวอย่างค่อนข้างเยอะ แล้วก็ค่อนข้างจะครบถ้วนให้เราศึกษางานทางด้าน Embedded System เราก็จะนำตัวอย่างโค๊ดของ Arduino ที่ชื่อว่า Fading มาทำการประยุกต์ในการทำไฟวิ่งฝนดาวตก กัน

หลักการคร่าวๆ ก็คือ ในการทำให้หลอด LED สว่างมาก-น้อย เราจะทำการเปลี่ยนแปลงแรงดันขาออก ให้อยู่ในรูบ Analog output ซึ่งที่ขาของ digital output แล้วไม่สามารถทำได้ตรงๆ แต่เราสามารถเปลี่ยนแปลงแรงดันค่าเฉลี่ยได้ ด้วยหลักการของ PWM ซึ่งเมื่อเราเปลี่ยนแปลงค่า %duty cycle แล้วจะทำให้เสมือนว่า แรงดันเฉลี่ยที่ออกมาดูเหมือนเปลี่ยนแปลงตามไปด้วย ด้วยผลลัพธ์นี้ เมื่อเรานำมาขับหลอด LED เราจะเห็นว่า หลอด LED ดูเหมือน สว่างมาก สว่างน้อย ตามการเปลี่ยนเปลงของ %duty cycle

จากหลักการนี้ เมื่อนำมารวมกับการเขียนโปรแกรมให้ไฟวิ่ง โดยให้หลอดไฟมีการไล่วงจรการติดดับเรียงลำดับกันไป คุณก็จะได้ วงจรไฟวิ่งฝนดาวตก อย่างง่ายๆ แล้วหล่ะครับ ซึ่งถ้าจะทำเป็นการค้าจริงๆ อาจจะต้องพิจารณาหลายอย่างเหมือนกัน แต่ว่าทำเอาไว้ให้แฟนดูในห้องกันสองคน จะภูมิใจกว่าหน่ะครับ อิอิอิ



มาเริ่มกันเลยดีกว่า ที่บอร์ด Arduino จะมีขา digital out ที่เป็น PWM ให้เรา 6 pin ครับ ไ้ด้แก่ PIN 11,10,9,6,5,3 ดูจากรูปด้านล่าง เราก็เอาหลอด LED ต่อที่ขาดังกล่าวเลยครับ โดยเรียนลำดับขาตาม ลำดับหมายเลข PIN นะครับ เพื่อเวลาที่โปรแกรมทำงาน ไฟจะได้ติดดับตามลำดับ ที่เราออกแบบไว้ที่โค๊ด หน่ะครับ

ในส่วนของโค๊ด ผมได้ศึกษาจากโค๊ดตัวอย่างเรื่อง Fading แล้วก็มาประยุกต๋เอาครับ ในที่นี้ ผมได้ต่อที่หลอด LED เข้าที่ขา PIN PWM ทั้ง 6 PIN
โดยกำหนดให้ ลำดับการต่อหลอด LED เรียงตามลำดับ PIN PWM ของ Arduino

ต่อมา ผมก็มานั่งคิดตารางการเรียงลำดับการไหลของ ไฟวิ่งฝนดาวตก ก่อนครับ แต่ถ้าใครคิดในหัวออกได้ ก็ตามใจครับ ค่าที่กำหนดได้สูงสุด ไม่เกิน 255 นะครับ เพราะที่ขา PWM นี้ มีความละเอียดแค่ 8 บิต ครับ ( 2^8 = 256 ไม่คิดเครื่องหมาย)



โค๊ด Arduino ไฟวิ่งฝนดาวตก (พอดี เขียนตอนดึก คิดได้ประมาณนี้ เพื่อนๆ อาจจะคิดได้ไม่เหมือนผมนะครับ อย่าซีเรียส)

int ledArr[] = {11,10,9,6,5,3}; // Led0 ..... Led5
void setup(){ }

void loop()
{
  for(int i = 0 ; i <13; i++){
    if(i<6){
      analogWrite(ledArr[i],255);// forward
      for(int k=0;k<i;k++){
        analogWrite(ledArr[k],fadeArr[i-k]); //update previous
      }
    }else{
      for(int j=0;j<6;j++){
        analogWrite(ledArr[j],fadeArr[i-j]); // update previous
      }     
    }   
    delay(100);   
  } 
}

Arduino ไฟวิ่งฝนดาวตก

พอดีผมแก้โค๊ดให้วิ่งกลับไปกลับมา

int fadeArr[] = {255, 200, 150, 100, 50, 10, 0, 0, 0, 0, 0, 0, 0};
int ledArr_fwd[] = {11,10,9,6,5,3}; // Led0 ..... Led5
int ledArr_rwd[] = {3,5,6,9,10,11}; // Led5 ..... Led0
int dl = 100;
void setup(){ }

void loop()
{
  for(int i = 0 ; i <13; i++){
    if(i<6){
      analogWrite(ledArr_fwd[i],255);// forward
      for(int k=0;k<i;k++){
        analogWrite(ledArr_fwd[k],fadeArr[i-k]); //update previous
      }
    }else{
      //analogWrite(ledArr[i-1],fadeArr[i-k]);// forward
      for(int j=0;j<6;j++){
        analogWrite(ledArr_fwd[j],fadeArr[i-j]); // update previous
      }     
    }   
    delay(dl);   
  }
  delay(300);
  for(int i = 0 ; i <13; i++){
    if(i<6){
      analogWrite(ledArr_rwd[i],255);// forward
      for(int k=0;k<i;k++){
        analogWrite(ledArr_rwd[k],fadeArr[i-k]); //update previous
      }
    }else{
      for(int j=0;j<6;j++){
        analogWrite(ledArr_rwd[j],fadeArr[i-j]); // update previous
      }     
    }   
    delay(dl);   
  } 
}



 

LED แสนสนุก

LED แสนสนุก
วันนี้เราจะทำไฟ(LED)วิ่งแบบวนลูปกันนะครับ
เราจะใช้ PIN Digital 6-13 และ GND สำหรับทำไฟวิ่ง 8 ดวงนะครับ

14-4-2556 15-42-38

อุปกรณ์ที่ต้องมีนะครับ
1. บอร์ด Arduino (รุ่นไหนก็ได้ครับ)
2. สาย USB สำหรับต่อ Aruduino กับคอมพิวเตอร์
3. โปรโตบอร์ด
4. LED x 8 อัน (สีอะไรก็ได้ครับ)
5. R 200 Ohm x 8 อัน
6. สายจั้ม

Example 1 : ไฟกระพริบ (จากโค๊ดตัวอย่าง) (ละเอียด)
Step 0 : เสียบสาย USB เข้ากับ Arduino และ คอมพิวเตอร์
Step 1 : เปิดโปรแกรม Arduino แล้วไปที่ File > Examples > 01 Basics > Blink



12-4-2556 12-49-03
Step 2 : เราจะได้หน้าต่างตัวอย่างโค๊ดมาใหม่ดังภาพ

12-4-2556 12-49-43
Step 3 : เลือกบอร์ดที่เราใช้ ไปที่เมนู Tools > Board > Aruino Uno (ซึ่งผมใช้ Uno ส่วนท่านไหนใช้บอร์ดไหน ก็เลือกตามนั้นเลยครับ)

12-4-2556 12-50-27
Step 4 : เลือก Port ที่บอร์ดเราต่ออยู่ โดยไปที่เมนู Tools > Serial Port > เลือก Port ที่บอร์ดเราต่อยู่ครับ (ส่วนใหญ่ก็จะเป็นอันล่าสุดนี่หล่ะครับ)

12-4-2556 12-50-49
Step 5 : ก็ Upload โปรแกรมใส่เจ้า Arduino ของเราได้เลย โดยกดที่ปุ่มลูกศรชี้ไปทางขวานะครับ ดังภาพ

12-4-2556 12-55-42
Step 6 : เสร็จแล้วครับ สังเกต LED ที่บอร์ด จะกระพริบ ติด-ดับ ใน 1 วินาที

20130412_125437


Example 2 : ไฟวิ่งทางเดียว (ไฟดาวตก)

เตรียม Hardware

โดยเราจะต่อ LED, R และ Arduino ดังรูปนะครับ
1. เอา R 200 Ohm 1 อัน ต่อกับขา + ของ LED 1 ดวง
2. เอาสายจั้มต่อสายจากอีกปลายข้าง 1 ของ R ไปเข้ากับพอร์ดของ Arduino 1 อัน (เช่น Digital 6)
3. จั๊มสายไฟจากขา – ของ LED ไปต่อไว้กับ Ground (GND) ร่วมบนโปรโตรบอร์ด
4. จั๊มสายไฟจาก GND ร่วมไปเข้ากับ GND ของ Arduino
5. ทำซ้ำข้อ 1-3 จนครบทั้ง 8 ดวง (ดังภาพ)
led8bit_bb
20130412_142935_1

สิ่งที่เราจะทำ
สิ่งที่เราจะทำคือไฟวิ่งติดไปที่ละดวง ไล่ตั้งแต่ LED 1 – LED 7 นะครับ
คือ LED 1 ติด แล้วก็ดับ จากนั้น LED 2 ค่อยติด แล้วก็ดับ ไป LED3 … ไปเลยๆ
แล้วก็วนกลับมาที่ LED 1 ใหม่ อย่างงี้นะครับ
20130412_142935_2
ผลลัพธ์
20130412_142828
CODE :


Example 3 : ไฟวิ่งวนไปกลับ

สิ่งที่เราจะทำ
คล้ายๆกับตัวอย่างที่ 2 นะครับ เพียงแต่แทนที่วนกลับมา เริ่ม LED 1 ใหม่
เราก็ให้มันวนกลับมา ไล่จาก LED 7 มาจนถึง LED 1 อย่างงี้ครับ
20130412_142935_3
ผลลัพธ์
20130412_142827
CODE :

มี Pattern ให้เล่นอีกมากมายเลยนะครับ ลองเล่นดู
– ไฟติดดับทีละ 2 ดวง
– ไฟวิ่งจากซ้ายและขวา ทีละดวง ไล่มาจนถึงตรงกลาง
– อื่นๆ
ขอให้สนุกนะครับ