Arduino-Driven LED Traffic Light
INTRO
ผมเป็น masochist ทางเทคนิคที่หลงใหลในเครื่องมือ cloud-based, CAD และ simulation ดังนั้น แทนที่จะติดตั้ง Arduino desktop ลงบน MacBook Pro ของผมโดยตรง และเริ่มทำงานกับ breadboard พร้อม LED และตัวต้านทานทันที ผมจะออกแบบด้วย CAD บน TinkerCad และเขียนโค้ดบน cloud-based IDE ทั้งหมดนี้จะทำจาก Windows 10 VM ที่รันบน Parallels ขอให้ผมโชคดี!
CLOUD IDE
ผมพยายามติดตั้ง osx Arduino Uno drivers ลงบน MacBook Pro ปี 2014 ของผมสำหรับ Chrome และ FireFox แต่ไม่สำเร็จ ไม่ย่อท้อ ผมสามารถรันบน virtual Win10 VM ใน Parallels ได้ ด้วยการสนับสนุน USB ที่ง่ายและยอดเยี่ยมของพวกเขา ไม่เป็นไรสำหรับผม ผมชอบที่จะเก็บฮาร์ดแวร์พื้นฐาน (Mac) ของผมให้สะอาดและปราศจาก plugin มากที่สุดเท่าที่จะเป็นไปได้อยู่แล้ว
CADDING IT UP
ผมเพิ่งจะเริ่มต้นใช้งานบริการ Arduino cloud คิดว่า Arduino Create จะนำผมไปสู่ circuit editor/simulator ภายใน ecosystem ของพวกเขา แต่กลับไม่เจอ ผมเจอ Autodesk TinkerCad และพยายามหาสิ่งที่ช่วยให้ผมวาดและ simulate วงจรได้ ปรากฏว่ามันง่ายเกินไปเสียอีก บทเรียนที่สองของการเริ่มต้นใช้งาน Tinkercad ครอบคลุมเรื่องไฟจราจร LED ได้อย่างตรงจุด
RUNNING ON A LEGIT BOARD
บางทีมันอาจจะไม่ง่ายอย่างที่ผมคิด ความพยายามซ้ำแล้วซ้ำเล่าในการดาวน์โหลดโค้ดไปยัง Adafruit Metro (ที่เข้ากันได้กับ Arduino Uno) ของผม ยังคงเกิด error นี้ซ้ำๆ
Avrdude Stk500_getsync(): Not in Sync Resp=0x30
Google พบกระทู้ฟอรัมจำนวนมากที่มีข้อความว่า "เฮ้ ผมก็มีปัญหาเดียวกัน" และ "ไม่ ผมยังหาวิธีแก้ไขไม่ได้"... จนกระทั่งผมพบ วิธีแก้ไขที่โพสต์ใน Instructables forum ปรากฏว่าผมต้องข้าม pin 0 การทบทวนบันทึกในชั้นเรียนอย่างรวดเร็วทำให้ผมจำได้ว่า อาจารย์ของผมแนะนำให้เริ่มต้นที่ pin 2 หลังจากเปลี่ยนโค้ด 3 บรรทัดและเปลี่ยน 3 pins ผมก็สามารถเริ่มทำงานได้แล้ว
MAKING IT MY OWN
ดังนั้น การปรับปรุงครั้งแรกของผมจึงเป็นการคัดลอกตัวอย่างไฟจราจรของ Tinkercad โดยตรง โดยมีการเปลี่ยนแปลงเพียง 3 ตัวเลขเล็กๆ เท่านั้น นอกจากนี้ สิ่งที่สร้างขึ้นจริงก็แตกต่างจากการออกแบบของผม ถึงเวลาที่จะทำให้มันเป็นของผมเอง
ก่อนอื่น ผมจะสร้างไฟล์ TinkerCad ของตัวเอง โดยใช้ breadboard ผมจะเริ่มต้นด้วยการทำให้สิ่งที่ออกแบบตรงกับสิ่งที่สร้างขึ้นจริง
มันทำงานได้ แต่มาลองจัดวางสิ่งต่างๆ ใหม่เล็กน้อยเพื่อให้ pins ชัดเจนและอ่านง่ายขึ้น
ดีขึ้นมาก ทีนี้มาพูดถึงโค้ดกัน มาสร้าง functions กัน ผมจะลองทำอะไรง่ายๆ โดยใช้ functions แยกกันคือ stop(), caution() และ go() โดยแต่ละ function จะรับค่า delay เป็นวินาที นักวิทยาศาสตร์คอมพิวเตอร์อาจชอบ function set_traffic_slight() ที่มี typdef struct ซึ่งระบุสถานะต่างๆ และเวลาเป็น milliseconds แต่ผมคิดว่าวิธีของผมจะได้รับการชื่นชมจากวิศวกรจราจรที่ถูกผู้จัดการบังคับให้เรียนรู้การเขียนโค้ด หากต้องการดูว่าผมทำอะไรไปบ้าง โปรดดูที่ส่วน Code
EXPANDED TECHNICAL DETAILS
Foundational Logic Controller
โปรเจกต์นี้จำลองระบบสัญญาณไฟจราจรในเมืองทั่วไป โดยเน้นที่ high-brightness visual indicators และ timing loops
- Time-Division Sequencing: ใช้ state machine ที่กำหนดไว้อย่างเคร่งครัดซึ่งจัดการโดย
millis()ซึ่งช่วยให้ Green-Yellow-Red transitions สมบูรณ์แบบและหลีกเลี่ยงปัญหา "Lockup" ที่เกี่ยวข้องกับdelay() - TinkerCad Verified: วงจรได้รับการปรับแต่งใน TinkerCad เพื่อคำนวณค่า resistor ที่แน่นอนสำหรับ 10mm LEDs เพื่อให้มั่นใจถึงความน่าเชื่อถือในระยะยาวและความสว่างที่สมดุลในทุกสี
Scalability
- Emergency Override: มี "Priority Input" (เช่น สำหรับ ambulance sensor) ที่บังคับให้วงจรเข้าสู่ predefined safety pattern ได้ทันที