หน้าแรก ดูโปรเจกต์ทั้งหมด
Expert

โปรเจกต์ Shift Registers - Tutorial 2, Relative Addressing

ez_SIPO8_lib - Tutorial 2, Relative Addressing - เพื่อส่งเสริมและช่วยในการนำ ez_SIPO8_lib library ไปใช้งาน

โปรเจกต์ Shift Registers - Tutorial 2, Relative Addressing

รายการอุปกรณ์และเครื่องมือ

1x Shift Register- Serial to Parallel
-
1x Arduino UNO
-
1x Breadboard (generic)
-
8x Resistor 220 ohm
-
8x LED (generic)
-
1x Jumper wires (generic)
-
}

รายละเอียดและวิธีทำ

หากคุณเข้ามาที่บทความนี้โดยบังเอิญและไม่ได้เริ่มจากจุดเริ่มต้น คุณอาจจะพบว่าเนื้อหาดูไม่ค่อยเข้าใจนัก ทั้งนี้เป็นเพราะบทความนี้เป็นหนึ่งในบทเรียนหลายส่วน (หกส่วน) เพื่อช่วยเหลือและสนับสนุนในการทำความเข้าใจการใช้งานไลบรารี ez_SIPO8_lib ในการจัดการและควบคุม Serial-in/Parallel-out ICs (SIPOs) shift registers ตัวอย่างเช่น ชิป 74HC595

หากคุณต้องการลิงก์ไปยังจุดเริ่มต้นของบทเรียน โปรดไปที่ลิงก์นี้ (Tutorial Start) มิเช่นนั้น โปรดอ่านต่อ...

บทเรียนเพื่อเสริมสร้างความเข้าใจและการใช้งาน ez Serial-in/Parallel-out IC Library (ez_SIPO8_lib) - Tutorial 2, Relative Addressing หากคุณต้องการลิงก์ไปยังบทความเริ่มต้นของบทเรียน ให้ไปที่ลิงก์นี้: Tutorial Start.
คุณสามารถเข้าถึงและดาวน์โหลด User Guide, Crib Sheet และบทความต้นฉบับของ ez_SIPO8_lib ได้ที่ลิงก์ด้านล่างนี้:
- ez_SIPO8_lib User Guide
- ez_SIPO8_lib Crib Sheet
- อ่านฉบับเต็มของ ez_SIPO8_lib article

Introduction to the Tutorial

ในบทเรียนที่สองนี้ เราจะต่อยอดจากประสบการณ์ใน Tutorial 1 และดูเรื่อง Relative Addressing ของ virtual SIPO output array pin pool รูปแบบการระบุตำแหน่งนี้ใช้สำหรับการระบุตำแหน่ง SIPO output pins ที่เกี่ยวข้องกับ 'banks' โดยเฉพาะ - ซึ่ง bank คือชุดของ SIPO ICs ทั้งแบบ physical/virtual และอาจหมายถึง SIPO IC เดียว หรือ หลายตัวที่เชื่อมต่อกันแบบ cascade

Objectives

เราจะมุ่งเน้นไปที่การสร้างสภาพแวดล้อม virtual SIPO ซึ่งเราสามารถนำหลักการพื้นฐานอื่นๆ มาประยุกต์ใช้ได้ โดยเฉพาะอย่างยิ่งเราจะได้เรียนรู้เรื่อง:

1. วิธีการต่อสายและเชื่อมต่อ 74HC595 IC (SIPO) ตัวเดียวเข้ากับ Microcontroller (เว้นแต่คุณจะศึกษาเรื่องนี้ไปแล้วใน Tutorial 1)

2. โครงสร้างของ Arduino Sketch ที่กำหนดค่าอย่างเหมาะสมเพื่อขับเคลื่อน SIPO IC ที่เชื่อมต่อทางกายภาพและ LEDs โดยเฉพาะในเรื่อง:

a. การสร้าง virtual SIPO bank
b. การใช้ Relative Addressing เพื่อเข้าถึง/อัปเดต virtual SIPO bank ที่สร้างขึ้น

3. สังเกตผลลัพธ์จาก Sketch – รูปแบบการวิ่งของ LED และข้อมูล SIPO บน Serial Monitor

หากคุณได้ทำ Tutorial 1 มาแล้วและยังคงติดตั้งอุปกรณ์ต่างๆ ไว้เหมือนเดิม ให้ข้ามไปที่ส่วนของ The Code/Sketch ได้เลย มิเช่นนั้นให้ดำเนินการต่อตามด้านล่าง

Kit List

เตรียมส่วนประกอบต่อไปนี้ให้พร้อม:

  • 1 x Arduino UNO - การออกแบบนี้ใช้ Arduino UNO แต่สามารถใช้ Microcontroller อื่นๆ ที่เหมาะสม (Arduino หรือรุ่นใกล้เคียง) ได้เช่นกัน ตราบใดที่สามารถรองรับ Pin out สำหรับการขับเคลื่อนอินเทอร์เฟซ SIPO และความต้องการด้านพลังงานได้
  • 1 x Breadboard - ขนาดเล็กหรือใหญ่ก็ได้ตามที่มี
  • 1 x 74HC595 IC - ชิป 8bit SIPO IC หรือรุ่นอื่นๆ ที่สามารถใช้งานแทนกันได้ (plug-compatible)
  • 8 x LEDs - แบบใดก็ได้ที่คุณมี
  • 8 x Resistors, 220 ohm - ตัวละหนึ่งตัวต่อหนึ่ง LED ให้ใช้ตัวต้านทาน 220 ohm และไม่ต้องสนใจค่า 180 ohm ที่แนะนำในผังวงจร
  • สายเชื่อมต่อ - สายสั้น/ยาว หรือสายจัมเปอร์สำหรับ Breadboard ตามความเหมาะสม

74HC595 Orientation and Pin Outs

ด้านไหนเป็นด้านไหน? สังเกตว่า 74HC595 จะมีรอยบากที่ปลายด้านหนึ่ง ซึ่งในแผนภาพนี้อยู่ด้านบน การนับ Pin จะเริ่มจาก Pin 1 ที่ด้านบนซ้ายและไล่ลงมาทางด้านซ้าย จากนั้นจะวนจากด้านล่างของ IC ขึ้นไปทางด้านขวาจนถึง Pin 16 ที่ด้านบนขวา:

Pin Outs 1 - 74HC595

Microcontroller/SIPO Interface Pin Configuration

ทุกๆ bank ของ SIPO ICs ที่คุณเชื่อมต่อกับ Microcontroller จะต้องใช้อินเทอร์เฟซแบบดิจิทัล 3 สาย ตารางด้านล่างแนะนำการกำหนด Pin ระหว่าง Microcontroller และ SIPO IC สำหรับบทเรียนนี้ แต่คุณสามารถเลือกใช้ Microcontroller digital pins ตามที่คุณต้องการได้ หากคุณเลือกใช้ Pin อื่น อย่าลืมเปลี่ยนในส่วนของการเรียกใช้งาน create_bank ใน Sketch ด้วย

  • UNO pin 8 ต่อกับ SIPO pin 14 - SIPO Data Pin
  • UNO pin 9 ต่อกับ SIPO pin 12 - SIPO Latch Pin
  • UNO pin 10 ต่อกับ SIPO pin 11 - SIPO Clock Pin
  • UNO pin +5v ต่อกับ SIPO pins 10, 16 - จ่ายไฟให้ SIPO
  • UNO GND pin ต่อกับ SIPO pins 8, 13 - กราวด์ (0v)

Connecting It All Together

ใช้แผนภาพต่อไปนี้เพื่อต่อสายอุปกรณ์ทั้งหมด โดยระมัดระวังให้การเชื่อมต่อ Output/Input ถูกต้อง:

Wiring Scheme 1- Single SIPO IC, 8 outputs

สังเกตว่า Pin เดียวของ 74HC595 IC ที่ไม่มีการเชื่อมต่อคือ Pin 9 (QH’) ซึ่งใช้เป็น Serial Output Pin สำหรับเชื่อมต่อกับ Serial Input Pin (14 SER) ของ SIPO 74HC595 ตัวถัดไปในการต่อแบบ cascade

The Code/Sketch

เมื่อเสร็จเรียบร้อยแล้ว มาดู Sketch เพื่อสาธิตการระบุตำแหน่งแบบ Relative bank/pin กัน Sketch นี้จะสร้าง SIPO bank เพียง bank เดียวที่มีช่วงตำแหน่ง Output Pin ตั้งแต่ 0–7 และมี SIPO bank id เป็น 0 เนื่องจากจะมีเพียง bank เดียวที่มี SIPO ตัวเดียว ช่วงตำแหน่งแบบ Absolute จึงตรงกับช่วงตำแหน่งแบบ Relative ของ bank นี้ ซึ่งจะเป็นจริงเสมอสำหรับ bank แรกในการกำหนดค่าใดๆ แต่นั่นไม่ใช่ประเด็นสำคัญสำหรับสิ่งที่เราต้องการจะสาธิต ซึ่งก็คือการใช้งาน Relative Addressing โดยใช้ฟังก์ชันและเทคนิคการระบุตำแหน่งแบบ Relative bank

Sketch นี้จะทำการกำหนดรูปแบบ Output Pin ขนาด 8 บิต สองรูปแบบที่แตกต่างกันให้กับ bank เดิมซ้ำๆ และอัปเดต (หรือเรียกว่า xfer ในภาษาของ ez) แต่ละรูปแบบไปยัง physical SIPO IC/LEDs ตามลำดับ โดยมีการหน่วงเวลาสั้นๆ ระหว่างกัน จากนั้น Sketch จะทำงานวนซ้ำในรอบนี้ไปเรื่อยๆ

สังเกตสองวิธีที่แตกต่างกันที่ใช้ในแต่ละครึ่งของ Loop หลักของ Sketch สำหรับการระบุตำแหน่งแบบ Relative bank - โดยใช้แบบแต่ละ Relative bank bit และแบบ Relative bank SIPO byte (อัปเดต Output Port ทั้งแปดพร้อมกันในครั้งเดียว)

เปิด Arduino IDE เริ่มต้นด้วย Sketch ใหม่และดาวน์โหลด Sketch ของบทเรียนนี้:

//
// Tutorial 2 - use of ez_SPI8 library,
// Relative addressing - 1 x physical SIPO IC
// The sketch demonstrates two ways in which SIPO output pins
// may be updated, individually (set_bank_pin) or in a group
// of 8 pins (set_bank_SIPO), representing a single 8it SIPO
// within a bank.
//
// Ron D Bentley, Stafford, UK
// April 2021
//
// This example and code is in the public domain and
// may be used without restriction and without warranty.
//
#include <ez_SIPO8_lib.h>
#define Max_SIPOs 1 // two virtual SIPOs 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);
int bank_id; // used to keep the SIPO bank id
void setup() {
Serial.begin(9600);
bank_id = my_SIPOs.create_bank(8, 10, 9, 1); // absolute pin addresses 0-7, relative addresses 0-7
if (bank_id == create_bank_failure) {
Serial.println(F("\
failed to create bank"));
Serial.flush();
exit(0);
}
// print the bank data for confirmation/inspection
my_SIPOs.print_SIPO_data();
}
void loop() {
// start by setting the only SIPO (0) in the bank to all outputs off/LOW
my_SIPOs.set_bank_SIPO(bank_id, 0, LOW);
my_SIPOs.xfer_bank(bank_id, LSBFIRST); // move virtual pin statuses to real SIPO output pins
do {
//
// setup pattern for first cycle: 0b01010101
// note that set_bank_pin uses relative addressing
my_SIPOs.set_bank_pin(bank_id, 0, HIGH); // least significant bit/pin
my_SIPOs.set_bank_pin(bank_id, 1, LOW);
my_SIPOs.set_bank_pin(bank_id, 2, HIGH);
my_SIPOs.set_bank_pin(bank_id, 3, LOW);
my_SIPOs.set_bank_pin(bank_id, 4, HIGH);
my_SIPOs.set_bank_pin(bank_id, 5, LOW);
my_SIPOs.set_bank_pin(bank_id, 6, HIGH);
my_SIPOs.set_bank_pin(bank_id, 7, LOW); // most significant bit/pin
my_SIPOs.xfer_bank(bank_id, MSBFIRST);
delay(500);
//
// setup reverse pattern using 8bit write function: 0b10101010
// note that set_bank_SIPO uses relative addressing for SIPOs in the bank
my_SIPOs.set_bank_SIPO(bank_id, 0, 0b10101010);
my_SIPOs.xfer_bank(bank_id, MSBFIRST);
delay(500);
} while (true);
}

ทำการ Compile และ Upload ตัว Sketch คุณควรจะเห็น LEDs สลับไปมาเหมือน 'กระดานหก' โดยมีการหน่วงเวลาเล็กน้อยระหว่างรอบ เช่นเดียวกับใน Tutorial 1:

Cycle pattern of LEDs

ผลลัพธ์ของ Sketch นี้เหมือนกับที่แสดงใน Tutorial 1 ซึ่งใช้ฟังก์ชันการระบุตำแหน่งแบบ absolute array เพื่อให้ได้ผลลัพธ์เดียวกัน

สังเกตว่าครึ่งแรกของ Sketch ด้านบนดูคล้ายกับ Sketch ใน Tutorial 1 แต่ใช้การระบุตำแหน่งแบบ Relative bank/SIPO โดยใช้ฟังก์ชัน set_bank_pin, set_bank_SIPO และ xfer_bank สลับกันไป

ครึ่งไหนมีประสิทธิภาพมากกว่ากัน? คำตอบคือครึ่งหลังอย่างแน่นอน เพราะมันรวมการเปลี่ยนสถานะของ Output Pin ทั้งแปดไว้ในการเรียกใช้ฟังก์ชันเพียงครั้งเดียว ซึ่งตัวมันเองจัดการกับข้อมูลสถานะทั้ง Byte ที่ถูกแมปไว้แบบ virtual แทนที่จะจัดการทีละ Bit/Pin

หากเราต้องการให้มีประสิทธิภาพสูงสุด เราควรแทนที่ส่วนแรกของ Sketch ด้วยฟังก์ชัน/วิธีการเดียวกับส่วนที่สอง โดยใช้รูปแบบ Bit ของ SIPO byte ที่แตกต่างออกไป (เช่น set_bank_SIPO(bank_id, 0, 0b01010101)) ลองทำดูครับ

สุดท้าย ให้ตรวจสอบที่ Serial Monitor ซึ่งควรจะมีลักษณะดังนี้:

SIPO global values:
pins_per_SIPO = 8
max_SIPOs = 1
bank_SIPO_count = 1
num_active_pins = 8
num_pin_status_bytes = 1
next_free bank = all SIPOs used
Number timers = 0
Bank data:
bank = 0
num SIPOs = 1
latch_pin = 9 clock_pin = 10 data_pin = 8
low_pin = 0 high_pin = 7

นั่นคือจุดสิ้นสุดของ Tutorial 2 ซึ่งหวังว่าคุณจะได้รับความรู้ที่เป็นประโยชน์ คุณสามารถดาวน์โหลดสำเนาของบทเรียนนี้ได้จาก github here.

หากคุณต้องการไปต่อยังบทเรียนถัดไป (การใช้งาน Timers) โปรดไปที่ลิงก์นี้: Tutorial 3, Using Timers หรือหากคุณต้องการลิงก์ไปยังบทความเริ่มต้นของบทเรียน ให้ไปที่ลิงก์นี้: Tutorial Start.

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: shift-registers-tutorial-2-relative-addressing-2990f4
299 บาท
PromptPay QR Code