ada452888776d80ea0c1e2ee090f0219b0603499
Chip-dat/74xx-dat/74HC165-dat/74HC165-dat.md
| ... | ... | @@ -0,0 +1,14 @@ |
| 1 | + |
|
| 2 | +# 74HC165-dat |
|
| 3 | + |
|
| 4 | +## demo code |
|
| 5 | + |
|
| 6 | +- [[74HC165-rpi-1.py]] |
|
| 7 | +- copy from https://forums.raspberrypi.com/viewtopic.php?t=254053 |
|
| 8 | +- [[rpi-python-dat]] |
|
| 9 | + |
|
| 10 | +## ref |
|
| 11 | + |
|
| 12 | +- [[74xx-dat]] |
|
| 13 | + |
|
| 14 | +- DS - |
|
| ... | ... | \ No newline at end of file |
Chip-dat/74xx-dat/74HC165-dat/74HC165-rpi-1.py
| ... | ... | @@ -0,0 +1,228 @@ |
| 1 | + |
|
| 2 | +#!/usr/bin/env python |
|
| 3 | + |
|
| 4 | +import time |
|
| 5 | +import threading |
|
| 6 | +import pigpio |
|
| 7 | + |
|
| 8 | +MAIN_SPI = 0 |
|
| 9 | +AUX_SPI = 1 |
|
| 10 | + |
|
| 11 | +class PISO(threading.Thread): |
|
| 12 | + |
|
| 13 | + """ |
|
| 14 | + A class to read multiple inputs from one or more |
|
| 15 | + SN74HC165 PISO (Parallel In Serial Out) shift |
|
| 16 | + registers. |
|
| 17 | + |
|
| 18 | + Either the main SPI or auxiliary SPI peripheral |
|
| 19 | + is used to clock the data off the chip. SPI is |
|
| 20 | + used for performance reasons. |
|
| 21 | + |
|
| 22 | + Connect a GPIO (referred to as SH_LD) to pin 1 of |
|
| 23 | + the first chip. |
|
| 24 | + |
|
| 25 | + Connect SPI SCLK to pin 2 of the first chip. SCLK |
|
| 26 | + will be GPIO 11 if the main SPI is being used and |
|
| 27 | + GPIO 21 if the auxiliary SPI is being used. |
|
| 28 | + |
|
| 29 | + Connect SPI MISO to pin 9 of the last chip. MISO |
|
| 30 | + will be GPIO 9 if the main SPI is being used and |
|
| 31 | + GPIO 19 if the auxiliary SPI is being used. |
|
| 32 | + |
|
| 33 | + First chip |
|
| 34 | + |
|
| 35 | + Pi GPIO ------> SH/LD 1 o 16 Vcc ------ 3V3 |
|
| 36 | + Pi SPI clock -> CLK 2 15 CLK INH -- Ground |
|
| 37 | + E 3 14 D |
|
| 38 | + F 4 13 C |
|
| 39 | + G 5 12 B |
|
| 40 | + H 6 11 A |
|
| 41 | + Don't connect /Qh 7 10 SER ------ Ground |
|
| 42 | + Ground -------- GND 8 9 Qh ------> next SER |
|
| 43 | + |
|
| 44 | + |
|
| 45 | + Middle chips |
|
| 46 | + |
|
| 47 | + prior SH/LD --> SH/LD 1 o 16 Vcc ------ 3V3 |
|
| 48 | + prior CLK ----> CLK 2 15 CLK INH -- Ground |
|
| 49 | + E 3 14 D |
|
| 50 | + F 4 13 C |
|
| 51 | + G 5 12 B |
|
| 52 | + H 6 11 A |
|
| 53 | + Don't connect /Qh 7 10 SER <----- prior Qh |
|
| 54 | + Ground -------- GND 8 9 Qh ------> next SER |
|
| 55 | + |
|
| 56 | + |
|
| 57 | + Last chip |
|
| 58 | + |
|
| 59 | + prior SH/LD --> SH/LD 1 o 16 Vcc ------ 3V3 |
|
| 60 | + prior CLK ----> CLK 2 15 CLK INH -- Ground |
|
| 61 | + E 3 14 D |
|
| 62 | + F 4 13 C |
|
| 63 | + G 5 12 B |
|
| 64 | + H 6 11 A |
|
| 65 | + Don't connect /Qh 7 10 SER <----- prior Qh |
|
| 66 | + Ground -------- GND 8 9 Qh ------> Pi SPI MISO |
|
| 67 | + """ |
|
| 68 | + SPI_FLAGS_AUX = 256 # use auxiliary SPI device |
|
| 69 | + SPI_FLAGS_NO_CE0 = 32 # don't use CE0 |
|
| 70 | + |
|
| 71 | + def __init__(self, pi, SH_LD, SPI_device=MAIN_SPI, |
|
| 72 | + chips=1, reads_per_second=100, callback=None): |
|
| 73 | + """ |
|
| 74 | + Instantiate with the connection to the Pi. |
|
| 75 | + |
|
| 76 | + SL_LD is the GPIO connected to the shift/load pin |
|
| 77 | + of the shift register. |
|
| 78 | + |
|
| 79 | + SPI_device is either MAIN_SPI (default) or AUX_SPI. |
|
| 80 | + |
|
| 81 | + chips is the number of SN74HC165 being used (defaults |
|
| 82 | + to 1). |
|
| 83 | + |
|
| 84 | + reads_per_second is the number of readings to |
|
| 85 | + be made per second (defaults to 100). |
|
| 86 | + |
|
| 87 | + If a callback is specified it will be called once |
|
| 88 | + for each pin level change. The callback receives |
|
| 89 | + the pin, the new level, and the time of reading. |
|
| 90 | + """ |
|
| 91 | + |
|
| 92 | + threading.Thread.__init__(self) |
|
| 93 | + |
|
| 94 | + self._lock = threading.Lock() |
|
| 95 | + |
|
| 96 | + self.set_reads_per_second(reads_per_second) |
|
| 97 | + |
|
| 98 | + self._pi = pi |
|
| 99 | + |
|
| 100 | + assert 0 <= SH_LD <= 53 |
|
| 101 | + self._SH_LD = SH_LD |
|
| 102 | + |
|
| 103 | + assert 0 <= SPI_device <= 1 |
|
| 104 | + flags = self.SPI_FLAGS_NO_CE0 |
|
| 105 | + if SPI_device == AUX_SPI: |
|
| 106 | + flags |= self.SPI_FLAGS_AUX |
|
| 107 | + self._h = pi.spi_open(0, 5000000, flags) |
|
| 108 | + |
|
| 109 | + assert 1 <= chips |
|
| 110 | + self._chips = chips |
|
| 111 | + |
|
| 112 | + self._callback = callback |
|
| 113 | + |
|
| 114 | + self._last_data = [0]*chips |
|
| 115 | + |
|
| 116 | + self._exiting = False |
|
| 117 | + |
|
| 118 | + self.daemon = True |
|
| 119 | + |
|
| 120 | + self.start() |
|
| 121 | + |
|
| 122 | + def read(self): |
|
| 123 | + """ |
|
| 124 | + Reads the shift registers and returns the |
|
| 125 | + readings as a byte array (one byte per |
|
| 126 | + chip). |
|
| 127 | + |
|
| 128 | + In addition if a callback is registered it |
|
| 129 | + will be called for each pin level change. |
|
| 130 | + """ |
|
| 131 | + data = None |
|
| 132 | + with self._lock: |
|
| 133 | + if self._exiting: |
|
| 134 | + return data |
|
| 135 | + self._pi.gpio_trigger(self._SH_LD, 1, 0) |
|
| 136 | + read_time = time.time() |
|
| 137 | + count, data = self._pi.spi_read(self._h, self._chips) |
|
| 138 | + if data != self._last_data: |
|
| 139 | + if self._callback is not None: |
|
| 140 | + # Emit callbacks for changed levels. |
|
| 141 | + for i in range(self._chips): |
|
| 142 | + if data[i] != self._last_data[i]: |
|
| 143 | + for j in range(8): |
|
| 144 | + if ((data[i] & (1<<j)) != |
|
| 145 | + (self._last_data[i] & (1<<j))): |
|
| 146 | + self._callback((i*8)+j, |
|
| 147 | + (data[i]>>j)&1, |
|
| 148 | + read_time) |
|
| 149 | + self._last_data = data |
|
| 150 | + return data |
|
| 151 | + |
|
| 152 | + def set_callback(self, callback): |
|
| 153 | + """ |
|
| 154 | + Sets the callback function. The callback will |
|
| 155 | + be called for each pin level change. |
|
| 156 | + |
|
| 157 | + The callback receives three parameters: |
|
| 158 | + the pin |
|
| 159 | + the new level |
|
| 160 | + the time of the reading |
|
| 161 | + |
|
| 162 | + There are 8 pins per chip. The last chip has |
|
| 163 | + pins numbered 0 to 7, the next to last chip has |
|
| 164 | + pins numbered 8 to 15 etc. |
|
| 165 | + |
|
| 166 | + The callback is cleared by setting it to None. |
|
| 167 | + """ |
|
| 168 | + with self._lock: |
|
| 169 | + self._callback = callback |
|
| 170 | + |
|
| 171 | + def set_reads_per_second(self, reads_per_second): |
|
| 172 | + """ |
|
| 173 | + Sets the number of chip reads per second. |
|
| 174 | + It must be between 1 and 5000 reads per |
|
| 175 | + second. |
|
| 176 | + """ |
|
| 177 | + with self._lock: |
|
| 178 | + assert 1 <= reads_per_second <= 5000 |
|
| 179 | + self._interval = 1.0 / reads_per_second |
|
| 180 | + |
|
| 181 | + def cancel(self): |
|
| 182 | + """ |
|
| 183 | + Cancels chip readings and releases resources. |
|
| 184 | + """ |
|
| 185 | + with self._lock: |
|
| 186 | + self._exiting = True |
|
| 187 | + self._pi.spi_close(self._h) |
|
| 188 | + |
|
| 189 | + def run(self): |
|
| 190 | + self._next_time = time.time() |
|
| 191 | + while not self._exiting: |
|
| 192 | + self.read() |
|
| 193 | + self._next_time += self._interval |
|
| 194 | + delay = self._next_time - time.time() |
|
| 195 | + if delay > 0.0: |
|
| 196 | + time.sleep(delay) |
|
| 197 | + |
|
| 198 | +if __name__ == "__main__": |
|
| 199 | + |
|
| 200 | + import time |
|
| 201 | + import SN74HC165 |
|
| 202 | + import pigpio |
|
| 203 | + |
|
| 204 | + def cbf(pin, level, tick): |
|
| 205 | + print(pin, level, tick) |
|
| 206 | + |
|
| 207 | + pi = pigpio.pi() |
|
| 208 | + if not pi.connected: |
|
| 209 | + exit() |
|
| 210 | + |
|
| 211 | + run_for = 30 |
|
| 212 | + |
|
| 213 | + sr = SN74HC165.PISO( |
|
| 214 | + pi, SH_LD=16, |
|
| 215 | + SPI_device=SN74HC165.AUX_SPI, chips=7, |
|
| 216 | + reads_per_second=200, callback=cbf) |
|
| 217 | + |
|
| 218 | + time.sleep(run_for) |
|
| 219 | + |
|
| 220 | + # read all registers |
|
| 221 | + r = sr.read() |
|
| 222 | + # and print each value |
|
| 223 | + for i in range(len(r)): |
|
| 224 | + print(r[i]) |
|
| 225 | + |
|
| 226 | + sr.cancel() |
|
| 227 | + |
|
| 228 | + pi.stop() |
|
| ... | ... | \ No newline at end of file |
Chip-dat/74xx-dat/74HC595-dat/74HC595-dat.md
| ... | ... | @@ -43,6 +43,8 @@ optional |
| 43 | 43 | |
| 44 | 44 | ## ref |
| 45 | 45 | |
| 46 | +- [[74xx-dat]] |
|
| 47 | + |
|
| 46 | 48 | - [[RPI-dat]] - [[rpi-python-dat]] |
| 47 | 49 | |
| 48 | 50 | - [[74HC595]] |
| ... | ... | \ No newline at end of file |
Chip-dat/74xx-dat/74hc541-dat/74hc541-dat.md
| ... | ... | @@ -0,0 +1,3 @@ |
| 1 | + |
|
| 2 | +# 74hc541-dat |
|
| 3 | + |
Chip-dat/74xx-dat/74hct245-dat/74hct245-dat.md
| ... | ... | @@ -0,0 +1,6 @@ |
| 1 | + |
|
| 2 | +# 74hct245-dat |
|
| 3 | + |
|
| 4 | +## ref |
|
| 5 | + |
|
| 6 | +- [[74xx-dat]] |
|
| ... | ... | \ No newline at end of file |
Chip-dat/74xx-dat/74xx-Buffer-dat/74hc541-dat/74hc541-dat.md
| ... | ... | @@ -1,3 +0,0 @@ |
| 1 | - |
|
| 2 | -# 74hc541-dat |
|
| 3 | - |
Chip-dat/74xx-dat/74xx-Buffer-dat/74hct245-dat/74hct245-dat.md
| ... | ... | @@ -1,3 +0,0 @@ |
| 1 | - |
|
| 2 | -# 74hct245-dat |
|
| 3 | - |
Tech-dat/SBC-dat/RPI-dat/RPI-dat.md
| ... | ... | @@ -34,7 +34,9 @@ |
| 34 | 34 | |
| 35 | 35 | ## demo code |
| 36 | 36 | |
| 37 | -https://github.com/Edragon/RPI |
|
| 37 | +- [[rpi-python-dat]] - [[rpi-c-dat]] |
|
| 38 | + |
|
| 39 | +- https://github.com/Edragon/RPI |
|
| 38 | 40 | |
| 39 | 41 | can use commands nohup to run script in background for long term. |
| 40 | 42 |
Tech-dat/SBC-dat/RPI-dat/RPI-python-dat/RPI-python-dat.md
| ... | ... | @@ -1,19 +0,0 @@ |
| 1 | - |
|
| 2 | -# RPI-python-dat |
|
| 3 | - |
|
| 4 | -apt-get install pip |
|
| 5 | - |
|
| 6 | - Note, selecting 'python3-pip' instead of 'pip' |
|
| 7 | - |
|
| 8 | - |
|
| 9 | - |
|
| 10 | -## setup env |
|
| 11 | - |
|
| 12 | - python3 -m venv .venv |
|
| 13 | - source .venv/bin/activate |
|
| 14 | - |
|
| 15 | - pip install RPi.GPIO |
|
| 16 | - |
|
| 17 | - |
|
| 18 | - |
|
| 19 | -- [[python-dat]] |
|
| ... | ... | \ No newline at end of file |
Tech-dat/SBC-dat/RPI-dat/rpi-c-dat/rpi-c-dat.md
| ... | ... | @@ -1,23 +0,0 @@ |
| 1 | - |
|
| 2 | -# rpi-c-dat |
|
| 3 | - |
|
| 4 | - chmod +x 2_5449615149826598388 |
|
| 5 | - |
|
| 6 | - (.venv) root@raspberrypi:/home/pi# ./2_5449615149826598388 |
|
| 7 | - |
|
| 8 | - ./2_5449615149826598388: error while loading shared libraries: libwiringPi.so: cannot open shared object file: No such file or directory |
|
| 9 | - |
|
| 10 | - |
|
| 11 | -## WiringPi |
|
| 12 | - |
|
| 13 | -https://github.com/WiringPi/WiringPi |
|
| 14 | -https://github.com/WiringPi/WiringPi |
|
| 15 | - |
|
| 16 | -Unzip/use the portable prebuilt verison: |
|
| 17 | - |
|
| 18 | - # unzip the archive |
|
| 19 | - tar -xfv wiringpi_3.0.tar.gz |
|
| 20 | - Install the debian package: |
|
| 21 | - |
|
| 22 | - # install a dpkg |
|
| 23 | - sudo apt install ./wiringpi-3.0-1.deb |
code-dat/RPI-python-dat/RPI-python-dat.md
| ... | ... | @@ -0,0 +1,34 @@ |
| 1 | + |
|
| 2 | +# RPI-python-dat |
|
| 3 | + |
|
| 4 | +apt-get install pip |
|
| 5 | + |
|
| 6 | + Note, selecting 'python3-pip' instead of 'pip' |
|
| 7 | + |
|
| 8 | + |
|
| 9 | + |
|
| 10 | +## setup env |
|
| 11 | + |
|
| 12 | + python3 -m venv .venv |
|
| 13 | + source .venv/bin/activate |
|
| 14 | + |
|
| 15 | + pip install RPi.GPIO |
|
| 16 | + |
|
| 17 | + |
|
| 18 | +## rpi library |
|
| 19 | + |
|
| 20 | +- pigpio |
|
| 21 | +- pi74HC595 |
|
| 22 | +- wiringpi |
|
| 23 | + |
|
| 24 | +- build-in library: time, threading, |
|
| 25 | + |
|
| 26 | + |
|
| 27 | +## hardware driver |
|
| 28 | + |
|
| 29 | +- [[74HC595-dat]] - [[74HC165-dat]] |
|
| 30 | + |
|
| 31 | + |
|
| 32 | +## ref |
|
| 33 | + |
|
| 34 | +- [[python-dat]] |
|
| ... | ... | \ No newline at end of file |
code-dat/rpi-c-dat/rpi-c-dat.md
| ... | ... | @@ -0,0 +1,23 @@ |
| 1 | + |
|
| 2 | +# rpi-c-dat |
|
| 3 | + |
|
| 4 | + chmod +x 2_5449615149826598388 |
|
| 5 | + |
|
| 6 | + (.venv) root@raspberrypi:/home/pi# ./2_5449615149826598388 |
|
| 7 | + |
|
| 8 | + ./2_5449615149826598388: error while loading shared libraries: libwiringPi.so: cannot open shared object file: No such file or directory |
|
| 9 | + |
|
| 10 | + |
|
| 11 | +## WiringPi |
|
| 12 | + |
|
| 13 | +https://github.com/WiringPi/WiringPi |
|
| 14 | +https://github.com/WiringPi/WiringPi |
|
| 15 | + |
|
| 16 | +Unzip/use the portable prebuilt verison: |
|
| 17 | + |
|
| 18 | + # unzip the archive |
|
| 19 | + tar -xfv wiringpi_3.0.tar.gz |
|
| 20 | + Install the debian package: |
|
| 21 | + |
|
| 22 | + # install a dpkg |
|
| 23 | + sudo apt install ./wiringpi-3.0-1.deb |