พบกับซีรีส์ Circle Electronic NOOB: Knight Rider!
เราต่างก็จำรถสุดเท่ในซีรีส์ตำนานอย่าง Knight Rider ได้ดี ฟีเจอร์เด็ดของมันคือไฟ LED ด้านหน้าที่วิ่งไล่กันไปมาแบบเรียงตัว
สำหรับน้องๆ ที่พึ่งหัดเล่น Arduino และอยากเริ่มเขียนโค้ด นี่แหละโอกาสดีที่จะได้ทำอนิเมชั่นไฟวิ่งแบบนี้!
ไม่ต้องมานั่งงมกับวงจรเบรดบอร์ดให้วุ่นวาย แค่ต่อสายแล้วเริ่มเขียนโค้ดได้เลย ง่ายๆ จัดไปวัยรุ่น!
เกร็ดเล็กเกร็ดน้อยของโปรเจกต์
โปรเจกต์ Arduino Knight Rider นี้คือโปรเจกต์คลาสสิกสำหรับมือใหม่ที่สร้างขึ้นเพื่อเป็นเกียรติให้กับซีรีส์ในยุค 80s ที่มี K.I.T.T. รถสุดอัจฉริยะเป็นพระเอก ฟีเจอร์เด่นของ K.I.T.T. ก็คือไฟสีแดงที่สแกนไปมาบนกันชนหน้าของมันนั่นเอง
น้องจะได้ทำอะไรบ้าง?
- น้องสามารถต่อ LED ทั้ง 8 ดวงแยกกันเข้ากับพินของ Arduino แล้วใช้ลูป for ควบคุมให้มันติดดับไล่กันไปมาได้
ฮาร์ดแวร์ที่ใช้
- LED Display: ในเวอร์ชันนี้เราใช้ LED สีแดง 8 หรือ 10 ดวงเรียงเป็นเส้น แคโทดของ LED แต่ละดวงต่อกับกราวด์ ส่วนแอโนดต่อกับพินดิจิตอลของ Arduino โดยเฉพาะ (เช่น พิน 2 ถึง 11)
- การป้องกัน: แต่ละ LED ต้องมี ตัวต้านทาน (Resistor) 220 โอห์ม ต่ออนุกรมไว้ เพื่อป้องกันพินเอาต์พุตของ Arduino และตัว LED เองจากกระแสเกิน (V=IR)
- ขอบคุณบัซเซอร์ที่อยู่ด้านบน น้องสามารถเล่นเพลงธีมของ Knight Rider และเรียนรู้การสร้างเมโลดี้ด้วยบัซเซอร์ได้
- น้องจะได้เรียนรู้วิธีการโปรแกรมไอซีขับ LED อย่าง 74HC593 ไอซีตัวนี้ช่วยให้เราควบคุม LED 8 ดวงได้โดยใช้การเชื่อมต่อแค่ 3 เส้นเท่านั้น เอาไปใช้กับโปรเจกต์อื่นที่ต้องขับมอเตอร์หรืออะไรก็ได้ แทนที่จะใช้แค่ LED
เขียนโค้ดเอฟเฟกต์ไฟสแกน
โปรเจกต์นี้เป็นวิธีที่เจ๋งมากในการเรียนรู้เรื่อง for loops และ arrays แทนที่จะสั่งเปิดปิดพินแต่ละอันด้วยมือ เราสามารถใช้ลูปเพื่อวนลูปผ่านหมายเลขพินได้:
// Moving Forward
for (int i = 2; i <= 11; i++) {
digitalWrite(i, HIGH);
delay(100);
digitalWrite(i, LOW);
}
// Moving Backward
for (int i = 11; i >= 2; i--) {
digitalWrite(i, HIGH);
delay(100);
digitalWrite(i, LOW);
}
แต่งแต้มให้ดูเท่: เอฟเฟกต์สายตาเหลือบมอง (Persistence of Vision)
ถ้าอยากให้สแกนเนอร์ของเราดูเท่เหมือน K.I.T.T. ตัวจริง ใช้ PWM (Pulse Width Modulation) ในการสร้างเอฟเฟกต์ "หาง" ได้เลยจ้า พอหลอด LED หลักดับ หลอดก่อนหน้านั้นก็ค่อยๆ หรี่ลงแทนที่จะดับทันที งานนี้ได้เอฟเฟกต์การเคลื่อนไหวที่ลื่นไหล เหมือนของเหลวไหลไปมาเลย
เอาไปใช้ทำอะไรได้บ้าง
นอกจากติดรถแล้ว เอฟเฟกต์สแกนแบบนี้ยังใช้ได้อีกเพียบ:
- ไฟแสดงสถานะ (Status Indicators): บอกว่าระบบกำลังทำงานหรือกำลังค้นหาอะไรอยู่
- อุปกรณ์ประกอบฉาก: ใส่ให้หมวกหรืออุปกรณ์ไซไฟดูล้ำๆ
- ไฟตกแต่งอารมณ์ (Mood Lighting): เอาไปทำแอนิเมชั่นง่ายๆ ติดตู้โชว์ก็ปัง
โค้ด
การตั้งค่า LED 8 หลอด
int leds[] = {2,3,4,5,6,7,8,9};
void setup()
{
for(int i=0; i<8; i++) {
pinMode(leds[i], OUTPUT);
}
}
void loop()
{
for(int i=0; i<7; i++) {
digitalWrite(leds[i], HIGH);
delay(100);
digitalWrite(leds[i], LOW);
}
for(int j=7; j>0; j--) {
digitalWrite(leds[j], HIGH);
delay(100);
digitalWrite(leds[j], LOW);
}
}
การตั้งค่าใช้ Shift Register 74HC595
#define LATCH 9
#define CLOCK 10
#define DATA 8
static int led = 0;
byte number[23] = {0b00000000,
0b00000001,
0b00000011,
0b00000111,
0b00001110,
0b00011100,
0b00111000,
0b01110000,
0b11100000,
0b11000000,
0b10000000,
0b00000000,
0b10000000,
0b11000000,
0b11100000,
0b01110000,
0b00111000,
0b00011100,
0b00001110,
0b00000111,
0b00000011,
0b00000001,
0b00000000
};
void setup() {
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);
}
void loop() {
static unsigned long time = millis();
if (millis() - time >= 80 && led <= 22) {
time = millis();
led++;
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, MSBFIRST, number[led]);
digitalWrite(LATCH, HIGH);
}
if (led == 22) {
led = 0;
}
}
ส่วนการตั้งค่าเพลงธีม ไปดูรายละเอียดเพิ่มเติมกันได้เลย
จัดชุด DIY Knight Rider ไปเลยวัยรุ่น!