|
1 |
| -# About |
2 |
| - |
3 |
| -The example here shows the wiring and codes for daisy-chained shift registers. |
4 |
| - |
5 |
| -The following items are used: |
6 |
| -- Two Shift Registers: [74HC595](https://www.adafruit.com/product/450) |
7 |
| -- One Level Shifter: [74AHCT125](https://www.adafruit.com/product/1787) |
8 |
| -- One LED Display: [10 Segment Light Bar LED](https://www.adafruit.com/product/1815) |
9 |
| -- One microcontroller board: [ItsyBitsy M0 Express](https://www.adafruit.com/product/3727) |
10 |
| - |
11 |
| -In addition, some other items are needed as well: |
12 |
| -- Through-hole 2K Resistor: [CFR-25JR-52-2K](https://www.digikey.com/en/products/detail/yageo/CFR-25JR-52-2K/11981) |
13 |
| -- Jumper wires |
14 |
| - |
15 |
| -The idea is to let the microcontroller to communicate with the shift registers through SPI, and then control 10 LEDs. |
16 |
| -The level shifter **74AHCT125** helps to translate 3.3V signal to 5.0V, since this example is trying to use 5.0V to drive LEDs and chips. |
17 |
| -If one uses 3.3V for all LEDs and chips, the level shifter is not going to be needed. |
18 |
| - |
19 |
| -For the daisy chain connection, this guide, [SPI interface Tutorial](https://www.best-microcontroller-projects.com/spi-interface.html), can provide some basic ideas. |
20 |
| -The guide, [Serial to Parallel Shifting-Out with a 74HC595](https://www.arduino.cc/en/Tutorial/Foundations/ShiftOut), can also provide some connection details for the 74HC595 chip. |
21 |
| - |
22 |
| -# Wiring |
23 |
| - |
24 |
| -With the board `Itsy Bitsy M0 Express`, pins can be connected as follows: |
25 |
| - |
26 |
| - |
27 |
| - |
28 |
| -In the wiring, the ItsyBitsy M0 is not powered, given that one can power it up through USB cable when programming it. |
29 |
| - |
30 |
| -Also, one may notice that, for the first 8 LEDs (from left to right), the pins from the 74HC595 at the *end* of the daisy chain are fully utilized, which means that the end of the daisy chain is actually the first device, the index 0 device. |
31 |
| - |
32 |
| -Therefore, |
33 |
| -- for pin index 0~7, the value will be sent to the device at the end of the daisy chain |
34 |
| -- for pin index 8~15, the value will be sent to the device the second end of the daisy chain (which is the head of the daisy chain in this example) |
35 |
| - |
36 |
| -# Coding |
37 |
| - |
38 |
| -The example code can be found in `74hc595_daisy_chain.py`. |
39 |
| -Here are some notes about the codes: |
40 |
| - |
41 |
| -## Import Modules |
42 |
| - |
43 |
| -```python |
44 |
| -import time |
45 |
| -import board |
46 |
| -import digitalio |
47 |
| -import adafruit_74hc595 |
48 |
| -``` |
49 |
| - |
50 |
| -## Instantiate Class |
51 |
| - |
52 |
| -One need to provide the number of shift registers when instantiating the class. |
53 |
| - |
54 |
| -```python |
55 |
| -# note: D2 port is close to SCK and MOSI pins for Itsy Bitsy M0 |
56 |
| -latch_pin = digitalio.DigitalInOut(board.D2) |
57 |
| -sr = adafruit_74hc595.ShiftRegister74HC595(board.SPI(), latch_pin, number_of_shift_registers=2) |
58 |
| - |
59 |
| -shift_register_pin_num = 10 |
60 |
| -shift_register_pins = [sr.get_pin(n) for n in range(shift_register_pin_num)] |
61 |
| -``` |
62 |
| - |
63 |
| -## Do Something with the Pins |
64 |
| - |
65 |
| -One simple example is to blink all LEDs together: |
66 |
| - |
67 |
| -```python |
68 |
| -while True: |
69 |
| - # turn all LEDs on |
70 |
| - for i in range(shift_register_pin_num): |
71 |
| - shift_register_pins[i].value = True |
72 |
| - time.sleep(0.5) |
73 |
| - |
74 |
| - # turn all LEDs off |
75 |
| - for i in range(shift_register_pin_num): |
76 |
| - shift_register_pins[i].value = False |
77 |
| - time.sleep(0.5) |
78 |
| -``` |
79 |
| - |
80 |
| -A more complicated example is to turn on/off each LEDs one-by-one: |
81 |
| -```python |
82 |
| -bar_ind_current = 0 # current index |
83 |
| -shift_register_pins[bar_ind_current].value = True |
84 |
| - |
85 |
| -while True: |
86 |
| - # iterate through every LED |
87 |
| - bar_ind_last = bar_ind_current |
88 |
| - bar_ind_current = bar_ind_last + 1 |
89 |
| - if bar_ind_current <= (shift_register_pin_num-1): |
90 |
| - shift_register_pins[bar_ind_last].value = False |
91 |
| - shift_register_pins[bar_ind_current].value = True |
92 |
| - else: |
93 |
| - bar_ind_current = 0 |
94 |
| - shift_register_pins[bar_ind_last].value = False |
95 |
| - shift_register_pins[bar_ind_current].value = True |
96 |
| - time.sleep(0.1) |
97 |
| -``` |
98 |
| - |
99 |
| -Here is the result one can get: |
100 |
| - |
101 |
| - |
| 1 | +# About |
| 2 | + |
| 3 | +The example here shows the wiring and codes for daisy-chained shift registers. |
| 4 | + |
| 5 | +The following items are used: |
| 6 | +- Two Shift Registers: [74HC595](https://www.adafruit.com/product/450) |
| 7 | +- One Level Shifter: [74AHCT125](https://www.adafruit.com/product/1787) |
| 8 | +- One LED Display: [10 Segment Light Bar LED](https://www.adafruit.com/product/1815) |
| 9 | +- One microcontroller board: [ItsyBitsy M0 Express](https://www.adafruit.com/product/3727) |
| 10 | + |
| 11 | +In addition, some other items are needed as well: |
| 12 | +- Through-hole 2K Resistor: [CFR-25JR-52-2K](https://www.digikey.com/en/products/detail/yageo/CFR-25JR-52-2K/11981) |
| 13 | +- Jumper wires |
| 14 | + |
| 15 | +The idea is to let the microcontroller to communicate with the shift registers through SPI, and then control 10 LEDs. |
| 16 | +The level shifter **74AHCT125** helps to translate 3.3V signal to 5.0V, since this example is trying to use 5.0V to drive LEDs and chips. |
| 17 | +If one uses 3.3V for all LEDs and chips, the level shifter is not going to be needed. |
| 18 | + |
| 19 | +For the daisy chain connection, this guide, [SPI interface Tutorial](https://www.best-microcontroller-projects.com/spi-interface.html), can provide some basic ideas. |
| 20 | +The guide, [Serial to Parallel Shifting-Out with a 74HC595](https://www.arduino.cc/en/Tutorial/Foundations/ShiftOut), can also provide some connection details for the 74HC595 chip. |
| 21 | + |
| 22 | +# Wiring |
| 23 | + |
| 24 | +With the board `Itsy Bitsy M0 Express`, pins can be connected as follows: |
| 25 | + |
| 26 | + |
| 27 | + |
| 28 | +In the wiring, the ItsyBitsy M0 is not powered, given that one can power it up through USB cable when programming it. |
| 29 | + |
| 30 | +Also, one may notice that, for the first 8 LEDs (from left to right), the pins from the 74HC595 at the *end* of the daisy chain are fully utilized, which means that the end of the daisy chain is actually the first device, the index 0 device. |
| 31 | + |
| 32 | +Therefore, |
| 33 | +- for pin index 0~7, the value will be sent to the device at the end of the daisy chain |
| 34 | +- for pin index 8~15, the value will be sent to the device the second end of the daisy chain (which is the head of the daisy chain in this example) |
| 35 | + |
| 36 | +# Coding |
| 37 | + |
| 38 | +The example code can be found in `74hc595_daisy_chain.py`. |
| 39 | +Here are some notes about the codes: |
| 40 | + |
| 41 | +## Import Modules |
| 42 | + |
| 43 | +```python |
| 44 | +import time |
| 45 | +import board |
| 46 | +import digitalio |
| 47 | +import adafruit_74hc595 |
| 48 | +``` |
| 49 | + |
| 50 | +## Instantiate Class |
| 51 | + |
| 52 | +One need to provide the number of shift registers when instantiating the class. |
| 53 | + |
| 54 | +```python |
| 55 | +# note: D2 port is close to SCK and MOSI pins for Itsy Bitsy M0 |
| 56 | +latch_pin = digitalio.DigitalInOut(board.D2) |
| 57 | +sr = adafruit_74hc595.ShiftRegister74HC595(board.SPI(), latch_pin, number_of_shift_registers=2) |
| 58 | + |
| 59 | +shift_register_pin_num = 10 |
| 60 | +shift_register_pins = [sr.get_pin(n) for n in range(shift_register_pin_num)] |
| 61 | +``` |
| 62 | + |
| 63 | +## Do Something with the Pins |
| 64 | + |
| 65 | +One simple example is to blink all LEDs together: |
| 66 | + |
| 67 | +```python |
| 68 | +while True: |
| 69 | + # turn all LEDs on |
| 70 | + for i in range(shift_register_pin_num): |
| 71 | + shift_register_pins[i].value = True |
| 72 | + time.sleep(0.5) |
| 73 | + |
| 74 | + # turn all LEDs off |
| 75 | + for i in range(shift_register_pin_num): |
| 76 | + shift_register_pins[i].value = False |
| 77 | + time.sleep(0.5) |
| 78 | +``` |
| 79 | + |
| 80 | +A more complicated example is to turn on/off each LEDs one-by-one: |
| 81 | +```python |
| 82 | +bar_ind_current = 0 # current index |
| 83 | +shift_register_pins[bar_ind_current].value = True |
| 84 | + |
| 85 | +while True: |
| 86 | + # iterate through every LED |
| 87 | + bar_ind_last = bar_ind_current |
| 88 | + bar_ind_current = bar_ind_last + 1 |
| 89 | + if bar_ind_current <= (shift_register_pin_num-1): |
| 90 | + shift_register_pins[bar_ind_last].value = False |
| 91 | + shift_register_pins[bar_ind_current].value = True |
| 92 | + else: |
| 93 | + bar_ind_current = 0 |
| 94 | + shift_register_pins[bar_ind_last].value = False |
| 95 | + shift_register_pins[bar_ind_current].value = True |
| 96 | + time.sleep(0.1) |
| 97 | +``` |
| 98 | + |
| 99 | +Here is the result one can get: |
| 100 | + |
| 101 | + |
0 commit comments