├── .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 | "![resistance](images/resistor.jpg)" 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+6vsRgaGoqhoaHRjwcGBur9kA2tKIr4X7c+HHue/uUJ3X7hnFPjWx9b7Bu9Qdln9dhptdjnxKv7r5v29fVFV1fX6KWnp6feD9nQBo8On/A3eETE7qd/ecKlzcSzz+qx02qxz4lX92cs1q1bF2vXrh39eGBgYNLHxYt2/5+lMaO15RX/7IUjw7Hwr783wRNxMuyzeuy0WuxzYtQ9LNra2qKtra3eD9OUZrS2xIzWavzGL/ZZRXZaLfY5MfzLmwBAmjGn2/PPPx9PPfXU6Mc/+9nPYt++fXHaaafF7NmzU4cDAJrLmMNi9+7d8Yd/+IejH7/4+omVK1fGnXfemTYYANB8xhwWl1xySUzw24sAAE3CaywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTCAgBIIywAgDTjCotbbrklzjrrrJg+fXosWrQoHn300ey5AIAmNOawuOeee2Lt2rWxfv362Lt3b8ybNy8uv/zyOHjwYD3mAwCayNSxfsKNN94YH/3oR+Pqq6+OiIhbb701/vmf/zm+8Y1vxLXXXps+4IkoiiIGjw6X8thj9cKRsc85ns9hYthn9dhptdjNxBtTWBw5ciT27NkT69atG71uypQpsXTp0nj44Ydf8XOGhoZiaGho9OOBgYFxjnp8g0eH4/zPbU6/30ax8K+/V/YIJLLP6rFT+K0xnQr5xS9+EcPDw3HGGWccc/0ZZ5wRzz777Ct+Tl9fX3R1dY1eenp6xj9thSycc2q0T2s57p+3T2uJhXNOncCJOBn2WT12Wi2vtU/y1IqiKE70xgcOHIg3velN8e///u+xePHi0es/+clPxvbt2+ORRx552ee80jMWPT090d/fH52dnSc5/m8006mQF7VPa4larfaqt2nG45qs7LN67LRaXmufL93liex+MhoYGIiurq7X/Pk9plMhr3/966OlpSWee+65Y65/7rnn4o1vfOMrfk5bW1u0tbWN5WHGrFarxYzWMb9cpOFV9bgmK/usHjutDrvMM6ZTIa2trbFgwYLYunXr6HUjIyOxdevWY57BAAAmpzHn2dq1a2PlypWxcOHCuPjii+MrX/lKHD58ePS3RACAyWvMYXHVVVfFz3/+8/jc5z4Xzz77bPze7/1ePPjggy97QScAMPmM6cWbGU70xR8AQOM40Z/f3isEAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgjLACANMICAEgz4W/l9uI/9DkwMDDRDw0AjNOLP7df6x/snvCwOHToUERE9PT0TPRDAwAn6dChQ9HV1XXcP5/w9woZGRmJAwcOREdHR9RqtbT7HRgYiJ6enti/f3+l34NkshxnxOQ5VsdZLY6zWibLcUa89rEWRRGHDh2K7u7umDLl+K+kmPBnLKZMmRKzZs2q2/13dnZWfvkRk+c4IybPsTrOanGc1TJZjjPi1Y/11Z6peJEXbwIAaYQFAJCmMmHR1tYW69evj7a2trJHqavJcpwRk+dYHWe1OM5qmSzHGZF3rBP+4k0AoLoq84wFAFA+YQEApBEWAEAaYQEApKlMWNxyyy1x1llnxfTp02PRokXx6KOPlj1Sqh07dsTy5cuju7s7arVa3HfffWWPVBd9fX3xjne8Izo6OmLmzJlx5ZVXxpNPPln2WOk2bNgQc+fOHf2HaBYvXhwPPPBA2WPV3Q033BC1Wi3WrFlT9ijpPv/5z0etVjvmct5555U9Vl3893//d/zZn/1ZnH766dHe3h5vf/vbY/fu3WWPleqss8562T5rtVr09vaWPVqq4eHh+OxnPxtnn312tLe3x1ve8pb44he/+JrvB/JqKhEW99xzT6xduzbWr18fe/fujXnz5sXll18eBw8eLHu0NIcPH4558+bFLbfcUvYodbV9+/bo7e2NnTt3xpYtW+Lo0aPx3ve+Nw4fPlz2aKlmzZoVN9xwQ+zZsyd2794dl156abzvfe+LH/zgB2WPVje7du2K2267LebOnVv2KHVzwQUXxDPPPDN6eeihh8oeKd0vf/nLWLJkSUybNi0eeOCB+OEPfxh/+7d/G6eeemrZo6XatWvXMbvcsmVLRER84AMfKHmyXF/60pdiw4YNcfPNN8ePfvSj+NKXvhRf/vKX46abbhr/nRYVcPHFFxe9vb2jHw8PDxfd3d1FX19fiVPVT0QUmzZtKnuMCXHw4MEiIort27eXPUrdnXrqqcXf/d3flT1GXRw6dKh461vfWmzZsqX4gz/4g2L16tVlj5Ru/fr1xbx588oeo+4+9alPFe9617vKHmPCrV69unjLW95SjIyMlD1KqiuuuKJYtWrVMde9//3vL1asWDHu+2z6ZyyOHDkSe/bsiaVLl45eN2XKlFi6dGk8/PDDJU5Ghv7+/oiIOO2000qepH6Gh4fj7rvvjsOHD8fixYvLHqcuent744orrjjmv9Mq+slPfhLd3d3x5je/OVasWBH/9V//VfZI6b7zne/EwoUL4wMf+EDMnDkzLrroovja175W9lh1deTIkfjmN78Zq1atSn3zzEbwzne+M7Zu3Ro//vGPIyLi+9//fjz00EOxbNmycd/nhL8JWbZf/OIXMTw8HGecccYx159xxhnxH//xHyVNRYaRkZFYs2ZNLFmyJC688MKyx0n3+OOPx+LFi+NXv/pVvO51r4tNmzbF+eefX/ZY6e6+++7Yu3dv7Nq1q+xR6mrRokVx5513xrnnnhvPPPNMfOELX4h3v/vd8cQTT0RHR0fZ46X56U9/Ghs2bIi1a9fGpz/96di1a1f8xV/8RbS2tsbKlSvLHq8u7rvvvvif//mf+PCHP1z2KOmuvfbaGBgYiPPOOy9aWlpieHg4rrvuulixYsW477Ppw4Lq6u3tjSeeeKKS56kjIs4999zYt29f9Pf3xz/8wz/EypUrY/v27ZWKi/3798fq1atjy5YtMX369LLHqauX/g1v7ty5sWjRopgzZ07ce++98ZGPfKTEyXKNjIzEwoUL4/rrr4+IiIsuuiieeOKJuPXWWysbFl//+tdj2bJl0d3dXfYo6e6999646667YuPGjXHBBRfEvn37Ys2aNdHd3T3ufTZ9WLz+9a+PlpaWeO655465/rnnnos3vvGNJU3Fybrmmmviu9/9buzYsSNmzZpV9jh10draGuecc05ERCxYsCB27doVX/3qV+O2224rebI8e/bsiYMHD8b8+fNHrxseHo4dO3bEzTffHENDQ9HS0lLihPXzO7/zO/G2t70tnnrqqbJHSXXmmWe+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 | 17 | 19 | 42 | SVG Picture created as blink_led.svg date 2023/02/05 20:37:01 44 | Picture generated by Eeschema-SVG 46 | 50 | 54 | 56 | 60 | 64 | 68 | +5V 77 | 80 | +5V 82 | 85 | 88 | 91 | 94 | 95 | 96 | 97 | 101 | 103 | 106 | 110 | 111 | 114 | 118 | 119 | 122 | 126 | 127 | 130 | 134 | 138 | 141 | 144 | LED 153 | 156 | LED 158 | 161 | 164 | 167 | 170 | 171 | 172 | 173 | 177 | 179 | 183 | 187 | 191 | 195 | 199 | 202 | 205 | 330R 214 | 217 | 330R 219 | 222 | 225 | 228 | 231 | 234 | 235 | 236 | 237 | 241 | 243 | 247 | GND 256 | 259 | GND 261 | 264 | 267 | 270 | 271 | 272 | 273 | 277 | 281 | PV1 290 | 293 | PV1 295 | 298 | 301 | 304 | 307 | 308 | +5V 317 | 320 | +5V 322 | 325 | 328 | 331 | 334 | 335 | LED 344 | 347 | LED 349 | 352 | 355 | 358 | 361 | 362 | 365 | 368 | 330R 377 | 380 | 330R 382 | 385 | 388 | 391 | 394 | 397 | 398 | 401 | 404 | GND 413 | 416 | GND 418 | 421 | 424 | 427 | 428 | 429 | 431 | 432 | 434 | SVG Picture created as blink_led.svg date 2023/02/05 20:37:01 435 | 436 | 437 | 438 | 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 | 17 | 19 | 42 | SVG Picture created as blink_led_reverse.svg date 2023/02/05 21:39:39 44 | Picture generated by Eeschema-SVG 46 | 50 | 54 | 56 | 60 | GND 69 | 72 | GND 74 | 77 | 80 | 83 | 84 | 85 | 86 | 90 | 92 | 95 | 99 | 100 | 103 | 107 | 108 | 111 | 115 | 116 | 119 | 123 | 127 | 130 | 133 | LED 142 | 145 | LED 147 | 150 | 153 | 156 | 159 | 160 | 161 | 162 | 166 | 168 | 171 | 175 | 176 | 179 | 183 | 184 | 187 | 191 | 192 | 195 | 199 | 203 | 206 | 209 | LED 218 | 221 | LED 223 | 226 | 229 | 232 | 235 | 236 | 237 | 238 | 242 | 244 | 248 | 252 | 256 | 260 | 264 | 267 | 270 | 330R 279 | 282 | 330R 284 | 287 | 290 | 293 | 296 | 299 | 300 | 301 | 302 | 306 | 308 | 312 | 316 | 320 | +5V 329 | 332 | +5V 334 | 337 | 340 | 343 | 346 | 347 | 348 | 349 | 353 | 357 | PV1 366 | 369 | PV1 371 | 374 | 377 | 380 | 383 | 384 | 387 | 390 | 393 | 396 | GND 405 | 408 | GND 410 | 413 | 416 | 419 | 420 | LED 429 | 432 | LED 434 | 437 | 440 | 443 | 446 | 447 | 450 | 453 | 330R 462 | 465 | 330R 467 | 470 | 473 | 476 | 479 | 482 | 483 | 486 | 489 | +5V 498 | 501 | +5V 503 | 506 | 509 | 512 | 515 | 516 | 517 | 521 | 526 | 531 | 532 | 534 | 535 | 537 | SVG Picture created as blink_led_reverse.svg date 2023/02/05 21:39:39 538 | 539 | 540 | 541 | 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 --------------------------------------------------------------------------------