สารบัญ:

จอแสดงผล LED RGB 64 พิกเซล - Arduino Clone อื่น: 12 ขั้นตอน (พร้อมรูปภาพ)
จอแสดงผล LED RGB 64 พิกเซล - Arduino Clone อื่น: 12 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: จอแสดงผล LED RGB 64 พิกเซล - Arduino Clone อื่น: 12 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: จอแสดงผล LED RGB 64 พิกเซล - Arduino Clone อื่น: 12 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: 64x32 Matrix with NodeMCU | DFRobot | NodeMCU 2024, พฤศจิกายน
Anonim
จอแสดงผล LED RGB 64 พิกเซล - Arduino Clone อีกตัว
จอแสดงผล LED RGB 64 พิกเซล - Arduino Clone อีกตัว
จอแสดงผล LED RGB 64 พิกเซล - Arduino Clone อีกตัว
จอแสดงผล LED RGB 64 พิกเซล - Arduino Clone อีกตัว
จอแสดงผล LED RGB 64 พิกเซล - Arduino Clone อีกตัว
จอแสดงผล LED RGB 64 พิกเซล - Arduino Clone อีกตัว

จอแสดงผลนี้ใช้เมทริกซ์ LED RGB 8x8 เพื่อวัตถุประสงค์ในการทดสอบ มันถูกเชื่อมต่อกับบอร์ด Arduino มาตรฐาน (Diecimila) โดยใช้ 4 shift register หลังจากทำให้มันใช้งานได้ฉันก็เปอร์เซ็นมันบน PCB ที่ยอดเยี่ยม shift register กว้าง 8 บิตและสามารถเชื่อมต่อกับโปรโตคอล SPI ได้อย่างง่ายดาย การปรับความกว้างพัลส์ใช้เพื่อผสมสี เพิ่มเติมในภายหลัง ส่วนหนึ่งของ RAM ของ MCU ใช้เป็นเฟรมบัฟเฟอร์เพื่อเก็บภาพ RAM ของวิดีโอแยกวิเคราะห์โดยรูทีนการขัดจังหวะในพื้นหลัง ดังนั้นผู้ใช้จึงสามารถทำสิ่งที่มีประโยชน์อื่นๆ เช่น พูดคุยกับพีซี ปุ่มอ่าน และโพเทนชิโอมิเตอร์ ข้อมูลเพิ่มเติมเกี่ยวกับ "Arduino": www.arduino.cc

ขั้นตอนที่ 1: การปรับความกว้างพัลส์สำหรับการผสมสี

การปรับความกว้างพัลส์สำหรับการผสมสี
การปรับความกว้างพัลส์สำหรับการผสมสี

โมดูลความกว้างพัลส์ - อะไร ?การปรับความกว้างพัลส์โดยพื้นฐานแล้วคือการเปิดและปิดพลังงานที่จ่ายไปยังอุปกรณ์ไฟฟ้าอย่างรวดเร็ว พลังงานที่ใช้ได้เป็นผลจากค่าเฉลี่ยทางคณิตศาสตร์ของฟังก์ชันคลื่นสี่เหลี่ยมในช่วงเวลาหนึ่ง ยิ่งฟังก์ชันอยู่ในตำแหน่ง ON นานเท่าใด คุณก็จะได้รับพลังงานมากขึ้นเท่านั้น PWM มีผลเช่นเดียวกันกับความสว่างของ LED เมื่อหรี่ไฟ AC ภารกิจข้างหน้าคือการควบคุมความสว่างของ 64 RGB LEDS (= 192 LED เดี่ยว!) ด้วยวิธีที่ประหยัดและง่ายดาย เพื่อให้ได้มาซึ่งทั้งหมด สเปกตรัมของสี ไม่ควรมีภาพสั่นไหวหรือผลรบกวนอื่น ๆ การรับรู้ความสว่างที่ไม่เป็นเชิงเส้นซึ่งแสดงโดยสายตามนุษย์จะไม่นำมาพิจารณาที่นี่ (เช่น ความแตกต่างระหว่าง 10% ถึง 20% ของความสว่างดูเหมือนจะ "ใหญ่" กว่าระหว่าง 90% ถึง 100%) รูปภาพ (1) แสดงหลักการทำงานของ อัลกอริทึม PWM สมมติว่ารหัสได้รับค่า 7 สำหรับความสว่างของ LED(0, 0) นอกจากนี้ยังรู้ว่ามีความสว่างสูงสุด N ขั้นตอน รหัสรัน N ลูปสำหรับระดับความสว่างที่เป็นไปได้ทั้งหมดและลูปที่จำเป็นทั้งหมดเพื่อให้บริการ LED ทุกดวงในทุกแถว ในกรณีที่ตัวนับลูป x ในลูปความสว่างน้อยกว่า 7 ไฟ LED จะสว่างขึ้น หากมากกว่า 7 ไฟ LED จะดับลง การทำเช่นนี้อย่างรวดเร็วมากสำหรับ LED ทั้งหมด ระดับความสว่าง และสีพื้นฐาน (RGB) แต่ละ LED สามารถปรับแยกกันเพื่อแสดงสีที่ต้องการได้ การวัดด้วยออสซิลโลสโคปแสดงให้เห็นว่ารหัสรีเฟรชการแสดงผลใช้เวลาประมาณ 50% ของเวลา CPU ที่เหลือสามารถใช้ทำการสื่อสารแบบอนุกรมกับพีซี, ปุ่มอ่าน, พูดคุยกับเครื่องอ่าน RFID, ส่ง I2ข้อมูล C ไปยังโมดูลอื่น…

ขั้นตอนที่ 2: พูดคุยกับ Shift Registers และ LEDs

คุยกับ Shift Registers และ LEDs
คุยกับ Shift Registers และ LEDs
คุยกับ Shift Registers และ LEDs
คุยกับ Shift Registers และ LEDs

shift register เป็นอุปกรณ์ที่อนุญาตให้โหลดข้อมูลแบบอนุกรมและเอาต์พุตแบบขนาน การทำงานที่ตรงกันข้ามนั้นสามารถทำได้ด้วยชิปที่เหมาะสม มีการสอนที่ดีเกี่ยวกับการลงทะเบียนกะบนเว็บไซต์ Arduino ไฟ LED ถูกขับเคลื่อนโดยการลงทะเบียนกะ 8 บิตของประเภท 74HC595 แต่ละพอร์ตสามารถจ่ายหรือจมกระแสได้ประมาณ 25mA กระแสรวมต่อชิปที่จมหรือจ่ายไม่ควรเกิน 70mA ชิปเหล่านี้มีราคาถูกมาก ดังนั้นอย่าจ่ายมากกว่า 40 เซ็นต์ต่อชิ้น เนื่องจาก LED มีลักษณะกระแส/แรงดันแบบเอ็กซ์โพเนนเชียล จึงจำเป็นต้องมีตัวต้านทานจำกัดกระแส โดยใช้กฎของโอห์ม:R = (V - Vf) / IR = ตัวต้านทานจำกัด, V = 5V, Vf = แรงดันไปข้างหน้าของ LED, I = กระแสไฟ LED สีแดงที่ต้องการ มีแรงดันไปข้างหน้าประมาณ 1.8V ช่วงสีน้ำเงินและสีเขียวตั้งแต่ 2.5V ถึง 3.5V ใช้มัลติมิเตอร์อย่างง่ายเพื่อกำหนดสิ่งนั้น สำหรับการสร้างสีที่เหมาะสม ควรพิจารณาสองสามสิ่ง: ความไวของสเปกตรัมของดวงตามนุษย์ (สีแดง/สีน้ำเงิน: แย่ สีเขียว: ดี) ประสิทธิภาพของ LED ที่ความยาวคลื่นและกระแสที่แน่นอน ในทางปฏิบัติ เราเพียงแค่ใช้โพเทนชิโอมิเตอร์ 3 โพเทนชิโอมิเตอร์แล้วปรับจนกว่าไฟ LED จะแสดงแสงสีขาวที่เหมาะสม แน่นอนว่าต้องไม่เกินกระแสไฟ LED สูงสุด สิ่งสำคัญที่นี่คือการลงทะเบียนกะที่ขับแถวต้องจ่ายกระแสไฟให้กับ LED 3x8 ดังนั้นจึงไม่ควรดันกระแสสูงเกินไป ฉันประสบความสำเร็จในการจำกัดตัวต้านทานที่ 270 โอห์มสำหรับ LED ทั้งหมด แต่นั่นก็ขึ้นอยู่กับยี่ห้อของเมทริกซ์ LED แน่นอน รีจิสเตอร์กะจะเชื่อมต่อกับซีเรียล SPI SPI = Serial Peripheral Interface (รูปภาพ (1)) ตรงข้ามกับพอร์ตอนุกรมบนพีซี (อะซิงโครนัส ไม่มีสัญญาณนาฬิกา) SPI ต้องใช้สายสัญญาณนาฬิกา (SRCLK) จากนั้นจะมีสายสัญญาณบอกอุปกรณ์เมื่อข้อมูลถูกต้อง (chip select / latch / RCLK) ในที่สุดก็มีสายข้อมูลสองสาย สายแรกเรียกว่า MOSI (master out slave in) อีกสายหนึ่งเรียกว่า MISO (master in slave out) SPI ใช้เพื่อเชื่อมต่อวงจรรวม เช่นเดียวกับ I2C. โครงการนี้ต้องการ MOSI, SRCLK และ RCLK นอกจากนี้ยังใช้บรรทัดเปิดใช้งาน (G) ด้วยเช่นกัน วงจร SPI เริ่มต้นโดยการดึงเส้น RCLK ไปที่ LOW (รูปภาพ (2)) MCU ส่งข้อมูลบนสาย MOSI สถานะทางลอจิคัลของมันจะถูกสุ่มตัวอย่างโดย shift register ที่ขอบที่เพิ่มขึ้นของเส้น SRCLK วัฏจักรสิ้นสุดลงโดยการดึงเส้น RCLK กลับไปที่ HIGH ตอนนี้ข้อมูลมีอยู่ที่เอาท์พุต

ขั้นตอนที่ 3: แผนผัง

แผนผัง
แผนผัง
แผนผัง
แผนผัง

รูปภาพ (1) แสดงวิธีการต่อสายของ shift register พวกมันถูกล่ามโซ่ด้วยเดซี่ จึงสามารถย้ายข้อมูลไปยังเชนนี้และผ่านมันไปได้ด้วย ดังนั้นการเพิ่ม shift register มากขึ้นจึงเป็นเรื่องง่าย

รูปภาพ (2) แสดงส่วนที่เหลือของแผนผังด้วย MCU, ตัวเชื่อมต่อ, ควอตซ์… ไฟล์ PDF ที่แนบมานี้ประกอบด้วยงานทั้งหมด ดีที่สุดสำหรับการพิมพ์

ขั้นตอนที่ 4: C ++ ซอร์สโค้ด

รหัสที่มา C++
รหัสที่มา C++
รหัสที่มา C++
รหัสที่มา C++
รหัสที่มา C++
รหัสที่มา C++

ใน C/C++ โดยปกติเราต้องสร้างฟังก์ชันต้นแบบก่อนที่จะเข้ารหัส #include int main(void);void do_something(void);int main(void) { do_something();}void do_something(void) { /* comment */ } Arduino IDE ไม่ต้องการขั้นตอนนี้ เนื่องจากฟังก์ชันต้นแบบจะถูกสร้างขึ้นโดยอัตโนมัติ ดังนั้น ฟังก์ชันต้นแบบจะไม่แสดงในโค้ดที่แสดงที่นี่ Image (1): setup() functionImage (2): spi_transfer() function using hardware SPI of the ATmega168 chip (ทำงานเร็วขึ้น)Image (3): framebuffer code using การขัดจังหวะโอเวอร์โฟลว์ timer1 ชิ้นส่วนของโค้ดที่มีรูปลักษณ์ที่คลุมเครือเล็กน้อยสำหรับผู้เริ่มต้นเช่น while(!(SPSR & (1<<SPIF))) {} ใช้การลงทะเบียนของ MCU โดยตรง ตัวอย่างนี้เป็นคำพูด: "ในขณะที่ SPIF บิตในการลงทะเบียน SPSR ไม่ได้ตั้งค่าไม่ทำอะไรเลย" ฉันแค่ต้องการเน้นว่าสำหรับโครงการมาตรฐาน ไม่จำเป็นต้องจัดการกับสิ่งเหล่านี้ที่เกี่ยวข้องกับฮาร์ดแวร์อย่างใกล้ชิด ผู้เริ่มต้นไม่ควรกลัวสิ่งนี้

ขั้นตอนที่ 5: Gadget ที่เสร็จแล้ว

Gadget สำเร็จรูป
Gadget สำเร็จรูป
Gadget สำเร็จรูป
Gadget สำเร็จรูป
Gadget สำเร็จรูป
Gadget สำเร็จรูป

หลังจากแก้ไขปัญหาทั้งหมดและเรียกใช้โค้ดแล้ว ฉันต้องสร้างเลย์เอาต์ PCB และส่งไปที่แฟบเฮาส์ มันดูสะอาดตาขึ้นมาก:-)รูปภาพ (1): บอร์ดควบคุมที่มีประชากรทั้งหมด Image (2): ด้านหน้าของ PCB เปล่ารูปภาพ (2): ด้านหลังมีตัวเชื่อมต่อที่แยก PORTC และ PORTD ของชิป ATmega168/328 และ 5V/GND. พอร์ตเหล่านี้ประกอบด้วย RX, TX lines, I. แบบอนุกรม2สาย C, สาย I/O ดิจิทัล และสาย ADC 7 เส้น นี้มีไว้สำหรับการซ้อนโล่ที่ด้านหลังของกระดาน ระยะห่างเหมาะสำหรับการใช้ perfboard (0.1in) บูตโหลดเดอร์สามารถแฟลชได้โดยใช้ส่วนหัวของ ICSP (ใช้งานได้กับ USBtinyISP ของ adafruit) ทันทีที่ทำเสร็จแล้ว เพียงใช้อะแดปเตอร์อนุกรม FTDI USB/TTL มาตรฐานหรือที่คล้ายกัน ฉันได้เพิ่มจัมเปอร์ที่ปิดใช้งานการรีเซ็ตอัตโนมัติด้วย ฉันยังได้สร้างสคริปต์ Perl เล็กน้อย (ดูบล็อกของฉัน) ที่เปิดใช้งานการรีเซ็ตอัตโนมัติด้วยสาย FTDI ซึ่งมักจะใช้งานไม่ได้ทันที (สาย RTS กับ DTR) ใช้งานได้บน Linux อาจเป็นบน MAC แผงวงจรพิมพ์และ DIY KIT บางตัวมีอยู่ในบล็อกของฉัน จำเป็นต้องบัดกรี SMD! ดูไฟล์ PDF สำหรับคำแนะนำในการสร้างและแหล่งที่มาสำหรับเมทริกซ์ LED

ขั้นตอนที่ 6: แอปพลิเคชัน: CPU Load Monitor สำหรับ Linux โดยใช้ Perl

นี่คือการตรวจสอบโหลดขั้นพื้นฐานที่มีพล็อตประวัติ มันใช้สคริปต์ Perl ที่รวบรวม "โหลดเฉลี่ย" ของระบบทุกๆ 1 วินาทีโดยใช้ iostat ข้อมูลถูกเก็บไว้ในอาร์เรย์ซึ่งจะถูกเลื่อนไปเมื่อมีการอัพเดทแต่ละครั้ง ข้อมูลใหม่จะถูกเพิ่มที่ด้านบนสุดของรายการ รายการเก่าที่สุดจะถูกผลักออก ข้อมูลรายละเอียดเพิ่มเติมและการดาวน์โหลด (รหัส…) มีอยู่ในบล็อกของฉัน

ขั้นตอนที่ 7: แอปพลิเคชัน: พูดคุยกับโมดูลอื่นโดยใช้I²C

แอปพลิเคชัน: การพูดคุยกับโมดูลอื่นโดยใช้I²C
แอปพลิเคชัน: การพูดคุยกับโมดูลอื่นโดยใช้I²C

นี่เป็นเพียงการพิสูจน์หลักการและไม่ใช่วิธีแก้ปัญหาที่ง่ายที่สุดสำหรับงานนี้ โดยใช้ I2C อนุญาตให้ระบุบอร์ด "ทาส" ได้โดยตรงถึง 127 บอร์ด ที่นี่บอร์ดทางด้านขวาของวิดีโอคือ "มาสเตอร์" (ซึ่งเริ่มต้นการถ่ายโอนทั้งหมด) บอร์ดด้านซ้ายคือสเลฟ (กำลังรอข้อมูล) ผม2C ต้องการ 2 สายสัญญาณและสายไฟปกติ (+, -, SDA, SCL) เนื่องจากเป็นบัส อุปกรณ์ทั้งหมดจึงเชื่อมต่อแบบขนาน

ขั้นตอนที่ 8: แอปพลิเคชัน: "Game Cube":-)

แอปพลิเคชัน
แอปพลิเคชัน

แค่ความคิดประหลาด อันนี้เข้ากับตู้ไม้ที่แสดงในหน้าแนะนำด้วย ด้านหลังมีปุ่ม 5 ปุ่ม ซึ่งอาจใช้สำหรับเล่นเกมง่ายๆ จบ ?

ขั้นตอนที่ 9: การแสดงรูปภาพ / แอนิเมชั่นบนเมทริกซ์ - Quick Hack

การแสดงรูปภาพ / แอนิเมชั่นบนเมทริกซ์ - Quick Hack
การแสดงรูปภาพ / แอนิเมชั่นบนเมทริกซ์ - Quick Hack
การแสดงภาพ / แอนิเมชั่นบนเมทริกซ์ - Quick Hack
การแสดงภาพ / แอนิเมชั่นบนเมทริกซ์ - Quick Hack
การแสดงภาพ / แอนิเมชั่นบนเมทริกซ์ - Quick Hack
การแสดงภาพ / แอนิเมชั่นบนเมทริกซ์ - Quick Hack
การแสดงภาพ / แอนิเมชั่นบนเมทริกซ์ - Quick Hack
การแสดงภาพ / แอนิเมชั่นบนเมทริกซ์ - Quick Hack

ดังนั้นจึงมีเพียง 8x8 พิกเซลและมีสีให้เลือกไม่กี่สี ขั้นแรกให้ใช้ Gimp เพื่อลดขนาดภาพโปรดของคุณเป็น 8x8 พิกเซลและบันทึกเป็นรูปแบบดิบ ".ppm" (ไม่ใช่ ASCII) PPM นั้นง่ายต่อการอ่านและประมวลผลในสคริปต์ Perl การใช้ ImageMagick และเครื่องมือบรรทัดคำสั่ง "แปลง" จะไม่ทำงานอย่างถูกต้อง อัปโหลดโค้ด Arduino ใหม่ จากนั้นใช้สคริปต์ Perl เพื่ออัปโหลดไปยังตัวควบคุม การกะพริบเป็นเพียงการไม่ตรงกันของการรีเฟรช LED และอัตราเฟรมของกล้องของฉัน หลังจากอัปเดตโค้ดเล็กน้อย มันทำงานได้ค่อนข้างเร็ว รูปภาพทั้งหมดจะถูกถ่ายโอนแบบสดผ่านซีเรียลตามที่คุณเห็น แอนิเมชั่นที่ยาวขึ้นสามารถจัดเก็บใน EEPROM ภายนอกได้เหมือนกับที่ทำในบอร์ด spoke-pov ต่างๆ

ขั้นตอนที่ 10: การควบคุมแบบโต้ตอบของแอนิเมชั่นที่เก็บไว้

ปล่อยให้ไมโครคอนโทรลเลอร์สนุกไปทำไม ลัทธิ Arduino คือทั้งหมดที่เกี่ยวกับการคำนวณทางกายภาพและการโต้ตอบ ดังนั้นเพียงแค่เพิ่มโพเทนชิออมิเตอร์และควบคุม ! การใช้อินพุตตัวแปลงแอนะล็อกเป็นดิจิตอลตัวใดตัวหนึ่งจาก 8 ตัวทำให้ง่ายมาก

ขั้นตอนที่ 11: แสดงวิดีโอสด

การใช้สคริปต์ Perl และโมดูลบางส่วนทำให้ง่ายต่อการแสดงวิดีโอสดเสมือนบนระบบ X11 มันถูกเข้ารหัสบน linux และอาจทำงานบน MAC ได้เช่นกัน มันทำงานดังนี้:- รับตำแหน่งเคอร์เซอร์ของเมาส์- จับกล่องของพิกเซล NxN ที่กึ่งกลางที่เคอร์เซอร์- ปรับขนาดภาพเป็น 8x8 พิกเซล- ส่งไปยังบอร์ด LED- ทำซ้ำ

ขั้นตอนที่ 12: เบากว่าเกือบฟรี

แสงมากขึ้นเกือบฟรี
แสงมากขึ้นเกือบฟรี

เพียงแค่สองขั้นตอน ความสว่างก็จะเพิ่มขึ้นได้ไม่น้อย แทนที่ตัวต้านทาน 270Ω ด้วยตัวต้านทาน 169Ω และ piggyback อีกตัวลงทะเบียนกะ 74HC595 บน IC5

แนะนำ: