├── .gitignore
├── Getting Started
├── 01_multimeter.ipynb
├── 02_power_supply.ipynb
├── 03_oscilloscope.ipynb
├── 04_waveform_generator.ipynb
├── 05_pwm_generator.ipynb
├── 06_logic_analyzer.ipynb
├── README.md
└── images
│ ├── blink_led.kicad_prl
│ ├── blink_led.kicad_pro
│ ├── blink_led.kicad_sch
│ ├── blink_led.svg
│ ├── blink_led_reverse.kicad_pro
│ ├── blink_led_reverse.kicad_sch
│ ├── blink_led_reverse.svg
│ ├── capacitor.jpg
│ └── resistor.jpg
├── LICENSE
├── README.md
└── requirements.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | share/python-wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 | MANIFEST
28 |
29 | # PyInstaller
30 | # Usually these files are written by a python script from a template
31 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
32 | *.manifest
33 | *.spec
34 |
35 | # Installer logs
36 | pip-log.txt
37 | pip-delete-this-directory.txt
38 |
39 | # Unit test / coverage reports
40 | htmlcov/
41 | .tox/
42 | .nox/
43 | .coverage
44 | .coverage.*
45 | .cache
46 | nosetests.xml
47 | coverage.xml
48 | *.cover
49 | *.py,cover
50 | .hypothesis/
51 | .pytest_cache/
52 | cover/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | .pybuilder/
76 | target/
77 |
78 | # Jupyter Notebook
79 | .ipynb_checkpoints
80 |
81 | # IPython
82 | profile_default/
83 | ipython_config.py
84 |
85 | # pyenv
86 | # For a library or package, you might want to ignore these files since the code is
87 | # intended to run in multiple environments; otherwise, check them in:
88 | # .python-version
89 |
90 | # pipenv
91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
94 | # install all needed dependencies.
95 | #Pipfile.lock
96 |
97 | # poetry
98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99 | # This is especially recommended for binary packages to ensure reproducibility, and is more
100 | # commonly ignored for libraries.
101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102 | #poetry.lock
103 |
104 | # pdm
105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106 | #pdm.lock
107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108 | # in version control.
109 | # https://pdm.fming.dev/#use-with-ide
110 | .pdm.toml
111 |
112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
113 | __pypackages__/
114 |
115 | # Celery stuff
116 | celerybeat-schedule
117 | celerybeat.pid
118 |
119 | # SageMath parsed files
120 | *.sage.py
121 |
122 | # Environments
123 | .env
124 | .venv
125 | env/
126 | venv/
127 | ENV/
128 | env.bak/
129 | venv.bak/
130 |
131 | # Spyder project settings
132 | .spyderproject
133 | .spyproject
134 |
135 | # Rope project settings
136 | .ropeproject
137 |
138 | # mkdocs documentation
139 | /site
140 |
141 | # mypy
142 | .mypy_cache/
143 | .dmypy.json
144 | dmypy.json
145 |
146 | # Pyre type checker
147 | .pyre/
148 |
149 | # pytype static type analyzer
150 | .pytype/
151 |
152 | # Cython debug symbols
153 | cython_debug/
154 |
155 | # PyCharm
156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158 | # and can be added to the global gitignore or merged into this file. For a more nuclear
159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder.
160 | #.idea/
161 |
--------------------------------------------------------------------------------
/Getting Started/01_multimeter.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "a626806f",
6 | "metadata": {},
7 | "source": [
8 | "# Multimeter\n",
9 | "\n",
10 | "With the PSLab's multimeter, we can measure voltage, resistance, and capacitance.\n",
11 | "\n",
12 | "## Required Equipment\n",
13 | "\n",
14 | "- Jumper wire\n",
15 | "- Resistor\n",
16 | "- Capacitor\n",
17 | "\n",
18 | "Start by importing the library and connecting to the device:"
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": 28,
24 | "id": "d28716be",
25 | "metadata": {},
26 | "outputs": [],
27 | "source": [
28 | "import pslab\n",
29 | "psl = pslab.ScienceLab()"
30 | ]
31 | },
32 | {
33 | "cell_type": "markdown",
34 | "id": "b8fb153b",
35 | "metadata": {},
36 | "source": [
37 | "The ScienceLab class provides a common interface to the PSLab's instruments, the oscilloscope being one example. Let's take a look at how we can use it to collect some data:\n",
38 | "\n",
39 | "## Measuring Voltage"
40 | ]
41 | },
42 | {
43 | "cell_type": "code",
44 | "execution_count": 30,
45 | "id": "491c3d1d",
46 | "metadata": {},
47 | "outputs": [
48 | {
49 | "data": {
50 | "text/plain": [
51 | "0.17084249084249084"
52 | ]
53 | },
54 | "execution_count": 19,
55 | "metadata": {},
56 | "output_type": "execute_result"
57 | }
58 | ],
59 | "source": [
60 | "psl.multimeter.measure_voltage()"
61 | ]
62 | },
63 | {
64 | "cell_type": "markdown",
65 | "id": "daf62f08",
66 | "metadata": {},
67 | "source": [
68 | "That's the voltage at the VOL pin (in volts, V), relative to the PSLab's ground. It's close to zero, since the pin is not connected to anything. It's not *exactly* zero, due to a number of factors such as electromagnetic noise in the environment, electromagnetic noise from the PSLab itself, and from imperfections in the ADC.\n",
69 | "\n",
70 | "We can also measure the voltage at pins other than VOL:"
71 | ]
72 | },
73 | {
74 | "cell_type": "code",
75 | "execution_count": 32,
76 | "id": "ae14ba8b",
77 | "metadata": {},
78 | "outputs": [
79 | {
80 | "data": {
81 | "text/plain": [
82 | "0.0018887362637362015"
83 | ]
84 | },
85 | "execution_count": 18,
86 | "metadata": {},
87 | "output_type": "execute_result"
88 | }
89 | ],
90 | "source": [
91 | "psl.multimeter.measure_voltage(channel=\"CH1\")"
92 | ]
93 | },
94 | {
95 | "attachments": {},
96 | "cell_type": "markdown",
97 | "id": "857637a5",
98 | "metadata": {},
99 | "source": [
100 | "By connecting the measured pin to one of the VDD pins, we can see what the voltage level is at VDD:"
101 | ]
102 | },
103 | {
104 | "cell_type": "code",
105 | "execution_count": 33,
106 | "id": "4a1a6ae5",
107 | "metadata": {},
108 | "outputs": [
109 | {
110 | "data": {
111 | "text/plain": [
112 | "3.3"
113 | ]
114 | },
115 | "execution_count": 33,
116 | "metadata": {},
117 | "output_type": "execute_result"
118 | }
119 | ],
120 | "source": [
121 | "psl.multimeter.measure_voltage()"
122 | ]
123 | },
124 | {
125 | "attachments": {},
126 | "cell_type": "markdown",
127 | "id": "610d86e9",
128 | "metadata": {},
129 | "source": [
130 | "## Measuring Resistance\n",
131 | "\n",
132 | "By connecting a resistor between the RES pin and a GND pin, we can measure its resistance (Ohm, Ω).\n",
133 | "\n",
134 | ""
135 | ]
136 | },
137 | {
138 | "cell_type": "code",
139 | "execution_count": 37,
140 | "id": "98666b09",
141 | "metadata": {},
142 | "outputs": [
143 | {
144 | "data": {
145 | "text/plain": [
146 | "324.54545454545456"
147 | ]
148 | },
149 | "execution_count": 21,
150 | "metadata": {},
151 | "output_type": "execute_result"
152 | }
153 | ],
154 | "source": [
155 | "psl.multimeter.measure_resistance()"
156 | ]
157 | },
158 | {
159 | "cell_type": "markdown",
160 | "id": "a2f64321",
161 | "metadata": {},
162 | "source": [
163 | "That's it for the multimeter! Now that we know how to use the multimeter, we will use it to get familiar with the PSLab's power supply instrument."
164 | ]
165 | }
166 | ],
167 | "metadata": {
168 | "kernelspec": {
169 | "display_name": "Python 3 (ipykernel)",
170 | "language": "python",
171 | "name": "python3"
172 | },
173 | "language_info": {
174 | "codemirror_mode": {
175 | "name": "ipython",
176 | "version": 3
177 | },
178 | "file_extension": ".py",
179 | "mimetype": "text/x-python",
180 | "name": "python",
181 | "nbconvert_exporter": "python",
182 | "pygments_lexer": "ipython3",
183 | "version": "3.8.10"
184 | }
185 | },
186 | "nbformat": 4,
187 | "nbformat_minor": 5
188 | }
189 |
--------------------------------------------------------------------------------
/Getting Started/02_power_supply.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "ece723e4",
6 | "metadata": {},
7 | "source": [
8 | "# Power Supply\n",
9 | "\n",
10 | "With the PSLab's power supply, we can control programmable voltage and current sources to power many different kinds of experiments.\n",
11 | "\n",
12 | "## Requirements\n",
13 | "\n",
14 | "- Jumper wire x 3\n",
15 | "- Smallish resistor (~100R)\n",
16 | "- LED x 2\n",
17 | "\n",
18 | "As usual, start by importing the library and connecting to the device:"
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": 1,
24 | "id": "ed7ae512",
25 | "metadata": {},
26 | "outputs": [],
27 | "source": [
28 | "import pslab\n",
29 | "psl = pslab.ScienceLab()"
30 | ]
31 | },
32 | {
33 | "cell_type": "markdown",
34 | "id": "424d681d",
35 | "metadata": {},
36 | "source": [
37 | "## Voltage sources\n",
38 | "\n",
39 | "The power supply is used by assigning the desired output value to the appropriate pin. We can read back the actual output value by connecting the voltage source pins (PV1-3) to the multimeter:"
40 | ]
41 | },
42 | {
43 | "cell_type": "code",
44 | "execution_count": 2,
45 | "id": "c07ad276",
46 | "metadata": {},
47 | "outputs": [
48 | {
49 | "data": {
50 | "text/plain": [
51 | "0.3271794871794872"
52 | ]
53 | },
54 | "execution_count": 2,
55 | "metadata": {},
56 | "output_type": "execute_result"
57 | }
58 | ],
59 | "source": [
60 | "psl.power_supply.pv1 = 1.7\n",
61 | "psl.multimeter.measure_voltage()"
62 | ]
63 | },
64 | {
65 | "cell_type": "markdown",
66 | "id": "ca1f08e0",
67 | "metadata": {},
68 | "source": [
69 | "### Blinking an LED\n",
70 | "\n",
71 | "Now that we've introducted the PSLab's programmable voltage source, we can do the \"Hello world!\" of hardware: Blinking an LED. Connect the positive leg of the LED to PV1, in series with a resistor, per this diagram: "
72 | ]
73 | },
74 | {
75 | "cell_type": "markdown",
76 | "id": "c4993520",
77 | "metadata": {},
78 | "source": [
79 | "
"
80 | ]
81 | },
82 | {
83 | "cell_type": "markdown",
84 | "id": "7917647f",
85 | "metadata": {},
86 | "source": [
87 | "**Do not connect the LED directly to the PV1 pin without a resistor in series!** If you connect the LED directly to the PV1 pin you may burn out the LED."
88 | ]
89 | },
90 | {
91 | "cell_type": "code",
92 | "execution_count": 3,
93 | "id": "1fa4697b",
94 | "metadata": {},
95 | "outputs": [],
96 | "source": [
97 | "import time\n",
98 | "for i in range(20):\n",
99 | " psl.power_supply.pv1 = (5, 0)[i % 2]\n",
100 | " time.sleep(0.5)"
101 | ]
102 | },
103 | {
104 | "cell_type": "markdown",
105 | "id": "6b32ff8e",
106 | "metadata": {},
107 | "source": [
108 | "### Changing the current direction\n",
109 | "\n",
110 | "The PV1 and PV2 pins can output negative voltages, i.e. they can drive the current in both directions. In order to measure negative voltages we must use one of CH1-3 as input to the multimeter:"
111 | ]
112 | },
113 | {
114 | "cell_type": "code",
115 | "execution_count": 4,
116 | "id": "e3a20eff",
117 | "metadata": {},
118 | "outputs": [
119 | {
120 | "data": {
121 | "text/plain": [
122 | "-0.09808836996337"
123 | ]
124 | },
125 | "execution_count": 4,
126 | "metadata": {},
127 | "output_type": "execute_result"
128 | }
129 | ],
130 | "source": [
131 | "psl.power_supply.pv1 = -1.7\n",
132 | "psl.multimeter.measure_voltage(channel=\"CH1\")"
133 | ]
134 | },
135 | {
136 | "cell_type": "markdown",
137 | "id": "887d6437",
138 | "metadata": {},
139 | "source": [
140 | "We can visualize this using a second LED connected in parallel with the first, but with reversed polarity:"
141 | ]
142 | },
143 | {
144 | "cell_type": "markdown",
145 | "id": "33cf1343",
146 | "metadata": {},
147 | "source": [
148 | "
"
149 | ]
150 | },
151 | {
152 | "cell_type": "code",
153 | "execution_count": 6,
154 | "id": "78a2f3e3",
155 | "metadata": {},
156 | "outputs": [],
157 | "source": [
158 | "for i in range(20):\n",
159 | " psl.power_supply.pv1 = (5, -5)[i % 2]\n",
160 | " time.sleep(0.5)\n",
161 | "psl.power_supply.pv1 = 0"
162 | ]
163 | },
164 | {
165 | "cell_type": "markdown",
166 | "id": "f0747695",
167 | "metadata": {},
168 | "source": [
169 | "## Current source\n",
170 | "\n",
171 | "The PCS pin is a programmable current source. It can output a current up to 3.3 mA. In order to measure the generated current, we can connect a resistor between PCS and GND, and also connect the PCS pin to the multimeter.\n",
172 | "\n",
173 | "Before we turn on the current, the multimeter will read 0 V, since it's connected to ground via the resistor:"
174 | ]
175 | },
176 | {
177 | "cell_type": "code",
178 | "execution_count": 8,
179 | "id": "60ceefd7",
180 | "metadata": {},
181 | "outputs": [
182 | {
183 | "data": {
184 | "text/plain": [
185 | "0.0"
186 | ]
187 | },
188 | "execution_count": 8,
189 | "metadata": {},
190 | "output_type": "execute_result"
191 | }
192 | ],
193 | "source": [
194 | "psl.multimeter.measure_voltage()"
195 | ]
196 | },
197 | {
198 | "cell_type": "markdown",
199 | "id": "b101d912",
200 | "metadata": {},
201 | "source": [
202 | "Once we turn on the current, we can use the multimeter to read the voltage drop across the resistor. In this case we use a 330 Ω resistor."
203 | ]
204 | },
205 | {
206 | "cell_type": "code",
207 | "execution_count": 23,
208 | "id": "eb244efd",
209 | "metadata": {},
210 | "outputs": [
211 | {
212 | "data": {
213 | "text/plain": [
214 | "0.0021611721611721614"
215 | ]
216 | },
217 | "execution_count": 23,
218 | "metadata": {},
219 | "output_type": "execute_result"
220 | }
221 | ],
222 | "source": [
223 | "psl.power_supply.pcs = 2e-3\n",
224 | "v_drop = psl.multimeter.measure_voltage()\n",
225 | "v_drop / 330 # Ohm's law, I = U / R"
226 | ]
227 | },
228 | {
229 | "cell_type": "markdown",
230 | "id": "3f3cf01b",
231 | "metadata": {},
232 | "source": [
233 | "Be aware that the full current range up to 3.3 mA is not always available; the actual maximum current depends on the load resistance:\n",
234 | "\n",
235 | "I_max = 3.3 V / (1 kΩ + R_load)\n",
236 | "\n",
237 | "In the case of the 330 Ω resistor we used here, the highest current we can get from the PCS pin is:\n",
238 | "\n",
239 | "3.3 V / 1330 Ω = 2.5 mA\n",
240 | "\n",
241 | "Let's take a look at what happens when we try to set a higher current than the source is able to provide:"
242 | ]
243 | },
244 | {
245 | "cell_type": "code",
246 | "execution_count": 25,
247 | "id": "e27bc98f",
248 | "metadata": {},
249 | "outputs": [
250 | {
251 | "data": {
252 | "text/plain": [
253 | "[]"
254 | ]
255 | },
256 | "execution_count": 25,
257 | "metadata": {},
258 | "output_type": "execute_result"
259 | },
260 | {
261 | "data": {
262 | "image/png": "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\n",
263 | "text/plain": [
264 | ""
265 | ]
266 | },
267 | "metadata": {},
268 | "output_type": "display_data"
269 | }
270 | ],
271 | "source": [
272 | "import matplotlib.pyplot as plt\n",
273 | "import numpy as np\n",
274 | "currents = np.arange(0, 3.3e-3, 1e-4)\n",
275 | "actual = []\n",
276 | "for i in currents:\n",
277 | " psl.power_supply.pcs = i\n",
278 | " v_drop = psl.multimeter.measure_voltage()\n",
279 | " actual.append(v_drop / 330)\n",
280 | "plt.plot(currents, actual)"
281 | ]
282 | },
283 | {
284 | "cell_type": "markdown",
285 | "id": "272ec5cf",
286 | "metadata": {},
287 | "source": [
288 | "We see that the actual current starts to drop sharply if a higher current than is available is requested. This highlights the importance of accounting for the load resistance when doing experiments with the current source.\n",
289 | "\n",
290 | "That's it for the power source! Next, we will see how we can use the PSLab's oscilloscope to capture large amounts of analog data very quickly."
291 | ]
292 | }
293 | ],
294 | "metadata": {
295 | "kernelspec": {
296 | "display_name": "Python 3 (ipykernel)",
297 | "language": "python",
298 | "name": "python3"
299 | },
300 | "language_info": {
301 | "codemirror_mode": {
302 | "name": "ipython",
303 | "version": 3
304 | },
305 | "file_extension": ".py",
306 | "mimetype": "text/x-python",
307 | "name": "python",
308 | "nbconvert_exporter": "python",
309 | "pygments_lexer": "ipython3",
310 | "version": "3.11.6"
311 | }
312 | },
313 | "nbformat": 4,
314 | "nbformat_minor": 5
315 | }
316 |
--------------------------------------------------------------------------------
/Getting Started/06_logic_analyzer.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "97e3f98e-f224-42bc-9386-53da868ce7f9",
6 | "metadata": {},
7 | "source": [
8 | "# Logic Analyzer\n",
9 | "\n",
10 | "In the previous tutorial we saw that the oscilloscope is not the ideal instrument for looking at digital signals. The PSLab has another instrument more suited for this purpose: The logic analyzer.\n",
11 | "\n",
12 | "The PSLab's oscilloscope struggles with digital signals with frequencies over 50 kHz. Let's see how the logic analyzer does. This time, connect SQ1 to LA1."
13 | ]
14 | },
15 | {
16 | "cell_type": "code",
17 | "execution_count": 9,
18 | "id": "6fe26b39-0284-4729-8f4d-f4f621b13bb1",
19 | "metadata": {},
20 | "outputs": [
21 | {
22 | "data": {
23 | "text/plain": [
24 | "[]"
25 | ]
26 | },
27 | "execution_count": 9,
28 | "metadata": {},
29 | "output_type": "execute_result"
30 | },
31 | {
32 | "data": {
33 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAepklEQVR4nO3df1TVhf3H8Rdc5aILySIugij200xFg8FB61SLxZyHzbOzxswlw3KnBmfoPbWkEmousc5kdIokLWvnLI9US9em6YhFHk90UIid3EpnlnAyQE7FJSxo997vHzvRl4nlxXt9x+X5OOfzhx8+n899f85nzaef+7ncCL/f7xcAAICRSOsBAADA6EaMAAAAU8QIAAAwRYwAAABTxAgAADBFjAAAAFPECAAAMEWMAAAAU2OsBzgdPp9Px44dU0xMjCIiIqzHAQAAp8Hv96unp0eJiYmKjDz1/Y8RESPHjh1TcnKy9RgAAGAY2traNHny5FP+fETESExMjKT/nsyECROMpwEAAKfD4/EoOTl54O/xUxkRMfLFWzMTJkwgRgAAGGG+7hELHmAFAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGCKGAEAAKYCjpE9e/YoNzdXiYmJioiI0Pbt2792n/r6el155ZVyOp26+OKL9fTTTw9jVAAAEI4CjpHe3l6lpqaqqqrqtLZ/9913tXDhQl133XVqaWnRihUrdOutt2r37t0BDwsAAMJPwN9Ns2DBAi1YsOC0t6+urta0adO0fv16SdLll1+uvXv36ve//71ycnICfflRz+/369PPvdZjnBXjxjq+9vsMRjquZ/gYTddS4nqGG+vrGfIvymtoaFB2dvagdTk5OVqxYsUp9+nr61NfX9/Anz0eT6jGG1H8fr9+XN2gpqMfWY9yVqRPnajnbssK2//D43qGj9F2LSWuZ7ixvp4hf4C1vb1dLpdr0DqXyyWPx6NPP/10yH3Ky8sVGxs7sCQnJ4d6zBHh08+9o+o/jv1HPwrrf5lwPcPHaLuWEtcz3Fhfz5DfGRmOkpISud3ugT97PB6C5H/svzdb46Mc1mOExIl+r9J/+7L1GGcV1zN8hPO1lLie4eabcj1DHiMJCQnq6OgYtK6jo0MTJkzQuHHjhtzH6XTK6XSGerQRbXyUQ+OjvpEtiWHgeoYPrmV44XqeHSF/myYrK0t1dXWD1tXW1iorKyvULw0AAEaAgGPkk08+UUtLi1paWiT996O7LS0tam1tlfTft1iWLl06sP1tt92mI0eO6Ne//rXefvttPfbYY3r22We1cuXK4JwBAAAY0QKOkf3792vu3LmaO3euJMntdmvu3LkqLS2VJH3wwQcDYSJJ06ZN044dO1RbW6vU1FStX79eTzzxBB/rBQAAkobxzMi1114rv99/yp8P9dtVr732Wr3xxhuBvhQAABgF+G4aAABgihgBAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGCKGAEAAKaIEQAAYIoYAQAApogRAABgihgBAACmiBEAAGBqWDFSVVWllJQURUdHKzMzU42NjV+5fWVlpS677DKNGzdOycnJWrlypT777LNhDQwAAMJLwDFSU1Mjt9utsrIyNTc3KzU1VTk5Oers7Bxy+y1btmjVqlUqKyvTW2+9pSeffFI1NTW6++67z3h4AAAw8gUcIxUVFVq+fLkKCgo0Y8YMVVdXa/z48dq8efOQ27/22muaP3++brrpJqWkpOiGG27Q4sWLv/ZuCgAAGB0CipH+/n41NTUpOzv7ywNERio7O1sNDQ1D7jNv3jw1NTUNxMeRI0e0c+dOff/73z/l6/T19cnj8QxaAABAeBoTyMZdXV3yer1yuVyD1rtcLr399ttD7nPTTTepq6tLV111lfx+v/7zn//otttu+8q3acrLy3X//fcHMhoAABihQv5pmvr6eq1du1aPPfaYmpub9cILL2jHjh1as2bNKfcpKSlRd3f3wNLW1hbqMQEAgJGA7ozExcXJ4XCoo6Nj0PqOjg4lJCQMuc/q1at1880369Zbb5UkzZo1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",
34 | "text/plain": [
35 | ""
36 | ]
37 | },
38 | "metadata": {},
39 | "output_type": "display_data"
40 | }
41 | ],
42 | "source": [
43 | "import matplotlib.pyplot as plt\n",
44 | "import pslab\n",
45 | "psl = pslab.ScienceLab()\n",
46 | "psl.pwm_generator.generate(channels=\"SQ1\", frequency=500_000, duty_cycles=0.5)\n",
47 | "t = psl.logic_analyzer.capture(channels=\"LA1\", events=8)\n",
48 | "x, y = psl.logic_analyzer.get_xy(t)\n",
49 | "plt.plot(x, y)"
50 | ]
51 | },
52 | {
53 | "cell_type": "markdown",
54 | "id": "4ae5fb02-eb22-42e9-8f83-308d6a4816e6",
55 | "metadata": {},
56 | "source": [
57 | "Much better!\n",
58 | "\n",
59 | "The logic analyzer also has four channels, so we can use it to look at all the PWM outputs simultaneously. Connect SQ2 to LA2, SQ3 to LA3, and SQ4 to LA4."
60 | ]
61 | },
62 | {
63 | "cell_type": "code",
64 | "execution_count": 17,
65 | "id": "cd8a3999-ab4a-414c-88bf-88aa4a183abf",
66 | "metadata": {},
67 | "outputs": [
68 | {
69 | "data": {
70 | "text/plain": [
71 | "[,\n",
72 | " ,\n",
73 | " ,\n",
74 | " ]"
75 | ]
76 | },
77 | "execution_count": 17,
78 | "metadata": {},
79 | "output_type": "execute_result"
80 | },
81 | {
82 | "data": {
83 | "image/png": "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Hw8MDIz3IQGABjfmF28+/vjj8brXvS7a2triYx/7WGzatCnOP//8496+r68vurq6Ri89PT0nNTAA0LjGHBbnnntu7Nu3Lx555JH48z//81i5cmX88Ic/PO7t161bF/39/aOX/fv3n9TAAEDjGvOpkNbW1jjnnHMiImLBggWxa9eu+OpXvxq33XbbK96+ra0t2traTm5KAKApnPS/YzEyMnLMaygAgMlrTM9YrFu3LpYtWxazZ8+OQ4cOxcaNG2Pbtm2xefPmes0HADSRMYXFwYMH40Mf+lA888wz0dXVFXPnzo3NmzfHH/3RH9VrPgCgiYwpLL7+9a/Xaw4AoAK8VwgAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABpppY9QIaiKGLw14Pp91uP+2xUk+FYJ8MxvtRkON7JcIwvmgzHOhmOcTKoRFgM/nowFm1cVPYYTe2Sey8pewSS2Wm12CfNwqmQE3DRzIuifWp72WOka5/aHhfNvKjsMSZcVfcZYadVY580o1pRFMVEPuDAwEB0dXVFf39/dHZ2ptxnvU6FvKh9anvUarW63X+Z6v21a0RV3meEnVaNfVbHS3fZjMd4oj+/K3EqpFarxYxpM8oeoyn52lWPnVaLfVbHZNmlUyEAQBphAQCkqcSpkEorioijL5Q9xW9NmxHRZOcFG0qj7TPCTk9Wo+3UPk+OfZ40YdHIiiLiG5dH7H+k7El+q+f3I1Y92HTf6A2hEfcZYacnoxF3ap/jZ58pnAppZEdfaKxv8IiI/Tsbq+abSSPuM8JOT0Yj7tQ+x88+U3jGoll84qmI1hJfTXzkhYi/Oae8x6+asvcZYafZyt6pfeayz3ETFs2idUZE6yllT0EW+6weO60W+xw3p0IAgDRjCou+vr54xzveER0dHTFz5sy48sor48knn6zXbABAkxlTWGzfvj16e3tj586dsWXLljh69Gi8973vjcOHD9drPgCgiYzpNRYPPvjgMR/feeedMXPmzNizZ0+85z3vSR0MAGg+J/Xizf7+/oiIOO200457m6GhoRgaGhr9eGBg4GQeEgBoYON+8ebIyEisWbMmlixZEhdeeOFxb9fX1xddXV2jl56envE+JADQ4MYdFr29vfHEE0/E3Xff/aq3W7duXfT3949e9u/fP96HBAAa3LhOhVxzzTXx3e9+N3bs2BGzZs161du2tbVFW1vbuIYDAJrLmMKiKIr4+Mc/Hps2bYpt27bF2WefXa+5AIAmNKaw6O3tjY0bN8b9998fHR0d8eyzz0ZERFdXV7S3t9dlQACgeYzpNRYbNmyI/v7+uOSSS+LMM88cvdxzzz31mg8AaCJjPhUCAHA83isEAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANFPLHiBFUUQcfaHsKfIdadBjatS5Gl0jf90aebZG1qhft0adq9H5uqWoRlgcfSHi+u6yp5g8/uacsicgm51Wi31SIqdCmkHP70dMm1HuDNNm/GYOTl4j7DPCTjM1wk7tM08j7LOJ1YqiKCbyAQcGBqKrqyv6+/ujs7Mz506reirkRdNmRNRqZU9R/a/zRGmUfUbYaZZG2al95miEfb50l40wT5z4z+9qnAqp1SJaTyl7iurzda4eO60W+6yOJt7lmE+F7NixI5YvXx7d3d1Rq9Xivvvuq8NYAEAzGnNYHD58OObNmxe33HJLPeYBAJrYmE+FLFu2LJYtW1aPWSaNoihi8OjwCd22fVpL1Brg3BrHZ5/VY6fVYp8Tq+6vsRgaGoqhoaHR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LH5/93d/N/7xH/+xpInq6+mnn47vfe978e1vf7vsUerir/7qr+Laa6+NP/mTP4mIiLe//e3x9NNPR19f37jDoulfY9Ha2hoLFiyIrVu3jl43MjISW7durez56ioriiKuueaa2LRpU/zrv/5rnH322WWPNGFGRkZiaGio7DFSXXbZZfH444/Hvn37Ri8LFy6MFStWxL59+yobFRERzz//fPznf/5nnHnmmWWPkmrJkiUv+xXwH//4xzFnzpySJqqvO+64I2bOnBlXXHFF2aPUxQsvvBBTphybAi0tLTEyMjLu+2z6ZywiItauXRsrV66MhQsXxsUXXxxf+cpX4vDhw3H11VeXPVqa559//pi/+fzsZz+Lffv2xWmnnRazZ88ucbJcvb29sXHjxrj//vujo6Mjnn322YiI6Orqivb29pKny7Nu3bpYtmxZzJ49Ow4dOhQbN26Mbdu2xebNm8seLVVHR8fLXh9zyimnxOmnn16518184hOfiOXLl8ecOXPiwIEDsX79+mhpaYk//dM/LXu0VH/5l38Z73znO+P666+PD37wg/Hoo4/G7bffHrfffnvZo6UbGRmJO+64I1auXBlTp1bix+XLLF++PK677rqYPXt2XHDBBfHYY4/FjTfeGKtWrRr/nZ7kb6o0jJtuuqmYPXt20draWlx88cXFzp07yx4p1b/9278VEfGyy8qVK8seLdUrHWNEFHfccUfZo6VatWpVMWfOnKK1tbV4wxveUFx22WXFv/zLv5Q91oSo6q+bXnXVVcWZZ55ZtLa2Fm9605uKq666qnjqqafKHqsu/umf/qm48MILi7a2tuK8884rbr/99rJHqovNmzcXEVE8+eSTZY9SNwMDA8Xq1auL2bNnF9OnTy/e/OY3F5/5zGeKoaGhcd+nt00HANI0/WssAIDGISwAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDT/D4DQf1sVdyynAAAAAElFTkSuQmCC",
84 | "text/plain": [
85 | ""
86 | ]
87 | },
88 | "metadata": {},
89 | "output_type": "display_data"
90 | }
91 | ],
92 | "source": [
93 | "psl.pwm_generator.generate(channels=4, frequency=500_000, duty_cycles=[0.1, 0.3, 0.5, 0.7], phases=[0, 0.2, 0.5, 0.8])\n",
94 | "t = psl.logic_analyzer.capture(channels=4, events=8)\n",
95 | "x1, y1, x2, y2, x3, y3, x4, y4 = psl.logic_analyzer.get_xy(t)\n",
96 | "plt.plot(x1, y1, x2, y2 + 1.1, x3, y3 + 2.2, x4, y4 + 3.3)"
97 | ]
98 | },
99 | {
100 | "cell_type": "markdown",
101 | "id": "38e53641-21ab-4e0f-a9c4-26181fcfae99",
102 | "metadata": {},
103 | "source": [
104 | "Here we have offset the graphs from each other on the y-axis to make them easier to tell apart.\n",
105 | "\n",
106 | "Note that the output from the logic analyzer's `capture` method is a list of timestamps for \"events\", i.e. logic level transissions, for each channel. In order to get something which is more suitable for plotting, the logic analyzer provides a `get_xy` method, which converts the timestamps into x and y values similar to the oscilloscope's output. Each channel has its own x and y pair.\n",
107 | "\n",
108 | "That's the basics of the PSLab's six core instruments!\n",
109 | "\n",
110 | "The PSLab also provides three types of serial buses: I2C, SPI, and UART. The buses can be used to connect external sensors and devices."
111 | ]
112 | }
113 | ],
114 | "metadata": {
115 | "kernelspec": {
116 | "display_name": "Python 3 (ipykernel)",
117 | "language": "python",
118 | "name": "python3"
119 | },
120 | "language_info": {
121 | "codemirror_mode": {
122 | "name": "ipython",
123 | "version": 3
124 | },
125 | "file_extension": ".py",
126 | "mimetype": "text/x-python",
127 | "name": "python",
128 | "nbconvert_exporter": "python",
129 | "pygments_lexer": "ipython3",
130 | "version": "3.8.10"
131 | }
132 | },
133 | "nbformat": 4,
134 | "nbformat_minor": 5
135 | }
136 |
--------------------------------------------------------------------------------
/Getting Started/README.md:
--------------------------------------------------------------------------------
1 | # PSLab Tutorial Notebooks
2 |
3 | Please read the top-level README first.
4 |
5 | This directory contains a series of tutorials introducing each of the PSLab's six core instruments in turn:
6 |
7 | - Multimeter
8 | - Power Supply
9 | - Oscilloscope
10 | - Analog Waveform Generator
11 | - PWM Generator
12 | - Logic Analyzer
13 |
14 | The above is the recommended reading order.
15 |
--------------------------------------------------------------------------------
/Getting Started/images/blink_led.kicad_prl:
--------------------------------------------------------------------------------
1 | {
2 | "board": {
3 | "active_layer": 0,
4 | "active_layer_preset": "",
5 | "auto_track_width": true,
6 | "hidden_nets": [],
7 | "high_contrast_mode": 0,
8 | "net_color_mode": 1,
9 | "opacity": {
10 | "pads": 1.0,
11 | "tracks": 1.0,
12 | "vias": 1.0,
13 | "zones": 0.6
14 | },
15 | "ratsnest_display_mode": 0,
16 | "selection_filter": {
17 | "dimensions": true,
18 | "footprints": true,
19 | "graphics": true,
20 | "keepouts": true,
21 | "lockedItems": true,
22 | "otherItems": true,
23 | "pads": true,
24 | "text": true,
25 | "tracks": true,
26 | "vias": true,
27 | "zones": true
28 | },
29 | "visible_items": [
30 | 0,
31 | 1,
32 | 2,
33 | 3,
34 | 4,
35 | 5,
36 | 8,
37 | 9,
38 | 10,
39 | 11,
40 | 12,
41 | 13,
42 | 14,
43 | 15,
44 | 16,
45 | 17,
46 | 18,
47 | 19,
48 | 20,
49 | 21,
50 | 22,
51 | 23,
52 | 24,
53 | 25,
54 | 26,
55 | 27,
56 | 28,
57 | 29,
58 | 30,
59 | 32,
60 | 33,
61 | 34,
62 | 35,
63 | 36
64 | ],
65 | "visible_layers": "fffffff_ffffffff",
66 | "zone_display_mode": 0
67 | },
68 | "meta": {
69 | "filename": "blink_led.kicad_prl",
70 | "version": 3
71 | },
72 | "project": {
73 | "files": []
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/Getting Started/images/blink_led.kicad_pro:
--------------------------------------------------------------------------------
1 | {
2 | "board": {
3 | "layer_presets": []
4 | },
5 | "boards": [],
6 | "cvpcb": {
7 | "equivalence_files": []
8 | },
9 | "erc": {
10 | "erc_exclusions": [],
11 | "meta": {
12 | "version": 0
13 | },
14 | "pin_map": [
15 | [
16 | 0,
17 | 0,
18 | 0,
19 | 0,
20 | 0,
21 | 0,
22 | 1,
23 | 0,
24 | 0,
25 | 0,
26 | 0,
27 | 2
28 | ],
29 | [
30 | 0,
31 | 2,
32 | 0,
33 | 1,
34 | 0,
35 | 0,
36 | 1,
37 | 0,
38 | 2,
39 | 2,
40 | 2,
41 | 2
42 | ],
43 | [
44 | 0,
45 | 0,
46 | 0,
47 | 0,
48 | 0,
49 | 0,
50 | 1,
51 | 0,
52 | 1,
53 | 0,
54 | 1,
55 | 2
56 | ],
57 | [
58 | 0,
59 | 1,
60 | 0,
61 | 0,
62 | 0,
63 | 0,
64 | 1,
65 | 1,
66 | 2,
67 | 1,
68 | 1,
69 | 2
70 | ],
71 | [
72 | 0,
73 | 0,
74 | 0,
75 | 0,
76 | 0,
77 | 0,
78 | 1,
79 | 0,
80 | 0,
81 | 0,
82 | 0,
83 | 2
84 | ],
85 | [
86 | 0,
87 | 0,
88 | 0,
89 | 0,
90 | 0,
91 | 0,
92 | 0,
93 | 0,
94 | 0,
95 | 0,
96 | 0,
97 | 2
98 | ],
99 | [
100 | 1,
101 | 1,
102 | 1,
103 | 1,
104 | 1,
105 | 0,
106 | 1,
107 | 1,
108 | 1,
109 | 1,
110 | 1,
111 | 2
112 | ],
113 | [
114 | 0,
115 | 0,
116 | 0,
117 | 1,
118 | 0,
119 | 0,
120 | 1,
121 | 0,
122 | 0,
123 | 0,
124 | 0,
125 | 2
126 | ],
127 | [
128 | 0,
129 | 2,
130 | 1,
131 | 2,
132 | 0,
133 | 0,
134 | 1,
135 | 0,
136 | 2,
137 | 2,
138 | 2,
139 | 2
140 | ],
141 | [
142 | 0,
143 | 2,
144 | 0,
145 | 1,
146 | 0,
147 | 0,
148 | 1,
149 | 0,
150 | 2,
151 | 0,
152 | 0,
153 | 2
154 | ],
155 | [
156 | 0,
157 | 2,
158 | 1,
159 | 1,
160 | 0,
161 | 0,
162 | 1,
163 | 0,
164 | 2,
165 | 0,
166 | 0,
167 | 2
168 | ],
169 | [
170 | 2,
171 | 2,
172 | 2,
173 | 2,
174 | 2,
175 | 2,
176 | 2,
177 | 2,
178 | 2,
179 | 2,
180 | 2,
181 | 2
182 | ]
183 | ],
184 | "rule_severities": {
185 | "bus_definition_conflict": "error",
186 | "bus_entry_needed": "error",
187 | "bus_label_syntax": "error",
188 | "bus_to_bus_conflict": "error",
189 | "bus_to_net_conflict": "error",
190 | "different_unit_footprint": "error",
191 | "different_unit_net": "error",
192 | "duplicate_reference": "error",
193 | "duplicate_sheet_names": "error",
194 | "extra_units": "error",
195 | "global_label_dangling": "warning",
196 | "hier_label_mismatch": "error",
197 | "label_dangling": "error",
198 | "lib_symbol_issues": "warning",
199 | "multiple_net_names": "warning",
200 | "net_not_bus_member": "warning",
201 | "no_connect_connected": "warning",
202 | "no_connect_dangling": "warning",
203 | "pin_not_connected": "error",
204 | "pin_not_driven": "error",
205 | "pin_to_pin": "warning",
206 | "power_pin_not_driven": "error",
207 | "similar_labels": "warning",
208 | "unannotated": "error",
209 | "unit_value_mismatch": "error",
210 | "unresolved_variable": "error",
211 | "wire_dangling": "error"
212 | }
213 | },
214 | "libraries": {
215 | "pinned_footprint_libs": [],
216 | "pinned_symbol_libs": []
217 | },
218 | "meta": {
219 | "filename": "blink_led.kicad_pro",
220 | "version": 1
221 | },
222 | "net_settings": {
223 | "classes": [
224 | {
225 | "bus_width": 12.0,
226 | "clearance": 0.2,
227 | "diff_pair_gap": 0.25,
228 | "diff_pair_via_gap": 0.25,
229 | "diff_pair_width": 0.2,
230 | "line_style": 0,
231 | "microvia_diameter": 0.3,
232 | "microvia_drill": 0.1,
233 | "name": "Default",
234 | "pcb_color": "rgba(0, 0, 0, 0.000)",
235 | "schematic_color": "rgba(0, 0, 0, 0.000)",
236 | "track_width": 0.25,
237 | "via_diameter": 0.8,
238 | "via_drill": 0.4,
239 | "wire_width": 6.0
240 | }
241 | ],
242 | "meta": {
243 | "version": 2
244 | },
245 | "net_colors": null
246 | },
247 | "pcbnew": {
248 | "last_paths": {
249 | "gencad": "",
250 | "idf": "",
251 | "netlist": "",
252 | "specctra_dsn": "",
253 | "step": "",
254 | "vrml": ""
255 | },
256 | "page_layout_descr_file": ""
257 | },
258 | "schematic": {
259 | "annotate_start_num": 0,
260 | "drawing": {
261 | "default_line_thickness": 6.0,
262 | "default_text_size": 50.0,
263 | "field_names": [],
264 | "intersheets_ref_own_page": false,
265 | "intersheets_ref_prefix": "",
266 | "intersheets_ref_short": false,
267 | "intersheets_ref_show": false,
268 | "intersheets_ref_suffix": "",
269 | "junction_size_choice": 3,
270 | "label_size_ratio": 0.375,
271 | "pin_symbol_size": 25.0,
272 | "text_offset_ratio": 0.15
273 | },
274 | "legacy_lib_dir": "",
275 | "legacy_lib_list": [],
276 | "meta": {
277 | "version": 1
278 | },
279 | "net_format_name": "",
280 | "ngspice": {
281 | "fix_include_paths": true,
282 | "fix_passive_vals": false,
283 | "meta": {
284 | "version": 0
285 | },
286 | "model_mode": 0,
287 | "workbook_filename": ""
288 | },
289 | "page_layout_descr_file": "",
290 | "plot_directory": "",
291 | "spice_adjust_passive_values": false,
292 | "spice_external_command": "spice \"%I\"",
293 | "subpart_first_id": 65,
294 | "subpart_id_separator": 0
295 | },
296 | "sheets": [
297 | [
298 | "4a9204a3-8a8d-4e4a-a2d3-1416603e8571",
299 | ""
300 | ]
301 | ],
302 | "text_variables": {}
303 | }
304 |
--------------------------------------------------------------------------------
/Getting Started/images/blink_led.kicad_sch:
--------------------------------------------------------------------------------
1 | (kicad_sch (version 20211123) (generator eeschema)
2 |
3 | (uuid 4a9204a3-8a8d-4e4a-a2d3-1416603e8571)
4 |
5 | (paper "A5")
6 |
7 | (lib_symbols
8 | (symbol "Device:LED" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
9 | (property "Reference" "D" (id 0) (at 0 2.54 0)
10 | (effects (font (size 1.27 1.27)))
11 | )
12 | (property "Value" "LED" (id 1) (at 0 -2.54 0)
13 | (effects (font (size 1.27 1.27)))
14 | )
15 | (property "Footprint" "" (id 2) (at 0 0 0)
16 | (effects (font (size 1.27 1.27)) hide)
17 | )
18 | (property "Datasheet" "~" (id 3) (at 0 0 0)
19 | (effects (font (size 1.27 1.27)) hide)
20 | )
21 | (property "ki_keywords" "LED diode" (id 4) (at 0 0 0)
22 | (effects (font (size 1.27 1.27)) hide)
23 | )
24 | (property "ki_description" "Light emitting diode" (id 5) (at 0 0 0)
25 | (effects (font (size 1.27 1.27)) hide)
26 | )
27 | (property "ki_fp_filters" "LED* LED_SMD:* LED_THT:*" (id 6) (at 0 0 0)
28 | (effects (font (size 1.27 1.27)) hide)
29 | )
30 | (symbol "LED_0_1"
31 | (polyline
32 | (pts
33 | (xy -1.27 -1.27)
34 | (xy -1.27 1.27)
35 | )
36 | (stroke (width 0.254) (type default) (color 0 0 0 0))
37 | (fill (type none))
38 | )
39 | (polyline
40 | (pts
41 | (xy -1.27 0)
42 | (xy 1.27 0)
43 | )
44 | (stroke (width 0) (type default) (color 0 0 0 0))
45 | (fill (type none))
46 | )
47 | (polyline
48 | (pts
49 | (xy 1.27 -1.27)
50 | (xy 1.27 1.27)
51 | (xy -1.27 0)
52 | (xy 1.27 -1.27)
53 | )
54 | (stroke (width 0.254) (type default) (color 0 0 0 0))
55 | (fill (type none))
56 | )
57 | (polyline
58 | (pts
59 | (xy -3.048 -0.762)
60 | (xy -4.572 -2.286)
61 | (xy -3.81 -2.286)
62 | (xy -4.572 -2.286)
63 | (xy -4.572 -1.524)
64 | )
65 | (stroke (width 0) (type default) (color 0 0 0 0))
66 | (fill (type none))
67 | )
68 | (polyline
69 | (pts
70 | (xy -1.778 -0.762)
71 | (xy -3.302 -2.286)
72 | (xy -2.54 -2.286)
73 | (xy -3.302 -2.286)
74 | (xy -3.302 -1.524)
75 | )
76 | (stroke (width 0) (type default) (color 0 0 0 0))
77 | (fill (type none))
78 | )
79 | )
80 | (symbol "LED_1_1"
81 | (pin passive line (at -3.81 0 0) (length 2.54)
82 | (name "K" (effects (font (size 1.27 1.27))))
83 | (number "1" (effects (font (size 1.27 1.27))))
84 | )
85 | (pin passive line (at 3.81 0 180) (length 2.54)
86 | (name "A" (effects (font (size 1.27 1.27))))
87 | (number "2" (effects (font (size 1.27 1.27))))
88 | )
89 | )
90 | )
91 | (symbol "Device:R_US" (pin_numbers hide) (pin_names (offset 0)) (in_bom yes) (on_board yes)
92 | (property "Reference" "R" (id 0) (at 2.54 0 90)
93 | (effects (font (size 1.27 1.27)))
94 | )
95 | (property "Value" "R_US" (id 1) (at -2.54 0 90)
96 | (effects (font (size 1.27 1.27)))
97 | )
98 | (property "Footprint" "" (id 2) (at 1.016 -0.254 90)
99 | (effects (font (size 1.27 1.27)) hide)
100 | )
101 | (property "Datasheet" "~" (id 3) (at 0 0 0)
102 | (effects (font (size 1.27 1.27)) hide)
103 | )
104 | (property "ki_keywords" "R res resistor" (id 4) (at 0 0 0)
105 | (effects (font (size 1.27 1.27)) hide)
106 | )
107 | (property "ki_description" "Resistor, US symbol" (id 5) (at 0 0 0)
108 | (effects (font (size 1.27 1.27)) hide)
109 | )
110 | (property "ki_fp_filters" "R_*" (id 6) (at 0 0 0)
111 | (effects (font (size 1.27 1.27)) hide)
112 | )
113 | (symbol "R_US_0_1"
114 | (polyline
115 | (pts
116 | (xy 0 -2.286)
117 | (xy 0 -2.54)
118 | )
119 | (stroke (width 0) (type default) (color 0 0 0 0))
120 | (fill (type none))
121 | )
122 | (polyline
123 | (pts
124 | (xy 0 2.286)
125 | (xy 0 2.54)
126 | )
127 | (stroke (width 0) (type default) (color 0 0 0 0))
128 | (fill (type none))
129 | )
130 | (polyline
131 | (pts
132 | (xy 0 -0.762)
133 | (xy 1.016 -1.143)
134 | (xy 0 -1.524)
135 | (xy -1.016 -1.905)
136 | (xy 0 -2.286)
137 | )
138 | (stroke (width 0) (type default) (color 0 0 0 0))
139 | (fill (type none))
140 | )
141 | (polyline
142 | (pts
143 | (xy 0 0.762)
144 | (xy 1.016 0.381)
145 | (xy 0 0)
146 | (xy -1.016 -0.381)
147 | (xy 0 -0.762)
148 | )
149 | (stroke (width 0) (type default) (color 0 0 0 0))
150 | (fill (type none))
151 | )
152 | (polyline
153 | (pts
154 | (xy 0 2.286)
155 | (xy 1.016 1.905)
156 | (xy 0 1.524)
157 | (xy -1.016 1.143)
158 | (xy 0 0.762)
159 | )
160 | (stroke (width 0) (type default) (color 0 0 0 0))
161 | (fill (type none))
162 | )
163 | )
164 | (symbol "R_US_1_1"
165 | (pin passive line (at 0 3.81 270) (length 1.27)
166 | (name "~" (effects (font (size 1.27 1.27))))
167 | (number "1" (effects (font (size 1.27 1.27))))
168 | )
169 | (pin passive line (at 0 -3.81 90) (length 1.27)
170 | (name "~" (effects (font (size 1.27 1.27))))
171 | (number "2" (effects (font (size 1.27 1.27))))
172 | )
173 | )
174 | )
175 | (symbol "power:+5V" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes)
176 | (property "Reference" "#PWR" (id 0) (at 0 -3.81 0)
177 | (effects (font (size 1.27 1.27)) hide)
178 | )
179 | (property "Value" "+5V" (id 1) (at 0 3.556 0)
180 | (effects (font (size 1.27 1.27)))
181 | )
182 | (property "Footprint" "" (id 2) (at 0 0 0)
183 | (effects (font (size 1.27 1.27)) hide)
184 | )
185 | (property "Datasheet" "" (id 3) (at 0 0 0)
186 | (effects (font (size 1.27 1.27)) hide)
187 | )
188 | (property "ki_keywords" "power-flag" (id 4) (at 0 0 0)
189 | (effects (font (size 1.27 1.27)) hide)
190 | )
191 | (property "ki_description" "Power symbol creates a global label with name \"+5V\"" (id 5) (at 0 0 0)
192 | (effects (font (size 1.27 1.27)) hide)
193 | )
194 | (symbol "+5V_0_1"
195 | (polyline
196 | (pts
197 | (xy -0.762 1.27)
198 | (xy 0 2.54)
199 | )
200 | (stroke (width 0) (type default) (color 0 0 0 0))
201 | (fill (type none))
202 | )
203 | (polyline
204 | (pts
205 | (xy 0 0)
206 | (xy 0 2.54)
207 | )
208 | (stroke (width 0) (type default) (color 0 0 0 0))
209 | (fill (type none))
210 | )
211 | (polyline
212 | (pts
213 | (xy 0 2.54)
214 | (xy 0.762 1.27)
215 | )
216 | (stroke (width 0) (type default) (color 0 0 0 0))
217 | (fill (type none))
218 | )
219 | )
220 | (symbol "+5V_1_1"
221 | (pin power_in line (at 0 0 90) (length 0) hide
222 | (name "+5V" (effects (font (size 1.27 1.27))))
223 | (number "1" (effects (font (size 1.27 1.27))))
224 | )
225 | )
226 | )
227 | (symbol "power:GND" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes)
228 | (property "Reference" "#PWR" (id 0) (at 0 -6.35 0)
229 | (effects (font (size 1.27 1.27)) hide)
230 | )
231 | (property "Value" "GND" (id 1) (at 0 -3.81 0)
232 | (effects (font (size 1.27 1.27)))
233 | )
234 | (property "Footprint" "" (id 2) (at 0 0 0)
235 | (effects (font (size 1.27 1.27)) hide)
236 | )
237 | (property "Datasheet" "" (id 3) (at 0 0 0)
238 | (effects (font (size 1.27 1.27)) hide)
239 | )
240 | (property "ki_keywords" "power-flag" (id 4) (at 0 0 0)
241 | (effects (font (size 1.27 1.27)) hide)
242 | )
243 | (property "ki_description" "Power symbol creates a global label with name \"GND\" , ground" (id 5) (at 0 0 0)
244 | (effects (font (size 1.27 1.27)) hide)
245 | )
246 | (symbol "GND_0_1"
247 | (polyline
248 | (pts
249 | (xy 0 0)
250 | (xy 0 -1.27)
251 | (xy 1.27 -1.27)
252 | (xy 0 -2.54)
253 | (xy -1.27 -1.27)
254 | (xy 0 -1.27)
255 | )
256 | (stroke (width 0) (type default) (color 0 0 0 0))
257 | (fill (type none))
258 | )
259 | )
260 | (symbol "GND_1_1"
261 | (pin power_in line (at 0 0 270) (length 0) hide
262 | (name "GND" (effects (font (size 1.27 1.27))))
263 | (number "1" (effects (font (size 1.27 1.27))))
264 | )
265 | )
266 | )
267 | )
268 |
269 | (junction (at 99.06 60.96) (diameter 0) (color 0 0 0 0)
270 | (uuid 518c9cbd-2514-468a-adff-032b09ccbf07)
271 | )
272 | (junction (at 106.68 60.96) (diameter 0) (color 0 0 0 0)
273 | (uuid 882920e0-3781-4292-baa7-ff08e4a0b4b9)
274 | )
275 |
276 | (wire (pts (xy 99.06 55.88) (xy 99.06 60.96))
277 | (stroke (width 0) (type default) (color 0 0 0 0))
278 | (uuid 13ff5dde-3482-43a9-b791-e12142833a1f)
279 | )
280 | (wire (pts (xy 107.95 55.88) (xy 107.95 60.96))
281 | (stroke (width 0) (type default) (color 0 0 0 0))
282 | (uuid 1bdcf008-8bc5-4ba5-b8c0-949b08af2bec)
283 | )
284 | (wire (pts (xy 107.95 55.88) (xy 106.68 55.88))
285 | (stroke (width 0) (type default) (color 0 0 0 0))
286 | (uuid 1f21e670-49cb-478c-aed2-e0bf00e2c674)
287 | )
288 | (wire (pts (xy 107.95 60.96) (xy 106.68 60.96))
289 | (stroke (width 0) (type default) (color 0 0 0 0))
290 | (uuid 447c2ad5-3a2f-4c2d-ad2d-bd12a4482044)
291 | )
292 |
293 | (label "PV1" (at 91.44 60.96 180)
294 | (effects (font (size 1.27 1.27)) (justify right bottom))
295 | (uuid 3e1c4c69-27ca-4645-a1ac-128b7c3f01d0)
296 | )
297 |
298 | (symbol (lib_id "power:+5V") (at 91.44 60.96 0) (mirror x) (unit 1)
299 | (in_bom yes) (on_board yes)
300 | (uuid 1a15b6bb-1aae-49ad-a5f0-a2e352fdf924)
301 | (property "Reference" "#PWR?" (id 0) (at 91.44 57.15 0)
302 | (effects (font (size 1.27 1.27)) hide)
303 | )
304 | (property "Value" "+5V" (id 1) (at 91.44 64.77 0))
305 | (property "Footprint" "" (id 2) (at 91.44 60.96 0)
306 | (effects (font (size 1.27 1.27)) hide)
307 | )
308 | (property "Datasheet" "" (id 3) (at 91.44 60.96 0)
309 | (effects (font (size 1.27 1.27)) hide)
310 | )
311 | (pin "1" (uuid cfc6c773-c013-4680-a304-5d367dcc4791))
312 | )
313 |
314 | (symbol (lib_id "Device:R_US") (at 95.25 60.96 90) (unit 1)
315 | (in_bom yes) (on_board yes)
316 | (uuid 2c592067-cbcc-4cfa-b689-9786ce94ef6c)
317 | (property "Reference" "R?" (id 0) (at 95.25 54.61 90)
318 | (effects (font (size 1.27 1.27)) hide)
319 | )
320 | (property "Value" "330R" (id 1) (at 95.25 58.42 90))
321 | (property "Footprint" "" (id 2) (at 95.504 59.944 90)
322 | (effects (font (size 1.27 1.27)) hide)
323 | )
324 | (property "Datasheet" "~" (id 3) (at 95.25 60.96 0)
325 | (effects (font (size 1.27 1.27)) hide)
326 | )
327 | (pin "1" (uuid 48b3c2aa-ccbe-4bbd-9262-55fb47c20ff9))
328 | (pin "2" (uuid a7fce068-cdff-4377-ad5d-33a580e9ac96))
329 | )
330 |
331 | (symbol (lib_id "power:GND") (at 106.68 60.96 0) (unit 1)
332 | (in_bom yes) (on_board yes)
333 | (uuid 5e2e6b94-c94f-4f0e-b1f2-e63d53b53aa2)
334 | (property "Reference" "#PWR?" (id 0) (at 106.68 67.31 0)
335 | (effects (font (size 1.27 1.27)) hide)
336 | )
337 | (property "Value" "GND" (id 1) (at 106.68 64.77 0))
338 | (property "Footprint" "" (id 2) (at 106.68 60.96 0)
339 | (effects (font (size 1.27 1.27)) hide)
340 | )
341 | (property "Datasheet" "" (id 3) (at 106.68 60.96 0)
342 | (effects (font (size 1.27 1.27)) hide)
343 | )
344 | (pin "1" (uuid 8f9f436d-e0da-42f3-9da0-b67a0c5b7b70))
345 | )
346 |
347 | (symbol (lib_id "Device:LED") (at 102.87 60.96 180) (unit 1)
348 | (in_bom yes) (on_board yes)
349 | (uuid 6b215902-553a-4860-a317-c40e476349cd)
350 | (property "Reference" "D?" (id 0) (at 104.4575 53.34 0)
351 | (effects (font (size 1.27 1.27)) hide)
352 | )
353 | (property "Value" "LED" (id 1) (at 102.87 58.42 0))
354 | (property "Footprint" "" (id 2) (at 102.87 60.96 0)
355 | (effects (font (size 1.27 1.27)) hide)
356 | )
357 | (property "Datasheet" "~" (id 3) (at 102.87 60.96 0)
358 | (effects (font (size 1.27 1.27)) hide)
359 | )
360 | (pin "1" (uuid 5bc92f5b-76ff-43ab-818c-bcdc8fa8765c))
361 | (pin "2" (uuid 0197262b-f60a-4f5b-aa7c-b27aedc2bf7a))
362 | )
363 |
364 | (symbol (lib_id "Device:LED") (at 102.87 55.88 0) (mirror x) (unit 1)
365 | (in_bom yes) (on_board yes)
366 | (uuid de2f7359-7b40-45f5-9e89-bbb18cd5ae65)
367 | (property "Reference" "D?" (id 0) (at 101.2825 48.26 0)
368 | (effects (font (size 1.27 1.27)) hide)
369 | )
370 | (property "Value" "LED" (id 1) (at 102.87 53.34 0))
371 | (property "Footprint" "" (id 2) (at 102.87 55.88 0)
372 | (effects (font (size 1.27 1.27)) hide)
373 | )
374 | (property "Datasheet" "~" (id 3) (at 102.87 55.88 0)
375 | (effects (font (size 1.27 1.27)) hide)
376 | )
377 | (pin "1" (uuid 765f2c90-e4c9-459a-9204-0103e1ac70df))
378 | (pin "2" (uuid 8592b71d-3652-4955-a50c-ed4a0458addc))
379 | )
380 |
381 | (sheet_instances
382 | (path "/" (page "1"))
383 | )
384 |
385 | (symbol_instances
386 | (path "/1a15b6bb-1aae-49ad-a5f0-a2e352fdf924"
387 | (reference "#PWR?") (unit 1) (value "+5V") (footprint "")
388 | )
389 | (path "/5e2e6b94-c94f-4f0e-b1f2-e63d53b53aa2"
390 | (reference "#PWR?") (unit 1) (value "GND") (footprint "")
391 | )
392 | (path "/6b215902-553a-4860-a317-c40e476349cd"
393 | (reference "D?") (unit 1) (value "LED") (footprint "")
394 | )
395 | (path "/de2f7359-7b40-45f5-9e89-bbb18cd5ae65"
396 | (reference "D?") (unit 1) (value "LED") (footprint "")
397 | )
398 | (path "/2c592067-cbcc-4cfa-b689-9786ce94ef6c"
399 | (reference "R?") (unit 1) (value "330R") (footprint "")
400 | )
401 | )
402 | )
403 |
--------------------------------------------------------------------------------
/Getting Started/images/blink_led.svg:
--------------------------------------------------------------------------------
1 |
2 |
439 |
--------------------------------------------------------------------------------
/Getting Started/images/blink_led_reverse.kicad_pro:
--------------------------------------------------------------------------------
1 | {
2 | "board": {
3 | "layer_presets": []
4 | },
5 | "boards": [],
6 | "cvpcb": {
7 | "equivalence_files": []
8 | },
9 | "erc": {
10 | "erc_exclusions": [],
11 | "meta": {
12 | "version": 0
13 | },
14 | "pin_map": [
15 | [
16 | 0,
17 | 0,
18 | 0,
19 | 0,
20 | 0,
21 | 0,
22 | 1,
23 | 0,
24 | 0,
25 | 0,
26 | 0,
27 | 2
28 | ],
29 | [
30 | 0,
31 | 2,
32 | 0,
33 | 1,
34 | 0,
35 | 0,
36 | 1,
37 | 0,
38 | 2,
39 | 2,
40 | 2,
41 | 2
42 | ],
43 | [
44 | 0,
45 | 0,
46 | 0,
47 | 0,
48 | 0,
49 | 0,
50 | 1,
51 | 0,
52 | 1,
53 | 0,
54 | 1,
55 | 2
56 | ],
57 | [
58 | 0,
59 | 1,
60 | 0,
61 | 0,
62 | 0,
63 | 0,
64 | 1,
65 | 1,
66 | 2,
67 | 1,
68 | 1,
69 | 2
70 | ],
71 | [
72 | 0,
73 | 0,
74 | 0,
75 | 0,
76 | 0,
77 | 0,
78 | 1,
79 | 0,
80 | 0,
81 | 0,
82 | 0,
83 | 2
84 | ],
85 | [
86 | 0,
87 | 0,
88 | 0,
89 | 0,
90 | 0,
91 | 0,
92 | 0,
93 | 0,
94 | 0,
95 | 0,
96 | 0,
97 | 2
98 | ],
99 | [
100 | 1,
101 | 1,
102 | 1,
103 | 1,
104 | 1,
105 | 0,
106 | 1,
107 | 1,
108 | 1,
109 | 1,
110 | 1,
111 | 2
112 | ],
113 | [
114 | 0,
115 | 0,
116 | 0,
117 | 1,
118 | 0,
119 | 0,
120 | 1,
121 | 0,
122 | 0,
123 | 0,
124 | 0,
125 | 2
126 | ],
127 | [
128 | 0,
129 | 2,
130 | 1,
131 | 2,
132 | 0,
133 | 0,
134 | 1,
135 | 0,
136 | 2,
137 | 2,
138 | 2,
139 | 2
140 | ],
141 | [
142 | 0,
143 | 2,
144 | 0,
145 | 1,
146 | 0,
147 | 0,
148 | 1,
149 | 0,
150 | 2,
151 | 0,
152 | 0,
153 | 2
154 | ],
155 | [
156 | 0,
157 | 2,
158 | 1,
159 | 1,
160 | 0,
161 | 0,
162 | 1,
163 | 0,
164 | 2,
165 | 0,
166 | 0,
167 | 2
168 | ],
169 | [
170 | 2,
171 | 2,
172 | 2,
173 | 2,
174 | 2,
175 | 2,
176 | 2,
177 | 2,
178 | 2,
179 | 2,
180 | 2,
181 | 2
182 | ]
183 | ],
184 | "rule_severities": {
185 | "bus_definition_conflict": "error",
186 | "bus_entry_needed": "error",
187 | "bus_label_syntax": "error",
188 | "bus_to_bus_conflict": "error",
189 | "bus_to_net_conflict": "error",
190 | "different_unit_footprint": "error",
191 | "different_unit_net": "error",
192 | "duplicate_reference": "error",
193 | "duplicate_sheet_names": "error",
194 | "extra_units": "error",
195 | "global_label_dangling": "warning",
196 | "hier_label_mismatch": "error",
197 | "label_dangling": "error",
198 | "lib_symbol_issues": "warning",
199 | "multiple_net_names": "warning",
200 | "net_not_bus_member": "warning",
201 | "no_connect_connected": "warning",
202 | "no_connect_dangling": "warning",
203 | "pin_not_connected": "error",
204 | "pin_not_driven": "error",
205 | "pin_to_pin": "warning",
206 | "power_pin_not_driven": "error",
207 | "similar_labels": "warning",
208 | "unannotated": "error",
209 | "unit_value_mismatch": "error",
210 | "unresolved_variable": "error",
211 | "wire_dangling": "error"
212 | }
213 | },
214 | "libraries": {
215 | "pinned_footprint_libs": [],
216 | "pinned_symbol_libs": []
217 | },
218 | "meta": {
219 | "filename": "blink_led_reverse.kicad_pro",
220 | "version": 1
221 | },
222 | "net_settings": {
223 | "classes": [
224 | {
225 | "bus_width": 12.0,
226 | "clearance": 0.2,
227 | "diff_pair_gap": 0.25,
228 | "diff_pair_via_gap": 0.25,
229 | "diff_pair_width": 0.2,
230 | "line_style": 0,
231 | "microvia_diameter": 0.3,
232 | "microvia_drill": 0.1,
233 | "name": "Default",
234 | "pcb_color": "rgba(0, 0, 0, 0.000)",
235 | "schematic_color": "rgba(0, 0, 0, 0.000)",
236 | "track_width": 0.25,
237 | "via_diameter": 0.8,
238 | "via_drill": 0.4,
239 | "wire_width": 6.0
240 | }
241 | ],
242 | "meta": {
243 | "version": 2
244 | },
245 | "net_colors": null
246 | },
247 | "pcbnew": {
248 | "last_paths": {
249 | "gencad": "",
250 | "idf": "",
251 | "netlist": "",
252 | "specctra_dsn": "",
253 | "step": "",
254 | "vrml": ""
255 | },
256 | "page_layout_descr_file": ""
257 | },
258 | "schematic": {
259 | "annotate_start_num": 0,
260 | "drawing": {
261 | "default_line_thickness": 6.0,
262 | "default_text_size": 50.0,
263 | "field_names": [],
264 | "intersheets_ref_own_page": false,
265 | "intersheets_ref_prefix": "",
266 | "intersheets_ref_short": false,
267 | "intersheets_ref_show": false,
268 | "intersheets_ref_suffix": "",
269 | "junction_size_choice": 3,
270 | "label_size_ratio": 0.375,
271 | "pin_symbol_size": 25.0,
272 | "text_offset_ratio": 0.15
273 | },
274 | "legacy_lib_dir": "",
275 | "legacy_lib_list": [],
276 | "meta": {
277 | "version": 1
278 | },
279 | "net_format_name": "",
280 | "ngspice": {
281 | "fix_include_paths": true,
282 | "fix_passive_vals": false,
283 | "meta": {
284 | "version": 0
285 | },
286 | "model_mode": 0,
287 | "workbook_filename": ""
288 | },
289 | "page_layout_descr_file": "",
290 | "plot_directory": "",
291 | "spice_adjust_passive_values": false,
292 | "spice_external_command": "spice \"%I\"",
293 | "subpart_first_id": 65,
294 | "subpart_id_separator": 0
295 | },
296 | "sheets": [
297 | [
298 | "4a9204a3-8a8d-4e4a-a2d3-1416603e8571",
299 | ""
300 | ]
301 | ],
302 | "text_variables": {}
303 | }
304 |
--------------------------------------------------------------------------------
/Getting Started/images/blink_led_reverse.kicad_sch:
--------------------------------------------------------------------------------
1 | (kicad_sch (version 20211123) (generator eeschema)
2 |
3 | (uuid 4a9204a3-8a8d-4e4a-a2d3-1416603e8571)
4 |
5 | (paper "A5")
6 |
7 | (lib_symbols
8 | (symbol "Device:LED" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
9 | (property "Reference" "D" (id 0) (at 0 2.54 0)
10 | (effects (font (size 1.27 1.27)))
11 | )
12 | (property "Value" "LED" (id 1) (at 0 -2.54 0)
13 | (effects (font (size 1.27 1.27)))
14 | )
15 | (property "Footprint" "" (id 2) (at 0 0 0)
16 | (effects (font (size 1.27 1.27)) hide)
17 | )
18 | (property "Datasheet" "~" (id 3) (at 0 0 0)
19 | (effects (font (size 1.27 1.27)) hide)
20 | )
21 | (property "ki_keywords" "LED diode" (id 4) (at 0 0 0)
22 | (effects (font (size 1.27 1.27)) hide)
23 | )
24 | (property "ki_description" "Light emitting diode" (id 5) (at 0 0 0)
25 | (effects (font (size 1.27 1.27)) hide)
26 | )
27 | (property "ki_fp_filters" "LED* LED_SMD:* LED_THT:*" (id 6) (at 0 0 0)
28 | (effects (font (size 1.27 1.27)) hide)
29 | )
30 | (symbol "LED_0_1"
31 | (polyline
32 | (pts
33 | (xy -1.27 -1.27)
34 | (xy -1.27 1.27)
35 | )
36 | (stroke (width 0.254) (type default) (color 0 0 0 0))
37 | (fill (type none))
38 | )
39 | (polyline
40 | (pts
41 | (xy -1.27 0)
42 | (xy 1.27 0)
43 | )
44 | (stroke (width 0) (type default) (color 0 0 0 0))
45 | (fill (type none))
46 | )
47 | (polyline
48 | (pts
49 | (xy 1.27 -1.27)
50 | (xy 1.27 1.27)
51 | (xy -1.27 0)
52 | (xy 1.27 -1.27)
53 | )
54 | (stroke (width 0.254) (type default) (color 0 0 0 0))
55 | (fill (type none))
56 | )
57 | (polyline
58 | (pts
59 | (xy -3.048 -0.762)
60 | (xy -4.572 -2.286)
61 | (xy -3.81 -2.286)
62 | (xy -4.572 -2.286)
63 | (xy -4.572 -1.524)
64 | )
65 | (stroke (width 0) (type default) (color 0 0 0 0))
66 | (fill (type none))
67 | )
68 | (polyline
69 | (pts
70 | (xy -1.778 -0.762)
71 | (xy -3.302 -2.286)
72 | (xy -2.54 -2.286)
73 | (xy -3.302 -2.286)
74 | (xy -3.302 -1.524)
75 | )
76 | (stroke (width 0) (type default) (color 0 0 0 0))
77 | (fill (type none))
78 | )
79 | )
80 | (symbol "LED_1_1"
81 | (pin passive line (at -3.81 0 0) (length 2.54)
82 | (name "K" (effects (font (size 1.27 1.27))))
83 | (number "1" (effects (font (size 1.27 1.27))))
84 | )
85 | (pin passive line (at 3.81 0 180) (length 2.54)
86 | (name "A" (effects (font (size 1.27 1.27))))
87 | (number "2" (effects (font (size 1.27 1.27))))
88 | )
89 | )
90 | )
91 | (symbol "Device:R_US" (pin_numbers hide) (pin_names (offset 0)) (in_bom yes) (on_board yes)
92 | (property "Reference" "R" (id 0) (at 2.54 0 90)
93 | (effects (font (size 1.27 1.27)))
94 | )
95 | (property "Value" "R_US" (id 1) (at -2.54 0 90)
96 | (effects (font (size 1.27 1.27)))
97 | )
98 | (property "Footprint" "" (id 2) (at 1.016 -0.254 90)
99 | (effects (font (size 1.27 1.27)) hide)
100 | )
101 | (property "Datasheet" "~" (id 3) (at 0 0 0)
102 | (effects (font (size 1.27 1.27)) hide)
103 | )
104 | (property "ki_keywords" "R res resistor" (id 4) (at 0 0 0)
105 | (effects (font (size 1.27 1.27)) hide)
106 | )
107 | (property "ki_description" "Resistor, US symbol" (id 5) (at 0 0 0)
108 | (effects (font (size 1.27 1.27)) hide)
109 | )
110 | (property "ki_fp_filters" "R_*" (id 6) (at 0 0 0)
111 | (effects (font (size 1.27 1.27)) hide)
112 | )
113 | (symbol "R_US_0_1"
114 | (polyline
115 | (pts
116 | (xy 0 -2.286)
117 | (xy 0 -2.54)
118 | )
119 | (stroke (width 0) (type default) (color 0 0 0 0))
120 | (fill (type none))
121 | )
122 | (polyline
123 | (pts
124 | (xy 0 2.286)
125 | (xy 0 2.54)
126 | )
127 | (stroke (width 0) (type default) (color 0 0 0 0))
128 | (fill (type none))
129 | )
130 | (polyline
131 | (pts
132 | (xy 0 -0.762)
133 | (xy 1.016 -1.143)
134 | (xy 0 -1.524)
135 | (xy -1.016 -1.905)
136 | (xy 0 -2.286)
137 | )
138 | (stroke (width 0) (type default) (color 0 0 0 0))
139 | (fill (type none))
140 | )
141 | (polyline
142 | (pts
143 | (xy 0 0.762)
144 | (xy 1.016 0.381)
145 | (xy 0 0)
146 | (xy -1.016 -0.381)
147 | (xy 0 -0.762)
148 | )
149 | (stroke (width 0) (type default) (color 0 0 0 0))
150 | (fill (type none))
151 | )
152 | (polyline
153 | (pts
154 | (xy 0 2.286)
155 | (xy 1.016 1.905)
156 | (xy 0 1.524)
157 | (xy -1.016 1.143)
158 | (xy 0 0.762)
159 | )
160 | (stroke (width 0) (type default) (color 0 0 0 0))
161 | (fill (type none))
162 | )
163 | )
164 | (symbol "R_US_1_1"
165 | (pin passive line (at 0 3.81 270) (length 1.27)
166 | (name "~" (effects (font (size 1.27 1.27))))
167 | (number "1" (effects (font (size 1.27 1.27))))
168 | )
169 | (pin passive line (at 0 -3.81 90) (length 1.27)
170 | (name "~" (effects (font (size 1.27 1.27))))
171 | (number "2" (effects (font (size 1.27 1.27))))
172 | )
173 | )
174 | )
175 | (symbol "power:+5V" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes)
176 | (property "Reference" "#PWR" (id 0) (at 0 -3.81 0)
177 | (effects (font (size 1.27 1.27)) hide)
178 | )
179 | (property "Value" "+5V" (id 1) (at 0 3.556 0)
180 | (effects (font (size 1.27 1.27)))
181 | )
182 | (property "Footprint" "" (id 2) (at 0 0 0)
183 | (effects (font (size 1.27 1.27)) hide)
184 | )
185 | (property "Datasheet" "" (id 3) (at 0 0 0)
186 | (effects (font (size 1.27 1.27)) hide)
187 | )
188 | (property "ki_keywords" "power-flag" (id 4) (at 0 0 0)
189 | (effects (font (size 1.27 1.27)) hide)
190 | )
191 | (property "ki_description" "Power symbol creates a global label with name \"+5V\"" (id 5) (at 0 0 0)
192 | (effects (font (size 1.27 1.27)) hide)
193 | )
194 | (symbol "+5V_0_1"
195 | (polyline
196 | (pts
197 | (xy -0.762 1.27)
198 | (xy 0 2.54)
199 | )
200 | (stroke (width 0) (type default) (color 0 0 0 0))
201 | (fill (type none))
202 | )
203 | (polyline
204 | (pts
205 | (xy 0 0)
206 | (xy 0 2.54)
207 | )
208 | (stroke (width 0) (type default) (color 0 0 0 0))
209 | (fill (type none))
210 | )
211 | (polyline
212 | (pts
213 | (xy 0 2.54)
214 | (xy 0.762 1.27)
215 | )
216 | (stroke (width 0) (type default) (color 0 0 0 0))
217 | (fill (type none))
218 | )
219 | )
220 | (symbol "+5V_1_1"
221 | (pin power_in line (at 0 0 90) (length 0) hide
222 | (name "+5V" (effects (font (size 1.27 1.27))))
223 | (number "1" (effects (font (size 1.27 1.27))))
224 | )
225 | )
226 | )
227 | (symbol "power:GND" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes)
228 | (property "Reference" "#PWR" (id 0) (at 0 -6.35 0)
229 | (effects (font (size 1.27 1.27)) hide)
230 | )
231 | (property "Value" "GND" (id 1) (at 0 -3.81 0)
232 | (effects (font (size 1.27 1.27)))
233 | )
234 | (property "Footprint" "" (id 2) (at 0 0 0)
235 | (effects (font (size 1.27 1.27)) hide)
236 | )
237 | (property "Datasheet" "" (id 3) (at 0 0 0)
238 | (effects (font (size 1.27 1.27)) hide)
239 | )
240 | (property "ki_keywords" "power-flag" (id 4) (at 0 0 0)
241 | (effects (font (size 1.27 1.27)) hide)
242 | )
243 | (property "ki_description" "Power symbol creates a global label with name \"GND\" , ground" (id 5) (at 0 0 0)
244 | (effects (font (size 1.27 1.27)) hide)
245 | )
246 | (symbol "GND_0_1"
247 | (polyline
248 | (pts
249 | (xy 0 0)
250 | (xy 0 -1.27)
251 | (xy 1.27 -1.27)
252 | (xy 0 -2.54)
253 | (xy -1.27 -1.27)
254 | (xy 0 -1.27)
255 | )
256 | (stroke (width 0) (type default) (color 0 0 0 0))
257 | (fill (type none))
258 | )
259 | )
260 | (symbol "GND_1_1"
261 | (pin power_in line (at 0 0 270) (length 0) hide
262 | (name "GND" (effects (font (size 1.27 1.27))))
263 | (number "1" (effects (font (size 1.27 1.27))))
264 | )
265 | )
266 | )
267 | )
268 |
269 | (junction (at 99.06 60.96) (diameter 0) (color 0 0 0 0)
270 | (uuid 518c9cbd-2514-468a-adff-032b09ccbf07)
271 | )
272 | (junction (at 106.68 60.96) (diameter 0) (color 0 0 0 0)
273 | (uuid 882920e0-3781-4292-baa7-ff08e4a0b4b9)
274 | )
275 |
276 | (wire (pts (xy 99.06 55.88) (xy 99.06 60.96))
277 | (stroke (width 0) (type default) (color 0 0 0 0))
278 | (uuid 13ff5dde-3482-43a9-b791-e12142833a1f)
279 | )
280 | (wire (pts (xy 107.95 55.88) (xy 107.95 60.96))
281 | (stroke (width 0) (type default) (color 0 0 0 0))
282 | (uuid 1bdcf008-8bc5-4ba5-b8c0-949b08af2bec)
283 | )
284 | (wire (pts (xy 107.95 55.88) (xy 106.68 55.88))
285 | (stroke (width 0) (type default) (color 0 0 0 0))
286 | (uuid 1f21e670-49cb-478c-aed2-e0bf00e2c674)
287 | )
288 | (wire (pts (xy 107.95 60.96) (xy 106.68 60.96))
289 | (stroke (width 0) (type default) (color 0 0 0 0))
290 | (uuid 447c2ad5-3a2f-4c2d-ad2d-bd12a4482044)
291 | )
292 |
293 | (label "PV1" (at 91.44 60.96 180)
294 | (effects (font (size 1.27 1.27)) (justify right bottom))
295 | (uuid 3e1c4c69-27ca-4645-a1ac-128b7c3f01d0)
296 | )
297 |
298 | (symbol (lib_id "power:+5V") (at 91.44 60.96 0) (mirror x) (unit 1)
299 | (in_bom yes) (on_board yes)
300 | (uuid 1a15b6bb-1aae-49ad-a5f0-a2e352fdf924)
301 | (property "Reference" "#PWR?" (id 0) (at 91.44 57.15 0)
302 | (effects (font (size 1.27 1.27)) hide)
303 | )
304 | (property "Value" "+5V" (id 1) (at 91.44 64.77 0))
305 | (property "Footprint" "" (id 2) (at 91.44 60.96 0)
306 | (effects (font (size 1.27 1.27)) hide)
307 | )
308 | (property "Datasheet" "" (id 3) (at 91.44 60.96 0)
309 | (effects (font (size 1.27 1.27)) hide)
310 | )
311 | (pin "1" (uuid cfc6c773-c013-4680-a304-5d367dcc4791))
312 | )
313 |
314 | (symbol (lib_id "Device:R_US") (at 95.25 60.96 90) (unit 1)
315 | (in_bom yes) (on_board yes)
316 | (uuid 2c592067-cbcc-4cfa-b689-9786ce94ef6c)
317 | (property "Reference" "R?" (id 0) (at 95.25 54.61 90)
318 | (effects (font (size 1.27 1.27)) hide)
319 | )
320 | (property "Value" "330R" (id 1) (at 95.25 58.42 90))
321 | (property "Footprint" "" (id 2) (at 95.504 59.944 90)
322 | (effects (font (size 1.27 1.27)) hide)
323 | )
324 | (property "Datasheet" "~" (id 3) (at 95.25 60.96 0)
325 | (effects (font (size 1.27 1.27)) hide)
326 | )
327 | (pin "1" (uuid 48b3c2aa-ccbe-4bbd-9262-55fb47c20ff9))
328 | (pin "2" (uuid a7fce068-cdff-4377-ad5d-33a580e9ac96))
329 | )
330 |
331 | (symbol (lib_id "power:GND") (at 106.68 60.96 0) (unit 1)
332 | (in_bom yes) (on_board yes)
333 | (uuid 5e2e6b94-c94f-4f0e-b1f2-e63d53b53aa2)
334 | (property "Reference" "#PWR?" (id 0) (at 106.68 67.31 0)
335 | (effects (font (size 1.27 1.27)) hide)
336 | )
337 | (property "Value" "GND" (id 1) (at 106.68 64.77 0))
338 | (property "Footprint" "" (id 2) (at 106.68 60.96 0)
339 | (effects (font (size 1.27 1.27)) hide)
340 | )
341 | (property "Datasheet" "" (id 3) (at 106.68 60.96 0)
342 | (effects (font (size 1.27 1.27)) hide)
343 | )
344 | (pin "1" (uuid 8f9f436d-e0da-42f3-9da0-b67a0c5b7b70))
345 | )
346 |
347 | (symbol (lib_id "Device:LED") (at 102.87 60.96 180) (unit 1)
348 | (in_bom yes) (on_board yes)
349 | (uuid 6b215902-553a-4860-a317-c40e476349cd)
350 | (property "Reference" "D?" (id 0) (at 104.4575 53.34 0)
351 | (effects (font (size 1.27 1.27)) hide)
352 | )
353 | (property "Value" "LED" (id 1) (at 102.87 58.42 0))
354 | (property "Footprint" "" (id 2) (at 102.87 60.96 0)
355 | (effects (font (size 1.27 1.27)) hide)
356 | )
357 | (property "Datasheet" "~" (id 3) (at 102.87 60.96 0)
358 | (effects (font (size 1.27 1.27)) hide)
359 | )
360 | (pin "1" (uuid 5bc92f5b-76ff-43ab-818c-bcdc8fa8765c))
361 | (pin "2" (uuid 0197262b-f60a-4f5b-aa7c-b27aedc2bf7a))
362 | )
363 |
364 | (symbol (lib_id "Device:LED") (at 102.87 55.88 0) (mirror x) (unit 1)
365 | (in_bom yes) (on_board yes)
366 | (uuid de2f7359-7b40-45f5-9e89-bbb18cd5ae65)
367 | (property "Reference" "D?" (id 0) (at 101.2825 48.26 0)
368 | (effects (font (size 1.27 1.27)) hide)
369 | )
370 | (property "Value" "LED" (id 1) (at 102.87 53.34 0))
371 | (property "Footprint" "" (id 2) (at 102.87 55.88 0)
372 | (effects (font (size 1.27 1.27)) hide)
373 | )
374 | (property "Datasheet" "~" (id 3) (at 102.87 55.88 0)
375 | (effects (font (size 1.27 1.27)) hide)
376 | )
377 | (pin "1" (uuid 765f2c90-e4c9-459a-9204-0103e1ac70df))
378 | (pin "2" (uuid 8592b71d-3652-4955-a50c-ed4a0458addc))
379 | )
380 |
381 | (sheet_instances
382 | (path "/" (page "1"))
383 | )
384 |
385 | (symbol_instances
386 | (path "/1a15b6bb-1aae-49ad-a5f0-a2e352fdf924"
387 | (reference "#PWR?") (unit 1) (value "+5V") (footprint "")
388 | )
389 | (path "/5e2e6b94-c94f-4f0e-b1f2-e63d53b53aa2"
390 | (reference "#PWR?") (unit 1) (value "GND") (footprint "")
391 | )
392 | (path "/6b215902-553a-4860-a317-c40e476349cd"
393 | (reference "D?") (unit 1) (value "LED") (footprint "")
394 | )
395 | (path "/de2f7359-7b40-45f5-9e89-bbb18cd5ae65"
396 | (reference "D?") (unit 1) (value "LED") (footprint "")
397 | )
398 | (path "/2c592067-cbcc-4cfa-b689-9786ce94ef6c"
399 | (reference "R?") (unit 1) (value "330R") (footprint "")
400 | )
401 | )
402 | )
403 |
--------------------------------------------------------------------------------
/Getting Started/images/blink_led_reverse.svg:
--------------------------------------------------------------------------------
1 |
2 |
542 |
--------------------------------------------------------------------------------
/Getting Started/images/capacitor.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fossasia/pslab-notebooks/f6b41fe79350787abc4f94f26008c600d30421cf/Getting Started/images/capacitor.jpg
--------------------------------------------------------------------------------
/Getting Started/images/resistor.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fossasia/pslab-notebooks/f6b41fe79350787abc4f94f26008c600d30421cf/Getting Started/images/resistor.jpg
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright © 2023 PSLab developers
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PSLab Notebooks
2 |
3 | This repository () contains a series
4 | of tutorials and exercises for the [Pocket Science Lab]()
5 | (PSLab) [Python library]().
6 |
7 | ## Downloading the notebooks
8 |
9 | Download the tutorial notebooks by either
10 |
11 | - `git clone`ing this repository ()
12 | - `cd` into it
13 |
14 | or
15 |
16 | - Download this repository as a ZIP archive by clicking the green
17 | '<> Code'-button in the Github web interface, and then select "Download ZIP"
18 | - Unpack the ZIP archive and `cd` into it
19 |
20 | ## Requirements
21 |
22 | The following software is required to run the notebooks:
23 |
24 | - Python 3.9 or later
25 | - On some Linux distributions (notably Debian, Ubuntu) the packages
26 | `python3-pip` and `python3-venv` must be installed from the distribution's
27 | repositories
28 |
29 | ### Additional Linux-specific requirements
30 |
31 | Windows and MacOS users can skip this section.
32 |
33 | Your user most likely does not have permission to access serial ports, which
34 | means you can't talk to the PSLab yet. You need to become a member of the
35 | group which owns the serial port device file. The device file is typically
36 | called '/dev/ttyUSB0', and the owner group is usually either 'dialout' (on
37 | Debian-, RedHat-, and Suse-based systems) or 'uucp' (on Arch-based systems).
38 |
39 | Check which group owns the serial port with this command (replace
40 | '/dev/ttyUSB0' with the actual path of your device file, if necessary):
41 |
42 | ```bash
43 | stat -c %G /dev/ttyUSB0
44 | ```
45 |
46 | The output from this command should be a single group name, e.g.
47 |
48 | ```bash
49 | dialout
50 | ```
51 |
52 | You need to be a member of this group. Check if you already are with (replace
53 | 'dialout' with the name of the owner group, if necessary):
54 |
55 | ```bash
56 | getent group dialout
57 | ```
58 |
59 | The output of this command should be a line from '/etc/group', e.g.
60 |
61 | ```bash
62 | dialout:x:20:alexander
63 | ```
64 |
65 | If your username is present in the response, you are already a member of the
66 | group. You can move on to the next section of the guide.
67 |
68 | If your username is not present in the response, you are not a member of the
69 | group which owns the serial port. On most distros, this can be done with
70 | (replace 'dialout' with the name of the owner group, if necessary, and
71 | 'username' with your username):
72 |
73 | ```bash
74 | usermod -aG dialout username
75 | ```
76 |
77 | You need to log out and log back in for the group change to take effect.
78 |
79 | ## Installing `pslab`
80 |
81 | - Create a Python venv (virtual environment) with `python3 -m venv venv`
82 | - Activate the virtual environment.
83 | - On Linux or MacOS, run `source ./venv/bin/activate`
84 | - On Windows, run `./venv/Scripts/activate.bat`
85 | - Install the dependencies: Run `pip install -r requirements.txt`
86 |
87 | ## Verifying the installation
88 |
89 | Once installed, connect the PSLab board and verify that you can connect to it
90 | by running `pslab collect -c 1 -d 0.00001 oscilloscope`. This will sample the
91 | voltage on the PSLab's CH1 pin for 10 µs. The output should look something
92 | like:
93 |
94 | ```
95 | Timestamp,CH1
96 | 0.0,0.016129032258064058
97 | 0.5,0.016129032258064058
98 | 1.0,0.016129032258064058
99 | 1.5,0.016129032258064058
100 | 2.0,0.016129032258064058
101 | 2.5,0.016129032258064058
102 | 3.0,0.016129032258064058
103 | 3.5,0.016129032258064058
104 | 4.0,0.016129032258064058
105 | 4.5,0.016129032258064058
106 | 5.0,0.016129032258064058
107 | 5.5,0.016129032258064058
108 | 6.0,0.016129032258064058
109 | 6.5,0.016129032258064058
110 | 7.0,0.016129032258064058
111 | 7.5,0.016129032258064058
112 | 8.0,0.016129032258064058
113 | 8.5,0.016129032258064058
114 | 9.0,0.016129032258064058
115 | 9.5,0.016129032258064058
116 | ```
117 |
118 | If you get an error saying
119 | `serial.serialutil.SerialException: Device not found.`, try another USB-cable.
120 |
121 | Once this installation is complete, launch Jupyter Notebooks by running
122 | `jupyter notebook`. A web interface should open in your default browser,
123 | showing the current directory. You can open notebooks (.ipynb-files) by
124 | clicking on them.
125 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | pslab>=3.1
2 | matplotlib
3 | jupyter
--------------------------------------------------------------------------------