มีวิธีที่จะมีมากกว่า 14 พินเอาต์พุตบน arduino หรือไม่?


52

เป็นไปได้หรือไม่ที่จะมีขาออกมากกว่า 14 ขาบน Arduino ฉันกำลังทำงานในโครงการที่ฉันต้องใช้ไฟ LED หลายดวงแยกกัน ฉันมี Arduino Uno เท่านั้นและฉันไม่ต้องการรับเมกะ


ด้วยจิตวิญญาณแห่งความสามารถในการขยายตัว I2C ​​เป็นตัวเลือกสำหรับ Arduino หรือไม่?
Chris O

@ChrisO คุณหมายถึงอะไรโดย I2C? เพราะจากสิ่งที่ฉันเข้าใจการลงทะเบียน Shift จะถือเป็น I2C
JVarhol

โอ้ทำให้ฉันตอบคำถามของฉันได้แล้ว ;-) ต่อไปนี้เป็นบทความวิกิพีเดียเกี่ยวกับมาตรฐานรถบัสนี้ และฉันเพิ่งพบการสนับสนุนจาก Wire libสำหรับ I2C ดังนั้นคุณสามารถเชื่อมต่อโซ่ I2C กับ Uno ของคุณ
Chris O

@JVarhol ไม่มาก I2C หรือที่รู้จักกันในชื่อ TWI นั้นเป็นอินเตอร์เฟสแบบ 2 สายในขณะที่ SPI อาจถูกพิจารณาว่าเป็นแบบ 3 สาย
Klaus-Dieter Warzecha

1
@JVarhol คุณเลือกวิธีแก้ปัญหาสำหรับโครงการของคุณแล้วหรือยัง ถ้าใช่จะเป็นประโยชน์ในการแก้ไขคำถามของคุณและยอมรับคำตอบที่ตรงกับ (หรือใกล้เคียงที่สุด) โซลูชันของคุณ
jfpoilpret

คำตอบ:


50

วิธีทั่วไปในการขยายชุดพินเอาต์พุตที่มีอยู่บน Arduino คือใช้รีจิสเตอร์แบบ shift เช่น 74HC595 IC ( ลิงก์ไปยังแผ่นข้อมูล )

คุณต้องมี 3 พินเพื่อควบคุมชิปเหล่านี้:

  1. นาฬิกา
  2. สลัก
  3. ข้อมูล

ในโปรแกรมคุณส่งข้อมูลหนึ่งครั้งไปยัง shift register โดยใช้คำสั่ง shiftOut ()เช่น:

shiftOut(dataPin, clockPin, data); 

ด้วยคำสั่งนั้นคุณตั้งค่า 8 เอาต์พุตแต่ละตัวบน 595 IC ด้วย 8 บิตในdataตัวแปร

ด้วยหนึ่ง 595 คุณจะได้รับ 5 พิน (8 บน IC แต่คุณใช้ 3 เพื่อคุยกับมัน) เพื่อให้ได้เอาต์พุตมากขึ้นคุณสามารถเชื่อมต่อชุดเดซี่เชน 595 เข้าด้วยกันโดยเชื่อมต่อพินอนุกรมออกไปยังดาต้าพินของอันถัดไป คุณต้องเชื่อมต่อนาฬิกาและสลักของไอซี 595 ทั้งหมดเข้าด้วยกัน

วงจรผลลัพธ์ (โดยใช้หนึ่ง 595) จะมีลักษณะดังนี้:

วงจรใช้ทะเบียน 595 กะ

รูปด้านบนนำมาจากหน้าเว็บcodeproject.comนี้:

สลัก latch ใช้เพื่อรักษาเอาต์พุต 595 ให้คงที่ในขณะที่คุณเปลี่ยนข้อมูลลงไปเช่น:

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, data); 
digitalWrite(latchPin, HIGH);

1
ขอบคุณลืมที่จะรวมการทำงานของ shift register ด้วย ฉันวางแผนไว้ แต่ฉันต้องเดินออกไปจากคอมพ์ของฉันและเมื่อฉันกลับมามันทำให้จิตใจของฉันลื่น :)
JVarhol

ไม่มีปัญหานั่นคือสาเหตุที่เราเป็นชุมชน เราเติมเต็มคำตอบของกันและกัน แต่ก็เป็นเรื่องดีที่คุณได้เพิ่มเคล็ดลับดีๆไว้ในคำตอบของคุณเช่นกันโดยเฉพาะเกี่ยวกับ EZ-Expander shield ช่วยให้ผู้ที่ไม่สามารถทำให้ PCB ของพวกเขาสามารถขยายจำนวนพอร์ตที่มีให้ได้ง่าย
Ricardo

2
นอกจากนี้ยังทำให้การเขียนโปรแกรมเป็นเรื่องง่ายคุณไม่ต้องเปลี่ยนข้อมูลในและหมุนนาฬิกาแล้วเปิดใช้งาน Latch ฉันรู้จักโล่มานานแล้วและฉันคิดว่ามันเหมาะสำหรับผู้เริ่มต้น สิ่งที่ดีที่สุดคือเนื่องจากรหัสเป็น opensource คุณสามารถใช้รหัสได้แม้ว่าคุณจะไม่ได้ใช้ shield จริงๆ แต่มีบอร์ดของคุณเองหรือใช้ breadboard
JVarhol

1
อย่าลืมว่าคุณสามารถเชื่อมโยงมันเข้ากับบรรทัด (ในทางทฤษฎี) ไปเรื่อย ๆ ดังนั้นการลงทะเบียน 8 บิต 2 อันสามารถกลายเป็น 16 บิตหนึ่งรายการได้
สกอตต์เอ็ม

ขอบคุณ! นี่คือการเชื่อมโยงข้อมูลที่เก็บคำอธิบาย codeproject ที่น่าตื่นตาตื่นใจในกรณีที่การเชื่อมโยงที่เคยไปลงarchive.fo/1uvPE
Akhmed

27

มีสองวิธีที่คุณจะได้รับพินมากขึ้นจากอาร์ดิโน

วิธีแรกคือการใช้พินแอนะล็อกเป็นพินเอาท์พุทแบบดิจิทัลซึ่งทำได้ง่ายมาก สิ่งที่คุณต้องทำคืออ้างถึง 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 เพื่อควบคุมการลงทะเบียนกะ

สิ่งที่ดีคือคุณสามารถใช้ทั้งสองวิธีข้างต้นร่วมกันโดยไม่มีปัญหาใด ๆ


3
จากการอ้างอิงของ Arduino คุณสามารถใช้A0- A5ตัวระบุโดยตรงแทนการใช้หมายเลข 14-19 ตัวอย่างเช่นdigitalWrite(A0, HIGH).
Peter Bloomfield

3
@ PeterR.Bloomfield ทั้งคู่ถูกต้อง แต่ฉันแนะนำ A0-A5 เพื่อความง่ายและอ่านง่าย ไม่ใช่เรื่องใหญ่กับ LED กระพริบ แต่เมื่อคุณมีโครงการขนาดใหญ่นิสัยเล็กน้อยเพิ่มขึ้น
Penguin Penguin ไม่ระบุชื่อ

2
ที่จริงแล้วในขณะที่ทั้งคู่จะทำงานให้เสร็จใน UNO และบอร์ดที่เข้ากันได้นั้นdigitalWrite(A0)จะถูกต้องมากขึ้นกว่าเดิมdigitalWrite(14)เพราะก่อนหน้านี้จะจับคู่กับขา (อนาล็อก) ทางกายภาพที่ถูกต้องเสมอ บนกระดานที่แตกต่างกันpin 14ในความเป็นจริงอาจไม่เป็นA0เช่นpin 14ใน MEGA เป็น Serial3 TXและจะไม่ส่งผลกระทบต่อขาอะนาล็อกที่คุณหลังจาก เช่นหากใช้digitalWriteกับขาอะนาล็อกให้ใช้การอ้างอิงA0- A5
Madivad

18

หากคุณต้องการขับ LED คุณยังสามารถใช้ MAX7219 ที่สามารถขับ 64 LED ได้โดยไม่ต้องใช้วงจรเสริม (ไม่ต้องใช้ทรานซิสเตอร์เพื่อขยายสัญญาณ)

การขับMAX7219 นั้นต้องใช้ขาออก 3 ตัวใน Arduino เท่านั้น นอกจากนี้คุณยังสามารถหาห้องสมุด Arduinoบางอย่างได้

นอกจากนี้คุณยังสามารถเชื่อมโยงหลาย ๆ สายได้หากคุณต้องการพลังงานมากกว่า 64 LED

ฉันใช้มันเรียบร้อยแล้วสำหรับการแสดงผล LED 7 เซกเมนต์หลายรายการ

ข้อเสีย: มันแพง (ประมาณ $ 10)


ฉันลืม MAX7219 ขอบคุณสำหรับการโพสต์!
JVarhol

LED 384 ดวง ... โอ้โห! บวกสองพินสำหรับการอนุมาน USB สงสัยว่าคุณสามารถสร้างเครื่องประดับเล็ก ๆ น้อย ๆ ที่น่ารำคาญ (ด้วยแหล่งจ่ายไฟเพียงพอ)
Penguin Penguin ไม่ระบุชื่อ

17

คุณสามารถใช้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

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถดูการกวดวิชาที่ดีกว่าที่นี่


สิ่งหนึ่งที่ควรทราบคือเทคนิคนี้ช่วยให้คุณสามารถควบคุมไฟ led ได้มากขึ้น แต่ไม่จำเป็นต้องพร้อมกัน
kontur

1
@kontur ใช่คุณพูดถูก แต่ในแง่ของการติดตาคุณสามารถพิจารณาว่าพวกเขาเป็น คำถามไม่มีรายละเอียดดังกล่าว
Daniel Grillo

Charlieplexing ไม่ใช่วิธีเดียวที่จะใช้ LED มัลติเพล็กซ์โดยไม่ต้องใช้การลงทะเบียนกะ
linhartr22

1
@ linhartr22 ฉันไม่เคยบอกว่าเป็นวิธีเดียว Charlieplexing เป็นเพียงวิธีการแก้ปัญหาทั่วไปสำหรับปัญหานี้ และคำตอบของฉันคือคนที่ 7 ดังนั้นความเป็นไปได้อื่น ๆ ได้แสดงมาก่อนแล้ว
Daniel Grillo

@DanielGrillo ฉันควรจะเจาะจงมากขึ้นและอธิบายว่าคอลัมน์และแถว multiplexing ซึ่งโดยทั่วไปจะใช้ในก้อน LED สามารถทำได้โดยไม่ต้องลงทะเบียนเปลี่ยนและไม่มีข้อ จำกัด ของ Charlieplexing เมทริกซ์คอลัมน์แถว 4x4 แต่ละแถวสามารถควบคุมไฟ LED 16 ดวงพร้อมเส้น 8 I / O คิวบ์ 4x4x4 สามารถควบคุม 64 leds ด้วย 12 I / O บรรทัด (เป็นไปได้แม้กระทั่งใน Uno โดยใช้ Analog A0-A5 เป็นสายดิจิตอล)
linhartr22

13

I 2 C (สาย)

คุณสามารถใช้โปรโตคอลI 2 C (Wire library) เพื่อเชื่อมต่อกับอุปกรณ์อื่น ๆ เช่นตัวขยายพอร์ต ตัวอย่างเช่น MCP23017

ฉันใช้ชิปตัวใดตัวหนึ่งในการเชื่อมต่อกับบอร์ด LCD MCP23017 มี 16 พอร์ตซึ่งสามารถกำหนดค่าเป็นอินพุตหรือเอาต์พุต ในฐานะที่เป็นปัจจัยการผลิตพวกเขาสามารถเพิ่มการขัดจังหวะถ้าต้องการ

ตัวอย่างการเชื่อมต่อ 13 จาก 16 ถึงจอ LCD:

MCP23017 เชื่อมต่อกับหน้าจอ LCD

ตอนนี้เราเชื่อมต่อกับ Arduino โดยใช้สายไฟเพียง 2 เส้น (SDA / SCL) บวกกับกำลังและพื้นดิน:

MCP23017 เชื่อมต่อกับ Arduino


ผู้ผลิตที่เป็นบุคคลที่สามบางรายได้ทำบอร์ดที่มี 4 x MCP23017 ไว้กับพวกเขาสิ่งนี้จะช่วยให้คุณได้รับอินพุต / เอาต์พุต 64 รายการ:

ตะขาบบอร์ด


multiplexers

คุณสามารถใช้มัลติเพล็กเซอร์แบบอะนาล็อกเช่น 74HC4051 (8 พอร์ต) หรือ 74HC4067 (16 พอร์ต) เพื่อเชื่อมต่อหนึ่งขาเข้ากับหนึ่งใน 8/16 พอร์ต (แต่จะมีเพียงหนึ่งตัวเท่านั้นในเวลาที่กำหนด) ดังนี้

ทวีคูณ 74HC4051

เหล่านี้เป็นแบบสองทิศทางดังนั้นสามารถใช้เป็นตัวขยายอินพุตหรือเอาต์พุต


SPI ด้วย 74HC595

การใช้ SPI คุณสามารถส่งข้อมูลอนุกรมที่รวดเร็วไปยัง shift register เช่น 74HC595 เดซี่เหล่านี้สามารถถูกล่ามโซ่ไว้ด้วยกัน ในตัวอย่างนี้ฉันกำลังควบคุมไฟ LED 32 ดวงด้วยหมุด I / O เพียง 3 ตัว (MOSI / MISO / SCK) พร้อมกำลังไฟและกราวด์

74HC595 การขับขี่ 32 LEDs


ฉันพบภายในสัญญาณไฟ LED เชิงพาณิชย์ว่า 72 LED ถูกขับเคลื่อนด้วยชิป 74HC595

เลื่อนสัญญาณ LED

มีชิป 9 ตัวขับอยู่ในคอลัมน์ (9 x 8 = 72 LEDs) และชิปหนึ่งตัวขับแถวในการกำหนดค่าแบบมัลติเพล็กซ์


SPI กับ MAX7219

หากคุณเพียงแค่ต้องการขับ LED คุณสามารถทวีคูณมันได้ MAX7219 ช่วยให้ง่ายขึ้นโดยการออกแบบให้ขับเมทริกซ์ LED ตัวอย่างเช่นการแสดงผล 7 ส่วน:

MAX7219 พร้อมจอแสดงผล 7 ส่วน

หรือเมทริกซ์ 64-LED:

MAX7219 พร้อมเมทริกซ์ 64-LED

ในทั้งสองกรณีเหล่านี้สามารถถูกผูกมัดด้วยเดซี่เข้าด้วยกันตัวอย่างเช่น:

โซ่ดอกเดซี่ MAX7219

ตัวอย่างทั้งหมดเหล่านี้ใช้เพียง 3 พินของ Arduino (MOSI / MISO / SCK) รวมถึงพลังงานและกราวด์


SPI ด้วย MCP23S17

ตัวขยายพอร์ต 16 พอร์ตที่กล่าวถึงก่อนหน้านี้ (MCP23017) ยังมาในรุ่น SPI (MCP23S17) ซึ่งทำสิ่งที่เหมือนกัน มันใช้สายมากกว่าหนึ่ง แต่จะเร็วกว่า


โปรโตคอลอื่น ๆ

แถบ LED (เช่น NeoPixel) มีโปรโตคอลของตัวเอง มีโพสต์บน Youtube โดย Josh Levineที่ผู้เขียนขับพิกเซลมากกว่า 1,000 พิกเซลด้วย Duemilanove!


อ้างอิง


12

การลงทะเบียน Shift ได้รับการกล่าวถึงในคำตอบอื่น ๆ และเป็นทางเลือกที่ยอดเยี่ยมสำหรับโครงการหลายโครงการ มีราคาถูกเรียบง่ายเร็วพอสมควรและโดยทั่วไปจะถูกล่ามโซ่ไว้ด้วยกันเพื่อเพิ่มผลผลิตมากขึ้น อย่างไรก็ตามพวกเขามีข้อเสียที่พวกเขามักจะต้องใช้พินหลายอย่างพิเศษ (ระหว่าง 2 และ 4 ขึ้นอยู่กับวิธีการตั้งค่าของพวกเขา)

ทางเลือกคือการใช้ขยายพอร์ตที่สูงขึ้นเช่น16 บิต MCP23017 และ MCP23S17 รองรับ I2C และ SPI ตามลำดับซึ่งหมายความว่าคุณสามารถวางไว้บนรถบัสด้วยอุปกรณ์อื่น ๆ (อาจเป็นประเภทที่แตกต่างกัน) อุปกรณ์แต่ละชิ้นบนรถบัสสามารถระบุได้เป็นรายบุคคลซึ่งหมายความว่าคุณต้องการเพียง 2 หรือ 3 พินในการพูดคุยกับอุปกรณ์ทั้งหมด ความเร็วในการอัปเดตนั้นเร็วมากดังนั้นคุณจึงไม่น่าจะได้รับเวลาในการตอบสนองล่าช้า (เช่นการส่งล่าช้า) ในโครงการ Arduino

ในระดับต่ำการใช้ I2C หรือ SPI นั้นซับซ้อนกว่าการลงทะเบียนกะแบบธรรมดา อย่างไรก็ตามมีรหัสห้องสมุดสำหรับ Arduino เพื่อดูแลสิ่งนั้นสำหรับคุณ ดูคำถามนี้เช่นฉันจะใช้อุปกรณ์ I2C กับ Arduino ได้อย่างไร


ว้าวฉันไม่เคยรู้เกี่ยวกับสิ่งเหล่านี้ขอบคุณไม่ได้ดูพวกเขา!
JVarhol

คุณสามารถใช้ I2C เพื่อควบคุมไฟ LED ได้หรือไม่?
Pro Q

1
@ProQ คุณไม่สามารถควบคุมไฟ LED มาตรฐานโดยตรงโดยใช้ I2C อย่างไรก็ตามมันเป็นไปได้ที่จะได้รับผลิตภัณฑ์ LED บางตัวที่มีไดรเวอร์ I2C ในตัว โดยปกติจะใช้สำหรับผลิตภัณฑ์ที่มี LED จำนวนมากเช่นแถบหรือเมทริกซ์
Peter Bloomfield

8

นอกจากคำตอบของริคาร์โด้แล้วสิ่งที่วิกิพีเดียระบุไว้ในการลงทะเบียนกะคือ

หนึ่งในการใช้งานบ่อยที่สุดของ shift register คือการแปลงระหว่างอินเตอร์เฟสแบบอนุกรมและแบบขนาน [... ] การลงทะเบียน SIPO มักจะเชื่อมต่อกับเอาท์พุทของไมโครโปรเซสเซอร์เมื่อจำเป็นต้องใช้หมุดอินพุต / เอาท์พุตสำหรับวัตถุประสงค์ทั่วไปมากกว่าที่มีอยู่ สิ่งนี้ทำให้อุปกรณ์ไบนารีหลายตัวสามารถควบคุมได้โดยใช้เพียงสองหรือสามพิน แต่ช้ากว่า I / O แบบขนาน

ในบทความของ Ricardo ที่เชื่อมโยงคุณสามารถดูแผนภาพของการลงทะเบียนกะ

เปลี่ยนแผนภาพการลงทะเบียน

สิ่งที่เกิดขึ้นที่นี่คือคุณใส่ข้อมูลของหมุด 8 ในลำดับและสำหรับแต่ละนาฬิกาติ๊กติ๊กลงทะเบียนกะจะเปลี่ยน (ย้ายข้อมูลไบนารีจากแต่ละสลักไปยังถัดไป) จนกว่ามันจะ "ทำให้เป็นวงกลม" คือบิตแรก มาถึงพินสุดท้าย รีจิสเตอร์กะยังมีอินพุตที่คุณสามารถเปิด / ปิดการเลื่อนเพื่อให้สามารถเก็บสถานะได้หลังจากที่ข้อมูลถูกเลื่อนไปยังตำแหน่ง สำหรับการสาธิตง่ายๆดูภาพเคลื่อนไหวต่อไปนี้

ภาพเคลื่อนไหว Shift register

ที่นี่มีแสงสีแดงคือการป้อนข้อมูลแบบอนุกรมและคนสีเขียวมีการแสดงสถานะของสลักในครั้งนี้ง่ายSIPO กะลงทะเบียน หลังจากข้อมูลเลื่อนไปที่การเปลี่ยนตำแหน่งสามารถปิดและคุณสามารถอ่านหมุดได้ 10101011ในตัวอย่างนี้ผมย้ายออก

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


1
+1 สำหรับข้อมูลเพิ่มเติมและสำหรับภาพเคลื่อนไหว GIF ที่น่ารักและเอฟเฟกต์เสียงดนตรี! คุณพบ GIF ที่ไหน หรือคุณสร้างมันขึ้นมา?
Ricardo

1
@ Ricardo ฉันสร้างวงจรด้วย Digital Works จากนั้นพิมพ์หน้าจอแก้ไข gif animator
totymedli

6

ตามที่คุณเขียนไปแล้วคุณสามารถใช้พินทั้งหมดรวมถึง TX และ RX เป็นเอาต์พุตดิจิตอล ฉันทำอย่างนั้นเมื่อไม่นานมานี้สำหรับผู้ประท้วงและบันทึกวิดีโอ - 20 LEDS บน 20 พิน - จากโครงการที่ไร้สาระ

ตามที่อธิบายโดยPeter R. Bloomfield ที่นี่คุณจำเป็นต้องตัดการเชื่อมต่อ TX และ RX เพื่ออัปโหลด ยิ่งไปกว่านั้นคุณไม่ได้อ่านเซ็นเซอร์สำหรับการโต้ตอบที่เป็นไปได้และต้องทำให้แน่ใจว่าจะไม่ถึงขีด จำกัด ปัจจุบันทั้งหมด อย่าลืมว่าคุณมีไฟ LED 5V จำกัด หากคุณขับโดยตรงด้วย Arduino

ดังนั้นจึงแนะนำให้ใช้ shift shift โดยทั่วไปและ 595 ซึ่งRicardoอธิบายไว้

  • พวกเขาราคาถูก!
  • มันค่อนข้างง่ายที่จะเรียงซ้อนพวกเขา
  • สามารถรับความเร็วได้มากเมื่อคุณใช้ hardware-SPI

ผมใช้พวกเขาในขณะที่ผ่านมาเมื่อฉันตระหนักบัดกรีและการเขียนโปรแกรมเป็นส่วนหนึ่งของKawaii ฉัน (ข้อความของการเชื่อมโยงอยู่ในเยอรมัน) ของ upcycling ศิลปินDominik Jais

ที่นี่มีเพียง595 ชิ้นเท่านั้นที่ใช้ในการขับเคลื่อนจอแสดงผลของไฟ LED 8x11 เนื่องจากไฟ LED ถูกตัดจากแถบไฟ LED SMD 12V ซึ่งเป็นแหล่งจ่ายไฟเพิ่มเติมและอาร์เรย์UDN2803Aดาร์ลิงตันUDN2803Aบางตัวจึงเชื่อมต่อกับขาเอาต์พุตของรีจิสเตอร์การเปลี่ยนแปลง

วิธีการทั่วไปอื่น ๆ จะรวมถึงการใช้ตัวขยายพอร์ต PCF8574 (A) 8 บิตซึ่งควบคุมผ่านบัส I2C

ต่อไปฉันจะลองลงทะเบียน 595 ครั้งก่อน

หากคุณต้องการควบคุมไฟ LED RGB สองคู่คุณอาจต้องการค้นหาโซลูชันพิเศษเพิ่มเติม บางไฟ LED RGB มาพร้อมกับตัวเองWS2812 ชิ้นเล็ก ๆ เหล่านี้สามารถต่อเรียงกัน (บัส 1 สาย) และส่งผ่านตำแหน่งในห่วงโซ่


3

ถ้ามันเป็นเรื่องของไฟ LED แถบไฟ LED WS2812B จะเป็นอย่างไรหรือเป็นเพียงชิปขับเอง? คุณสามารถควบคุมไฟ LED ได้ไม่ จำกัด จำนวนโดยใช้เพียงขาเดียว!

แม้ว่าผู้คนจะคุ้นเคยกับสิ่งเหล่านี้เป็นแถบ แต่พวกเขาก็สามารถใช้งานได้เป็น LEDs แบบสแตนด์อโลน (รู้จักกันในชื่อ neo pixels บน Adafruit) หรือถ้าคุณขับเพียงสีเดียวชิป WS2811 แต่ละตัวสามารถควบคุมไฟ LED 3 ดวงโดยใช้เอาต์พุต RGB แต่ละอันสำหรับ LED หนึ่งหลอดแต่ละตัว

เมื่อเร็ว ๆ นี้ฉันเพิ่งสร้างสร้างโครงการที่ใช้ไฟ LED 5 ดวงเช่น: เปิด / ปิดประตู 1, เปิด / ปิดประตู 2, ทำงานมอเตอร์ 1, ทำงานมอเตอร์ 2 และทำงาน ไฟ LED "แอคทีฟ" นั้นมีวัตถุประสงค์สองอย่างเนื่องจากฉันมีสีแดงเป็นอินพุตจากมอเตอร์ที่ใช้งานอยู่และสีเขียวเป็นธงที่ใช้งานอยู่ภายใน Arduino

จุดที่มี 1 พินและติดตั้งไลบรารีคุณสามารถควบคุมไฟ LED จำนวนเท่าใดก็ได้


2

ฉันไม่ได้อ้างสิทธิ์วิธีนี้ด้วยตัวเอง แต่ฉันพบเคล็ดลับที่ประณีตบนหน้าเว็บMUX-DEMUX: CD4051 Parlour Tricks

ไม่ว่าคุณจะเลือกใช้วิธีใดในการขับเอาต์พุตหรืออ่านอินพุต (shift register, multiplexors หรือการใช้ Arduino โดยตรงโดยตรงอย่างตรงไปตรงมา) คุณสามารถเพิ่มจำนวนเอาท์พุทหรืออินพุตได้สองเท่าโดยใช้วงจรคู่ขนานที่ชาญฉลาด อินพุตหรือเอาท์พุตธนาคาร ) ใช้ไดโอดในการรับรู้ของฝ่ายตรงข้ามในแต่ละสาขาขนานและเปลี่ยนอินพุต / เอาต์พุตเป็นสูงและต่ำ

ในการแสดงวิธีการแสดงผล (LED ในกรณีนี้โปรดทราบว่าไม่จำเป็นต้องใช้ไดโอดเพิ่มเติม):

ธนาคาร LED

หากคุณพิจารณาว่าคู่ของไฟ LED ในตัวอย่างนี้เป็น "ธนาคาร" และคุณต้องการไฟ LED_0 คุณจะต้องตั้งค่า PIN 17 เป็นสูงและ PIN 18 เป็นต่ำ (หมายเลขพินสับสน แต่ตรงกับตัวอย่างในภายหลังดังนั้นฉัน) ในการให้แสง LED_1 คุณเพียงแค่ย้อนกลับ PINS ธรรมชาติไดโอดของ LED ทำให้กระแสไม่ไหลไปในทิศทางตรงกันข้าม

เพื่อแสดงวิธีการอินพุต (CdS ในกรณีนี้โปรดทราบว่าจำเป็นต้องมีไดโอดเพิ่มเติม):

ธนาคาร CdS

สิ่งนี้จะซับซ้อนกว่านี้เล็กน้อยถ้าคุณต้องการทำการอ่านแบบอะนาล็อกบนเซ็นเซอร์วัดแสง CdS ก่อนอื่นคุณต้องเพิ่มไดโอดในแต่ละเซ็นเซอร์เพื่อควบคุมการไหล ประการที่สองเนื่องจากคุณกำลังอ่านค่าคุณต้องดึงอินพุตสูงหรือต่ำเพื่อป้องกันไม่ให้ลอย เป็นคนขี้เกียจฉันจะดึงพวกเขาสูงโดยใช้ตัวต้านทานแบบดึงขึ้นภายใน หากต้องการอ่าน CdS_0 คุณตั้งค่าโหมด PIN 17 เป็น OUTPUT และตั้งค่าเป็น LOW นี่ทำให้พื้นดิน จากนั้นคุณตั้งค่าโหมด PIN 18 เป็น INPUT และตั้งค่าเป็นสูงเพื่อต่อตัวต้านทานแบบดึงขึ้น ตอนนี้คุณได้รับการตั้งค่าให้อ่านบน PIN 18 (หรือที่รู้จักว่า analog pin 4) หากต้องการเข้าถึงเซ็นเซอร์อื่นเพียงแค่สลับโหมดและเอาต์พุต

ดังนั้นหากคุณมีมัลติเพล็กเซอร์พอร์ต CD4051 8 โดยใช้ 5 พินบน Arduino (แทน 3 ปกติ) คุณสามารถรับ 16 อินพุตหรือเอาท์พุตหรือทั้งสองอย่าง

16 เอาต์พุต / อินพุตโดยใช้ CD4051

ในทำนองเดียวกันหากคุณมีพอร์ตมัลติเพล็กเซอร์ 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


1

สำหรับโครงการเรียนฉันใช้ CD4024 และหมุด Arduino สองตัวเพื่อขับเคลื่อนจอแสดงผล 7 ส่วน

มีข้อแม้บางประการสำหรับวิธีการนี้ ตัวอย่างเช่นในการเขียนhighค่าลงในเอาต์พุตแรกของตัวนับ ripple ต้องใช้resetและสลับเข็มนาฬิกาสองครั้งเท่านั้น แต่ถ้าคุณต้องการที่จะเขียนhighไปยังหมุดทั้งหมดต้องสลับเข็มนาฬิกา 2 nครั้งและในช่วงเวลานั้นหมุดอื่น ๆ ทั้งหมดจะสลับเปิดและปิดอย่างต่อเนื่อง

หากแอปพลิเคชันของคุณสามารถจัดการกับข้อ จำกัด เหล่านี้และคุณมีพินสั้นก็เป็นอีกตัวเลือกหนึ่ง

คำตอบโบนัส: มีตัวอย่างมากมายของอินพุตแบบมัลติเพล็กซ์ที่นี่ส่วนใหญ่ใช้กับเอาต์พุตแบบมัลติเพล็กซ์


การใช้ตัวนับ 7 ขั้นตอนในการผลักดันการแสดงผล 7 ส่วนนั้นเป็นวิธีที่ไม่ดีนักสำหรับเหตุผลที่คุณระบุด้วยตัวคุณเอง
jfpoilpret

1

ด้วยการทำงานเล็กน้อย (ติดตั้ง 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 ยังทำงานบนกระดานเมกะ


0

มีคำตอบที่ดีมากมายที่นี่ แต่ถ้าคุณเสียเวลาคุณจะพบว่าถูกกว่าการซื้อ Mega

3/2-d ของฉันคุ้มค่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.