เป็นไปได้หรือไม่ที่จะมีขาออกมากกว่า 14 ขาบน Arduino ฉันกำลังทำงานในโครงการที่ฉันต้องใช้ไฟ LED หลายดวงแยกกัน ฉันมี Arduino Uno เท่านั้นและฉันไม่ต้องการรับเมกะ
เป็นไปได้หรือไม่ที่จะมีขาออกมากกว่า 14 ขาบน Arduino ฉันกำลังทำงานในโครงการที่ฉันต้องใช้ไฟ LED หลายดวงแยกกัน ฉันมี Arduino Uno เท่านั้นและฉันไม่ต้องการรับเมกะ
คำตอบ:
วิธีทั่วไปในการขยายชุดพินเอาต์พุตที่มีอยู่บน Arduino คือใช้รีจิสเตอร์แบบ shift เช่น 74HC595 IC ( ลิงก์ไปยังแผ่นข้อมูล )
คุณต้องมี 3 พินเพื่อควบคุมชิปเหล่านี้:
ในโปรแกรมคุณส่งข้อมูลหนึ่งครั้งไปยัง shift register โดยใช้คำสั่ง shiftOut ()เช่น:
shiftOut(dataPin, clockPin, data);
ด้วยคำสั่งนั้นคุณตั้งค่า 8 เอาต์พุตแต่ละตัวบน 595 IC ด้วย 8 บิตในdata
ตัวแปร
ด้วยหนึ่ง 595 คุณจะได้รับ 5 พิน (8 บน IC แต่คุณใช้ 3 เพื่อคุยกับมัน) เพื่อให้ได้เอาต์พุตมากขึ้นคุณสามารถเชื่อมต่อชุดเดซี่เชน 595 เข้าด้วยกันโดยเชื่อมต่อพินอนุกรมออกไปยังดาต้าพินของอันถัดไป คุณต้องเชื่อมต่อนาฬิกาและสลักของไอซี 595 ทั้งหมดเข้าด้วยกัน
วงจรผลลัพธ์ (โดยใช้หนึ่ง 595) จะมีลักษณะดังนี้:
รูปด้านบนนำมาจากหน้าเว็บcodeproject.comนี้:
สลัก latch ใช้เพื่อรักษาเอาต์พุต 595 ให้คงที่ในขณะที่คุณเปลี่ยนข้อมูลลงไปเช่น:
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, data);
digitalWrite(latchPin, HIGH);
มีสองวิธีที่คุณจะได้รับพินมากขึ้นจากอาร์ดิโน
วิธีแรกคือการใช้พินแอนะล็อกเป็นพินเอาท์พุทแบบดิจิทัลซึ่งทำได้ง่ายมาก สิ่งที่คุณต้องทำคืออ้างถึง A0-A5 เป็นพิน 14,15,16,17,18,19 ตัวอย่างเช่นการเขียน high ถึง pin A0 เพียงใช้ digitalWrite (14, HIGH)
วิธีอื่นในการรับหมุดเพิ่มเติมจาก Arduino คือการใช้ Shift Register ในการทำเช่นนี้ฉันแนะนำให้ใช้EZ-Expander Shieldซึ่งช่วยให้คุณใช้ digitalWrite ([20-35], สูง) เมื่อคุณนำเข้า EZ-Expander Library อย่างไรก็ตามโล่นี้อนุญาตให้ใช้หมุดเป็นเอาต์พุตเท่านั้นและใช้หมุด 8,12 และ 13 เพื่อควบคุมการลงทะเบียนกะ
สิ่งที่ดีคือคุณสามารถใช้ทั้งสองวิธีข้างต้นร่วมกันโดยไม่มีปัญหาใด ๆ
A0
- A5
ตัวระบุโดยตรงแทนการใช้หมายเลข 14-19 ตัวอย่างเช่นdigitalWrite(A0, HIGH)
.
digitalWrite(A0)
จะถูกต้องมากขึ้นกว่าเดิมdigitalWrite(14)
เพราะก่อนหน้านี้จะจับคู่กับขา (อนาล็อก) ทางกายภาพที่ถูกต้องเสมอ บนกระดานที่แตกต่างกันpin 14
ในความเป็นจริงอาจไม่เป็นA0
เช่นpin 14
ใน MEGA เป็น Serial3 TX
และจะไม่ส่งผลกระทบต่อขาอะนาล็อกที่คุณหลังจาก เช่นหากใช้digitalWrite
กับขาอะนาล็อกให้ใช้การอ้างอิงA0
- A5
หากคุณต้องการขับ LED คุณยังสามารถใช้ MAX7219 ที่สามารถขับ 64 LED ได้โดยไม่ต้องใช้วงจรเสริม (ไม่ต้องใช้ทรานซิสเตอร์เพื่อขยายสัญญาณ)
การขับMAX7219 นั้นต้องใช้ขาออก 3 ตัวใน Arduino เท่านั้น นอกจากนี้คุณยังสามารถหาห้องสมุด Arduinoบางอย่างได้
นอกจากนี้คุณยังสามารถเชื่อมโยงหลาย ๆ สายได้หากคุณต้องการพลังงานมากกว่า 64 LED
ฉันใช้มันเรียบร้อยแล้วสำหรับการแสดงผล LED 7 เซกเมนต์หลายรายการ
ข้อเสีย: มันแพง (ประมาณ $ 10)
คุณสามารถใช้Charlieplexing ด้วยเทคนิคนี้คุณสามารถขับn*(n-1)
LED ได้โดยตรงจาก n pins ดังนั้นด้วย 3 พินคุณสามารถขับ 6 LED, 4 พิน - 12 LED, 5 พิน - 20 LED และอื่น ๆ
กันตัวอย่าง:
หก LED บน 3 Pins
PINS LEDS
0 1 2 1 2 3 4 5 6
0 0 0 0 0 0 0 0 0
0 1 Z 1 0 0 0 0 0
1 0 Z 0 1 0 0 0 0
Z 0 1 0 0 1 0 0 0
Z 1 0 0 0 0 1 0 0
0 Z 1 0 0 0 0 1 0
1 Z 0 0 0 0 0 0 1
0 0 1 0 0 1 0 1 0
0 1 0 1 0 0 1 0 0
0 1 1 1 0 0 0 1 0
1 0 0 0 1 0 0 0 1
1 0 1 0 1 1 0 0 0
1 1 0 0 0 0 1 0 1
1 1 1 0 0 0 0 0 0
คุณสามารถใช้โปรโตคอลI 2 C (Wire library) เพื่อเชื่อมต่อกับอุปกรณ์อื่น ๆ เช่นตัวขยายพอร์ต ตัวอย่างเช่น MCP23017
ฉันใช้ชิปตัวใดตัวหนึ่งในการเชื่อมต่อกับบอร์ด LCD MCP23017 มี 16 พอร์ตซึ่งสามารถกำหนดค่าเป็นอินพุตหรือเอาต์พุต ในฐานะที่เป็นปัจจัยการผลิตพวกเขาสามารถเพิ่มการขัดจังหวะถ้าต้องการ
ตัวอย่างการเชื่อมต่อ 13 จาก 16 ถึงจอ LCD:
ตอนนี้เราเชื่อมต่อกับ Arduino โดยใช้สายไฟเพียง 2 เส้น (SDA / SCL) บวกกับกำลังและพื้นดิน:
ผู้ผลิตที่เป็นบุคคลที่สามบางรายได้ทำบอร์ดที่มี 4 x MCP23017 ไว้กับพวกเขาสิ่งนี้จะช่วยให้คุณได้รับอินพุต / เอาต์พุต 64 รายการ:
คุณสามารถใช้มัลติเพล็กเซอร์แบบอะนาล็อกเช่น 74HC4051 (8 พอร์ต) หรือ 74HC4067 (16 พอร์ต) เพื่อเชื่อมต่อหนึ่งขาเข้ากับหนึ่งใน 8/16 พอร์ต (แต่จะมีเพียงหนึ่งตัวเท่านั้นในเวลาที่กำหนด) ดังนี้
เหล่านี้เป็นแบบสองทิศทางดังนั้นสามารถใช้เป็นตัวขยายอินพุตหรือเอาต์พุต
การใช้ SPI คุณสามารถส่งข้อมูลอนุกรมที่รวดเร็วไปยัง shift register เช่น 74HC595 เดซี่เหล่านี้สามารถถูกล่ามโซ่ไว้ด้วยกัน ในตัวอย่างนี้ฉันกำลังควบคุมไฟ LED 32 ดวงด้วยหมุด I / O เพียง 3 ตัว (MOSI / MISO / SCK) พร้อมกำลังไฟและกราวด์
ฉันพบภายในสัญญาณไฟ LED เชิงพาณิชย์ว่า 72 LED ถูกขับเคลื่อนด้วยชิป 74HC595
มีชิป 9 ตัวขับอยู่ในคอลัมน์ (9 x 8 = 72 LEDs) และชิปหนึ่งตัวขับแถวในการกำหนดค่าแบบมัลติเพล็กซ์
หากคุณเพียงแค่ต้องการขับ LED คุณสามารถทวีคูณมันได้ MAX7219 ช่วยให้ง่ายขึ้นโดยการออกแบบให้ขับเมทริกซ์ LED ตัวอย่างเช่นการแสดงผล 7 ส่วน:
หรือเมทริกซ์ 64-LED:
ในทั้งสองกรณีเหล่านี้สามารถถูกผูกมัดด้วยเดซี่เข้าด้วยกันตัวอย่างเช่น:
ตัวอย่างทั้งหมดเหล่านี้ใช้เพียง 3 พินของ Arduino (MOSI / MISO / SCK) รวมถึงพลังงานและกราวด์
ตัวขยายพอร์ต 16 พอร์ตที่กล่าวถึงก่อนหน้านี้ (MCP23017) ยังมาในรุ่น SPI (MCP23S17) ซึ่งทำสิ่งที่เหมือนกัน มันใช้สายมากกว่าหนึ่ง แต่จะเร็วกว่า
แถบ LED (เช่น NeoPixel) มีโปรโตคอลของตัวเอง มีโพสต์บน Youtube โดย Josh Levineที่ผู้เขียนขับพิกเซลมากกว่า 1,000 พิกเซลด้วย Duemilanove!
การลงทะเบียน Shift ได้รับการกล่าวถึงในคำตอบอื่น ๆ และเป็นทางเลือกที่ยอดเยี่ยมสำหรับโครงการหลายโครงการ มีราคาถูกเรียบง่ายเร็วพอสมควรและโดยทั่วไปจะถูกล่ามโซ่ไว้ด้วยกันเพื่อเพิ่มผลผลิตมากขึ้น อย่างไรก็ตามพวกเขามีข้อเสียที่พวกเขามักจะต้องใช้พินหลายอย่างพิเศษ (ระหว่าง 2 และ 4 ขึ้นอยู่กับวิธีการตั้งค่าของพวกเขา)
ทางเลือกคือการใช้ขยายพอร์ตที่สูงขึ้นเช่น16 บิต MCP23017 และ MCP23S17 รองรับ I2C และ SPI ตามลำดับซึ่งหมายความว่าคุณสามารถวางไว้บนรถบัสด้วยอุปกรณ์อื่น ๆ (อาจเป็นประเภทที่แตกต่างกัน) อุปกรณ์แต่ละชิ้นบนรถบัสสามารถระบุได้เป็นรายบุคคลซึ่งหมายความว่าคุณต้องการเพียง 2 หรือ 3 พินในการพูดคุยกับอุปกรณ์ทั้งหมด ความเร็วในการอัปเดตนั้นเร็วมากดังนั้นคุณจึงไม่น่าจะได้รับเวลาในการตอบสนองล่าช้า (เช่นการส่งล่าช้า) ในโครงการ Arduino
ในระดับต่ำการใช้ I2C หรือ SPI นั้นซับซ้อนกว่าการลงทะเบียนกะแบบธรรมดา อย่างไรก็ตามมีรหัสห้องสมุดสำหรับ Arduino เพื่อดูแลสิ่งนั้นสำหรับคุณ ดูคำถามนี้เช่นฉันจะใช้อุปกรณ์ I2C กับ Arduino ได้อย่างไร
นอกจากคำตอบของริคาร์โด้แล้วสิ่งที่วิกิพีเดียระบุไว้ในการลงทะเบียนกะคือ
หนึ่งในการใช้งานบ่อยที่สุดของ shift register คือการแปลงระหว่างอินเตอร์เฟสแบบอนุกรมและแบบขนาน [... ] การลงทะเบียน SIPO มักจะเชื่อมต่อกับเอาท์พุทของไมโครโปรเซสเซอร์เมื่อจำเป็นต้องใช้หมุดอินพุต / เอาท์พุตสำหรับวัตถุประสงค์ทั่วไปมากกว่าที่มีอยู่ สิ่งนี้ทำให้อุปกรณ์ไบนารีหลายตัวสามารถควบคุมได้โดยใช้เพียงสองหรือสามพิน แต่ช้ากว่า I / O แบบขนาน
ในบทความของ Ricardo ที่เชื่อมโยงคุณสามารถดูแผนภาพของการลงทะเบียนกะ
สิ่งที่เกิดขึ้นที่นี่คือคุณใส่ข้อมูลของหมุด 8 ในลำดับและสำหรับแต่ละนาฬิกาติ๊กติ๊กลงทะเบียนกะจะเปลี่ยน (ย้ายข้อมูลไบนารีจากแต่ละสลักไปยังถัดไป) จนกว่ามันจะ "ทำให้เป็นวงกลม" คือบิตแรก มาถึงพินสุดท้าย รีจิสเตอร์กะยังมีอินพุตที่คุณสามารถเปิด / ปิดการเลื่อนเพื่อให้สามารถเก็บสถานะได้หลังจากที่ข้อมูลถูกเลื่อนไปยังตำแหน่ง สำหรับการสาธิตง่ายๆดูภาพเคลื่อนไหวต่อไปนี้
ที่นี่มีแสงสีแดงคือการป้อนข้อมูลแบบอนุกรมและคนสีเขียวมีการแสดงสถานะของสลักในครั้งนี้ง่ายSIPO กะลงทะเบียน หลังจากข้อมูลเลื่อนไปที่การเปลี่ยนตำแหน่งสามารถปิดและคุณสามารถอ่านหมุดได้ 10101011
ในตัวอย่างนี้ผมย้ายออก
จากตัวอย่างเหล่านี้คุณสามารถรู้ได้ว่าการถ่ายโอนข้อมูลแบบอนุกรมจะช้ากว่าแบบขนานเนื่องจากคุณต้องรอให้ shift register เลื่อนบิตไปยังตำแหน่งของพวกเขา คุณจะต้องรอจำนวนนาฬิกาเท่ากันเป็นจำนวนบิตที่คุณต้องการโหลด นี่คือหนึ่งในหลายเหตุผลที่คุณไม่สามารถโยงได้ไม่ จำกัด เนื่องจากการโหลดอาจใช้เวลาตลอดไป
ตามที่คุณเขียนไปแล้วคุณสามารถใช้พินทั้งหมดรวมถึง TX และ RX เป็นเอาต์พุตดิจิตอล ฉันทำอย่างนั้นเมื่อไม่นานมานี้สำหรับผู้ประท้วงและบันทึกวิดีโอ - 20 LEDS บน 20 พิน - จากโครงการที่ไร้สาระ
ตามที่อธิบายโดยPeter R. Bloomfield ที่นี่คุณจำเป็นต้องตัดการเชื่อมต่อ TX และ RX เพื่ออัปโหลด ยิ่งไปกว่านั้นคุณไม่ได้อ่านเซ็นเซอร์สำหรับการโต้ตอบที่เป็นไปได้และต้องทำให้แน่ใจว่าจะไม่ถึงขีด จำกัด ปัจจุบันทั้งหมด อย่าลืมว่าคุณมีไฟ LED 5V จำกัด หากคุณขับโดยตรงด้วย Arduino
ดังนั้นจึงแนะนำให้ใช้ shift shift โดยทั่วไปและ 595 ซึ่งRicardoอธิบายไว้
ผมใช้พวกเขาในขณะที่ผ่านมาเมื่อฉันตระหนักบัดกรีและการเขียนโปรแกรมเป็นส่วนหนึ่งของKawaii ฉัน (ข้อความของการเชื่อมโยงอยู่ในเยอรมัน) ของ upcycling ศิลปินDominik Jais
ที่นี่มีเพียง595 ชิ้นเท่านั้นที่ใช้ในการขับเคลื่อนจอแสดงผลของไฟ LED 8x11 เนื่องจากไฟ LED ถูกตัดจากแถบไฟ LED SMD 12V ซึ่งเป็นแหล่งจ่ายไฟเพิ่มเติมและอาร์เรย์UDN2803Aดาร์ลิงตันUDN2803Aบางตัวจึงเชื่อมต่อกับขาเอาต์พุตของรีจิสเตอร์การเปลี่ยนแปลง
วิธีการทั่วไปอื่น ๆ จะรวมถึงการใช้ตัวขยายพอร์ต PCF8574 (A) 8 บิตซึ่งควบคุมผ่านบัส I2C
ต่อไปฉันจะลองลงทะเบียน 595 ครั้งก่อน
หากคุณต้องการควบคุมไฟ LED RGB สองคู่คุณอาจต้องการค้นหาโซลูชันพิเศษเพิ่มเติม บางไฟ LED RGB มาพร้อมกับตัวเองWS2812 ชิ้นเล็ก ๆ เหล่านี้สามารถต่อเรียงกัน (บัส 1 สาย) และส่งผ่านตำแหน่งในห่วงโซ่
ถ้ามันเป็นเรื่องของไฟ LED แถบไฟ LED WS2812B จะเป็นอย่างไรหรือเป็นเพียงชิปขับเอง? คุณสามารถควบคุมไฟ LED ได้ไม่ จำกัด จำนวนโดยใช้เพียงขาเดียว!
แม้ว่าผู้คนจะคุ้นเคยกับสิ่งเหล่านี้เป็นแถบ แต่พวกเขาก็สามารถใช้งานได้เป็น LEDs แบบสแตนด์อโลน (รู้จักกันในชื่อ neo pixels บน Adafruit) หรือถ้าคุณขับเพียงสีเดียวชิป WS2811 แต่ละตัวสามารถควบคุมไฟ LED 3 ดวงโดยใช้เอาต์พุต RGB แต่ละอันสำหรับ LED หนึ่งหลอดแต่ละตัว
เมื่อเร็ว ๆ นี้ฉันเพิ่งสร้างสร้างโครงการที่ใช้ไฟ LED 5 ดวงเช่น: เปิด / ปิดประตู 1, เปิด / ปิดประตู 2, ทำงานมอเตอร์ 1, ทำงานมอเตอร์ 2 และทำงาน ไฟ LED "แอคทีฟ" นั้นมีวัตถุประสงค์สองอย่างเนื่องจากฉันมีสีแดงเป็นอินพุตจากมอเตอร์ที่ใช้งานอยู่และสีเขียวเป็นธงที่ใช้งานอยู่ภายใน Arduino
จุดที่มี 1 พินและติดตั้งไลบรารีคุณสามารถควบคุมไฟ LED จำนวนเท่าใดก็ได้
ฉันไม่ได้อ้างสิทธิ์วิธีนี้ด้วยตัวเอง แต่ฉันพบเคล็ดลับที่ประณีตบนหน้าเว็บMUX-DEMUX: CD4051 Parlour Tricks
ไม่ว่าคุณจะเลือกใช้วิธีใดในการขับเอาต์พุตหรืออ่านอินพุต (shift register, multiplexors หรือการใช้ Arduino โดยตรงโดยตรงอย่างตรงไปตรงมา) คุณสามารถเพิ่มจำนวนเอาท์พุทหรืออินพุตได้สองเท่าโดยใช้วงจรคู่ขนานที่ชาญฉลาด อินพุตหรือเอาท์พุตธนาคาร ) ใช้ไดโอดในการรับรู้ของฝ่ายตรงข้ามในแต่ละสาขาขนานและเปลี่ยนอินพุต / เอาต์พุตเป็นสูงและต่ำ
ในการแสดงวิธีการแสดงผล (LED ในกรณีนี้โปรดทราบว่าไม่จำเป็นต้องใช้ไดโอดเพิ่มเติม):
หากคุณพิจารณาว่าคู่ของไฟ LED ในตัวอย่างนี้เป็น "ธนาคาร" และคุณต้องการไฟ LED_0 คุณจะต้องตั้งค่า PIN 17 เป็นสูงและ PIN 18 เป็นต่ำ (หมายเลขพินสับสน แต่ตรงกับตัวอย่างในภายหลังดังนั้นฉัน) ในการให้แสง LED_1 คุณเพียงแค่ย้อนกลับ PINS ธรรมชาติไดโอดของ LED ทำให้กระแสไม่ไหลไปในทิศทางตรงกันข้าม
เพื่อแสดงวิธีการอินพุต (CdS ในกรณีนี้โปรดทราบว่าจำเป็นต้องมีไดโอดเพิ่มเติม):
สิ่งนี้จะซับซ้อนกว่านี้เล็กน้อยถ้าคุณต้องการทำการอ่านแบบอะนาล็อกบนเซ็นเซอร์วัดแสง CdS ก่อนอื่นคุณต้องเพิ่มไดโอดในแต่ละเซ็นเซอร์เพื่อควบคุมการไหล ประการที่สองเนื่องจากคุณกำลังอ่านค่าคุณต้องดึงอินพุตสูงหรือต่ำเพื่อป้องกันไม่ให้ลอย เป็นคนขี้เกียจฉันจะดึงพวกเขาสูงโดยใช้ตัวต้านทานแบบดึงขึ้นภายใน หากต้องการอ่าน CdS_0 คุณตั้งค่าโหมด PIN 17 เป็น OUTPUT และตั้งค่าเป็น LOW นี่ทำให้พื้นดิน จากนั้นคุณตั้งค่าโหมด PIN 18 เป็น INPUT และตั้งค่าเป็นสูงเพื่อต่อตัวต้านทานแบบดึงขึ้น ตอนนี้คุณได้รับการตั้งค่าให้อ่านบน PIN 18 (หรือที่รู้จักว่า analog pin 4) หากต้องการเข้าถึงเซ็นเซอร์อื่นเพียงแค่สลับโหมดและเอาต์พุต
ดังนั้นหากคุณมีมัลติเพล็กเซอร์พอร์ต CD4051 8 โดยใช้ 5 พินบน Arduino (แทน 3 ปกติ) คุณสามารถรับ 16 อินพุตหรือเอาท์พุตหรือทั้งสองอย่าง
ในทำนองเดียวกันหากคุณมีพอร์ตมัลติเพล็กเซอร์ 4067 16 คุณสามารถรับอินพุตหรือเอาต์พุตได้ 32 ตัวหรือผสมกันทั้งสอง
ตัวอย่างร่างจะเป็น:
/*
* Example of getting 16 i/o from 5 pins using a CD4051
*
* Based on tutorial and code by david c. and tomek n.* for k3 / malmö högskola
* http://www.arduino.cc/playground/Learning/4051?action=sourceblock&ref=1
*/
int selPin[] = { 14, 15, 16 }; // select pins on 4051 (analog A0, A1, A2)
int commonPin[] = { 17, 18}; // common in/out pins (analog A3, A4)
int led[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW }; // stores eight LED states
int CdSVal[] = { 0, 0, 0, 0 }; // store last CdS readings
int cnt = 0; // main loop counter
int persistDelay = 100; // LED ontime in microseconds
void setup(){
Serial.begin(9600); // serial comms for troubleshooting (always)
for(int pin = 0; pin < 3; pin++){ // setup select pins
pinMode(selPin[pin], OUTPUT);
}
}
void loop(){
flashLEDs();
if (cnt == 0){
for(int x; x < 8; x++){
led[x] = random(2);
}
}
cnt++;
if (cnt > 100) { cnt = 0; }
}
void flashLEDs() {
for(int pin = 0; pin < 2; pin++) { // set common pins low
pinMode(commonPin[pin], OUTPUT);
digitalWrite(commonPin[pin], LOW);
}
for (int bank = 0; bank < 4; bank++) {
for(int pin = 0; pin < 3; pin++) { // parse out select pin bits
int signal = (bank >> pin) & 1; // shift & bitwise compare
digitalWrite(selPin[pin], signal);
}
if (led[bank * 2]){ // first LED
digitalWrite(commonPin[0], HIGH); // turn common on
delayMicroseconds(persistDelay); // leave led lit
digitalWrite(commonPin[0], LOW); // turn common off
}
if (led[bank * 2 + 1]){ // repeat for second LED
digitalWrite(commonPin[1], HIGH);
delayMicroseconds(persistDelay);
digitalWrite(commonPin[1], LOW);
}
}
}
อย่างที่ฉันพูดในบรรทัดแรกคำอธิบายแบบเต็มสามารถพบได้ในMUX-DEMUX: CD4051 Parlour Tricks
สำหรับโครงการเรียนฉันใช้ CD4024 และหมุด Arduino สองตัวเพื่อขับเคลื่อนจอแสดงผล 7 ส่วน
มีข้อแม้บางประการสำหรับวิธีการนี้ ตัวอย่างเช่นในการเขียนhigh
ค่าลงในเอาต์พุตแรกของตัวนับ ripple ต้องใช้reset
และสลับเข็มนาฬิกาสองครั้งเท่านั้น แต่ถ้าคุณต้องการที่จะเขียนhigh
ไปยังหมุดทั้งหมดต้องสลับเข็มนาฬิกา 2 nครั้งและในช่วงเวลานั้นหมุดอื่น ๆ ทั้งหมดจะสลับเปิดและปิดอย่างต่อเนื่อง
หากแอปพลิเคชันของคุณสามารถจัดการกับข้อ จำกัด เหล่านี้และคุณมีพินสั้นก็เป็นอีกตัวเลือกหนึ่ง
คำตอบโบนัส: มีตัวอย่างมากมายของอินพุตแบบมัลติเพล็กซ์ที่นี่ส่วนใหญ่ใช้กับเอาต์พุตแบบมัลติเพล็กซ์
ด้วยการทำงานเล็กน้อย (ติดตั้ง bootloader ที่แตกต่างกัน) จะมี I / O เพิ่มอีกเจ็ดบรรทัดบน Uno บนหัว ICSP1 และ JP2 bootloader ทดแทนเรียกว่าHoodLoader2 อนุญาตให้คุณติดตั้งภาพร่างบน Atmega328 และ Atmega16U2 บน Uno การจัดการกับตัวประมวลผลหลายตัวจะเป็นความยุ่งยากหลักจากการใช้วิธีนี้
บน Uno ส่วนหัว ICSP1 และ JP2 เชื่อมต่อกับหมุด PB1 ... PB7 ของ Atmega16U2 นอกจากนี้ Atmega16U2 ยังมีพิน I / O ประมาณ 9 ตัวโดยไม่เชื่อมต่อกับแผงวงจร บุคคลที่ทำงานภายใต้กล้องจุลทรรศน์อาจสามารถเชื่อมต่อสายไฟกับหมุด I / O ทั้งหมด 18 อันบน 16U2 ในขณะที่ทิ้งหมุด I / O อื่น ๆ อีกสามตัวไว้ที่การเชื่อมต่อทั่วไป
HoodLoader2 ยังทำงานบนกระดานเมกะ
มีคำตอบที่ดีมากมายที่นี่ แต่ถ้าคุณเสียเวลาคุณจะพบว่าถูกกว่าการซื้อ Mega
3/2-d ของฉันคุ้มค่า