กลับไปหน้ารวมไฟล์
shift-registers-ez_sipo8_lib-library-tutorials-2ee7c0.md
คอร์สสอนใช้งานไลบรารี ez_SIPO8_lib ทั้งหมด 6 ตอน สำหรับจัดการและควบคุม Shift Register ตัวเดียวหรือหลายตัว แบบต่อกันเป็นสายโซ่ (Cascade) หรือ แบบหลายชุด ที่ทำงานพร้อมกัน

ภาพรวมโปรเจค

"Register-Logic" นี่คือการลงมือทำจริงจังกับเรื่อง การควบคุม Serial-In Parallel-Out (SIPO) แบบจัดเต็ม และ การวินิจฉัย Bitstream แบบหลายแบงค์ ชุดบทเรียน 6 ตอนนี้จะพาน้องๆ รู้จักกับไลบรารี ez_SIPO8_lib ซึ่งเป็นเลเยอร์ระดับสูงที่ออกแบบมาเพื่อจัดการ Shift Register ต่อกันเป็นพวงได้สูงสุด 255 ตัวเลยทีเดียว โปรเจคนี้จะเจาะลึกเทคนิคการทำ Memory-Mapping แบบจัดหนัก ทั้ง Absolute vs. Relative addressing, การสลับแบงค์แบบต่อกันเป็นสายโซ่ และการตั้งเวลาแบบอิสระ (Temporal-Timer Heuristics) เน้นหนักไปที่การตรวจสอบระดับบิตแบบละเอียดยิบ, ความแข็งแรงของสัญญาณที่วิ่งผ่าน IC หลายตัวต่อกัน และการขยายสัญญาณ GPIO-Pin แบบแม่นยำ

ก่อนจะเริ่ม

คำเตือนเล็กน้อย (ห้ามช็อตนะตัวนี้):

บทเรียนและคู่มือผู้ใช้ชุดนี้จะเน้นเฉพาะการใช้งานและความสามารถของไลบรารี SIPO8 เท่านั้นนะครับ มัน ไม่ได้ ครอบคลุมถึงการเชื่อมต่อเอาต์พุตของ SIPO ไปยังอุปกรณ์อื่นๆ นอกเหนือจาก LED ทั่วไป เช่น รีเลย์หรืออุปกรณ์อื่นๆ – น้องต้องระวังและศึกษาให้ดีเรื่องการจับคู่ระหว่าง IC SIPO ที่ใช้, อุปกรณ์ที่เราจะเชื่อมต่อ และเรื่อง ความต้องการกำลังไฟโดยรวม ที่อาจจะมากเกินกว่าที่ไมโครคอนโทรลเลอร์ของเราจะจ่ายไหว

ในอินเทอร์เน็ตมีข้อมูลเกี่ยวกับเรื่องพวกนี้อยู่เพียบเลย น้องควรหาข้อมูลเพิ่มเติมสักหน่อยก่อนจะลงมือทำโปรเจคที่ซับซ้อนเกินกว่าแค่ต่อ LED นะครับ

ตัวอย่างสเก็ตช์ในบทเรียนนี้ตั้งค่าไว้สำหรับบอร์ด Arduino แต่หลักการก็เอาไปใช้กับบอร์ด ESP32 ได้เหมือนกันครับ

ถ้าอยากอ่านบทความต้นฉบับเกี่ยวกับไลบรารี ez_SIPO8_lib ก็ลองหาอ่านดูได้ตามแหล่งข้อมูลต่างๆ นะครับ

บทนำ

บทความนี้จะพาไปรู้จักกับบทเรียนทั้ง 6 ตอน ที่จะโชว์ความสามารถของไลบรารี ez_SIPO8_lib ในการจัดการและควบคุม Shift Register หรือ IC แบบ Serial-In/Parallel Out (SIPO) แนวคิดการออกแบบและการประยุกต์ใช้ของไลบรารีนี้ต่างจากวิธีอื่นๆ ที่มีอยู่ เพราะมันรองรับสิ่งเหล่านี้:

  • การใช้ SIPO IC หลายตัวพร้อมกันได้ (ในทางทฤษฎีสูงสุด 255 ตัว)
  • SIPO IC ที่ต่อเดี่ยวๆ หรือต่อกันเป็นสายโซ่ (Daisy Chained)
  • สายโซ่ SIPO สามารถมีกี่ตัวต่อกันก็ได้
  • SIPO (ทั้งตัวเดียวและแบบต่อกัน) สามารถถูกจัดกลุ่มเป็น 'แบงค์' ที่แยกจากกันและกำหนดที่อยู่ได้อิสระ หนึ่งหรือหลายแบงค์ก็ได้
  • แต่ละแบงค์สามารถมีขนาดต่างกันได้ (เป็น SIPO เดี่ยวหรือต่อกันเป็นสายโซ่)
  • สามารถกำหนดที่อยู่และควบคุมแบงค์ที่มีขนาดต่างกันหลายๆ แบงค์ได้อย่างอิสระ
  • แต่ละแบงค์จะเชื่อมต่อกับไมโครคอนโทรลเลอร์ด้วยอินเทอร์เฟซ 3 สายของตัวเอง

สรุปก็คือ ถ้าน้องต้องใช้ SIPO IC สักตัว หรือจะใช้เป็นสิบเป็นร้อยตัว ไลบรารี ez_SIPO8_lib นี้อาจจะเป็นตัวช่วยที่ดีเลยล่ะ! ถ้าอยากอ่านบทความต้นฉบับของไลบรารีนี้ ก็ลองหาอ่านดูจากแหล่งข้อมูลอื่นๆ ได้ครับ

ถ้าน้องทำตามและลงมือปฏิบัติไปด้วยกันในบทเรียนทั้งหมด น้องจะเข้าใจและเห็นศักยภาพของไลบรารีนี้ได้อย่างลึกซึ้งขึ้นแน่นอน จัดไปวัยรุ่น!

มีทั้งหมด 6 ตอนด้วยกันน้อง เรียนไล่จากง่ายไปหายาก ตามนี้เลย:

Tutorial 1 - Absolute Addressing แนะนำการเข้าถึงแบบ Absolute ของเอาต์พุต SIPO โดยใช้ SIPO IC ตัวเดียว โดยมองมันเป็นเหมือนอาร์เรย์ต่อเนื่องของพอร์ตเสมือนที่แมปไว้แต่ละตัว

Tutorial 2 - Relative Addressing มาเรียนรู้การเข้าถึงแบบ Relative ของเอาต์พุต SIPO กันบ้าง ยังใช้ SIPO IC ตัวเดียวเหมือนเดิม แต่คราวนี้การอ้างอิงจะคิด สัมพันธ์ กับ 'bank' ที่สนใจ แทนที่จะมองเป็นอาร์เรย์ใหญ่ทั้งก้อน

Tutorial 3 - Using Timers มาดูหลักการใช้งานความสามารถด้าน Timer ของไลบรารี SIPO8 กัน (ยังใช้ SIPO IC ตัวเดียวอยู่นะ) ตัว Timer นี่เป็นฟีเจอร์ในตัวไลบรารีเลย เพราะมันช่วยให้เราตั้งช่วงเวลาในการอัปเดตเอาต์พุตได้สะดวกขึ้น เช่น ให้ไฟ LED กะพริบ เปิดปิดรีเลย์ เป็นต้น ไลบรารีนี้ให้เราสร้าง Timer กี่ตัวก็ได้ตอนเริ่มต้น โดยแต่ละตัวจะมี ID เป็นของตัวเอง

Tutorial 4 - Cascading SIPOs ตอนนี้จะพาน้องๆ ต่อ SIPO IC สองตัวให้กลายเป็น bank เดียวกันแบบ Cascade หลักการที่เรียนไปจะทำให้เราสร้าง bank ขนาดไหนก็ได้ แค่เพิ่ม IC ต่อกันไปเรื่อยๆ โดยที่โค้ดในสเก็ตช์เราแทบไม่ต้องเปลี่ยนเลย

Tutorial 5 - Bank Interleaving มาดูฟีเจอร์เจ๋งๆ อย่าง Bank Interleaving กัน มันคือการที่เราสามารถแมป bank ของ SIPO หลายๆ bank (ที่ขนาดเท่ากัน) ไปยัง อินเทอร์เฟซดิจิทัล 3 สายชุดเดียวกัน ได้ เลือกใช้ bank ไหนเมื่อไหร่ก็ได้ตามต้องการ ฟังดูขัดกับวิธีต่อปกติใช่มั้ย? แต่มันเปิดโลกการออกแบบใหม่ให้เราจ้า

Tutorial 6 - Q & A และสุดท้าย ตอนนี้เป็นคำถาม-คำตอบสำหรับปัญหาแบบ "ทำยังไงให้..." "จะสามารถ..." ฯลฯ

หวังว่าพอเรียนจบทั้ง 6 ตอนแล้ว น้องๆ จะได้ทั้งความรู้และไอเดียพอที่จะตัดสินใจได้ว่า ความสามารถของไลบรารี ez_SIPO8_lib นี่จะช่วยงานโปรเจกต์ของน้องๆ ได้มั้ย เอาใจช่วยนะ สู้ๆ!

ลงลึกกันแบบช่างๆ

  • SIPO Bitstream & การไล่สืบแบบต่อพ่วง (Cascade Forensics):
    • The 3-Wire Interface Logic-Hub: แต่ละกลุ่ม SIPO (bank) จะถูกควบคุมผ่านบัส $3$-สาย $(Data, Clock, Latch)$ การไล่สืบ (Forensics) จะเกี่ยวข้องกับการสั่งพัลส์แบบกำหนดได้ (deterministic pulsing) ของสัญญาณนาฬิกา SH_CP เพื่อเลื่อนแพ็กเก็ตบิตแบบอนุกรมเข้าไปในฟลิปฟล็อปภายใน การวินิจฉัยจะโฟกัสไปที่เหตุการณ์ latch() ซึ่งจะโอนบิตสตรีมที่บัฟเฟอร์ไว้ไปยังขาพาราเลลเอาต์พุต $(Q_0-Q_7)$ โดยไม่มีสัญญาณรบกวน (zero-jitter harmonics) แสดงให้เห็นถึงการซิงค์ของลอจิกเกตได้อย่างสวยงาม
    • Absolute vs. Relative Addressing Heuristics:
      • Absolute Addressing: ใช้วิธีมองโซ่ของ IC ทั้งหมดเป็นอาร์เรย์ $N\text{-bit}$ เดียวที่ต่อเนื่องกัน การไล่สืบจะเป็นการแมปอินเด็กซ์พอร์ตเสมือน (virtual port index) ไปยังเอาต์พุตทางกายภาพของซิลิกอนโดยตรง
      • Relative Addressing (Banks): แบ่งอาร์เรย์ออกเป็นหน่วยลอจิกแยกกัน (discrete logic-units) หรือที่เรียกว่า $(banks)$ การไล่สืบจะเน้นไปที่การอ้างถึงพินที่ $3$ ของ bank ที่ $2$ ช่วยให้สามารถควบคุมเมคาทรอนิกส์แบบโมดูลาร์สำหรับเมทริกซ์ LED หรืออาร์เรย์รีเลย์ที่ซับซ้อนได้
  • Temporal Timer & การวิเคราะห์ Bank Interleaving:
    • Asynchronous SIPO-Timer Diagnostics: ไลบรารีนี้มีตัวจับเวลา (timer) อิสระสำหรับแต่ละเอาต์พุต การไล่สืบเกี่ยวข้องกับการตั้งช่วงเวลา (intervals) แบบ non-blocking ในซอฟต์แวร์เพื่อกระตุ้นการสลับบิตเฉพาะเจาะจง ช่วยให้สามารถทำการไล่สืบสำหรับการหรี่ไฟแบบจำลอง PWM ระดับมืออาชีพ หรือการทำงานแบบกำหนดเวลา (time-gated actuation) โดยไม่รบกวนการทำงานหลัก (primary loop harmonics)
    • Bank Interleaving Forensics (Tutorial 5): จะพาไปสำรวจการแมปขั้นสูงของหลายๆ SIPO bank ไปยังอินเทอร์เฟซ 3-สายเดียวกัน การวินิจฉัยจะเน้นไปที่การเลือก bank ความเร็วสูง แสดงให้เห็นวิธีเพิ่มความหนาแน่นของเอาต์พุตโดยใช้ชุดพินเพียงชุดเดียว

ก่อนจะลงมือจัด

แต่ก่อนจะเริ่ม มาจัดการกับเรื่องแนวคิด คำศัพท์ และแนวทางที่จำเป็นระหว่างทางกันสักหน่อย

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

คำศัพท์: 'SIPO IC' - ตลอดทั้งบทช่วยสอน โค้ด และเอกสารอื่นๆ จะใช้คำว่า 'SIPO IC' หรือ 'SIPO' แทนที่คำว่า shift register แต่ทั้งสองคำมีความหมายเหมือนกัน

การนับบิต - ฟังก์ชันการอ้างที่อยู่ (addressing functions) ของไลบรารีจะถือว่าการนับบิตเป็นไปตามธรรมเนียมดั้งเดิมของสัญกรณ์ไบนารี นั่นคือ บิตที่มีค่าน้อยที่สุด (least significant bit) จะอยู่ทางขวามือของไบต์ที่บิต 0

คำศัพท์: 'array' - ไลบรารีจะเรียก SIPO IC ทั้งหมดที่เชื่อมต่อกันว่า array โดยจะอ้างอิงแบบต่อเนื่องตั้งแต่พอร์ต 0 ของ IC ตัวแรกไปจนถึงพอร์ตสุดท้ายของ IC ตัวสุดท้าย โดยไม่คำนึงว่าพวกมันจะถูกกำหนดค่า (configured) หรือ 'แบ่ง' (chopped up) ออกเป็น banks อย่างไร (ดูด้านล่าง) บิตแมปของ array จะครอบคลุมทุกพอร์ตเอาต์พุตของ SIPO IC ทุกตัวที่เชื่อมต่อและทำงานอยู่

คำศัพท์: 'bank' - bank หมายถึง SIPO IC หนึ่งตัวหรือหลายตัวที่ต่อพ่วงกัน (cascaded) ตัวอย่างเช่น bank อาจถูกสร้างขึ้นด้วย SIPO IC เพียงตัวเดียว หรือหลายตัวที่ต่อพ่วงกัน เมื่อ bank ถูกกำหนด/สร้างขึ้นทางซอฟต์แวร์แล้ว บิตแมปของ array ที่แสดงถึงพอร์ตเอาต์พุตของ bank นั้นก็จะเริ่มทำงาน แม้ว่าโดยทั่วไปการอ้างที่อยู่ของ bank จะสัมพันธ์กับ SIPO ที่กำหนดโดย bank นั้นเสมอ แต่สิ่งสำคัญที่ต้องจำไว้คือ ถ้ามีการกำหนดค่า SIPO IC เพียง หนึ่ง bank เท่านั้น ไม่ว่าจะมีขนาดเท่าใด ที่อยู่แบบ absolute และ relative จะตรงกัน

Concurrent & variable size banking - แนวคิดการออกแบบของไลบรารีอนุญาตให้กำหนดค่าและใช้งาน banks ที่มีขนาดใดๆ ก็ได้ พร้อมกัน (concurrently) และ เป็นอิสระต่อกัน (independently) ยิ่งไปกว่านั้น banks ยังสามารถมีขนาดต่างกันได้อีกด้วย ตัวอย่างเช่น เราอาจสร้าง bank ของ SIPO IC หนึ่งตัว บวกกับ bank ของ SIPO IC สามตัวที่ต่อพ่วงกัน บวกกับ bank ของ SIPO IC แปดตัวที่ต่อพ่วงกัน และอื่นๆ banks ทั้งหมดสามารถอยู่ร่วมกันได้และสามารถอ้างถึงได้ทั้งผ่านหมายเลขประจำ bank (relative addressing) หรือมองเป็น array เดียวที่ต่อเนื่องกันทั้งหมด (absolute addressing)

มาดูอีกตัวอย่างนึงดีกว่า คราวนี้เป็นตัวอย่างแบบแผนภาพ จะได้เห็นความยืดหยุ่นของความสามารถของไลบรารี ez_SIPO8_lib ชัดเจนขึ้น ดูแผนภาพการออกแบบนี้ซิ:

ชุมชน SIPO แบบผสมโรง

ในที่นี้เราตั้งค่า SIPO IC จำนวน 11 ตัว เป็น 5 แบงค์ บน 5 3WI ตามแผนภาพ สังเกตช่วงแอดเดรสแบบสัมบูรณ์และแบบสัมพัทธ์ให้ดีนะ เราสามารถจัดเรียง SIPO IC 11 ตัวนี้ได้หลายแบบมาก เลือกแบบที่เหมาะกับความต้องการของงานออกแบบเราเลย

เรามีอิสระเต็มที่ในการเข้าถึงการจัดเรียงแบบนี้ ทั้งในรูปแบบอาร์เรย์ต่อเนื่องของพอร์ตเอาต์พุตทั้งหมด (ตั้งแต่พอร์ต 0 ถึงพอร์ต 87) หรือเป็นแบงค์ของพอร์ตเอาต์พุตแยกกัน (ดูตารางด้านบนสำหรับช่วงแอดเดรสสัมพัทธ์ตามไอดีแบงค์)

อินเทอร์เฟซ 3-สาย (3-wire interface) - ทุกแบงค์ต้องการอินเทอร์เฟซ 3-สาย (3WI) เพื่อเชื่อมต่อกับไมโครคอนโทรลเลอร์ (ขา data, clock และ latch) อย่างไรก็ตาม แบงค์ที่มีขนาดเท่ากันสามารถแชร์ 3WI เดียวกันได้โดยใช้คอนเซปต์ 'อินเตอร์ลีฟ' (ดูได้ใน Tutorial 5)

วิศวกรรมและการนำไปใช้

  • การวิเคราะห์ความต้องการกำลังไฟและความสมบูรณ์ของสัญญาณ:
    • การวิเคราะห์โหลดแบบ capacitive: การขับคาสเคดของ shift register 8+ ตัว $(64+\text{ LEDs})$ สามารถทำให้เกิดกระแสพีคชั่วขณะที่สูงได้ $(\approx 1\text{A}+)$ การวิเคราะห์จะเน้นไปที่ตัวเก็บประจุบายพาส (decoupling capacitors) ที่จำเป็นสำหรับเรล $V_{cc}$ เพื่อวินิจฉัยให้แน่ใจว่าแรงดันตก (voltage-droop) จะไม่ทำให้เกิดฮาร์มอนิกส์ของบิตพลิก (bit-flip) ในระหว่างการ shift ความถี่สูง
    • การวินิจฉัยลอจิกจำกัดกระแส: การใช้งานนี้ใช้ตัวต้านทาน $220\Omega$ สำหรับแต่ละโหนด LED การวิเคราะห์ต้องทำให้แน่ใจว่ากระแสรวมที่ไหลผ่านแพ็คเกจ 74HC595 ยังคงอยู่ในขอบเขตความร้อน $70\text{mA}$ ต่อ IC ซึ่งเป็นการรับประกันความทนทานของฮาร์ดแวร์แบบสุดๆ
  • การผสานไลบรารีและความสวยงามของคู่มือผู้ใช้:
    • การใช้งานนี้ใช้อินสแตนซ์คลาส ez_SIPO8_lib การวิเคราะห์จะเน้นที่พารามิเตอร์ instantiation $(max_SIPOs, max_timers)$ เพื่อเพิ่มประสิทธิภาพการแมป SRAM ให้เข้ากับพื้นที่หน่วยความจำที่จำกัดของ Arduino ในขณะที่ยังคงความแม่นยำสูงในการจัดการบิต

ไฟล์ไลบรารี - น้องต้องดาวน์โหลดไฟล์ไลบรารีเพื่อรันบทสอนนะจ๊ะ ดาวน์โหลดไฟล์ไลบรารี ez_SIPO8_lib ไปไว้ในไดเรกทอรี ...Arduino/libraries/ ของน้องซะ

มีไฟล์ให้ดาวน์โหลด 3 ไฟล์ คือ

  • ez_SIPO8_lib.h,
  • ez_SIPO8_lib.cpp และ
  • keywords.txt

(ไฟล์เหล่านี้รวมอยู่ในบทความนี้แล้ว ดูได้ในส่วน Code หรือจะดาวน์โหลดผ่าน Arduino IDE Library Manager ก็ได้)

การประกาศและสร้างอินสแตนซ์ไลบรารี - การประกาศไลบรารีและการสร้างอินสแตนซ์นั้นคล้ายกันมากในแต่ละตัวอย่างสเก็ตช์บทสอน แตกต่างแค่จำนวน SIPO IC และตัวจับเวลา (timer) ที่บทสอนนั้นๆ เรียกใช้ ตัวอย่างต่อไปนี้มาจาก Tutorial 1 -

การประกาศไลบรารี:

#include <ez_SIPO8_lib>

การสร้างอินสแตนซ์คลาสไลบรารี:

...
#define max_SIPOs 1 // one 1 SIPO for this tutorial
#define max_timers 0 // no timers required
// initiate the class for max SIPOs/timers required
SIPO8 my_SIPOs(max_SIPOs, max_timers);
...

เราสร้างอินสแตนซ์คลาสไลบรารี ตั้งชื่อให้มันว่า 'my_SIPOs' สำหรับจำนวน SIPO IC และตัวจับเวลาที่เรากำหนดไว้ สำหรับตัวอย่างนี้เราจะใช้แค่ SIPO IC หนึ่งตัวและไม่มีตัวจับเวลา (เราจะพูดถึงตัวจับเวลาใน Tutorial 3)

เราใช้วิธีเดียวกันนี้ในการประกาศและสร้างอินสแตนซ์ในทุกบทสอน แค่เปลี่ยนพารามิเตอร์ของคลาสให้ตรงกับความต้องการของบทสอนนั้นๆ เท่านั้นเอง จัดไปวัยรุ่น! สู้งานนะน้อง

Quick Access Resources

จัดไปวัยรุ่น! ลิงก์ข้างล่างนี้คือของดีที่รุ่นพี่เก็บมาให้น้องโหลดไปใช้ได้เลย:

ez_SIPO8_lib

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x arduino IDE"
author: "ronbentley1"
category: "Lab Stuff"
components:
  - "1x Jumper wires (generic)"
  - "8x Resistor 220 ohm"
  - "1x Arduino UNO"
  - "8x LED (generic)"
  - "1x Development Kit Accessory, Jumper Wire Kit"
  - "1x Breadboard (generic)"
  - "1x Shift Register- Parallel to Serial"
description: "คอร์สจัดเต็มที่จะพาน้องๆ วัยรุ่นสายช่างมาเจาะลึกไลบรารี ez_SIPO8_lib ตัวเทพ เอาไว้ควบคุม Shift Register ให้ตึงๆ กัน!"
difficulty: "Easy"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/54593c82-8928-401a-b86f-d809260d537c.txt"
  - "https://projects.arduinocontent.cc/673608ab-b703-4d44-86f1-509c74079a4f.cpp"
  - "https://projects.arduinocontent.cc/4402dfc1-389f-4062-b7f6-7dc8e5e41150.h"
  - "https://projects.arduinocontent.cc/4402dfc1-389f-4062-b7f6-7dc8e5e41150.h"
  - "https://projects.arduinocontent.cc/54593c82-8928-401a-b86f-d809260d537c.txt"
encryptedPayload: "U2FsdGVkX1+s7L07HJiwQ1SdYmGAmPhrC68xUnz0UFplHpUQFSk40Eh0LMJiKHcvqtyd08nUma/gTeEOiVJ4YFq4kST8WjDWZJJir6dkdo4="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/shift-registers-ez_sipo8_lib-library-tutorials-2ee7c0_cover.jpg"
lang: "en"
likes: 0
passwordHash: "2a24ef6330324da85de1722bb7d33baee65a5df825d2b4394b2f114218a93e74"
price: 699
seoDescription: "Master Shift Registers with ez_SIPO8_lib library tutorials. Learn to manage and control pins for your Arduino projects efficiently."
tags:
  - "tutorials"
  - "sipo"
  - "74hc595"
  - "shift registers"
title: "เรียน Shift Register ง่ายๆ กับ ez_SIPO8_lib - งานง่ายแต่หล่อ!"
tools: []
videoLinks: []
views: 4022