├── .github └── workflows │ └── build_test.yml ├── .gitignore ├── LICENSE ├── README.md ├── control_scripts ├── betaBoard_interface.py ├── check_waveform_length.py ├── plot_spectrum.py ├── record.py ├── recordings │ ├── .gitignore │ └── plot_distributions_comparison.py └── tools.py ├── firmware ├── CMakeLists.txt ├── README.md ├── build │ └── .gitignore ├── clean.sh ├── flash.sh ├── gen_version_header.sh ├── make.sh ├── pico_extras_import.cmake ├── pico_sdk_import.cmake └── src │ ├── adc_dma.hpp │ ├── config.h │ ├── fifo.hpp │ ├── main.cpp │ └── version.h ├── hardware ├── README.md ├── betaBoard.pretty │ ├── AMPHENOL_10103592-0001LF.kicad_mod │ ├── C26638.kicad_mod │ ├── JLC_tooling_hole.kicad_mod │ ├── Osram_BPW34S-SMD_hole.kicad_mod │ ├── PinHeader_1x02_P2.54mm_castellation.kicad_mod │ ├── TS-1187A-B-A-B.kicad_mod │ └── betaBoard_r2.0_outlines.kicad_mod ├── betaBoard_r1.0 │ ├── betaBoard.kicad_pcb │ ├── betaBoard.kicad_pro │ ├── betaBoard.kicad_sch │ ├── fp-info-cache │ ├── fp-lib-table │ ├── frontend.kicad_sch │ ├── mcu.kicad_sch │ ├── pdf │ │ ├── betaBoard_pcb.pdf │ │ └── betaBoard_sch.pdf │ └── production │ │ └── betaBoard_R1.0_2024-01-08_ordered │ │ ├── betaBoard_R1.0.zip │ │ ├── bom.csv │ │ ├── designators.csv │ │ ├── netlist.ipc │ │ └── positions.csv ├── betaBoard_r2.0 │ ├── betaBoard.kicad_pcb │ ├── betaBoard.kicad_pro │ ├── betaBoard.kicad_sch │ ├── betaBoard_r2.0_pcb.pdf │ ├── betaBoard_r2.0_positions.pdf │ ├── betaBoard_r2.0_sch.pdf │ ├── frontend.kicad_sch │ ├── frontend_alpha.kicad_sch │ ├── mcu.kicad_sch │ └── mid_panel_r2.0 │ │ ├── mid_panel_r2.0.kicad_pcb │ │ ├── mid_panel_r2.0.kicad_pro │ │ └── mid_panel_r2.0.kicad_sch ├── mid_panel_r2.0 │ ├── mid_panel_r2.0.kicad_pcb │ ├── mid_panel_r2.0.kicad_pro │ └── mid_panel_r2.0.kicad_sch ├── new_mid_panel_r2.0 │ ├── mid_panel_r2.0.kicad_pcb │ ├── mid_panel_r2.0.kicad_pro │ └── mid_panel_r2.0.kicad_sch └── top_panel_r2.0 │ ├── top_panel_r2.0.kicad_pcb │ ├── top_panel_r2.0.kicad_pro │ └── top_panel_r2.0.kicad_sch └── other ├── calculations └── dEdx.py ├── datasheets ├── hardware-design-with-rp2040.pdf └── rp2040-datasheet.pdf ├── digital_filter ├── demo_interf_code.py └── filter.py ├── img ├── avg_pulse_and_spectrum.png ├── first_pulse_maybe.png ├── hello_world.gif ├── noise_level_analysis.png ├── noise_lpf.png ├── noise_lpf.svg ├── picture_pcb_r1.jpeg ├── picture_pcb_r2.jpeg ├── r1.0_pcb_back.png └── r1.0_pcb_front.png ├── micropython ├── README.md ├── config.py ├── flash.sh ├── flash_main.sh ├── main.py ├── plot.py ├── rp_devices.py └── test.sh └── spice_sim ├── Draft1.asc ├── original.asc ├── r1_design.asc ├── r1_design_adjust.asc └── r1_design_adjust.plt /.github/workflows/build_test.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: [push] 3 | jobs: 4 | build-test-code: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - name: install pico-sdk dependencies 8 | run: sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 9 | 10 | - name: Check out repository code 11 | uses: actions/checkout@v3 12 | 13 | - name: get pico-sdk 14 | run: git clone --depth 1 https://github.com/raspberrypi/pico-sdk.git 15 | 16 | - name: build 17 | run: export PICO_SDK_PATH=`pwd`/pico-sdk; cd firmware; ./make.sh 18 | 19 | - name: Artifact ELF 20 | uses: actions/upload-artifact@v3 21 | with: 22 | name: RP2040 firmware ELF 23 | path: firmware/build/betaBoard.elf 24 | 25 | - name: Artifact UF2 26 | uses: actions/upload-artifact@v3 27 | with: 28 | name: RP2040 firmware UF2 29 | path: firmware/build/betaBoard.uf2 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .*.sw* 2 | .*.sw* 3 | .sw* 4 | 5 | *-backups/ 6 | 7 | fp-info-cache 8 | fp-lib-table 9 | 10 | *.kicad_prl 11 | *.log 12 | 13 | hardware/*/production/ 14 | 15 | firmware/src/version.c 16 | .DS_store 17 | 18 | *.json 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2023-2024, Tim Kuhlbusch 4 | 5 | All rights reserved. 6 | 7 | Redistribution and use in source and binary forms, with or without 8 | modification, are permitted provided that the following conditions are met: 9 | 10 | 1. Redistributions of source code must retain the above copyright notice, this 11 | list of conditions and the following disclaimer. 12 | 13 | 2. Redistributions in binary form must reproduce the above copyright notice, 14 | this list of conditions and the following disclaimer in the documentation 15 | and/or other materials provided with the distribution. 16 | 17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 21 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 23 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 24 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 25 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Build status](https://github.com/timbk/BetaBoard/actions/workflows/build_test.yml/badge.svg) 2 | 3 | # BetaBoard 4 | 5 | A particle detector built for cost-effectiveness when ordered at O(100) pieces. 6 | 7 | The detector concept is adapted from the [DIY Particle Detector Project](https://github.com/ozel/DIY_particle_detector) by Oliver Keller. 8 | 9 | ## Hardware Revisions 10 | 11 | | Revision 1 | Revision 2 | 12 | | :---: | :---: | 13 | | | | 14 | | [Schematic](hardware/betaBoard_r1.0/pdf/betaBoard_sch.pdf) [Layout](hardware/betaBoard_r1.0/pdf/betaBoard_pdf.pdf) | [Schematic](hardware/betaBoard_r2.0/betaBoard_r2.0_sch.pdf) [Layout](hardware/betaBoard_r2.0/betaBoard_r2.0_pcb.pdf) [Component Positions](hardware/betaBoard_r2.0/betaBoard_r2.0_positions.pdf) | 15 | | Initial protoype: Working with adjustemtns to a few component values. Requires a lot of electrical and conductive tape to assemble. Designed for 16 diodes with the option to measure coincidences. | Streamlined redesign. Mainly adding a PCB casing to block light and radio imission. Attempting to add a simple alpha particle detector channel by stripping the isolation off of a diode (not successfull yet). Single channel with 6 diodes in parallel. Using additional ADC channels with less gain for debugging and potential experiments with scintillators. | 16 | 17 | ## Experiment Ideas 18 | 19 | * Time distribution of pulses 20 | * Rate vs distance (1/d^2 + offset) 21 | * Absorption coefficient 22 | * Increase material thickness between detector and source 23 | * Spectroscopy?? (alphas, sand down diode? 24 | * Balloon in cellar 25 | 26 | ## Serial interface 27 | 28 | * `T` `T # .. ` 29 | * `block_index`: uint16_t, mainly relevant for debugging 30 | * `timestamp_us`: uint64_t, Trigger point timestamp in micro seconds since start of the measurement 31 | * `overflow`: bool, set to 1 if an overflow happend prior to this sample 32 | * `sample_n`: int16_t, samples from the triggered waveform 33 | 34 | ## PCB 35 | 36 | ![PCB front view](other/img/r1.0_pcb_front.png) 37 | ![PCB back view](other/img/r1.0_pcb_back.png) 38 | 39 | [Schematic](betaBoard/pdf/betaBoard_sch.pdf) 40 | [Layout](betaBoard/pdf/betaBoard_pdf.pdf) 41 | 42 | The goal was to keep it small to keep the PCB cost low and to make it fit easily. 43 | Components were chosen to keep the price low and based on availablility at the chosen manufacturer. 44 | 45 | ## Ideas 46 | 47 | * Strip detector with 4 pixels? 48 | * File down SMD LEDs for less absorption? 49 | * 3D-Printed Case? 50 | * Interconnect multiple detectors? 51 | 52 | ## R2.0 ideas 53 | 54 | * Put VCC on interconnect instead of 3V3 55 | * Review diode cutout size 56 | * Increase power supply castellated hole distance 57 | * Increase LDO heat sink plane size 58 | * Think about how usefull the coincidence concept is: 2x2 = 2+2 = 4! 59 | * Silk to highlight Diode grouping 60 | * Seperate bulk capacitor on 5V rail for analog 61 | 62 | ## Noise calculations 63 | 64 | * Spice simulation: peak of ca. 40 $\mu\text{V}/\sqrt{\text{Hz}}$ 65 | * Resistor thermal noise: $\sqrt{4k_BTR}\approx 400 ~ \text{nV/}\sqrt{\text{Hz}}$ 66 | * LM358 input noise is ca. 40 $\text{nV}/\sqrt{\text{Hz}}$ 67 | * Gain of second stage is ca. 100 for the peak frequency 68 | * => Resistor thermal noise is dominant part in simulation, LM385 noise should be negligible 69 | * $100 \cdot 400~\text{nV}/\sqrt{\text{Hz}} \approx 40~\mu\text{V}/\sqrt{\text{Hz}}$ 70 | 71 | ![Noise plot](other/img/noise_level_analysis.png) 72 | 73 | ## Potential signal sources 74 | 75 | * 10g KCl has ca. 164 Bq. 76 | * Estimate of geometric acceptency at 2 cm distance: $A = \frac{4 \cdot 7.5~\text{mm}^2} {4\pi\cdot (20~\text{mm})^2} \approx 0.006$ 77 | * With perfect efficiency: ca. 1 Hz 78 | -------------------------------------------------------------------------------- /control_scripts/betaBoard_interface.py: -------------------------------------------------------------------------------- 1 | import serial 2 | import numpy as np 3 | 4 | class betaBoard: 5 | ADCC_TO_V = 3.3 / 2**12 6 | 7 | def __init__(self, device:str, timeout=0.01): 8 | """ 9 | Constructor 10 | device: (str) Address of the USB serial device 11 | Linux: '/dev/ttyACMX' 12 | Mac: '/dev/tty.usbmodemXXX' 13 | Windows: 'COMX' 14 | X = Random number 15 | """ 16 | self.timeout = timeout 17 | self.conn = serial.Serial(device, timeout=timeout) 18 | self.pulses = [] 19 | 20 | self.response_queue = [] 21 | self.pulses = [] 22 | 23 | def _parse_queue(self): 24 | ''' parse messages in the response queue (not matched to any request) ''' 25 | # for now: all messages are triggers 26 | for entry in self.response_queue: 27 | entry = entry.split(' ') 28 | 29 | if entry[0] != 'OT': 30 | print(f'Warning: Unexpected message start: {repr(entry[0])}') 31 | continue 32 | if entry[6] != '#': 33 | print(f'Warning: Could not find \'#\' at index 6 of OT trigger message') 34 | continue 35 | 36 | try: 37 | block_idx = int(entry[1]) 38 | timestamp = int(entry[2]) 39 | overflow = bool(int(entry[3])) 40 | trigger_counter = int(entry[4]) 41 | block_edge_trigger = bool(int(entry[5])) 42 | waveform = np.array([int(i) for i in entry[7:-1]]) 43 | 44 | new_data = (block_idx, timestamp, overflow, waveform, trigger_counter, block_edge_trigger) 45 | self.pulses.append(new_data) 46 | except Exception as e: 47 | print(f'Warning: Could not parse integers in OT trigger message') 48 | print(e) 49 | print(repr(entry)) 50 | continue 51 | self.response_queue = [] 52 | 53 | def _clear(self, max_queue_size=None): 54 | self.conn.timeout = 0.001 55 | 56 | while True: 57 | response = self.conn.readline() 58 | if len(response) == 0: 59 | break 60 | self.response_queue.append(response.decode()) 61 | 62 | if max_queue_size is not None and len(self.response_queue) > max_queue_size: 63 | break 64 | 65 | self.conn.timeout = self.timeout 66 | 67 | def read_messages(self): 68 | ''' clear input buffer ''' 69 | self._clear(10) 70 | self._parse_queue() 71 | 72 | def _execute_command(self, command_char, params=[], ignore_response=False, timeout=None): 73 | """ 74 | Internal macro that sends a command to the device and optionally collects the response 75 | command_char: The command character. Example: 'v' to retrieve the version 76 | params: Optional parameters, list of string 77 | ignore_response: don't parse the response, ignore if none is provided 78 | """ 79 | assert type(command_char)==str and len(command_char)==1, "command must be a single character" 80 | 81 | self._clear() 82 | 83 | # send command 84 | for p in params: 85 | assert type(p) == str 86 | command = f"{command_char} " + ' '.join(params) + '\r' 87 | # print(f'sending {repr(command)}') 88 | self.conn.write(command.encode()) 89 | 90 | # receive response if expected 91 | if not ignore_response: 92 | if timeout is not None: 93 | self.conn.timeout = timeout 94 | 95 | while True: 96 | response = self.conn.readline().decode() 97 | if len(response) == 0: 98 | raise RuntimeError(f'No response or too late response') 99 | if response[0] == 'E': 100 | raise RuntimeError(f'Error to {command_char}: {repr(response)}') 101 | if response[0] != 'O': 102 | raise RuntimeError(f'Unknown response to {command_char}: {repr(response)}') 103 | 104 | if response[1] != command_char: 105 | self.response_queue.append(response) 106 | continue 107 | 108 | return response[3:] 109 | 110 | self.conn.timeout = self.timeout 111 | 112 | def get_version(self): 113 | return self._execute_command('v')[:-2] 114 | 115 | def get_waveform_length(self, _set_values=[]): 116 | """ 117 | retrieve how many samples will be recorded before and after the trigger 118 | returns: sample_count_before, sample_count_after 119 | """ 120 | response = self._execute_command('p', _set_values) 121 | try: 122 | pre = int(response.split(' ')[0]) 123 | post = int(response.split(' ')[1]) 124 | except: 125 | raise RuntimeError(f'Malformed response: {repr(response)}') 126 | return pre, post 127 | 128 | def set_waveform_length(self, pre, post): 129 | """ 130 | set how many samples will be recorded before and after the trigger 131 | pre: sample count before 132 | post: sample count after 133 | returns: sample_count_before, sample_count_after (read back from device) 134 | """ 135 | assert type(pre)==int and pre>0, "pre must be positive integer" 136 | assert type(post)==int and post>0, "post must be positive integer" 137 | 138 | return self.get_waveform_length(_set_values=[str(pre), str(post)]) 139 | 140 | def get_ignore_count(self, _set_values=[]): 141 | response = self._execute_command('i', _set_values) 142 | try: 143 | value = int(response.split(' ')[0]) 144 | except: 145 | raise RuntimeError(f'Malformed response: {repr(response)}') 146 | return value 147 | 148 | def set_ignore_count(self, ignore_count): 149 | assert type(ignore_count)==int and ignore_count>0, "ignore_count must be positive integer" 150 | return self.get_ignore_count([str(ignore_count)]) 151 | 152 | def get_threshold(self, _set_values=[]): 153 | response = self._execute_command('t', _set_values) 154 | try: 155 | value = int(response.split(' ')[0]) 156 | except: 157 | raise RuntimeError(f'Malformed response: {repr(response)}') 158 | return value 159 | 160 | def set_threshold(self, threshold): 161 | assert type(threshold)==int, "threshold must be integer" 162 | if threshold > 0: 163 | print('Warning: Thresholds are typically negative!') 164 | return self.get_threshold([str(threshold)]) 165 | 166 | def get_trigger_status(self, _set_values=[]): 167 | response = self._execute_command('T', _set_values) 168 | try: 169 | value = int(response.split(' ')[0]) 170 | except: 171 | raise RuntimeError(f'Malformed response: {repr(response)}') 172 | return value 173 | 174 | def set_trigger_status(self, trigger_status): 175 | assert trigger_status in [0, 1] 176 | return self.get_trigger_status([str(trigger_status)]) 177 | 178 | def get_data_dump(self, filtered=True): 179 | """ 180 | Retrieve an untriggered sequence of samples 181 | filtered: Set to false to get the values before the high pass filter 182 | returns: numpy array of samples in ADC counts 183 | """ 184 | response = self._execute_command('B' if filtered else 'b', timeout=4) 185 | try: 186 | samples = response.split(' ')[:-1] 187 | samples = np.fromiter(map(int, samples), dtype=np.int16) 188 | except: 189 | raise RuntimeError(f'Malformed response: {repr(response)}') 190 | return samples 191 | 192 | def get_sample_rate(self): 193 | """ Get the sample rate in Hertz """ 194 | response = self._execute_command('s') 195 | try: 196 | value = int(response.split(' ')[0]) 197 | except: 198 | raise RuntimeError(f'Malformed response: {repr(response)}') 199 | return value 200 | 201 | def get_uid(self): 202 | """ Get the (hopefully) unique ID of the board """ 203 | response = self._execute_command('u') 204 | value = response.split(' ')[0].replace('\n', '').replace('\r', '') 205 | return value 206 | 207 | def get_led_status(self, _set_values=[]): 208 | """ get wether the main loop led blinking is enabled """ 209 | response = self._execute_command('l', _set_values) 210 | try: 211 | value = int(response.split(' ')[0]) 212 | except: 213 | raise RuntimeError(f'Malformed response: {repr(response)}') 214 | return value 215 | 216 | def set_led_status(self, led_status): 217 | """ Enable/Disable status led blinking """ 218 | assert led_status in [0, 1] 219 | return self.get_led_status([str(led_status)]) 220 | 221 | def get_channel(self, _set_values=[]): 222 | """ get currently selected channel """ 223 | response = self._execute_command('c', _set_values) 224 | try: 225 | value = int(response.split(' ')[0]) 226 | except: 227 | raise RuntimeError(f'Malformed response: {repr(response)}') 228 | return value 229 | 230 | def set_channel(self, channel): 231 | """ Enable/Disable status led blinking """ 232 | assert channel in [0, 1, 2, 3] 233 | return self.get_channel([str(channel)]) 234 | 235 | if __name__ == '__main__': 236 | import sys, time 237 | from scipy.signal import welch 238 | try: 239 | import plotext as plt 240 | using_plotext = True 241 | except: 242 | import matplotlib.pyplot as plt 243 | using_plotext = False 244 | 245 | bb = betaBoard(sys.argv[1]) 246 | SR = bb.get_sample_rate() 247 | print(f'sample rate: {SR} Hz') 248 | 249 | bb.set_channel(3) # select default channel 250 | 251 | bb.set_led_status(0) # disable LED 252 | 253 | samples = [] 254 | N = 1 255 | for i in range(N): 256 | print(f'{i} / {N}', end='\r') 257 | samples.append( bb.get_data_dump(False) * bb.ADCC_TO_V ) 258 | print() 259 | samples = np.array(samples).flatten() 260 | 261 | hist, bin_edges = np.histogram(samples, bins=40) 262 | 263 | if using_plotext: 264 | plt.plot_size(height=20) 265 | plt.plot(hist, bin_edges[:-1]) 266 | plt.xlabel('Amp output [V]') 267 | plt.show() 268 | 269 | if using_plotext: 270 | plt.clear_figure() 271 | plt.plot_size(height=20) 272 | 273 | plt.plot(np.arange(len(samples))/SR, samples) 274 | plt.ylabel('Amp output [V]') 275 | plt.xlabel('Time [s]') 276 | plt.show() 277 | 278 | f, S = welch(samples, fs=SR, nperseg=len(samples)) 279 | for do_log in range(1): 280 | if using_plotext: 281 | plt.clear_figure() 282 | plt.plot_size(height=20) 283 | 284 | plt.plot(f[1:], S[1:]) 285 | plt.xlabel('Frequency [Hz]') 286 | plt.ylabel('Amp output [V]') 287 | if do_log: 288 | plt.yscale('log') 289 | plt.xscale('log') 290 | plt.show() 291 | 292 | if True: 293 | if using_plotext: 294 | plt.clear_figure() 295 | plt.plot_size(height=20) 296 | 297 | plt.plot(f[1:], S[1:]) 298 | plt.xlabel('Frequency [Hz]') 299 | plt.ylabel('Amp output [V]') 300 | plt.xlim(0, 20000) 301 | plt.show() 302 | 303 | print(f'Mean: {np.mean(samples):.4f}V; Std: {np.std(samples):.4f}V') 304 | 305 | bb.set_threshold(int(-55)) 306 | # print('threshold', bb.get_threshold(), bb.get_threshold()*3.3/2**12) 307 | 308 | bb._clear() 309 | time.sleep(4) 310 | bb._clear() 311 | bb._clear() 312 | print('clear done') 313 | 314 | local_trig_cnt = 0 315 | while True: 316 | bb.read_messages() 317 | 318 | for block_idx, timestamp, overflow, waveform, trigger_counter, block_edge_trigger in bb.pulses: 319 | print() 320 | print(f'time={timestamp*1e-6:.6f}s overflow={overflow} [{trigger_counter}] {local_trig_cnt}') 321 | local_trig_cnt += 1 322 | 323 | plt.clear_figure() 324 | plt.plot_size(height=15) 325 | plt.plot(waveform * bb.ADCC_TO_V) 326 | plt.show() 327 | 328 | bb.pulses = [] 329 | -------------------------------------------------------------------------------- /control_scripts/check_waveform_length.py: -------------------------------------------------------------------------------- 1 | from betaBoard_interface import betaBoard 2 | import sys 3 | 4 | bb = betaBoard(sys.argv[1]) 5 | 6 | bb.set_threshold(-40) 7 | 8 | while True: 9 | bb.read_messages() 10 | 11 | for block_idx, timestamp, overflow, waveform, trigger_counter, block_edge_trigger in bb.pulses: 12 | print(block_idx, timestamp, len(waveform), block_edge_trigger) 13 | bb.pulses = [] 14 | -------------------------------------------------------------------------------- /control_scripts/plot_spectrum.py: -------------------------------------------------------------------------------- 1 | from betaBoard_interface import betaBoard 2 | import sys 3 | # import plotext as plt 4 | import matplotlib.pyplot as plt 5 | import numpy as np 6 | from scipy.signal import sosfilt, butter, welch 7 | from tools import log_average 8 | import time 9 | 10 | # SR = 200e3 11 | SR = 50e3 12 | 13 | def hpf(data): 14 | sosp = butter(1, 1e3/SR, btype='high', output='sos') 15 | print(sosp) 16 | return sosfilt(sosp, data) 17 | 18 | if __name__ == '__main__': 19 | # simulation = np.genfromtxt('amplifier_spice_sim.csv', delimiter=',').T 20 | 21 | bb = betaBoard(sys.argv[1]) 22 | 23 | print("recording"); 24 | samples = [] 25 | N = 50 26 | for i in range(N): 27 | print(f'{i} / {N}', end='\r') 28 | samples.append( bb.get_data_dump(False) * bb.ADCC_TO_V ) 29 | print() 30 | samples = np.array(samples) 31 | 32 | 33 | np.savez(time.strftime("recordings/noise_%Y%m%d-%H%M%S.npz"), samples=samples) 34 | 35 | S = [] 36 | Sf = [] 37 | for waveform in samples: 38 | f, iS = welch(waveform, fs=SR, nperseg=len(waveform)) 39 | S.append(iS) 40 | f, iS = welch(hpf(waveform), fs=SR, nperseg=len(waveform)) 41 | Sf.append(iS) 42 | 43 | plt.plot(*log_average(f[1:], 1e6*np.sqrt(np.mean(S, axis=0)[1:]), 300), label='Measurement') 44 | plt.plot(*log_average(f[1:], 1e6*np.sqrt(np.mean(Sf, axis=0)[1:]), 300), label='Measurement + HPF') 45 | # plt.plot(simulation[0], 1e6*simulation[1], label='Simulation') 46 | # plt.scatter(f[1:], np.sqrt(np.mean(S, axis=0)[1:])) 47 | # plt.axhline(40e-6) 48 | 49 | plt.xlabel('Frequency [Hz]') 50 | plt.ylabel('Amplitude Spectral Density [$\\mu V/\sqrt{\\text{Hz}})$]') 51 | plt.xscale('log') 52 | plt.yscale('log') 53 | plt.xlim(5, 20e3) 54 | # plt.ylim(1, 600) 55 | plt.grid() 56 | plt.legend() 57 | 58 | plt.figure() 59 | plt.plot(samples[0] - np.mean(samples[0])) 60 | 61 | print(f'Mean: {np.mean(samples):.4f}V; Std: {np.std(samples):.4f}V') 62 | 63 | plt.show() 64 | -------------------------------------------------------------------------------- /control_scripts/record.py: -------------------------------------------------------------------------------- 1 | import sys, time 2 | from scipy.signal import welch, butter, sosfilt 3 | try: 4 | import plotext as plt 5 | using_plotext = True 6 | except: 7 | print('To enable live plotting please install plotext') 8 | using_plotext = False 9 | from betaBoard_interface import betaBoard 10 | import numpy as np 11 | from icecream import ic 12 | 13 | # Settings 14 | CHANNEL = 3 # r2: ch3; r1: ch2 15 | # THRESHOLD = int(-65*1.35) 16 | # THRESHOLD = int(-55) 17 | # THRESHOLD = int(-37) 18 | THRESHOLD = int(-30) 19 | # THRESHOLD = int(-30) 20 | # THRESHOLD = int(-55 * 1.9) 21 | print(f'Threshold: {THRESHOLD*3.3/2**12*1e3:.2f} mV') 22 | 23 | # open connection 24 | bb = betaBoard(sys.argv[1]) 25 | bb.set_trigger_status(0) # disable triggering for now 26 | 27 | # clear betaBoard buffer 28 | bb.read_messages() 29 | bb.pulses = list() 30 | 31 | # prepare board 32 | bb.set_threshold(THRESHOLD) 33 | bb.set_channel(CHANNEL) 34 | bb.set_led_status(0) # disable LED 35 | 36 | # get board config 37 | SR = bb.get_sample_rate() 38 | print(f'sample rate: {SR} Hz') 39 | 40 | pre, post = bb.get_waveform_length() 41 | 42 | firmware_version = bb.get_version() 43 | print(f'version: {firmware_version}') 44 | 45 | comment = input('Comment: ') 46 | 47 | # open output file 48 | fname = 'pulses_'+time.strftime("%Y%m%d-%H%M%S")+'.csv' 49 | f = open('recordings/' + fname, 'w') 50 | 51 | # write file header 52 | f.write(f'# Sample rate: {SR}\n') 53 | f.write(f'# Firmware version: {firmware_version}\n') 54 | f.write(f'# Trigger Threshold: {bb.get_threshold()}\n') 55 | f.write(f'# Comment: {comment}\n') 56 | f.write(f'# Channel: {bb.get_channel()}\n') 57 | f.write(f'# LED status: {bb.get_led_status()}\n') 58 | f.write(f'# Board ID: {bb.get_uid()}\n') 59 | 60 | f.flush() 61 | 62 | bb.read_messages() 63 | bb.pulses = list() 64 | 65 | bb.set_trigger_status(1) 66 | 67 | # record pulses 68 | start = time.time() 69 | pulse_count = 0 70 | while True: 71 | bb.read_messages() 72 | 73 | for block_idx, timestamp, overflow, waveform, trigger_counter, block_edge_trigger in bb.pulses: 74 | pulse_count += 1 75 | print() 76 | print(f'time={timestamp*1e-6:.6f}s overflow={overflow} cnt={pulse_count} ->rate={pulse_count/(time.time()-start):.5f}Hz duration={(time.time()-start)/60:.1f}min') 77 | 78 | # TODO: fixme; This is only a hack while the firmware does not guarantee fixed length waveforms yet 79 | if len(waveform) < pre+post: 80 | waveform = np.array( list(waveform) + list(np.zeros(pre + post - len(waveform))) ) 81 | print('short waveform') 82 | ic(block_idx, timestamp, overflow, waveform, trigger_counter, block_edge_trigger) 83 | if len(waveform) > pre+post: 84 | waveform = waveform[:pre+post] 85 | print('long_waveform') 86 | ic(block_idx, timestamp, overflow, waveform, trigger_counter, block_edge_trigger) 87 | 88 | csv_line = f'{block_idx},{timestamp},{int(overflow)},{trigger_counter},{",".join(map(str, waveform))}\n' 89 | f.write(csv_line) 90 | f.flush() 91 | 92 | if using_plotext: 93 | plt.clear_figure() 94 | plt.plot_size(height=15) 95 | plt.plot(waveform * bb.ADCC_TO_V) 96 | plt.show() 97 | 98 | bb.pulses = [] 99 | -------------------------------------------------------------------------------- /control_scripts/recordings/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /control_scripts/recordings/plot_distributions_comparison.py: -------------------------------------------------------------------------------- 1 | ''' 2 | plot the pulse height distribution for multiple measurements 3 | Usage: python plot_distributions_comparison.py 4 | Where is: 5 | Windows: COM? 6 | Linux: /dev/ttyACM? 7 | Mac: /dev/tty.usbmodem? 8 | (The ? is a number) 9 | ''' 10 | import numpy as np 11 | import matplotlib.pyplot as plt 12 | import matplotlib as mpl 13 | from icecream import ic 14 | import sys 15 | 16 | def load_recording(fname): 17 | """ load a file with recorded pulses """ 18 | data = np.genfromtxt(fname, delimiter=',', comments='#') 19 | 20 | with open(fname, 'r') as f: 21 | sample_rate = float(f.readline().split(' ')[3]) 22 | firmware_version = ' '.join(f.readline().split(' ')[3:]) 23 | trigger_threshold = float(f.readline().split(' ')[3]) 24 | comment = ' '.join(f.readline().split(' ')[2:]) 25 | 26 | return data, [sample_rate, firmware_version, trigger_threshold, comment] 27 | 28 | def calculate_threshold_scan(idata): 29 | # calculate measurement duration 30 | timestamps = idata[:,1] * 1e-6 31 | duration = timestamps[-1] - timestamps[0] 32 | 33 | # get waveforms 34 | waveforms = idata[:,3:] * 3.3 / 2**12 35 | 36 | # extract peak height 37 | peak_heights = np.min(waveforms, axis=1) 38 | 39 | # calculate histogram 40 | bins = np.arange(-300, 0, 3) * 3.3/2**12 41 | hist, bin_edges = np.histogram(peak_heights, bins=bins) 42 | ic(hist.shape, bin_edges.shape) 43 | 44 | return hist, bin_edges, duration 45 | 46 | if __name__ == '__main__': 47 | # load files 48 | data = [load_recording(fname) for fname in sys.argv[1:]] 49 | 50 | # histogram 51 | plt.figure() 52 | for idx, ((idata, [sample_rate, firmware_version, trigger_threshold, comment])) in enumerate(data): 53 | hist, bin_edges, duration = calculate_threshold_scan(idata) 54 | 55 | comment = comment.replace('\n', ' ') 56 | label = f'Sample rate: {sample_rate*1e-3:.1f} kSps threshold: {trigger_threshold}ADCC duration: {duration:.3f}s\n{comment}' 57 | 58 | plt.bar(-1*(bin_edges[1:]+bin_edges[:-1])/2, hist/duration, bin_edges[1]-bin_edges[0], label=label, alpha=0.3, fc=f'C{idx}') 59 | plt.step(-1*bin_edges[1:], hist/duration, bin_edges[1]-bin_edges[0], c=f'C{idx}') 60 | 61 | plt.xlabel('Pulse height [$V_\\text{amplified}$]') 62 | plt.yscale('log') 63 | plt.ylabel('Rate per bin [Hz]') 64 | plt.legend() 65 | plt.grid() 66 | 67 | # cumulative 68 | plt.figure() 69 | for idx, ((idata, [sample_rate, firmware_version, trigger_threshold, comment])) in enumerate(data): 70 | hist, bin_edges, duration = calculate_threshold_scan(idata) 71 | 72 | comment = comment.replace('\n', ' ') 73 | label = f'Sample rate: {sample_rate*1e-3:.1f} kSps threshold: {trigger_threshold}ADCC duration: {duration:.3f}s\n{comment}' 74 | 75 | hist_acc = [sum(hist[:i]) for i in range(len(hist))] 76 | 77 | plt.plot(-1*(bin_edges[1:]+bin_edges[:-1])/2, hist_acc/duration, c=f'C{idx}', label=label) 78 | 79 | plt.xlabel('Pulse height [$V_\\text{amplified}$]') 80 | plt.yscale('log') 81 | plt.ylabel('Rate above threshold [Hz]') 82 | plt.legend() 83 | plt.grid() 84 | 85 | plt.show() 86 | -------------------------------------------------------------------------------- /control_scripts/tools.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | def log_average(x, y, scale): 4 | """ 5 | x, y: x and y data (x must be ascending) 6 | scale: maximum values per decade in x 7 | """ 8 | assert len(x) == len(y) 9 | outX = [] 10 | outY = [] 11 | idx = 0 12 | 13 | while idx0 else 1 15 | 16 | outX.append(np.mean(x[idx:idx+collect_count])) 17 | outY.append(np.mean(y[idx:idx+collect_count])) 18 | idx += collect_count 19 | return outX, outY 20 | -------------------------------------------------------------------------------- /firmware/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.13) 2 | 3 | # initialize the SDK based on PICO_SDK_PATH 4 | # note: this must happen before project() 5 | include(pico_sdk_import.cmake) 6 | # include(pico_extras_import.cmake) 7 | 8 | set(PICO_CXX_ENABLE_EXCEPTIONS 1) 9 | project(betaBoard) 10 | pico_sdk_init() 11 | 12 | add_executable(betaBoard 13 | src/main.cpp 14 | src/version.c 15 | ) 16 | 17 | target_compile_options(betaBoard PRIVATE -Wall ) # These all throw too many warning from SDK: -Wpedantic -Werror -Wextra 18 | 19 | set_property(TARGET betaBoard PROPERTY CXX_STANDARD 20) 20 | 21 | target_link_libraries(betaBoard PRIVATE 22 | pico_stdlib 23 | # hardware_pio # for i2s 24 | hardware_dma # for ADC 25 | hardware_irq # ADC data ready gpio interrupt 26 | # hardware_spi # for ADC interface 27 | # hardware_i2c # for configuring the DAC 28 | # hardware_pwm # for clocking the ADC 29 | hardware_adc # For RP2040 internal temperature sensor 30 | hardware_flash 31 | ) 32 | pico_add_extra_outputs(betaBoard) 33 | 34 | # add url via pico_set_program_url 35 | # example_auto_set_url(betaBoard) 36 | 37 | pico_enable_stdio_usb(betaBoard 1) 38 | pico_enable_stdio_uart(betaBoard 0) 39 | -------------------------------------------------------------------------------- /firmware/README.md: -------------------------------------------------------------------------------- 1 | # RP2040 Firmware 2 | 3 | ## Build instructions 4 | 5 | Requires a working installation of the [pico sdk](https://github.com/raspberrypi/pico-sdk). 6 | 7 | ```bash 8 | cd firmware/ 9 | ./build.sh 10 | ``` 11 | 12 | ## Flashing 13 | 14 | * Option 1: (simple) 15 | > Hold the boot select pin on the PCB while connecting the board via USB. It will show up as a mass storage device. Copy `firmware/build/betaBoard.uf2` with a file manager (Finder/Explorer/..). 16 | 17 | * Option 2: (complicated, but better for developement) 18 | > Use a `picoprobe` and connect it to the SWD header. Execute the `./flash.sh` script. 19 | -------------------------------------------------------------------------------- /firmware/build/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /firmware/clean.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | rm -rf build/* 3 | cd build/ && cmake .. 4 | -------------------------------------------------------------------------------- /firmware/flash.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # ~/git/software/openocd-raspberry/src/openocd --search "/User/tim/git/software/openocd-raspberry/tcl/" -f interface/picoprobe.cfg -f target/rp2040.cfg -c "targets rp2040.core0; program build/betaBoard.elf verify reset exit" 4 | 5 | openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000; targets rp2040.core0; program build/betaBoard.elf verify reset exit" 6 | -------------------------------------------------------------------------------- /firmware/gen_version_header.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo "generating version.c" 3 | echo "const char GIT_COMMIT_HASH[] = \"`git log --pretty=format:'%h' -n 1``git diff --quiet --exit-code || echo +`\";" > src/version.c 4 | echo "const char COMPILE_DATE[] = \"`date`\";" >> src/version.c 5 | -------------------------------------------------------------------------------- /firmware/make.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | ./gen_version_header.sh 3 | cd build && cmake .. && make 4 | -------------------------------------------------------------------------------- /firmware/pico_extras_import.cmake: -------------------------------------------------------------------------------- 1 | # This is a copy of /external/pico_extras_import.cmake 2 | 3 | # This can be dropped into an external project to help locate pico-extras 4 | # It should be include()ed prior to project() 5 | 6 | if (DEFINED ENV{PICO_EXTRAS_PATH} AND (NOT PICO_EXTRAS_PATH)) 7 | set(PICO_EXTRAS_PATH $ENV{PICO_EXTRAS_PATH}) 8 | message("Using PICO_EXTRAS_PATH from environment ('${PICO_EXTRAS_PATH}')") 9 | endif () 10 | 11 | if (DEFINED ENV{PICO_EXTRAS_FETCH_FROM_GIT} AND (NOT PICO_EXTRAS_FETCH_FROM_GIT)) 12 | set(PICO_EXTRAS_FETCH_FROM_GIT $ENV{PICO_EXTRAS_FETCH_FROM_GIT}) 13 | message("Using PICO_EXTRAS_FETCH_FROM_GIT from environment ('${PICO_EXTRAS_FETCH_FROM_GIT}')") 14 | endif () 15 | 16 | if (DEFINED ENV{PICO_EXTRAS_FETCH_FROM_GIT_PATH} AND (NOT PICO_EXTRAS_FETCH_FROM_GIT_PATH)) 17 | set(PICO_EXTRAS_FETCH_FROM_GIT_PATH $ENV{PICO_EXTRAS_FETCH_FROM_GIT_PATH}) 18 | message("Using PICO_EXTRAS_FETCH_FROM_GIT_PATH from environment ('${PICO_EXTRAS_FETCH_FROM_GIT_PATH}')") 19 | endif () 20 | 21 | if (NOT PICO_EXTRAS_PATH) 22 | if (PICO_EXTRAS_FETCH_FROM_GIT) 23 | include(FetchContent) 24 | set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR}) 25 | if (PICO_EXTRAS_FETCH_FROM_GIT_PATH) 26 | get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_EXTRAS_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") 27 | endif () 28 | FetchContent_Declare( 29 | pico_extras 30 | GIT_REPOSITORY https://github.com/raspberrypi/pico-extras 31 | GIT_TAG master 32 | ) 33 | if (NOT pico_extras) 34 | message("Downloading Raspberry Pi Pico Extras") 35 | FetchContent_Populate(pico_extras) 36 | set(PICO_EXTRAS_PATH ${pico_extras_SOURCE_DIR}) 37 | endif () 38 | set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) 39 | else () 40 | if (PICO_SDK_PATH AND EXISTS "${PICO_SDK_PATH}/../pico-extras") 41 | set(PICO_EXTRAS_PATH ${PICO_SDK_PATH}/../pico-extras) 42 | message("Defaulting PICO_EXTRAS_PATH as sibling of PICO_SDK_PATH: ${PICO_EXTRAS_PATH}") 43 | else() 44 | message(FATAL_ERROR 45 | "PICO EXTRAS location was not specified. Please set PICO_EXTRAS_PATH or set PICO_EXTRAS_FETCH_FROM_GIT to on to fetch from git." 46 | ) 47 | endif() 48 | endif () 49 | endif () 50 | 51 | set(PICO_EXTRAS_PATH "${PICO_EXTRAS_PATH}" CACHE PATH "Path to the PICO EXTRAS") 52 | set(PICO_EXTRAS_FETCH_FROM_GIT "${PICO_EXTRAS_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of PICO EXTRAS from git if not otherwise locatable") 53 | set(PICO_EXTRAS_FETCH_FROM_GIT_PATH "${PICO_EXTRAS_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download EXTRAS") 54 | 55 | get_filename_component(PICO_EXTRAS_PATH "${PICO_EXTRAS_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") 56 | if (NOT EXISTS ${PICO_EXTRAS_PATH}) 57 | message(FATAL_ERROR "Directory '${PICO_EXTRAS_PATH}' not found") 58 | endif () 59 | 60 | set(PICO_EXTRAS_PATH ${PICO_EXTRAS_PATH} CACHE PATH "Path to the PICO EXTRAS" FORCE) 61 | 62 | add_subdirectory(${PICO_EXTRAS_PATH} pico_extras) 63 | -------------------------------------------------------------------------------- /firmware/pico_sdk_import.cmake: -------------------------------------------------------------------------------- 1 | # This is a copy of /external/pico_sdk_import.cmake 2 | 3 | # This can be dropped into an external project to help locate this SDK 4 | # It should be include()ed prior to project() 5 | 6 | if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH)) 7 | set(PICO_SDK_PATH $ENV{PICO_SDK_PATH}) 8 | message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')") 9 | endif () 10 | 11 | if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT} AND (NOT PICO_SDK_FETCH_FROM_GIT)) 12 | set(PICO_SDK_FETCH_FROM_GIT $ENV{PICO_SDK_FETCH_FROM_GIT}) 13 | message("Using PICO_SDK_FETCH_FROM_GIT from environment ('${PICO_SDK_FETCH_FROM_GIT}')") 14 | endif () 15 | 16 | if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_PATH)) 17 | set(PICO_SDK_FETCH_FROM_GIT_PATH $ENV{PICO_SDK_FETCH_FROM_GIT_PATH}) 18 | message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')") 19 | endif () 20 | 21 | set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK") 22 | set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable") 23 | set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK") 24 | 25 | if (NOT PICO_SDK_PATH) 26 | if (PICO_SDK_FETCH_FROM_GIT) 27 | include(FetchContent) 28 | set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR}) 29 | if (PICO_SDK_FETCH_FROM_GIT_PATH) 30 | get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") 31 | endif () 32 | FetchContent_Declare( 33 | pico_sdk 34 | GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk 35 | GIT_TAG master 36 | ) 37 | if (NOT pico_sdk) 38 | message("Downloading Raspberry Pi Pico SDK") 39 | FetchContent_Populate(pico_sdk) 40 | set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR}) 41 | endif () 42 | set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) 43 | else () 44 | message(FATAL_ERROR 45 | "SDK location was not specified. Please set PICO_SDK_PATH or set PICO_SDK_FETCH_FROM_GIT to on to fetch from git." 46 | ) 47 | endif () 48 | endif () 49 | 50 | get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") 51 | if (NOT EXISTS ${PICO_SDK_PATH}) 52 | message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found") 53 | endif () 54 | 55 | set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake) 56 | if (NOT EXISTS ${PICO_SDK_INIT_CMAKE_FILE}) 57 | message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' does not appear to contain the Raspberry Pi Pico SDK") 58 | endif () 59 | 60 | set(PICO_SDK_PATH ${PICO_SDK_PATH} CACHE PATH "Path to the Raspberry Pi Pico SDK" FORCE) 61 | 62 | include(${PICO_SDK_INIT_CMAKE_FILE}) 63 | -------------------------------------------------------------------------------- /firmware/src/adc_dma.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "hardware/adc.h" 4 | #include "hardware/dma.h" 5 | 6 | #include "config.h" 7 | #include "fifo.hpp" 8 | 9 | // data format for every buffer 10 | struct ADC_DATA_BLOCK { 11 | uint64_t timestamp_us_end; 12 | uint16_t block_idx; 13 | uint16_t *samples; 14 | }; 15 | 16 | static uint adc_dma_channel; // The DMA channel that is being used 17 | 18 | // the queue from which other code will collect the data blocks 19 | fifo adc_queue(ADC_QUEUE_MAX_SIZE); 20 | 21 | // pointer to keep a record of the buffer currently being used (in priciple it is also in the DMA registers) 22 | static ADC_DATA_BLOCK *adc_current_buffer=NULL; 23 | 24 | bool adc_queue_overflow = false; // overflow indicator flag 25 | 26 | /** 27 | * The main ADC DMA handler 28 | * Allocates a new buffer and hands it to DMA if the queue is not full 29 | * If the queue is full the current buffer is just handed over again and data is lost 30 | * The main thread is expected to collect the data 31 | */ 32 | void dma_handler() { 33 | static uint16_t block_idx = 0; 34 | 35 | // Clear the interrupt request. 36 | dma_hw->ints0 = 1u << adc_dma_channel; 37 | block_idx++; 38 | 39 | if(not adc_queue.is_full()) { // swap buffers 40 | // puts("adc tick"); 41 | adc_current_buffer->timestamp_us_end = time_us_64(); 42 | adc_current_buffer->block_idx = block_idx; 43 | 44 | adc_queue.push(adc_current_buffer); 45 | 46 | adc_current_buffer = new ADC_DATA_BLOCK; 47 | adc_current_buffer->samples = new uint16_t[ADC_BLOCK_SIZE]; 48 | } else { // queue is full, data is lost 49 | // puts("adc queue full"); 50 | // adc_queue.debug(); 51 | if(not adc_queue_overflow) { 52 | adc_queue_overflow = true; 53 | } 54 | } 55 | 56 | // Kick off the next transfer. 57 | dma_channel_set_write_addr(adc_dma_channel, adc_current_buffer->samples, true); 58 | } 59 | 60 | void my_adc_init(void) { 61 | // inspired by: https://github.com/raspberrypi/pico-examples/blob/master/adc/dma_capture/dma_capture.c 62 | // inspired by: https://github.com/raspberrypi/pico-examples/issues/112 63 | 64 | for(int adc_channel=0; adc_channel<4; ++adc_channel) { 65 | adc_gpio_init(26 + adc_channel); 66 | } 67 | 68 | adc_init(); 69 | adc_select_input(DEFAULT_ADC_CHANNEL); 70 | adc_fifo_setup( 71 | true, // Write each completed conversion to the sample FIFO 72 | true, // Enable DMA data request (DREQ) 73 | 1, // DREQ (and IRQ) asserted when at least 1 sample present 74 | false, // We won't see the ERR bit because of 8 bit reads; disable. 75 | false // Don't shift each sample to 8 bits when pushing to FIFO 76 | ); 77 | adc_set_temp_sensor_enabled(true); 78 | 79 | adc_set_clkdiv(ADC_CLOCK_DIV); 80 | 81 | // Set up the DMA to start transferring data as soon as it appears in FIFO 82 | adc_dma_channel = dma_claim_unused_channel(true); 83 | dma_channel_config cfg = dma_channel_get_default_config(adc_dma_channel); 84 | 85 | // Reading from constant address, writing to incrementing byte addresses 86 | channel_config_set_transfer_data_size(&cfg, DMA_SIZE_16); 87 | channel_config_set_read_increment(&cfg, false); 88 | channel_config_set_write_increment(&cfg, true); 89 | 90 | // Pace transfers based on availability of ADC samples 91 | channel_config_set_dreq(&cfg, DREQ_ADC); 92 | 93 | adc_current_buffer = new ADC_DATA_BLOCK; 94 | adc_current_buffer->samples = new uint16_t[ADC_BLOCK_SIZE]; 95 | 96 | dma_channel_configure(adc_dma_channel, &cfg, 97 | adc_current_buffer->samples, // dst 98 | &adc_hw->fifo, // src 99 | ADC_BLOCK_SIZE, // transfer count 100 | false // don't start immediately 101 | ); 102 | 103 | printf("Starting capture\n"); 104 | adc_run(true); 105 | 106 | // Tell the DMA to raise IRQ line 0 when the channel finishes a block 107 | dma_channel_set_irq0_enabled(adc_dma_channel, true); 108 | 109 | // Configure the processor to run dma_handler() when DMA IRQ 0 is asserted 110 | irq_set_exclusive_handler(DMA_IRQ_0, dma_handler); 111 | irq_set_enabled(DMA_IRQ_0, true); 112 | 113 | // Manually call the handler once, to trigger the first transfer 114 | dma_handler(); 115 | } 116 | -------------------------------------------------------------------------------- /firmware/src/config.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // Pin definitions (not many for this PCB ;) 4 | #define LED1_PIN 18 5 | #define MAIN_LOOP_BLINK true 6 | 7 | // The ADC channel to start reading from 8 | #define DEFAULT_ADC_CHANNEL 2 9 | 10 | // ADC rate config 11 | #define ADC_RATE 500000 // ADC sample rate 12 | #define ADC_CLOCK_DIV (48000000 / ADC_RATE - 1) // clock divider value, Brackets are important! 13 | #define ADC_ACTUAL_RATE (48000000 / (ADC_CLOCK_DIV + 1)) // actual sample rate 14 | 15 | // ADC buffer settings 16 | #define ADC_BLOCK_SIZE (1024*20) // Buffer size, Brackets are important!! 17 | #define ADC_QUEUE_MAX_SIZE 2 // buffer count 18 | #define ADC_LEFTOVER_SIZE (64+128) // amount of samples that are stored to get full waveform readouts for triggers close to the block edge 19 | 20 | // #define TRIGGER_THRESHOLD -0.045 // [V] 0.055 was the recommendattion for 9V operation 21 | // #define TRIGGER_THRESHOLD -0.055 // [V] 0.055 was the recommendattion for 9V operation 22 | 23 | #define USER_INPUT_BUFFER_SIZE 32 24 | #define USER_INPUT_COMMIT_CHAR '\r' 25 | 26 | #define BENCHMARK_BUFFER_SIZE (1024*8) 27 | #define BENCHMARK_REPITITIONS 16 28 | -------------------------------------------------------------------------------- /firmware/src/fifo.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | template 6 | class fifo{ 7 | /** 8 | * Simple ring-buffer for pointers 9 | * p_read = next index to read from 10 | * p_write = next index to write to 11 | * 12 | * Buffer is one element larger than queue capacity 13 | * => resolves disambiguity about being full or empty 14 | * 15 | * empty: p_read == p_write (next buffer to read from has not been written yet) 16 | * full: (p_write+1)%ringbuffer.size() == p_read 17 | * 18 | * The goal is for it to be thread safe when reading and writing happen seperately (mainly for writing in an interrupt and reading in normal code) 19 | */ 20 | private: 21 | std::vector ringbuffer; 22 | uint p_read; 23 | uint p_write; 24 | public: 25 | fifo(uint size) : ringbuffer(size+1) { 26 | p_read = 0; 27 | p_write = 0; 28 | } 29 | 30 | inline bool is_empty() { 31 | return p_read == p_write; 32 | } 33 | 34 | inline bool is_full() { 35 | return (p_write+1)%ringbuffer.size() == p_read; 36 | } 37 | 38 | T pop() { 39 | if(is_empty()) 40 | throw std::runtime_error("Attemptet pop on empty fifo"); 41 | 42 | T retval = ringbuffer[p_read]; // retrieve value 43 | p_read = (p_read+1) % ringbuffer.size(); // increase read index -> only now can a new element be written to the fifo 44 | return retval; 45 | } 46 | 47 | void push(T new_element) { 48 | if(is_full()) 49 | throw std::runtime_error("Attemptet push to full fifo"); 50 | 51 | ringbuffer[p_write] = new_element; 52 | p_write = (p_write+1) % ringbuffer.size(); 53 | } 54 | 55 | void debug() { 56 | printf("fifp: r=%u w=%u e:%u f:%u\n", p_read, p_write, is_empty(), is_full()); 57 | } 58 | }; 59 | -------------------------------------------------------------------------------- /firmware/src/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | // Pico 6 | #include "pico/stdlib.h" 7 | #include "hardware/flash.h" 8 | 9 | #include "version.h" 10 | #include "config.h" // compile time configuration options 11 | #include "adc_dma.hpp" 12 | 13 | ////////////////////////////////////////////////// 14 | // global variables 15 | struct SETTINGS { 16 | int16_t trigger_threshold; 17 | uint samples_pre, samples_post, trigger_ignore; 18 | bool trigger_enabled; 19 | uint8_t adc_channel; 20 | bool main_loop_blink_enabled; 21 | }; 22 | 23 | SETTINGS settings = { 24 | -68, // trigger threshold 25 | 64, // pre 26 | 128, // post 27 | 64, // trigger_ignore 28 | true, // trigger_neabled 29 | DEFAULT_ADC_CHANNEL, // adc channel 30 | MAIN_LOOP_BLINK, // main loop blink 31 | }; 32 | 33 | bool execute_data_dump_raw = false; 34 | bool execute_data_dump_hpf = false; 35 | 36 | ////////////////////////////////////////////////// 37 | // functions 38 | inline void print_version_info() { 39 | printf("BetaBoard %s %s\n", GIT_COMMIT_HASH, COMPILE_DATE); 40 | } 41 | 42 | void my_gpio_init(void) { 43 | // LED pin init 44 | gpio_init(LED1_PIN); 45 | gpio_set_dir(LED1_PIN, GPIO_OUT); 46 | gpio_put(LED1_PIN, 0); 47 | } 48 | 49 | void print_peaks(ADC_DATA_BLOCK *data_block) { 50 | uint start, stop; 51 | int16_t *data = (int16_t *)data_block->samples; 52 | static uint16_t trigger_counter = 0; 53 | 54 | static int16_t leftover_samples[ADC_LEFTOVER_SIZE]; 55 | 56 | static bool pending_trigger = false; 57 | static uint64_t pending_trigger_timestamp; 58 | static uint pending_trigger_samples_left; 59 | 60 | if(pending_trigger) { 61 | pending_trigger = false; 62 | 63 | printf("OT %u %llu %u %u 1 # ", data_block->block_idx-1, pending_trigger_timestamp, adc_queue_overflow, trigger_counter); 64 | adc_queue_overflow = false; 65 | trigger_counter += 1; 66 | 67 | for(uint j=(ADC_LEFTOVER_SIZE-pending_trigger_samples_left); jtimestamp_us_end - ((ADC_BLOCK_SIZE-i)*1000000/ADC_ACTUAL_RATE); 80 | 81 | if((ADC_BLOCK_SIZE - i) < settings.samples_post) { 82 | pending_trigger = true; 83 | pending_trigger_timestamp = timestamp; 84 | pending_trigger_samples_left = ADC_BLOCK_SIZE - i + settings.samples_pre; 85 | break; 86 | } 87 | 88 | printf("OT %u %llu %u %u 0 # ", data_block->block_idx, timestamp, adc_queue_overflow, trigger_counter); 89 | 90 | // print samples from leftover buffer if trigger was very close to block start 91 | if(i < settings.samples_pre) { 92 | for(uint j=(ADC_LEFTOVER_SIZE - settings.samples_pre + i); j= settings.samples_pre) ? i-settings.samples_pre : 0; 98 | stop = (i <= (ADC_BLOCK_SIZE-settings.samples_post)) ? i+settings.samples_post : ADC_BLOCK_SIZE; 99 | 100 | for(uint j=start; j : set/get recorded samples before/after trigger\n" 174 | "\ti : set/get minimum delay between two triggers in samples\n" 175 | "\tt : set trigger threshold (negative integer, default: -68)\n" 176 | "\tT : 1=enabled, 0=disabled; enable or disable the trigger\n" 177 | "\tv: print firmware version info\n" 178 | "\tb: dump one block of samples of raw values\n" 179 | "\tB: dump one block of samples after the high pass filter\n" 180 | "\tc : select/get adc channel (0..3)\n" 181 | "\tl : enable/disable blinking led\n" 182 | "\tu: get unique board id\n" 183 | ; 184 | void handle_user_input(const char *input) { 185 | uint16_t p1, p2; 186 | 187 | switch(input[0]) { 188 | case 'v': // print version info 189 | printf("Ov "); 190 | print_version_info(); 191 | break; 192 | case 'p': // get/set pre/post trigger sample count 193 | if(sscanf(input, "p %hu %hu", &p1, &p2) >= 2) { 194 | settings.samples_pre = p1; 195 | settings.samples_post = p2; 196 | } 197 | printf("Op %hu %hu\n", settings.samples_pre, settings.samples_post); 198 | break; 199 | case 'i': // get/set ignored sample count after trigger 200 | if(sscanf(input, "i %hu", &p1) >= 1) { 201 | settings.trigger_ignore = p1; 202 | } 203 | printf("Oi %hu\n", settings.trigger_ignore); 204 | break; 205 | case 't': // get/set trigger threshold 206 | if(sscanf(input, "t %hi", &p1) >= 1) { 207 | settings.trigger_threshold = p1; 208 | } 209 | printf("Ot %hi\n", settings.trigger_threshold); 210 | break; 211 | case 'T': // get/set trigger status 212 | if(sscanf(input, "T %hi", &p1) >= 1) { 213 | settings.trigger_enabled = p1; 214 | } 215 | printf("OT %hi\n", settings.trigger_enabled!=0 ? 1 : 0); 216 | break; 217 | case 's': 218 | printf("Os %u\n", ADC_ACTUAL_RATE); 219 | case 'b': // dump one full block of samples 220 | execute_data_dump_raw = true; 221 | break; 222 | case 'B': // dump one full block of samples 223 | execute_data_dump_hpf = true; 224 | break; 225 | case 'P': // dev tool to benchmark high pass filter speed 226 | puts("O benchmarking"); 227 | benchmark_hpf(); 228 | break; 229 | case 'c': // get/set adc channel selection 230 | if(sscanf(input, "c %hu", &p1) >= 1) { 231 | if(p1 >= 4) { 232 | puts("E ADC channel must be in 0..3"); 233 | return; 234 | } 235 | settings.adc_channel = p1; 236 | adc_select_input(settings.adc_channel); 237 | } 238 | printf("Oc %u\n", settings.adc_channel); 239 | break; 240 | case 'l': // set/get main loop led blink status 241 | if(sscanf(input, "l %hi", &p1) >= 1) { 242 | settings.main_loop_blink_enabled = p1; 243 | if(not p1) { 244 | gpio_put(LED1_PIN, 0); 245 | } 246 | } 247 | printf("Ol %hi\n", settings.main_loop_blink_enabled!=0 ? 1 : 0); 248 | break; 249 | case 'u': // get unique ID 250 | uint8_t uid[8]; 251 | flash_get_unique_id(uid); 252 | printf("Ou "); 253 | for(uint8_t i=0; i<8; ++i) { 254 | printf("%02X", uid[i]); 255 | } 256 | puts(""); 257 | break; 258 | case 'h': // help message 259 | puts(help_msg); 260 | break; 261 | default: 262 | puts("E Unknown command"); 263 | } 264 | } 265 | 266 | void read_user_input() { 267 | char c; 268 | static char buffer[USER_INPUT_BUFFER_SIZE+1]; 269 | static uint buffer_length = 0; 270 | 271 | while( (c = getchar_timeout_us(0)) != 0xFF) { 272 | if((c == USER_INPUT_COMMIT_CHAR) and (buffer_length > 0)) { 273 | buffer[buffer_length] = 0; 274 | handle_user_input(buffer); 275 | buffer_length = 0; 276 | } else if (buffer_length < USER_INPUT_BUFFER_SIZE) { 277 | buffer[buffer_length] = c; 278 | buffer_length++; 279 | } 280 | } 281 | } 282 | 283 | void print_data_dump(int16_t *samples, char command_char) { 284 | printf("O%c ", command_char); 285 | for(uint i=0; isamples, 'b'); 323 | execute_data_dump_raw = false; 324 | } 325 | 326 | hpf_discrete((int16_t *)data->samples, ADC_BLOCK_SIZE); 327 | 328 | if(execute_data_dump_hpf) { 329 | print_data_dump((int16_t *)data->samples, 'B'); 330 | execute_data_dump_hpf = false; 331 | } 332 | 333 | if(settings.trigger_enabled) { 334 | // print_timeseries_info((int16_t *)data->samples); 335 | print_peaks(data); 336 | } 337 | 338 | delete [] data->samples; // NOTE: Keep me!! 339 | delete data; // NOTE: Keep me!! 340 | } 341 | 342 | read_user_input(); 343 | 344 | if(settings.main_loop_blink_enabled) { 345 | gpio_put(LED1_PIN, (time_us_32() % 1000000) < 900000); 346 | } 347 | } 348 | } 349 | 350 | /// Wrapper around main function to catch exception and print meaningful debug messages 351 | int main(void) { 352 | try { 353 | actual_main(); 354 | } catch (const std::exception &e) { 355 | puts("Exception occured:"); 356 | puts(e.what()); 357 | } catch (...) { 358 | puts("Unknown exception occured"); 359 | } 360 | 361 | while(1) { 362 | gpio_put(LED1_PIN, (time_us_32() % 200000) < 100000); 363 | } 364 | } 365 | -------------------------------------------------------------------------------- /firmware/src/version.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | extern const char GIT_COMMIT_HASH[]; 4 | extern const char COMPILE_DATE[]; 5 | -------------------------------------------------------------------------------- /hardware/README.md: -------------------------------------------------------------------------------- 1 | # Hardware Files 2 | 3 | ## betaBoard.pretty 4 | 5 | Custom KiCad footprints. 6 | 7 | ## betaBoard_r1.0 8 | 9 | First revision of the PCB. 10 | 11 | Design concepts: 12 | * 4 Channels 13 | * adding channles came without significant cost (only opamps and passives) 14 | * 2 Channel on the back are expensive to populate 15 | * Header to connect PD with leads 16 | * External power header for up to 12 V to increase diode bias 17 | * RP2040 allows simple programming via USB 18 | * Can be done by the user without special tools 19 | * Allow options for different diode placement 20 | * More diodes yield more sensitivity 21 | 22 | ![PCB first LED blinking](../other/img/hello_world.gif) 23 | 24 | Good: 25 | * MCU, buttons, USB etc work perfectly out of the box :D 26 | 27 | Challenges: 28 | * High USB noise (1kHz spikes) 29 | * R14 requires a parallel C to get rid of noise from USB line 30 | * 1uF seems to help but does not seem sufficient (Could try 10uF, have 0603) 31 | * could increase R by factor 10 32 | * Try larger bulk capacitance (100uF or 1000uF) 33 | * 1000 uF seems to help! 34 | * Might be change in current draw 35 | * Cable length (resistance) seems to have an effect 36 | * Useing seperate diodes for the two supplies could help (diode voltage drop might depend on current) 37 | * TODO: Try if battery operation is better (helps to exclude potential points where 1 kHz noise couples) 38 | * Is 40 MOhm working with the input impedance of LM358?? 39 | * Cut up groundplane at the PDs is probably not optimal 40 | * Keep loop areas even smaller (I don't think it's the source of issues, but would feel better) 41 | * USB port shielding is connected to GND. This might not be the optimal solution 42 | * Next: Add 2 0603 footprints? (allows open, short, 1MOhm+C) 43 | 44 | ## betaBoard_r1.1 45 | 46 | Next revision. Work in progress. 47 | -------------------------------------------------------------------------------- /hardware/betaBoard.pretty/C26638.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "C26638" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 0) 4 | (descr "push button SMD") 5 | (attr smd) 6 | (fp_text reference "REF**" (at -2.35 0 90) (layer "F.SilkS") 7 | (effects (font (size 1 1) (thickness 0.15))) 8 | (tstamp 04081c7f-f7f0-47f1-83b3-1415696500b2) 9 | ) 10 | (fp_text value "C26638" (at 0 0) (layer "F.Fab") 11 | (effects (font (size 1 1) (thickness 0.15))) 12 | (tstamp a6aae5b1-02cf-4cf4-9bc7-0a43fbcdab0b) 13 | ) 14 | (fp_line (start -1.35 -3.1) (end 1.35 -3.1) (layer "F.SilkS") (width 0.12) (tstamp 3c99c3db-e566-4b9c-bdea-4c5336610f55)) 15 | (fp_line (start -0.55 3.1) (end -1.35 2.3) (layer "F.SilkS") (width 0.12) (tstamp 4c59f3fe-c441-4d31-94c5-30c285fa316d)) 16 | (fp_line (start 1.35 3.1) (end -0.55 3.1) (layer "F.SilkS") (width 0.12) (tstamp 4c8ce580-b396-4dbf-b153-aad27dcb2542)) 17 | (fp_line (start -1.35 2.3) (end -1.35 -3.1) (layer "F.SilkS") (width 0.12) (tstamp 90545fd8-7417-4328-8d28-3feadc63bc18)) 18 | (fp_line (start 1.35 -3.1) (end 1.35 3.1) (layer "F.SilkS") (width 0.12) (tstamp cd136a06-6ddc-4dcd-967b-917a3ea85b29)) 19 | (fp_line (start 1.5 -2.85) (end 1.5 2.85) (layer "F.CrtYd") (width 0.05) (tstamp 77b3e3b6-d038-4738-baf4-c4810e4b8a80)) 20 | (fp_line (start -1.5 -2.85) (end 1.5 -2.85) (layer "F.CrtYd") (width 0.05) (tstamp 7c8646eb-0f14-4cd2-ae3e-d30c992507a3)) 21 | (fp_line (start 1.5 2.85) (end -1.5 2.85) (layer "F.CrtYd") (width 0.05) (tstamp 856f2f6b-a234-4504-8f45-baa53eeafa73)) 22 | (fp_line (start -1.5 2.85) (end -1.5 -2.85) (layer "F.CrtYd") (width 0.05) (tstamp b28751fb-c260-4dd7-ac68-3f1198249b5f)) 23 | (pad "1" smd rect (at 0 2.225) (size 1.7 0.75) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 4647822a-51ad-4cd2-bc29-7241772d27cd)) 24 | (pad "2" smd rect (at 0 -2.225) (size 1.7 0.75) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 4647822a-51ad-4cd2-bc29-7241772d27cd)) 25 | ) 26 | -------------------------------------------------------------------------------- /hardware/betaBoard.pretty/JLC_tooling_hole.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "JLC_tooling_hole" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 5B924765) 4 | (descr "Mounting Hole 2.1mm, no annular") 5 | (tags "mounting hole 2.1mm no annular") 6 | (attr exclude_from_pos_files exclude_from_bom) 7 | (fp_text reference "REF**" (at 0 -3.2) (layer "F.SilkS") hide 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | (tstamp 5c387287-9ac0-4cc4-9497-9ebc258c1a43) 10 | ) 11 | (fp_text value "JLC Tooling Hole" (at 0 3.2) (layer "F.Fab") 12 | (effects (font (size 1 1) (thickness 0.15))) 13 | (tstamp d6364151-0fc9-496d-88d1-222e420f79ca) 14 | ) 15 | (fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab") 16 | (effects (font (size 1 1) (thickness 0.15))) 17 | (tstamp 5ba811d1-dacc-41d4-89f4-f2b39abbd10e) 18 | ) 19 | (fp_circle (center 0 0) (end 1.2 0) (layer "F.CrtYd") (width 0.05) (fill none) (tstamp 4ab661cc-c5d2-4d56-ab04-8b7ea2160825)) 20 | (pad "" np_thru_hole circle (at 0 0) (size 1.3 1.3) (drill 1.15) (layers F&B.Cu *.Mask) (tstamp 201d79da-8a4c-4b6f-916f-5485963d9ace)) 21 | ) 22 | -------------------------------------------------------------------------------- /hardware/betaBoard.pretty/Osram_BPW34S-SMD_hole.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "Osram_BPW34S-SMD_hole" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 5B870B94) 4 | (descr "PhotoDiode, plastic SMD DIL, 4.5x4mm, area: 2.65x2.65mm, https://dammedia.osram.info/media/resource/hires/osram-dam-5488319/BPW%2034%20S_EN.pdf") 5 | (tags "PhotoDiode plastic SMD DIL") 6 | (attr smd) 7 | (fp_text reference "REF**" (at 0.01 -3.2) (layer "F.SilkS") 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | (tstamp 2ac01ffc-7d5f-4437-a5ec-4be56a7e384a) 10 | ) 11 | (fp_text value "Osram_BPW34S-SMD" (at 0 3.17) (layer "F.Fab") 12 | (effects (font (size 1 1) (thickness 0.15))) 13 | (tstamp 6b027a1d-4714-4f65-ac89-21ffbc22ddad) 14 | ) 15 | (fp_text user "${REFERENCE}" (at 0.01 -3.2) (layer "F.Fab") 16 | (effects (font (size 1 1) (thickness 0.15))) 17 | (tstamp 2fabd162-8ff9-4450-8521-f954e6208b71) 18 | ) 19 | (fp_line (start -2.4 -2.2) (end -2.4 -1.4) (layer "F.SilkS") (width 0.12) (tstamp 0fa09957-ecd7-4cfe-a16e-d6a164487b29)) 20 | (fp_line (start 2.4 2.2) (end 2.4 1.31) (layer "F.SilkS") (width 0.12) (tstamp 298908b4-5c3b-4956-9ddc-6834ebbc2cef)) 21 | (fp_line (start 2.4 -2.2) (end -2.4 -2.2) (layer "F.SilkS") (width 0.12) (tstamp 3e17e46e-9686-41da-96b0-2a6ad00a9658)) 22 | (fp_line (start 2.4 -1.4) (end 2.4 -2.2) (layer "F.SilkS") (width 0.12) (tstamp 5747c0e8-4706-4818-85c3-67393cad26f9)) 23 | (fp_line (start -3.59 1.31) (end -2.4 1.31) (layer "F.SilkS") (width 0.12) (tstamp 7fdc49db-b3f1-4bff-80da-cf0d451bcc17)) 24 | (fp_line (start -2.4 2.2) (end 2.4 2.2) (layer "F.SilkS") (width 0.12) (tstamp 9c1abf95-0937-4e3d-bae0-ec2abaf83d56)) 25 | (fp_line (start -2.41 -1.4) (end -3.59 -1.4) (layer "F.SilkS") (width 0.12) (tstamp b737c768-c0a2-42fe-9fcd-fd1b6ed89d21)) 26 | (fp_line (start -2.4 1.31) (end -2.4 2.2) (layer "F.SilkS") (width 0.12) (tstamp cd5b1868-d306-4049-816f-d0a123268855)) 27 | (fp_rect (start -1.8 -1.325) (end 0.85 1.325) (layer "Cmts.User") (width 0.12) (fill none) (tstamp 2df62104-6c8e-4e7b-9c51-382349992ca6)) 28 | (fp_rect (start -2 -1.55) (end 1.7 1.55) (layer "Edge.Cuts") (width 0.12) (fill none) (tstamp 77e817a7-c73d-4543-883b-7f6521364b2d)) 29 | (fp_line (start -4 -2.25) (end 4 -2.25) (layer "F.CrtYd") (width 0.05) (tstamp 0779c494-c5a1-4a9e-a800-180071cb64a2)) 30 | (fp_line (start 4 2.25) (end -4 2.25) (layer "F.CrtYd") (width 0.05) (tstamp 140a92f7-c91e-428f-8988-42a006dbfdd8)) 31 | (fp_line (start 4 2.25) (end 4 -2.25) (layer "F.CrtYd") (width 0.05) (tstamp 99f9c8a8-1a69-4a88-8f0f-7745757b688e)) 32 | (fp_line (start -4 -2.25) (end -4 2.25) (layer "F.CrtYd") (width 0.05) (tstamp d949418f-e078-4794-ba63-8eae8350d9a9)) 33 | (fp_line (start 2.25 2) (end -2.25 2) (layer "F.Fab") (width 0.1) (tstamp 018b04c0-5a55-4d2f-bee2-d5b544eb4d91)) 34 | (fp_line (start -1.25 -2) (end 2.25 -2) (layer "F.Fab") (width 0.1) (tstamp 0923f5a0-4d29-4973-a202-c1c35cad35cb)) 35 | (fp_line (start 0.33 0) (end 0.33 1.27) (layer "F.Fab") (width 0.1) (tstamp 0f696a8c-01e6-490e-9000-949c143272cd)) 36 | (fp_line (start -1.27 0.64) (end 1.27 0.64) (layer "F.Fab") (width 0.1) (tstamp 182f3400-cce4-4d74-baa9-c155b74a20fc)) 37 | (fp_line (start -2.25 -1) (end -1.25 -2) (layer "F.Fab") (width 0.1) (tstamp 1a7cf973-0f46-47dc-8d20-064e226a74a1)) 38 | (fp_line (start 0.71 -1.14) (end -0.05 -0.38) (layer "F.Fab") (width 0.1) (tstamp 1c0da231-6138-4f39-983b-84b84d6591a5)) 39 | (fp_line (start 1.22 -1.14) (end 0.45 -0.38) (layer "F.Fab") (width 0.1) (tstamp 1d118634-79fc-43bc-ac55-542113856198)) 40 | (fp_line (start -0.31 0) (end -0.31 1.27) (layer "F.Fab") (width 0.1) (tstamp 2d15db0b-4e2d-4a49-8b18-3b0a20246487)) 41 | (fp_line (start 0.45 -0.38) (end 0.71 -0.38) (layer "F.Fab") (width 0.1) (tstamp 3c648a60-fe85-401e-913c-c3250bb48ae8)) 42 | (fp_line (start -0.31 0.64) (end 0.33 0) (layer "F.Fab") (width 0.1) (tstamp 54c89567-0830-41c0-aa94-d3b9c929875d)) 43 | (fp_line (start -2.25 -1) (end -2.25 2) (layer "F.Fab") (width 0.1) (tstamp 88d6375b-c453-4d04-b759-ba9ad9b2104d)) 44 | (fp_line (start -0.05 -0.38) (end 0.2 -0.38) (layer "F.Fab") (width 0.1) (tstamp a19caeba-07c7-4b19-8ba1-9f79eb6ce8ed)) 45 | (fp_line (start 2.25 -2) (end 2.25 2) (layer "F.Fab") (width 0.1) (tstamp b4a603ba-f766-4303-a73a-38cf97284d45)) 46 | (fp_line (start 0.33 1.27) (end -0.31 0.64) (layer "F.Fab") (width 0.1) (tstamp d4411a0b-2fea-40f5-9a1b-7718f4b3f7ed)) 47 | (fp_line (start -0.05 -0.38) (end -0.05 -0.64) (layer "F.Fab") (width 0.1) (tstamp f671fe1a-dfcf-4138-a430-844cf23143a6)) 48 | (fp_line (start 0.45 -0.38) (end 0.45 -0.64) (layer "F.Fab") (width 0.1) (tstamp fb2d4bb7-3ba2-4bfd-9739-bb221e9b54a2)) 49 | (pad "" smd roundrect (at 3.05 0 180) (size 1.5 1.3) (layers "F.Mask") (roundrect_rratio 0.125) (tstamp 213beccf-e356-4fc0-beed-099c0c9ab87e)) 50 | (pad "" smd roundrect (at -3.05 0 180) (size 1.3 1.9) (layers "F.Paste") (roundrect_rratio 0.125) (tstamp 36e37edc-dc08-4bb3-a67c-507c87131cf1)) 51 | (pad "" smd roundrect (at 3.05 0 180) (size 1.3 1.1) (layers "F.Paste") (roundrect_rratio 0.125) (tstamp 3b01b4cd-9067-4684-b28f-9e6bae648f65)) 52 | (pad "" smd roundrect (at -3.05 0 180) (size 1.5 2.1) (layers "F.Mask") (roundrect_rratio 0.125) (tstamp 4ead9188-1c80-46ca-b73e-835c592504ed)) 53 | (pad "1" smd roundrect (at -3.05 0 180) (size 1.4 2) (layers "F.Cu" "F.Mask") (roundrect_rratio 0.125) (tstamp 43b1e3ac-bcfd-4b21-a9f7-b7204596768c)) 54 | (pad "2" smd roundrect (at 3.05 0 180) (size 1.4 1.2) (layers "F.Cu" "F.Mask") (roundrect_rratio 0.125) (tstamp 28a27834-8643-4d36-8c7a-697464f2b973)) 55 | (model "${KICAD6_3DMODEL_DIR}/OptoDevice.3dshapes/Osram_BPW34S-SMD.wrl" 56 | (offset (xyz 0 0 0)) 57 | (scale (xyz 1 1 1)) 58 | (rotate (xyz 0 0 0)) 59 | ) 60 | ) 61 | -------------------------------------------------------------------------------- /hardware/betaBoard.pretty/PinHeader_1x02_P2.54mm_castellation.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "PinHeader_1x02_P2.54mm_castellation" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 59FED5CC) 4 | (descr "Through hole straight pin header, 1x02, 2.54mm pitch, single row") 5 | (tags "Through hole pin header THT 1x02 2.54mm single row") 6 | (attr through_hole) 7 | (fp_text reference "REF**" (at 1.905 -2.33) (layer "F.SilkS") 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | (tstamp 9f449d09-37db-4679-b4e5-533258de06b2) 10 | ) 11 | (fp_text value "PinHeader_1x02_P2.54mm_castellation" (at 1.905 4.87) (layer "F.Fab") 12 | (effects (font (size 1 1) (thickness 0.15))) 13 | (tstamp 38fef59b-958b-45b7-8820-2d51d2463f7b) 14 | ) 15 | (fp_text user "${REFERENCE}" (at 1.905 1.27 90) (layer "F.Fab") 16 | (effects (font (size 1 1) (thickness 0.15))) 17 | (tstamp 37dcc22b-aaa5-40bf-8441-c3e442439a19) 18 | ) 19 | (fp_line (start 0.575 3.87) (end 3.235 3.87) (layer "F.SilkS") (width 0.12) (tstamp 356cd7c3-c732-46f6-901c-08ed3018653a)) 20 | (fp_line (start 0.575 1.27) (end 3.235 1.27) (layer "F.SilkS") (width 0.12) (tstamp acc4628e-df19-42c5-8749-bf9d024c5546)) 21 | (fp_line (start 0.575 -1.33) (end 1.905 -1.33) (layer "F.SilkS") (width 0.12) (tstamp c8d9f458-d8ec-4ce7-837b-0c157bcfe850)) 22 | (fp_line (start 3.235 1.27) (end 3.235 3.87) (layer "F.SilkS") (width 0.12) (tstamp cb13b7ee-2d34-4ee0-a235-16f903038f41)) 23 | (fp_line (start 0 -1.27) (end 0 3.81) (layer "Edge.Cuts") (width 0.12) (tstamp c51570b9-453b-4c0d-98c1-e52502e0854f)) 24 | (fp_line (start 3.81 -1.8) (end 0 -1.805) (layer "F.CrtYd") (width 0.05) (tstamp 0431df18-ccfa-43ed-988f-ccfa94f64588)) 25 | (fp_line (start 3.81 4.35) (end 3.81 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 39e4174d-3678-46b7-8a86-e101b522ee01)) 26 | (fp_line (start 0 -1.805) (end 0 4.345) (layer "F.CrtYd") (width 0.05) (tstamp 4c579f0c-22ef-46f1-9321-ced1932e9de8)) 27 | (fp_line (start 0 4.345) (end 3.81 4.35) (layer "F.CrtYd") (width 0.05) (tstamp bbe4fc65-e3ef-4f3e-a8f2-a145d26dd2d0)) 28 | (fp_line (start 3.175 3.81) (end 0.635 3.81) (layer "F.Fab") (width 0.1) (tstamp 4862cb63-0472-41cc-a8df-0b9bad363bce)) 29 | (fp_line (start 0.635 -0.635) (end 1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp 568e96c1-5e2a-4c04-bbbf-fe7e31835e6c)) 30 | (fp_line (start 0.635 3.81) (end 0.635 -0.635) (layer "F.Fab") (width 0.1) (tstamp 56968ee9-c95b-4291-bcb7-1793b34b76a2)) 31 | (fp_line (start 1.27 -1.27) (end 3.175 -1.27) (layer "F.Fab") (width 0.1) (tstamp 6febb08f-4976-439b-a073-38d3b74479d4)) 32 | (fp_line (start 3.175 -1.27) (end 3.175 3.81) (layer "F.Fab") (width 0.1) (tstamp eecb46da-29c2-41e8-8b5f-45913974fea0)) 33 | (pad "1" thru_hole rect (at 1.905 0) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) (tstamp 2b0a2100-e129-47ab-bd5f-042914e5b9df)) 34 | (pad "1" smd rect (at 1.5045 0) (size 2.501 1.7) (layers "F.Cu" "F.Mask") (tstamp 39b6f38d-b327-43b5-8ccd-a9d1a7316d48)) 35 | (pad "1" thru_hole rect (at 0 0) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) (tstamp cd50bada-18ff-4864-a0cb-a77407762ae0)) 36 | (pad "2" thru_hole oval (at 1.905 2.54) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) (tstamp 09ceeb43-9fac-40b4-a3bb-4f36cdd20ed2)) 37 | (pad "2" thru_hole oval (at 0 2.54) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) (tstamp 33553e34-eba1-4ad1-8a42-103777a564af)) 38 | (pad "2" smd rect (at 0.9652 2.54) (size 1.8796 1.7) (layers "F.Cu" "F.Mask") (tstamp a5bd8f3c-2f9d-483a-9138-fd0fcb39cd2f)) 39 | (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x02_P2.54mm_Vertical.wrl" hide 40 | (offset (xyz 1.905 0 0)) 41 | (scale (xyz 1 1 1)) 42 | (rotate (xyz 0 0 0)) 43 | ) 44 | ) 45 | -------------------------------------------------------------------------------- /hardware/betaBoard.pretty/TS-1187A-B-A-B.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "TS-1187A-B-A-B" (version 20221018) (generator pcbnew) 2 | (layer "F.Cu") 3 | (attr smd) 4 | (fp_text reference "REF**" (at -3.75 0 90) (layer "F.SilkS") 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | (tstamp 0b599b46-93ca-4d33-9ace-5437323f27ff) 7 | ) 8 | (fp_text value "TS-1187A-B-A-B" (at 3.9 0 90) (layer "F.Fab") 9 | (effects (font (size 1 1) (thickness 0.15))) 10 | (tstamp a52d9674-1c7f-4179-bfb9-2c00a0eda658) 11 | ) 12 | (fp_line (start -2.75 -4) (end 2.75 -4) 13 | (stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp f0648058-444c-4e4b-b3fe-e6194084d25a)) 14 | (fp_line (start -2.75 3.2) (end -2.75 -4) 15 | (stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp a65062e4-781b-49b6-871f-d925251c1d66)) 16 | (fp_line (start -1.95 4) (end -2.75 3.2) 17 | (stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp 717fb4ee-7eb8-42dc-af2c-3e36ef68d759)) 18 | (fp_line (start 2.75 -4) (end 2.75 4) 19 | (stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp f6a351c2-2c63-4733-926f-394838a89786)) 20 | (fp_line (start 2.75 4) (end -1.95 4) 21 | (stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp f57ee753-0e69-4109-afb2-d4af7e73b25f)) 22 | (fp_line (start -2.5 -3.75) (end 2.5 -3.75) 23 | (stroke (width 0.05) (type default)) (layer "F.CrtYd") (tstamp 8d920d0b-7dd8-4e9d-8559-38bc39c3d9f7)) 24 | (fp_line (start -2.5 3.75) (end -2.5 -3.75) 25 | (stroke (width 0.05) (type default)) (layer "F.CrtYd") (tstamp e2798cd5-ed6a-40d6-bbc4-c428c707a9ce)) 26 | (fp_line (start 2.5 -3.75) (end 2.5 3.75) 27 | (stroke (width 0.05) (type default)) (layer "F.CrtYd") (tstamp 416b98e1-e042-4702-b83f-aa2536b0e8db)) 28 | (fp_line (start 2.5 3.75) (end -2.5 3.75) 29 | (stroke (width 0.05) (type default)) (layer "F.CrtYd") (tstamp 71a2e528-f404-4a4a-acc2-072553300052)) 30 | (pad "1" smd rect (at -1.875 -3) (size 0.75 1) (layers "F.Cu" "F.Paste" "F.Mask") 31 | (thermal_bridge_angle 45) (tstamp 4ee58835-63f6-4737-b328-53dc695ffeb3)) 32 | (pad "1" smd rect (at -1.875 3) (size 0.75 1) (layers "F.Cu" "F.Paste" "F.Mask") 33 | (thermal_bridge_angle 45) (tstamp 453a9b9e-1893-42a3-ad09-9bf1c14ca7e7)) 34 | (pad "2" smd rect (at 1.875 -3) (size 0.75 1) (layers "F.Cu" "F.Paste" "F.Mask") 35 | (thermal_bridge_angle 45) (tstamp 6175315d-b3f2-4120-98c0-3f4888bd91a2)) 36 | (pad "2" smd rect (at 1.875 3) (size 0.75 1) (layers "F.Cu" "F.Paste" "F.Mask") 37 | (thermal_bridge_angle 45) (tstamp 94abe475-62f3-4d7e-9245-1811e0fd1469)) 38 | ) 39 | -------------------------------------------------------------------------------- /hardware/betaBoard.pretty/betaBoard_r2.0_outlines.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "betaBoard_r2.0_outlines" (version 20221018) (generator pcbnew) 2 | (layer "F.Cu") 3 | (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS") hide 4 | (effects (font (size 1 1) (thickness 0.1))) 5 | (tstamp b3a780be-79d6-4f01-8871-b7eaf31b5b4b) 6 | ) 7 | (fp_text value "betaBoard_r2.0_outlines" (at 0 1 unlocked) (layer "F.Fab") hide 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | (tstamp 2a9ff51f-9108-47e6-ae5d-8fb77f36a226) 10 | ) 11 | (fp_line (start 0 48) (end 0 2) 12 | (stroke (width 0.1) (type solid)) (layer "Edge.Cuts") (tstamp 81ec2e2c-6ca3-49e4-96d0-db0c39df550b)) 13 | (fp_line (start 2 0) (end 13.7416 0) 14 | (stroke (width 0.1) (type solid)) (layer "Edge.Cuts") (tstamp 9c4655d5-401c-446f-b551-d461a58ac135)) 15 | (fp_line (start 13.7416 0) (end 21 0) 16 | (stroke (width 0.1) (type solid)) (layer "Edge.Cuts") (tstamp 22a9a9c1-4ddf-4a8d-8f67-3a1145a4c037)) 17 | (fp_line (start 37 0) (end 77.502643 0) 18 | (stroke (width 0.1) (type solid)) (layer "Edge.Cuts") (tstamp d3faa05e-3140-42e9-be7d-bb70503f4336)) 19 | (fp_line (start 78 50) (end 2 50) 20 | (stroke (width 0.1) (type solid)) (layer "Edge.Cuts") (tstamp c805d7dc-30ec-4a71-85ae-6e82fc7638f3)) 21 | (fp_line (start 80 2.5) (end 80 48) 22 | (stroke (width 0.1) (type solid)) (layer "Edge.Cuts") (tstamp 95bbe0f9-d30d-4d7f-bf5a-ef62015af642)) 23 | (fp_arc (start 0 2) (mid 0.585786 0.585786) (end 2 0) 24 | (stroke (width 0.1) (type solid)) (layer "Edge.Cuts") (tstamp 5782d16a-b27c-4465-9d80-f50bbf9fa291)) 25 | (fp_arc (start 2 50) (mid 0.585786 49.414214) (end 0 48) 26 | (stroke (width 0.1) (type solid)) (layer "Edge.Cuts") (tstamp bbb52b53-c3b5-473a-a13a-78b57e6677a9)) 27 | (fp_arc (start 77.502643 0) (mid 79.286007 0.716653) (end 80.002643 2.5) 28 | (stroke (width 0.1) (type solid)) (layer "Edge.Cuts") (tstamp 916801a0-0e47-4e26-adea-b714687c6ef2)) 29 | (fp_arc (start 80 48) (mid 79.414214 49.414214) (end 78 50) 30 | (stroke (width 0.1) (type solid)) (layer "Edge.Cuts") (tstamp 524a024b-7bb4-4782-b95b-556b696dcafa)) 31 | (fp_line (start 5 42) (end 5 8) 32 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp ffb075d7-3f3e-45e3-af52-5f4365178d42)) 33 | (fp_line (start 7 6) (end 14 6) 34 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 49e19451-8069-4309-8618-617d6c48c927)) 35 | (fp_line (start 14 6) (end 16.5 8) 36 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 40440c3f-dc49-4c4b-9793-1609ac66333d)) 37 | (fp_line (start 16.5 8) (end 19.5 8) 38 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp b0c1b4b3-5271-49a9-9a1c-10fefec39192)) 39 | (fp_line (start 19.5 8) (end 22.5 11) 40 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp e9a385ce-2958-40af-bcda-d29b41cf873e)) 41 | (fp_line (start 21 0) (end 21 5) 42 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 917e577b-356b-47df-be3b-0bdc85185d2a)) 43 | (fp_line (start 21 5) (end 23 7) 44 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp aa5f9389-03c7-4f5d-8047-ff7b89a94a62)) 45 | (fp_line (start 22.5 11) (end 31.585786 11) 46 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 4e4cf974-0524-4e96-8192-aefb1eb1ee37)) 47 | (fp_line (start 23 7) (end 34 7) 48 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp e5519a35-1052-4796-a2f0-6d8954c38513)) 49 | (fp_line (start 31 7) (end 32.5 5.5) 50 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 4e01603c-1ff6-42cc-9690-5c163a9500c0)) 51 | (fp_line (start 31.5 44) (end 7 44) 52 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 4cead4a7-ad21-4a10-bac7-2f4d1742d799)) 53 | (fp_line (start 32.5 5.5) (end 32.5 0) 54 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp abfadbb2-e0a9-4c46-9d4e-a2c35e9ae540)) 55 | (fp_line (start 33 7) (end 35.5 9.5) 56 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 0aa10688-7d08-45fd-b5ff-1c33e28a0c3a)) 57 | (fp_line (start 33.5 12.914214) (end 33.5 18) 58 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 235241db-0523-426d-aee7-13d4ebe214e6)) 59 | (fp_line (start 33.5 18) (end 33.5 29) 60 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp e5e83103-cd35-467f-aec7-e814d472efb5)) 61 | (fp_line (start 33.5 18) (end 39.5 18) 62 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 9ed4f168-bc95-4407-8cd8-f329f62c5f2c)) 63 | (fp_line (start 33.5 29) (end 33.5 42) 64 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 3fd97ff4-8645-4d95-b1b6-72f6891066c5)) 65 | (fp_line (start 33.5 42) (end 33.5 50) 66 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 7165778c-69ff-463e-8c53-778edbdd19b9)) 67 | (fp_line (start 34 7) (end 37 4) 68 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 3faf0232-5cfc-42ac-a523-56979fd63898)) 69 | (fp_line (start 35.5 9.5) (end 39.5 9.5) 70 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 97c064e4-6020-4071-adc7-ba539470a562)) 71 | (fp_line (start 36.5 7.5) (end 35 6) 72 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 41e2a93f-af25-465d-9fa6-da6d7d8ae0a3)) 73 | (fp_line (start 37 4) (end 37 0) 74 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp ee6c4094-8f42-4cae-9e8f-210519c26374)) 75 | (fp_line (start 39.5 7.5) (end 36.5 7.5) 76 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 96f4be75-f82f-4a1e-a17c-b549a2316b41)) 77 | (fp_line (start 39.5 18) (end 39.5 8) 78 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 6ce56deb-adef-4e03-9828-b5aa5b6d1d9b)) 79 | (fp_line (start 39.5 18) (end 39.5 29) 80 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 14442b9f-6768-4109-b535-38345460e879)) 81 | (fp_line (start 39.5 29) (end 33.5 29) 82 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp e5870b6d-674e-4f0e-804d-d88ff54125c6)) 83 | (fp_line (start 39.5 42) (end 39.5 29) 84 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 868ea86c-cbe2-4e27-9afc-b2ae66f22e21)) 85 | (fp_line (start 41.5 6) (end 72 6) 86 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp bbf17d0d-cc15-464e-8c76-ae9a43160dbf)) 87 | (fp_line (start 59.5 8) (end 59.5 22.5) 88 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp b62ff4f2-477f-4be7-837d-c1161cf774c8)) 89 | (fp_line (start 67 36.25) (end 67 41.5) 90 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 0c97c08a-5e7f-42dc-9b39-bcd195301f7a)) 91 | (fp_line (start 69 34.25) (end 71.25 34.25) 92 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 7eb7447f-8ba4-452d-b26e-ffad32de7248)) 93 | (fp_line (start 69 43.5) (end 71.25 43.5) 94 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp a0c4c41f-9b00-4f9c-9a81-b240663b58e4)) 95 | (fp_line (start 72 24.5) (end 61.5 24.5) 96 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 6b6d4a6b-3e84-4df1-bfdb-72938a45d547)) 97 | (fp_line (start 72 44) (end 41.5 44) 98 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 2a5dba34-3ff8-4c85-9b6f-b8b4f8d4a4c4)) 99 | (fp_line (start 73.25 36.25) (end 73.25 41.5) 100 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 5dff7d3b-5aac-4435-9b57-6bb6ba722d75)) 101 | (fp_line (start 74 8) (end 74 42) 102 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 8a74d93a-0cb3-4cfd-890a-59d4f4dfe8c0)) 103 | (fp_rect (start 5.75 21.5) (end 11 29.25) 104 | (stroke (width 0.15) (type default)) (fill none) (layer "User.2") (tstamp 617e7aaf-d76b-4d44-bbde-c99ecb415830)) 105 | (fp_rect (start 6.25 39.25) (end 22.75 43) 106 | (stroke (width 0.15) (type default)) (fill none) (layer "User.2") (tstamp c105b655-6039-48cc-a119-fba3099f3b5d)) 107 | (fp_rect (start 6.75 30) (end 10.75 38.75) 108 | (stroke (width 0.15) (type default)) (fill none) (layer "User.2") (tstamp c18eb781-7255-4b95-8a5e-b848373faba9)) 109 | (fp_rect (start 23.75 33.875) (end 27.5 42.5) 110 | (stroke (width 0.15) (type default)) (fill none) (layer "User.2") (tstamp 421d1604-9387-49ca-8e3b-9929ec7c7056)) 111 | (fp_rect (start 28 33.75) (end 33 41.5) 112 | (stroke (width 0.15) (type default)) (fill none) (layer "User.2") (tstamp eb8aad81-4181-464c-825b-60cbc84fe0a8)) 113 | (fp_arc (start 5 8) (mid 5.585786 6.585786) (end 7 6) 114 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 75123ebd-f2a7-4b52-890f-4e8fd50617a9)) 115 | (fp_arc (start 7 44) (mid 5.585786 43.414214) (end 5 42) 116 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 8327669f-0c0c-4ae7-a02f-eaaaefeee513)) 117 | (fp_arc (start 31.585786 11) (mid 32.939344 11.560656) (end 33.5 12.914214) 118 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 552dfd79-a658-4009-845c-fd7e80cecab9)) 119 | (fp_arc (start 33.5 42) (mid 32.914214 43.414214) (end 31.5 44) 120 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp ddf681a5-b860-4e6f-88a8-88647bbc1dee)) 121 | (fp_arc (start 39.5 8) (mid 40.085786 6.585786) (end 41.5 6) 122 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 018209f3-0a57-4758-b2dd-a7809f461209)) 123 | (fp_arc (start 41.5 44) (mid 40.085786 43.414214) (end 39.5 42) 124 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp c99dcf69-8046-4c95-9cc5-18ef279532d8)) 125 | (fp_arc (start 59.5 8) (mid 60.085786 6.585786) (end 61.5 6) 126 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 40cd7f59-6301-41a8-82cc-11789d7254eb)) 127 | (fp_arc (start 61.5 24.5) (mid 60.085786 23.914214) (end 59.5 22.5) 128 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 7e0d6ae5-c395-48e6-ade1-ddc3a1e82450)) 129 | (fp_arc (start 67 36.25) (mid 67.585786 34.835786) (end 69 34.25) 130 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 895dd1f1-9f18-41e7-ba39-099d27af2999)) 131 | (fp_arc (start 69 43.5) (mid 67.585786 42.914214) (end 67 41.5) 132 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 405802df-7b13-4481-b75c-8749ddba61bc)) 133 | (fp_arc (start 71.25 34.25) (mid 72.664214 34.835786) (end 73.25 36.25) 134 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 06ee734f-1259-45ff-8237-29a2b9345096)) 135 | (fp_arc (start 72 6) (mid 73.414214 6.585786) (end 74 8) 136 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 106183a7-e4f7-47dc-8ad1-b1b06b44639a)) 137 | (fp_arc (start 73.25 41.5) (mid 72.664214 42.914214) (end 71.25 43.5) 138 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp 144f2d52-a63a-4a9c-8609-8fffbd4af6b2)) 139 | (fp_arc (start 74 22.5) (mid 73.414214 23.914214) (end 72 24.5) 140 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp c58af15b-34fa-4394-8f45-71d39fba4e05)) 141 | (fp_arc (start 74 42) (mid 73.414214 43.414214) (end 72 44) 142 | (stroke (width 0.15) (type default)) (layer "User.2") (tstamp dabf9e30-909c-43e2-be66-e5eecb28aced)) 143 | (fp_circle (center 30 27.27) (end 31.227952 27.27) 144 | (stroke (width 0.2) (type default)) (fill none) (layer "User.2") (tstamp 158810b0-985a-4edb-82c2-104963d1bba8)) 145 | (pad "1" thru_hole circle (at 3 3) (size 4.7 4.7) (drill 2.7) (layers "*.Cu" "*.Mask") (tstamp c97c7a5f-e0bf-4766-a27f-db4160d325e0)) 146 | (pad "1" thru_hole circle (at 3 47) (size 4.7 4.7) (drill 2.7) (layers "*.Cu" "*.Mask") (tstamp 626b5524-5be1-42d4-925f-32097669cb2c)) 147 | (pad "1" thru_hole circle (at 40 3) (size 4.7 4.7) (drill 2.7) (layers "*.Cu" "*.Mask") (tstamp 52767cfc-94f9-4022-9f6a-7da8eb66dfe1)) 148 | (pad "1" thru_hole circle (at 40 47 45) (size 4.7 4.7) (drill 2.7) (layers "*.Cu" "*.Mask") (tstamp 8fee56cd-c4f6-41e4-9f0d-21bcd9a47947)) 149 | (pad "1" thru_hole circle (at 77 3 45) (size 4.7 4.7) (drill 2.7) (layers "*.Cu" "*.Mask") (tstamp 50ef9f71-08cf-4b4b-b985-94b04e43aeac)) 150 | (pad "1" thru_hole circle (at 77 47 45) (size 4.7 4.7) (drill 2.7) (layers "*.Cu" "*.Mask") (tstamp dbb7ba42-4f84-4cc6-9f41-52f6d7182d10)) 151 | ) 152 | -------------------------------------------------------------------------------- /hardware/betaBoard_r1.0/betaBoard.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "apply_defaults_to_fp_fields": false, 7 | "apply_defaults_to_fp_shapes": false, 8 | "apply_defaults_to_fp_text": false, 9 | "board_outline_line_width": 0.1, 10 | "copper_line_width": 0.2, 11 | "copper_text_italic": false, 12 | "copper_text_size_h": 1.5, 13 | "copper_text_size_v": 1.5, 14 | "copper_text_thickness": 0.3, 15 | "copper_text_upright": false, 16 | "courtyard_line_width": 0.05, 17 | "dimension_precision": 4, 18 | "dimension_units": 3, 19 | "dimensions": { 20 | "arrow_length": 1270000, 21 | "extension_offset": 500000, 22 | "keep_text_aligned": true, 23 | "suppress_zeroes": false, 24 | "text_position": 0, 25 | "units_format": 1 26 | }, 27 | "fab_line_width": 0.1, 28 | "fab_text_italic": false, 29 | "fab_text_size_h": 1.0, 30 | "fab_text_size_v": 1.0, 31 | "fab_text_thickness": 0.15, 32 | "fab_text_upright": false, 33 | "other_line_width": 0.15, 34 | "other_text_italic": false, 35 | "other_text_size_h": 1.0, 36 | "other_text_size_v": 1.0, 37 | "other_text_thickness": 0.15, 38 | "other_text_upright": false, 39 | "pads": { 40 | "drill": 2.7, 41 | "height": 4.7, 42 | "width": 4.7 43 | }, 44 | "silk_line_width": 0.15, 45 | "silk_text_italic": false, 46 | "silk_text_size_h": 1.0, 47 | "silk_text_size_v": 1.0, 48 | "silk_text_thickness": 0.15, 49 | "silk_text_upright": false, 50 | "zones": { 51 | "45_degree_only": false, 52 | "min_clearance": 0.408 53 | } 54 | }, 55 | "diff_pair_dimensions": [ 56 | { 57 | "gap": 0.0, 58 | "via_gap": 0.0, 59 | "width": 0.0 60 | } 61 | ], 62 | "drc_exclusions": [], 63 | "meta": { 64 | "version": 2 65 | }, 66 | "rule_severities": { 67 | "annular_width": "error", 68 | "clearance": "error", 69 | "connection_width": "warning", 70 | "copper_edge_clearance": "error", 71 | "copper_sliver": "warning", 72 | "courtyards_overlap": "error", 73 | "diff_pair_gap_out_of_range": "error", 74 | "diff_pair_uncoupled_length_too_long": "error", 75 | "drill_out_of_range": "error", 76 | "duplicate_footprints": "warning", 77 | "extra_footprint": "warning", 78 | "footprint": "error", 79 | "footprint_symbol_mismatch": "warning", 80 | "footprint_type_mismatch": "error", 81 | "hole_clearance": "error", 82 | "hole_near_hole": "error", 83 | "invalid_outline": "error", 84 | "isolated_copper": "warning", 85 | "item_on_disabled_layer": "error", 86 | "items_not_allowed": "error", 87 | "length_out_of_range": "error", 88 | "lib_footprint_issues": "warning", 89 | "lib_footprint_mismatch": "warning", 90 | "malformed_courtyard": "error", 91 | "microvia_drill_out_of_range": "error", 92 | "missing_courtyard": "ignore", 93 | "missing_footprint": "warning", 94 | "net_conflict": "warning", 95 | "npth_inside_courtyard": "ignore", 96 | "padstack": "error", 97 | "pth_inside_courtyard": "ignore", 98 | "shorting_items": "error", 99 | "silk_edge_clearance": "warning", 100 | "silk_over_copper": "warning", 101 | "silk_overlap": "warning", 102 | "skew_out_of_range": "error", 103 | "solder_mask_bridge": "error", 104 | "starved_thermal": "error", 105 | "text_height": "warning", 106 | "text_thickness": "warning", 107 | "through_hole_pad_without_hole": "error", 108 | "too_many_vias": "error", 109 | "track_dangling": "warning", 110 | "track_width": "error", 111 | "tracks_crossing": "error", 112 | "unconnected_items": "error", 113 | "unresolved_variable": "error", 114 | "via_dangling": "warning", 115 | "zones_intersect": "error" 116 | }, 117 | "rules": { 118 | "allow_blind_buried_vias": false, 119 | "allow_microvias": false, 120 | "max_error": 0.005, 121 | "min_clearance": 0.2, 122 | "min_connection": 0.0, 123 | "min_copper_edge_clearance": 0.3, 124 | "min_hole_clearance": 0.33, 125 | "min_hole_to_hole": 0.25, 126 | "min_microvia_diameter": 0.2, 127 | "min_microvia_drill": 0.1, 128 | "min_resolved_spokes": 1, 129 | "min_silk_clearance": 0.0, 130 | "min_text_height": 0.8, 131 | "min_text_thickness": 0.08, 132 | "min_through_hole_diameter": 0.3, 133 | "min_track_width": 0.2, 134 | "min_via_annular_width": 0.15, 135 | "min_via_diameter": 0.5, 136 | "solder_mask_clearance": 0.0, 137 | "solder_mask_min_width": 0.0, 138 | "solder_mask_to_copper_clearance": 0.005, 139 | "use_height_for_length_calcs": true 140 | }, 141 | "teardrop_options": [ 142 | { 143 | "td_onpadsmd": true, 144 | "td_onroundshapesonly": false, 145 | "td_ontrackend": false, 146 | "td_onviapad": true 147 | } 148 | ], 149 | "teardrop_parameters": [ 150 | { 151 | "td_allow_use_two_tracks": true, 152 | "td_curve_segcount": 0, 153 | "td_height_ratio": 1.0, 154 | "td_length_ratio": 0.5, 155 | "td_maxheight": 2.0, 156 | "td_maxlen": 1.0, 157 | "td_on_pad_in_zone": false, 158 | "td_target_name": "td_round_shape", 159 | "td_width_to_size_filter_ratio": 0.9 160 | }, 161 | { 162 | "td_allow_use_two_tracks": true, 163 | "td_curve_segcount": 0, 164 | "td_height_ratio": 1.0, 165 | "td_length_ratio": 0.5, 166 | "td_maxheight": 2.0, 167 | "td_maxlen": 1.0, 168 | "td_on_pad_in_zone": false, 169 | "td_target_name": "td_rect_shape", 170 | "td_width_to_size_filter_ratio": 0.9 171 | }, 172 | { 173 | "td_allow_use_two_tracks": true, 174 | "td_curve_segcount": 0, 175 | "td_height_ratio": 1.0, 176 | "td_length_ratio": 0.5, 177 | "td_maxheight": 2.0, 178 | "td_maxlen": 1.0, 179 | "td_on_pad_in_zone": false, 180 | "td_target_name": "td_track_end", 181 | "td_width_to_size_filter_ratio": 0.9 182 | } 183 | ], 184 | "track_widths": [ 185 | 0.0, 186 | 0.15 187 | ], 188 | "tuning_pattern_settings": { 189 | "diff_pair_defaults": { 190 | "corner_radius_percentage": 80, 191 | "corner_style": 1, 192 | "max_amplitude": 1.0, 193 | "min_amplitude": 0.2, 194 | "single_sided": false, 195 | "spacing": 1.0 196 | }, 197 | "diff_pair_skew_defaults": { 198 | "corner_radius_percentage": 80, 199 | "corner_style": 1, 200 | "max_amplitude": 1.0, 201 | "min_amplitude": 0.2, 202 | "single_sided": false, 203 | "spacing": 0.6 204 | }, 205 | "single_track_defaults": { 206 | "corner_radius_percentage": 80, 207 | "corner_style": 1, 208 | "max_amplitude": 1.0, 209 | "min_amplitude": 0.2, 210 | "single_sided": false, 211 | "spacing": 0.6 212 | } 213 | }, 214 | "via_dimensions": [ 215 | { 216 | "diameter": 0.0, 217 | "drill": 0.0 218 | }, 219 | { 220 | "diameter": 0.8, 221 | "drill": 0.4 222 | } 223 | ], 224 | "zones_allow_external_fillets": false, 225 | "zones_use_no_outline": true 226 | }, 227 | "ipc2581": { 228 | "dist": "", 229 | "distpn": "", 230 | "internal_id": "", 231 | "mfg": "", 232 | "mpn": "" 233 | }, 234 | "layer_presets": [], 235 | "viewports": [] 236 | }, 237 | "boards": [], 238 | "cvpcb": { 239 | "equivalence_files": [] 240 | }, 241 | "erc": { 242 | "erc_exclusions": [], 243 | "meta": { 244 | "version": 0 245 | }, 246 | "pin_map": [ 247 | [ 248 | 0, 249 | 0, 250 | 0, 251 | 0, 252 | 0, 253 | 0, 254 | 1, 255 | 0, 256 | 0, 257 | 0, 258 | 0, 259 | 2 260 | ], 261 | [ 262 | 0, 263 | 2, 264 | 0, 265 | 1, 266 | 0, 267 | 0, 268 | 1, 269 | 0, 270 | 2, 271 | 2, 272 | 2, 273 | 2 274 | ], 275 | [ 276 | 0, 277 | 0, 278 | 0, 279 | 0, 280 | 0, 281 | 0, 282 | 1, 283 | 0, 284 | 1, 285 | 0, 286 | 1, 287 | 2 288 | ], 289 | [ 290 | 0, 291 | 1, 292 | 0, 293 | 0, 294 | 0, 295 | 0, 296 | 1, 297 | 1, 298 | 2, 299 | 1, 300 | 1, 301 | 2 302 | ], 303 | [ 304 | 0, 305 | 0, 306 | 0, 307 | 0, 308 | 0, 309 | 0, 310 | 1, 311 | 0, 312 | 0, 313 | 0, 314 | 0, 315 | 2 316 | ], 317 | [ 318 | 0, 319 | 0, 320 | 0, 321 | 0, 322 | 0, 323 | 0, 324 | 0, 325 | 0, 326 | 0, 327 | 0, 328 | 0, 329 | 2 330 | ], 331 | [ 332 | 1, 333 | 1, 334 | 1, 335 | 1, 336 | 1, 337 | 0, 338 | 1, 339 | 1, 340 | 1, 341 | 1, 342 | 1, 343 | 2 344 | ], 345 | [ 346 | 0, 347 | 0, 348 | 0, 349 | 1, 350 | 0, 351 | 0, 352 | 1, 353 | 0, 354 | 0, 355 | 0, 356 | 0, 357 | 2 358 | ], 359 | [ 360 | 0, 361 | 2, 362 | 1, 363 | 2, 364 | 0, 365 | 0, 366 | 1, 367 | 0, 368 | 2, 369 | 2, 370 | 2, 371 | 2 372 | ], 373 | [ 374 | 0, 375 | 2, 376 | 0, 377 | 1, 378 | 0, 379 | 0, 380 | 1, 381 | 0, 382 | 2, 383 | 0, 384 | 0, 385 | 2 386 | ], 387 | [ 388 | 0, 389 | 2, 390 | 1, 391 | 1, 392 | 0, 393 | 0, 394 | 1, 395 | 0, 396 | 2, 397 | 0, 398 | 0, 399 | 2 400 | ], 401 | [ 402 | 2, 403 | 2, 404 | 2, 405 | 2, 406 | 2, 407 | 2, 408 | 2, 409 | 2, 410 | 2, 411 | 2, 412 | 2, 413 | 2 414 | ] 415 | ], 416 | "rule_severities": { 417 | "bus_definition_conflict": "error", 418 | "bus_entry_needed": "error", 419 | "bus_to_bus_conflict": "error", 420 | "bus_to_net_conflict": "error", 421 | "conflicting_netclasses": "error", 422 | "different_unit_footprint": "error", 423 | "different_unit_net": "error", 424 | "duplicate_reference": "error", 425 | "duplicate_sheet_names": "error", 426 | "endpoint_off_grid": "warning", 427 | "extra_units": "error", 428 | "global_label_dangling": "warning", 429 | "hier_label_mismatch": "error", 430 | "label_dangling": "error", 431 | "lib_symbol_issues": "warning", 432 | "missing_bidi_pin": "warning", 433 | "missing_input_pin": "warning", 434 | "missing_power_pin": "error", 435 | "missing_unit": "warning", 436 | "multiple_net_names": "warning", 437 | "net_not_bus_member": "warning", 438 | "no_connect_connected": "warning", 439 | "no_connect_dangling": "warning", 440 | "pin_not_connected": "error", 441 | "pin_not_driven": "error", 442 | "pin_to_pin": "warning", 443 | "power_pin_not_driven": "error", 444 | "similar_labels": "warning", 445 | "simulation_model_issue": "ignore", 446 | "unannotated": "error", 447 | "unit_value_mismatch": "error", 448 | "unresolved_variable": "error", 449 | "wire_dangling": "error" 450 | } 451 | }, 452 | "libraries": { 453 | "pinned_footprint_libs": [], 454 | "pinned_symbol_libs": [] 455 | }, 456 | "meta": { 457 | "filename": "betaBoard.kicad_pro", 458 | "version": 1 459 | }, 460 | "net_settings": { 461 | "classes": [ 462 | { 463 | "bus_width": 12, 464 | "clearance": 0.2, 465 | "diff_pair_gap": 0.25, 466 | "diff_pair_via_gap": 0.25, 467 | "diff_pair_width": 0.2, 468 | "line_style": 0, 469 | "microvia_diameter": 0.3, 470 | "microvia_drill": 0.1, 471 | "name": "Default", 472 | "pcb_color": "rgba(0, 0, 0, 0.000)", 473 | "schematic_color": "rgba(0, 0, 0, 0.000)", 474 | "track_width": 0.25, 475 | "via_diameter": 0.8, 476 | "via_drill": 0.4, 477 | "wire_width": 6 478 | }, 479 | { 480 | "bus_width": 12, 481 | "clearance": 0.2, 482 | "diff_pair_gap": 0.25, 483 | "diff_pair_via_gap": 0.25, 484 | "diff_pair_width": 0.2, 485 | "line_style": 0, 486 | "microvia_diameter": 0.3, 487 | "microvia_drill": 0.1, 488 | "name": "PWR", 489 | "pcb_color": "rgba(0, 0, 0, 0.000)", 490 | "schematic_color": "rgba(0, 0, 0, 0.000)", 491 | "track_width": 0.4, 492 | "via_diameter": 1.0, 493 | "via_drill": 0.6, 494 | "wire_width": 6 495 | } 496 | ], 497 | "meta": { 498 | "version": 3 499 | }, 500 | "net_colors": null, 501 | "netclass_assignments": null, 502 | "netclass_patterns": [ 503 | { 504 | "netclass": "PWR", 505 | "pattern": "+3V3" 506 | }, 507 | { 508 | "netclass": "PWR", 509 | "pattern": "GND" 510 | }, 511 | { 512 | "netclass": "PWR", 513 | "pattern": "VCC" 514 | } 515 | ] 516 | }, 517 | "pcbnew": { 518 | "last_paths": { 519 | "gencad": "", 520 | "idf": "", 521 | "netlist": "", 522 | "plot": "", 523 | "pos_files": "", 524 | "specctra_dsn": "", 525 | "step": "", 526 | "svg": "", 527 | "vrml": "" 528 | }, 529 | "page_layout_descr_file": "" 530 | }, 531 | "schematic": { 532 | "annotate_start_num": 0, 533 | "bom_fmt_presets": [], 534 | "bom_fmt_settings": { 535 | "field_delimiter": ",", 536 | "keep_line_breaks": false, 537 | "keep_tabs": false, 538 | "name": "CSV", 539 | "ref_delimiter": ",", 540 | "ref_range_delimiter": "", 541 | "string_delimiter": "\"" 542 | }, 543 | "bom_presets": [], 544 | "bom_settings": { 545 | "exclude_dnp": false, 546 | "fields_ordered": [ 547 | { 548 | "group_by": false, 549 | "label": "Reference", 550 | "name": "Reference", 551 | "show": true 552 | }, 553 | { 554 | "group_by": true, 555 | "label": "Value", 556 | "name": "Value", 557 | "show": true 558 | }, 559 | { 560 | "group_by": false, 561 | "label": "Datasheet", 562 | "name": "Datasheet", 563 | "show": true 564 | }, 565 | { 566 | "group_by": false, 567 | "label": "Footprint", 568 | "name": "Footprint", 569 | "show": true 570 | }, 571 | { 572 | "group_by": false, 573 | "label": "Qty", 574 | "name": "${QUANTITY}", 575 | "show": true 576 | }, 577 | { 578 | "group_by": true, 579 | "label": "DNP", 580 | "name": "${DNP}", 581 | "show": true 582 | } 583 | ], 584 | "filter_string": "", 585 | "group_symbols": true, 586 | "name": "Grouped By Value", 587 | "sort_asc": true, 588 | "sort_field": "Reference" 589 | }, 590 | "connection_grid_size": 50.0, 591 | "drawing": { 592 | "dashed_lines_dash_length_ratio": 12.0, 593 | "dashed_lines_gap_length_ratio": 3.0, 594 | "default_line_thickness": 6.0, 595 | "default_text_size": 50.0, 596 | "field_names": [], 597 | "intersheets_ref_own_page": false, 598 | "intersheets_ref_prefix": "", 599 | "intersheets_ref_short": false, 600 | "intersheets_ref_show": false, 601 | "intersheets_ref_suffix": "", 602 | "junction_size_choice": 3, 603 | "label_size_ratio": 0.375, 604 | "operating_point_overlay_i_precision": 3, 605 | "operating_point_overlay_i_range": "~A", 606 | "operating_point_overlay_v_precision": 3, 607 | "operating_point_overlay_v_range": "~V", 608 | "overbar_offset_ratio": 1.23, 609 | "pin_symbol_size": 25.0, 610 | "text_offset_ratio": 0.15 611 | }, 612 | "legacy_lib_dir": "", 613 | "legacy_lib_list": [], 614 | "meta": { 615 | "version": 1 616 | }, 617 | "net_format_name": "", 618 | "ngspice": { 619 | "fix_include_paths": true, 620 | "fix_passive_vals": false, 621 | "meta": { 622 | "version": 0 623 | }, 624 | "model_mode": 0, 625 | "workbook_filename": "" 626 | }, 627 | "page_layout_descr_file": "", 628 | "plot_directory": "", 629 | "spice_adjust_passive_values": false, 630 | "spice_current_sheet_as_root": false, 631 | "spice_external_command": "spice \"%I\"", 632 | "spice_model_current_sheet_as_root": true, 633 | "spice_save_all_currents": false, 634 | "spice_save_all_dissipations": false, 635 | "spice_save_all_voltages": false, 636 | "subpart_first_id": 65, 637 | "subpart_id_separator": 0 638 | }, 639 | "sheets": [ 640 | [ 641 | "3d37b943-9a24-43ad-9fbf-b901b38695ce", 642 | "" 643 | ], 644 | [ 645 | "9a638de9-fce0-4d4f-9079-020409d07315", 646 | "MCU" 647 | ], 648 | [ 649 | "1d31b165-afd9-4178-8caf-a7fc7b259f97", 650 | "particle_sensor_array" 651 | ], 652 | [ 653 | "a19c94be-85f2-45d0-b8ae-fe772296c136", 654 | "particle_sensor_array1" 655 | ], 656 | [ 657 | "cd42d678-88a0-4889-b461-e4aa141e3c58", 658 | "particle_sensor_array2" 659 | ], 660 | [ 661 | "617ca541-d0cd-4a41-a58b-d194673edcc6", 662 | "particle_sensor_array3" 663 | ] 664 | ], 665 | "text_variables": {} 666 | } 667 | -------------------------------------------------------------------------------- /hardware/betaBoard_r1.0/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (version 7) 3 | (lib (name "betaBoard")(type "KiCad")(uri "/Users/tim/git/BetaBoard/betaBoard.pretty")(options "")(descr "")) 4 | ) 5 | -------------------------------------------------------------------------------- /hardware/betaBoard_r1.0/pdf/betaBoard_pcb.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/hardware/betaBoard_r1.0/pdf/betaBoard_pcb.pdf -------------------------------------------------------------------------------- /hardware/betaBoard_r1.0/pdf/betaBoard_sch.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/hardware/betaBoard_r1.0/pdf/betaBoard_sch.pdf -------------------------------------------------------------------------------- /hardware/betaBoard_r1.0/production/betaBoard_R1.0_2024-01-08_ordered/betaBoard_R1.0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/hardware/betaBoard_r1.0/production/betaBoard_R1.0_2024-01-08_ordered/betaBoard_R1.0.zip -------------------------------------------------------------------------------- /hardware/betaBoard_r1.0/production/betaBoard_R1.0_2024-01-08_ordered/bom.csv: -------------------------------------------------------------------------------- 1 | Designator,Footprint,Quantity,Value,LCSC Part # 2 | "C1, C2",1206,2,10u, 3 | "C10, C11, C15, C16, C18, C22, C24, C28, C3, C30, C34, C36, C4, C40, C5, C6, C7, C8",0603,18,100n, 4 | "C12, C13",0603,2,30p, 5 | "C14, C17, C9",0603,3,1u, 6 | "C19, C20, C25, C26, C31, C32, C37, C38",0603,8,10p, 7 | "C21, C27, C33, C39",0603,4,470n, 8 | "C23, C29, C35, C41",0603,4,47p, 9 | "D10, D11, D14, D15, D2, D3, D6, D7",Osram_BPW34S-SMD_hole,8,BPW34-SMD, 10 | "D17, D18",D_SOD-323,2,1N5819WS, 11 | D19,0603,1,LED, 12 | "D20, D21, D22, D23",D_MiniMELF,4,ZMM3V3-M, 13 | J2,AMPHENOL_10103592-0001LF,1,AMPHENOL_10103592-0001LF, 14 | "R1, R10, R17, R18, R20, R25, R26, R28, R33, R34, R36, R41, R42, R44, R7",0603,15,10k, 15 | "R11, R2, R3, R4, R5, R6",0603,6,1k, 16 | R12,0603,1,100, 17 | "R13, R16, R21, R24, R29, R32, R37, R40",0603,8,4k7, 18 | "R14, R22, R30, R38",0603,4,15k, 19 | "R15, R23, R31, R39",0603,4,47M, 20 | "R19, R27, R35, R43",0603,4,1M, 21 | "R8, R9",0603,2,27.4, 22 | "SW1, SW2",TS-1187A-B-A-B,2,C26638, 23 | U1,SOT-223-3_TabPin2,1,AMS1117-3.3_SOT223, 24 | U2,SOIC-8_5.23x5.23mm_P1.27mm,1,W25Q128JVSIQ, 25 | U3,QFN-56-1EP_7x7mm_P0.4mm_EP3.2x3.2mm,1,RP2040, 26 | "U4, U5, U6, U7",SOIC-8_3.9x4.9mm_P1.27mm,4,LM358, 27 | Y1,Crystal_SMD_3225-4Pin_3.2x2.5mm,1,X322512MSB4SI, 28 | -------------------------------------------------------------------------------- /hardware/betaBoard_r1.0/production/betaBoard_R1.0_2024-01-08_ordered/designators.csv: -------------------------------------------------------------------------------- 1 | C1:1 2 | C10:1 3 | C11:1 4 | C12:1 5 | C13:1 6 | C14:1 7 | C15:1 8 | C16:1 9 | C17:1 10 | C18:1 11 | C19:1 12 | C2:1 13 | C20:1 14 | C21:1 15 | C22:1 16 | C23:1 17 | C24:1 18 | C25:1 19 | C26:1 20 | C27:1 21 | C28:1 22 | C29:1 23 | C3:1 24 | C30:1 25 | C31:1 26 | C32:1 27 | C33:1 28 | C34:1 29 | C35:1 30 | C36:1 31 | C37:1 32 | C38:1 33 | C39:1 34 | C4:1 35 | C40:1 36 | C41:1 37 | C5:1 38 | C6:1 39 | C7:1 40 | C8:1 41 | C9:1 42 | D1:1 43 | D10:1 44 | D11:1 45 | D12:1 46 | D13:1 47 | D14:1 48 | D15:1 49 | D16:1 50 | D17:1 51 | D18:1 52 | D19:1 53 | D2:1 54 | D20:1 55 | D21:1 56 | D22:1 57 | D23:1 58 | D3:1 59 | D4:1 60 | D5:1 61 | D6:1 62 | D7:1 63 | D8:1 64 | D9:1 65 | G***:1 66 | H1:1 67 | H2:1 68 | H3:1 69 | H4:1 70 | H5:1 71 | H6:1 72 | J1:1 73 | J2:1 74 | J3:1 75 | J4:1 76 | J5:1 77 | J6:1 78 | JP1:1 79 | R1:1 80 | R10:1 81 | R11:1 82 | R12:1 83 | R13:1 84 | R14:1 85 | R15:1 86 | R16:1 87 | R17:1 88 | R18:1 89 | R19:1 90 | R2:1 91 | R20:1 92 | R21:1 93 | R22:1 94 | R23:1 95 | R24:1 96 | R25:1 97 | R26:1 98 | R27:1 99 | R28:1 100 | R29:1 101 | R3:1 102 | R30:1 103 | R31:1 104 | R32:1 105 | R33:1 106 | R34:1 107 | R35:1 108 | R36:1 109 | R37:1 110 | R38:1 111 | R39:1 112 | R4:1 113 | R40:1 114 | R41:1 115 | R42:1 116 | R43:1 117 | R44:1 118 | R5:1 119 | R6:1 120 | R7:1 121 | R8:1 122 | R9:1 123 | SW1:1 124 | SW2:1 125 | U1:1 126 | U2:1 127 | U3:1 128 | U4:1 129 | U5:1 130 | U6:1 131 | U7:1 132 | Y1:1 133 | -------------------------------------------------------------------------------- /hardware/betaBoard_r1.0/production/betaBoard_R1.0_2024-01-08_ordered/positions.csv: -------------------------------------------------------------------------------- 1 | Designator,Mid X,Mid Y,Rotation,Layer 2 | C1,55.0,-53.475,90.0,top 3 | C10,68.453,-77.864,270.0,top 4 | C11,73.533,-71.6026,0.0,top 5 | C12,60.325,-77.978,90.0,top 6 | C13,65.3796,-77.8764,90.0,top 7 | C14,73.787,-62.8142,90.0,top 8 | C15,70.612,-77.851,270.0,top 9 | C16,67.0306,-63.373,90.0,top 10 | C17,74.549,-65.786,0.0,top 11 | C18,90.932,-92.443,270.0,top 12 | C19,100.4824,-88.011,270.0,top 13 | C2,52.832,-66.421,180.0,top 14 | C20,98.933,-88.011,90.0,top 15 | C21,93.98,-92.443,270.0,top 16 | C22,87.1982,-84.0486,90.0,top 17 | C23,85.6742,-87.363,270.0,top 18 | C24,89.8652,-61.468,270.0,top 19 | C25,100.457,-57.8,270.0,top 20 | C26,98.932,-57.8,90.0,top 21 | C27,93.98,-61.468,270.0,top 22 | C28,87.2,-53.086,90.0,top 23 | C29,85.7,-56.4,270.0,top 24 | C3,75.311,-62.8142,90.0,top 25 | C30,89.916,-71.628,270.0,top 26 | C31,100.4824,-67.9196,270.0,top 27 | C32,98.933,-67.9196,90.0,top 28 | C33,94.063,-71.628,270.0,top 29 | C34,87.2236,-63.246,90.0,top 30 | C35,85.6996,-66.535,270.0,top 31 | C36,90.0938,-82.0674,270.0,top 32 | C37,100.4824,-78.359,270.0,top 33 | C38,98.933,-78.359,90.0,top 34 | C39,94.063,-82.042,270.0,top 35 | C4,74.549,-67.564,0.0,top 36 | C40,87.1982,-73.66,90.0,top 37 | C41,85.6742,-76.962,270.0,top 38 | C5,61.582,-71.374,180.0,top 39 | C6,68.58,-63.119,90.0,top 40 | C7,67.0306,-58.928,90.0,top 41 | C8,61.595,-66.929,180.0,top 42 | C9,68.58,-58.928,90.0,top 43 | D10,110.49,-68.072,270.0,top 44 | D11,105.41,-77.216,90.0,top 45 | D14,105.41,-68.072,270.0,top 46 | D15,110.49,-85.852,270.0,top 47 | D17,59.182,-51.943,0.0,top 48 | D18,67.945,-55.499,270.0,top 49 | D19,75.0316,-75.3364,180.0,top 50 | D2,110.49,-59.69,90.0,top 51 | D20,80.772,-85.5472,270.0,top 52 | D21,80.8228,-57.0484,90.0,top 53 | D22,85.8266,-69.2912,0.0,top 54 | D23,80.8736,-75.184,270.0,top 55 | D3,110.49,-77.216,90.0,top 56 | D6,105.41,-59.69,90.0,top 57 | D7,105.41,-85.852,270.0,top 58 | J2,74.549,-50.0,180.0,top 59 | R1,73.533,-73.66,180.0,top 60 | R10,75.013,-77.0051,0.0,top 61 | R11,66.9036,-77.8764,90.0,top 62 | R12,76.835,-62.8142,90.0,top 63 | R13,100.4824,-84.5,270.0,top 64 | R14,98.933,-84.5058,90.0,top 65 | R15,97.3582,-88.0364,90.0,top 66 | R16,92.456,-92.443,270.0,top 67 | R17,84.1502,-84.0486,90.0,top 68 | R18,85.6742,-84.0486,270.0,top 69 | R19,87.1982,-87.363,90.0,top 70 | R2,56.515,-83.566,270.0,top 71 | R20,84.1502,-87.363,270.0,top 72 | R21,100.457,-54.371,270.0,top 73 | R22,98.933,-54.371,90.0,top 74 | R23,97.409,-57.8104,90.0,top 75 | R24,92.456,-61.468,270.0,top 76 | R25,84.152,-53.086,90.0,top 77 | R26,85.676,-53.086,270.0,top 78 | R27,87.224,-56.4,90.0,top 79 | R28,84.176,-56.4,270.0,top 80 | R29,100.4824,-64.516,270.0,top 81 | R3,58.039,-83.566,270.0,top 82 | R30,98.933,-64.516,90.0,top 83 | R31,97.3836,-67.9196,90.0,top 84 | R32,92.539,-71.628,270.0,top 85 | R33,84.1756,-63.246,90.0,top 86 | R34,85.6996,-63.246,270.0,top 87 | R35,87.2236,-66.535,90.0,top 88 | R36,84.1756,-66.535,90.0,top 89 | R37,100.4824,-74.93,270.0,top 90 | R38,98.933,-74.93,90.0,top 91 | R39,97.3836,-78.359,90.0,top 92 | R4,59.563,-83.566,270.0,top 93 | R40,92.539,-82.042,270.0,top 94 | R41,84.1502,-73.66,90.0,top 95 | R42,85.6742,-73.66,270.0,top 96 | R43,87.1982,-76.962,90.0,top 97 | R44,84.1502,-76.962,270.0,top 98 | R5,61.087,-83.566,270.0,top 99 | R6,57.6834,-67.2846,0.0,top 100 | R7,57.6834,-65.7241,180.0,top 101 | R8,70.441,-62.8065,270.0,top 102 | R9,71.965,-62.8065,270.0,top 103 | SW1,54.277,-72.487,90.0,top 104 | SW2,76.297,-82.979,180.0,top 105 | U1,55.499,-60.071,180.0,top 106 | U2,63.246,-59.436,270.0,top 107 | U3,67.455,-70.3205,0.0,top 108 | U4,92.329,-87.363,180.0,top 109 | U5,92.329,-56.388,180.0,top 110 | U6,92.412,-66.548,180.0,top 111 | U7,92.412,-76.962,180.0,top 112 | Y1,62.865,-78.105,90.0,top 113 | -------------------------------------------------------------------------------- /hardware/betaBoard_r2.0/betaBoard.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "apply_defaults_to_fp_fields": false, 7 | "apply_defaults_to_fp_shapes": false, 8 | "apply_defaults_to_fp_text": false, 9 | "board_outline_line_width": 0.1, 10 | "copper_line_width": 0.2, 11 | "copper_text_italic": false, 12 | "copper_text_size_h": 1.5, 13 | "copper_text_size_v": 1.5, 14 | "copper_text_thickness": 0.3, 15 | "copper_text_upright": false, 16 | "courtyard_line_width": 0.05, 17 | "dimension_precision": 4, 18 | "dimension_units": 3, 19 | "dimensions": { 20 | "arrow_length": 1270000, 21 | "extension_offset": 500000, 22 | "keep_text_aligned": true, 23 | "suppress_zeroes": false, 24 | "text_position": 0, 25 | "units_format": 1 26 | }, 27 | "fab_line_width": 0.1, 28 | "fab_text_italic": false, 29 | "fab_text_size_h": 1.0, 30 | "fab_text_size_v": 1.0, 31 | "fab_text_thickness": 0.15, 32 | "fab_text_upright": false, 33 | "other_line_width": 0.15, 34 | "other_text_italic": false, 35 | "other_text_size_h": 1.0, 36 | "other_text_size_v": 1.0, 37 | "other_text_thickness": 0.15, 38 | "other_text_upright": false, 39 | "pads": { 40 | "drill": 2.7, 41 | "height": 4.7, 42 | "width": 4.7 43 | }, 44 | "silk_line_width": 0.15, 45 | "silk_text_italic": false, 46 | "silk_text_size_h": 1.0, 47 | "silk_text_size_v": 1.0, 48 | "silk_text_thickness": 0.15, 49 | "silk_text_upright": false, 50 | "zones": { 51 | "45_degree_only": false, 52 | "min_clearance": 0.6 53 | } 54 | }, 55 | "diff_pair_dimensions": [ 56 | { 57 | "gap": 0.0, 58 | "via_gap": 0.0, 59 | "width": 0.0 60 | } 61 | ], 62 | "drc_exclusions": [], 63 | "meta": { 64 | "version": 2 65 | }, 66 | "rule_severities": { 67 | "annular_width": "error", 68 | "clearance": "error", 69 | "connection_width": "warning", 70 | "copper_edge_clearance": "error", 71 | "copper_sliver": "warning", 72 | "courtyards_overlap": "error", 73 | "diff_pair_gap_out_of_range": "error", 74 | "diff_pair_uncoupled_length_too_long": "error", 75 | "drill_out_of_range": "error", 76 | "duplicate_footprints": "warning", 77 | "extra_footprint": "warning", 78 | "footprint": "error", 79 | "footprint_symbol_mismatch": "warning", 80 | "footprint_type_mismatch": "error", 81 | "hole_clearance": "error", 82 | "hole_near_hole": "error", 83 | "holes_co_located": "warning", 84 | "invalid_outline": "error", 85 | "isolated_copper": "warning", 86 | "item_on_disabled_layer": "error", 87 | "items_not_allowed": "error", 88 | "length_out_of_range": "error", 89 | "lib_footprint_issues": "warning", 90 | "lib_footprint_mismatch": "warning", 91 | "malformed_courtyard": "error", 92 | "microvia_drill_out_of_range": "error", 93 | "missing_courtyard": "ignore", 94 | "missing_footprint": "warning", 95 | "net_conflict": "warning", 96 | "npth_inside_courtyard": "ignore", 97 | "padstack": "error", 98 | "pth_inside_courtyard": "ignore", 99 | "shorting_items": "error", 100 | "silk_edge_clearance": "warning", 101 | "silk_over_copper": "warning", 102 | "silk_overlap": "warning", 103 | "skew_out_of_range": "error", 104 | "solder_mask_bridge": "error", 105 | "starved_thermal": "error", 106 | "text_height": "warning", 107 | "text_thickness": "warning", 108 | "through_hole_pad_without_hole": "error", 109 | "too_many_vias": "error", 110 | "track_dangling": "warning", 111 | "track_width": "error", 112 | "tracks_crossing": "error", 113 | "unconnected_items": "error", 114 | "unresolved_variable": "error", 115 | "via_dangling": "warning", 116 | "zones_intersect": "error" 117 | }, 118 | "rules": { 119 | "allow_blind_buried_vias": false, 120 | "allow_microvias": false, 121 | "max_error": 0.005, 122 | "min_clearance": 0.2, 123 | "min_connection": 0.0, 124 | "min_copper_edge_clearance": 0.3, 125 | "min_hole_clearance": 0.33, 126 | "min_hole_to_hole": 0.25, 127 | "min_microvia_diameter": 0.2, 128 | "min_microvia_drill": 0.1, 129 | "min_resolved_spokes": 1, 130 | "min_silk_clearance": 0.0, 131 | "min_text_height": 0.8, 132 | "min_text_thickness": 0.08, 133 | "min_through_hole_diameter": 0.3, 134 | "min_track_width": 0.2, 135 | "min_via_annular_width": 0.15, 136 | "min_via_diameter": 0.5, 137 | "solder_mask_clearance": 0.0, 138 | "solder_mask_min_width": 0.0, 139 | "solder_mask_to_copper_clearance": 0.005, 140 | "use_height_for_length_calcs": true 141 | }, 142 | "teardrop_options": [ 143 | { 144 | "td_onpadsmd": true, 145 | "td_onroundshapesonly": false, 146 | "td_ontrackend": false, 147 | "td_onviapad": true 148 | } 149 | ], 150 | "teardrop_parameters": [ 151 | { 152 | "td_allow_use_two_tracks": true, 153 | "td_curve_segcount": 0, 154 | "td_height_ratio": 1.0, 155 | "td_length_ratio": 0.5, 156 | "td_maxheight": 2.0, 157 | "td_maxlen": 1.0, 158 | "td_on_pad_in_zone": false, 159 | "td_target_name": "td_round_shape", 160 | "td_width_to_size_filter_ratio": 0.9 161 | }, 162 | { 163 | "td_allow_use_two_tracks": true, 164 | "td_curve_segcount": 0, 165 | "td_height_ratio": 1.0, 166 | "td_length_ratio": 0.5, 167 | "td_maxheight": 2.0, 168 | "td_maxlen": 1.0, 169 | "td_on_pad_in_zone": false, 170 | "td_target_name": "td_rect_shape", 171 | "td_width_to_size_filter_ratio": 0.9 172 | }, 173 | { 174 | "td_allow_use_two_tracks": true, 175 | "td_curve_segcount": 0, 176 | "td_height_ratio": 1.0, 177 | "td_length_ratio": 0.5, 178 | "td_maxheight": 2.0, 179 | "td_maxlen": 1.0, 180 | "td_on_pad_in_zone": false, 181 | "td_target_name": "td_track_end", 182 | "td_width_to_size_filter_ratio": 0.9 183 | } 184 | ], 185 | "track_widths": [ 186 | 0.0, 187 | 0.15 188 | ], 189 | "tuning_pattern_settings": { 190 | "diff_pair_defaults": { 191 | "corner_radius_percentage": 80, 192 | "corner_style": 1, 193 | "max_amplitude": 1.0, 194 | "min_amplitude": 0.2, 195 | "single_sided": false, 196 | "spacing": 1.0 197 | }, 198 | "diff_pair_skew_defaults": { 199 | "corner_radius_percentage": 80, 200 | "corner_style": 1, 201 | "max_amplitude": 1.0, 202 | "min_amplitude": 0.2, 203 | "single_sided": false, 204 | "spacing": 0.6 205 | }, 206 | "single_track_defaults": { 207 | "corner_radius_percentage": 80, 208 | "corner_style": 1, 209 | "max_amplitude": 1.0, 210 | "min_amplitude": 0.2, 211 | "single_sided": false, 212 | "spacing": 0.6 213 | } 214 | }, 215 | "via_dimensions": [ 216 | { 217 | "diameter": 0.0, 218 | "drill": 0.0 219 | }, 220 | { 221 | "diameter": 0.8, 222 | "drill": 0.4 223 | } 224 | ], 225 | "zones_allow_external_fillets": false, 226 | "zones_use_no_outline": true 227 | }, 228 | "ipc2581": { 229 | "dist": "", 230 | "distpn": "", 231 | "internal_id": "", 232 | "mfg": "", 233 | "mpn": "" 234 | }, 235 | "layer_presets": [], 236 | "viewports": [] 237 | }, 238 | "boards": [], 239 | "cvpcb": { 240 | "equivalence_files": [] 241 | }, 242 | "erc": { 243 | "erc_exclusions": [], 244 | "meta": { 245 | "version": 0 246 | }, 247 | "pin_map": [ 248 | [ 249 | 0, 250 | 0, 251 | 0, 252 | 0, 253 | 0, 254 | 0, 255 | 1, 256 | 0, 257 | 0, 258 | 0, 259 | 0, 260 | 2 261 | ], 262 | [ 263 | 0, 264 | 2, 265 | 0, 266 | 1, 267 | 0, 268 | 0, 269 | 1, 270 | 0, 271 | 2, 272 | 2, 273 | 2, 274 | 2 275 | ], 276 | [ 277 | 0, 278 | 0, 279 | 0, 280 | 0, 281 | 0, 282 | 0, 283 | 1, 284 | 0, 285 | 1, 286 | 0, 287 | 1, 288 | 2 289 | ], 290 | [ 291 | 0, 292 | 1, 293 | 0, 294 | 0, 295 | 0, 296 | 0, 297 | 1, 298 | 1, 299 | 2, 300 | 1, 301 | 1, 302 | 2 303 | ], 304 | [ 305 | 0, 306 | 0, 307 | 0, 308 | 0, 309 | 0, 310 | 0, 311 | 1, 312 | 0, 313 | 0, 314 | 0, 315 | 0, 316 | 2 317 | ], 318 | [ 319 | 0, 320 | 0, 321 | 0, 322 | 0, 323 | 0, 324 | 0, 325 | 0, 326 | 0, 327 | 0, 328 | 0, 329 | 0, 330 | 2 331 | ], 332 | [ 333 | 1, 334 | 1, 335 | 1, 336 | 1, 337 | 1, 338 | 0, 339 | 1, 340 | 1, 341 | 1, 342 | 1, 343 | 1, 344 | 2 345 | ], 346 | [ 347 | 0, 348 | 0, 349 | 0, 350 | 1, 351 | 0, 352 | 0, 353 | 1, 354 | 0, 355 | 0, 356 | 0, 357 | 0, 358 | 2 359 | ], 360 | [ 361 | 0, 362 | 2, 363 | 1, 364 | 2, 365 | 0, 366 | 0, 367 | 1, 368 | 0, 369 | 2, 370 | 2, 371 | 2, 372 | 2 373 | ], 374 | [ 375 | 0, 376 | 2, 377 | 0, 378 | 1, 379 | 0, 380 | 0, 381 | 1, 382 | 0, 383 | 2, 384 | 0, 385 | 0, 386 | 2 387 | ], 388 | [ 389 | 0, 390 | 2, 391 | 1, 392 | 1, 393 | 0, 394 | 0, 395 | 1, 396 | 0, 397 | 2, 398 | 0, 399 | 0, 400 | 2 401 | ], 402 | [ 403 | 2, 404 | 2, 405 | 2, 406 | 2, 407 | 2, 408 | 2, 409 | 2, 410 | 2, 411 | 2, 412 | 2, 413 | 2, 414 | 2 415 | ] 416 | ], 417 | "rule_severities": { 418 | "bus_definition_conflict": "error", 419 | "bus_entry_needed": "error", 420 | "bus_to_bus_conflict": "error", 421 | "bus_to_net_conflict": "error", 422 | "conflicting_netclasses": "error", 423 | "different_unit_footprint": "error", 424 | "different_unit_net": "error", 425 | "duplicate_reference": "error", 426 | "duplicate_sheet_names": "error", 427 | "endpoint_off_grid": "warning", 428 | "extra_units": "error", 429 | "global_label_dangling": "warning", 430 | "hier_label_mismatch": "error", 431 | "label_dangling": "error", 432 | "lib_symbol_issues": "warning", 433 | "missing_bidi_pin": "warning", 434 | "missing_input_pin": "warning", 435 | "missing_power_pin": "error", 436 | "missing_unit": "warning", 437 | "multiple_net_names": "warning", 438 | "net_not_bus_member": "warning", 439 | "no_connect_connected": "warning", 440 | "no_connect_dangling": "warning", 441 | "pin_not_connected": "error", 442 | "pin_not_driven": "error", 443 | "pin_to_pin": "warning", 444 | "power_pin_not_driven": "error", 445 | "similar_labels": "warning", 446 | "simulation_model_issue": "ignore", 447 | "unannotated": "error", 448 | "unit_value_mismatch": "error", 449 | "unresolved_variable": "error", 450 | "wire_dangling": "error" 451 | } 452 | }, 453 | "libraries": { 454 | "pinned_footprint_libs": [], 455 | "pinned_symbol_libs": [] 456 | }, 457 | "meta": { 458 | "filename": "betaBoard.kicad_pro", 459 | "version": 1 460 | }, 461 | "net_settings": { 462 | "classes": [ 463 | { 464 | "bus_width": 12, 465 | "clearance": 0.2, 466 | "diff_pair_gap": 0.25, 467 | "diff_pair_via_gap": 0.25, 468 | "diff_pair_width": 0.2, 469 | "line_style": 0, 470 | "microvia_diameter": 0.3, 471 | "microvia_drill": 0.1, 472 | "name": "Default", 473 | "pcb_color": "rgba(0, 0, 0, 0.000)", 474 | "schematic_color": "rgba(0, 0, 0, 0.000)", 475 | "track_width": 0.25, 476 | "via_diameter": 0.8, 477 | "via_drill": 0.4, 478 | "wire_width": 6 479 | }, 480 | { 481 | "bus_width": 12, 482 | "clearance": 0.2, 483 | "diff_pair_gap": 0.25, 484 | "diff_pair_via_gap": 0.25, 485 | "diff_pair_width": 0.2, 486 | "line_style": 0, 487 | "microvia_diameter": 0.3, 488 | "microvia_drill": 0.1, 489 | "name": "PWR", 490 | "pcb_color": "rgba(0, 0, 0, 0.000)", 491 | "schematic_color": "rgba(0, 0, 0, 0.000)", 492 | "track_width": 0.4, 493 | "via_diameter": 1.0, 494 | "via_drill": 0.6, 495 | "wire_width": 6 496 | } 497 | ], 498 | "meta": { 499 | "version": 3 500 | }, 501 | "net_colors": null, 502 | "netclass_assignments": null, 503 | "netclass_patterns": [ 504 | { 505 | "netclass": "PWR", 506 | "pattern": "+3V3" 507 | }, 508 | { 509 | "netclass": "PWR", 510 | "pattern": "GND" 511 | }, 512 | { 513 | "netclass": "PWR", 514 | "pattern": "VCC" 515 | }, 516 | { 517 | "netclass": "PWR", 518 | "pattern": "5V_USB" 519 | } 520 | ] 521 | }, 522 | "pcbnew": { 523 | "last_paths": { 524 | "gencad": "", 525 | "idf": "", 526 | "netlist": "", 527 | "plot": "", 528 | "pos_files": "", 529 | "specctra_dsn": "", 530 | "step": "", 531 | "svg": "", 532 | "vrml": "" 533 | }, 534 | "page_layout_descr_file": "" 535 | }, 536 | "schematic": { 537 | "annotate_start_num": 0, 538 | "bom_export_filename": "", 539 | "bom_fmt_presets": [], 540 | "bom_fmt_settings": { 541 | "field_delimiter": ",", 542 | "keep_line_breaks": false, 543 | "keep_tabs": false, 544 | "name": "CSV", 545 | "ref_delimiter": ",", 546 | "ref_range_delimiter": "", 547 | "string_delimiter": "\"" 548 | }, 549 | "bom_presets": [], 550 | "bom_settings": { 551 | "exclude_dnp": false, 552 | "fields_ordered": [ 553 | { 554 | "group_by": false, 555 | "label": "Reference", 556 | "name": "Reference", 557 | "show": true 558 | }, 559 | { 560 | "group_by": true, 561 | "label": "Value", 562 | "name": "Value", 563 | "show": true 564 | }, 565 | { 566 | "group_by": false, 567 | "label": "Datasheet", 568 | "name": "Datasheet", 569 | "show": true 570 | }, 571 | { 572 | "group_by": false, 573 | "label": "Footprint", 574 | "name": "Footprint", 575 | "show": true 576 | }, 577 | { 578 | "group_by": false, 579 | "label": "Qty", 580 | "name": "${QUANTITY}", 581 | "show": true 582 | }, 583 | { 584 | "group_by": true, 585 | "label": "DNP", 586 | "name": "${DNP}", 587 | "show": true 588 | } 589 | ], 590 | "filter_string": "", 591 | "group_symbols": true, 592 | "name": "Grouped By Value", 593 | "sort_asc": true, 594 | "sort_field": "Reference" 595 | }, 596 | "connection_grid_size": 50.0, 597 | "drawing": { 598 | "dashed_lines_dash_length_ratio": 12.0, 599 | "dashed_lines_gap_length_ratio": 3.0, 600 | "default_line_thickness": 6.0, 601 | "default_text_size": 50.0, 602 | "field_names": [], 603 | "intersheets_ref_own_page": false, 604 | "intersheets_ref_prefix": "", 605 | "intersheets_ref_short": false, 606 | "intersheets_ref_show": false, 607 | "intersheets_ref_suffix": "", 608 | "junction_size_choice": 3, 609 | "label_size_ratio": 0.375, 610 | "operating_point_overlay_i_precision": 3, 611 | "operating_point_overlay_i_range": "~A", 612 | "operating_point_overlay_v_precision": 3, 613 | "operating_point_overlay_v_range": "~V", 614 | "overbar_offset_ratio": 1.23, 615 | "pin_symbol_size": 25.0, 616 | "text_offset_ratio": 0.15 617 | }, 618 | "legacy_lib_dir": "", 619 | "legacy_lib_list": [], 620 | "meta": { 621 | "version": 1 622 | }, 623 | "net_format_name": "", 624 | "ngspice": { 625 | "fix_include_paths": true, 626 | "fix_passive_vals": false, 627 | "meta": { 628 | "version": 0 629 | }, 630 | "model_mode": 0, 631 | "workbook_filename": "" 632 | }, 633 | "page_layout_descr_file": "", 634 | "plot_directory": "", 635 | "spice_adjust_passive_values": false, 636 | "spice_current_sheet_as_root": false, 637 | "spice_external_command": "spice \"%I\"", 638 | "spice_model_current_sheet_as_root": true, 639 | "spice_save_all_currents": false, 640 | "spice_save_all_dissipations": false, 641 | "spice_save_all_voltages": false, 642 | "subpart_first_id": 65, 643 | "subpart_id_separator": 0 644 | }, 645 | "sheets": [ 646 | [ 647 | "3d37b943-9a24-43ad-9fbf-b901b38695ce", 648 | "Root" 649 | ], 650 | [ 651 | "9a638de9-fce0-4d4f-9079-020409d07315", 652 | "MCU" 653 | ], 654 | [ 655 | "a19c94be-85f2-45d0-b8ae-fe772296c136", 656 | "particle_sensor_array1" 657 | ], 658 | [ 659 | "04257380-b0d3-4dec-9d7c-5e99e8454005", 660 | "Frontend Alpha" 661 | ] 662 | ], 663 | "text_variables": {} 664 | } 665 | -------------------------------------------------------------------------------- /hardware/betaBoard_r2.0/betaBoard_r2.0_pcb.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/hardware/betaBoard_r2.0/betaBoard_r2.0_pcb.pdf -------------------------------------------------------------------------------- /hardware/betaBoard_r2.0/betaBoard_r2.0_positions.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/hardware/betaBoard_r2.0/betaBoard_r2.0_positions.pdf -------------------------------------------------------------------------------- /hardware/betaBoard_r2.0/betaBoard_r2.0_sch.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/hardware/betaBoard_r2.0/betaBoard_r2.0_sch.pdf -------------------------------------------------------------------------------- /hardware/betaBoard_r2.0/mid_panel_r2.0/mid_panel_r2.0.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 20221018) (generator pcbnew) 2 | ) -------------------------------------------------------------------------------- /hardware/betaBoard_r2.0/mid_panel_r2.0/mid_panel_r2.0.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "design_settings": { 4 | "defaults": { 5 | "board_outline_line_width": 0.1, 6 | "copper_line_width": 0.2, 7 | "copper_text_size_h": 1.5, 8 | "copper_text_size_v": 1.5, 9 | "copper_text_thickness": 0.3, 10 | "other_line_width": 0.15, 11 | "silk_line_width": 0.15, 12 | "silk_text_size_h": 1.0, 13 | "silk_text_size_v": 1.0, 14 | "silk_text_thickness": 0.15 15 | }, 16 | "diff_pair_dimensions": [], 17 | "drc_exclusions": [], 18 | "rules": { 19 | "min_copper_edge_clearance": 0.0, 20 | "solder_mask_clearance": 0.0, 21 | "solder_mask_min_width": 0.0 22 | }, 23 | "track_widths": [], 24 | "via_dimensions": [] 25 | } 26 | }, 27 | "boards": [], 28 | "libraries": { 29 | "pinned_footprint_libs": [], 30 | "pinned_symbol_libs": [] 31 | }, 32 | "meta": { 33 | "filename": "kicad.kicad_pro", 34 | "version": 1 35 | }, 36 | "net_settings": { 37 | "classes": [ 38 | { 39 | "clearance": 0.2, 40 | "diff_pair_gap": 0.25, 41 | "diff_pair_via_gap": 0.25, 42 | "diff_pair_width": 0.2, 43 | "microvia_diameter": 0.3, 44 | "microvia_drill": 0.1, 45 | "name": "Default", 46 | "nets": [], 47 | "track_width": 0.25, 48 | "via_diameter": 0.8, 49 | "via_drill": 0.4 50 | } 51 | ], 52 | "meta": { 53 | "version": 0 54 | } 55 | }, 56 | "pcbnew": { 57 | "page_layout_descr_file": "" 58 | }, 59 | "sheets": [], 60 | "text_variables": {} 61 | } 62 | -------------------------------------------------------------------------------- /hardware/betaBoard_r2.0/mid_panel_r2.0/mid_panel_r2.0.kicad_sch: -------------------------------------------------------------------------------- 1 | (kicad_sch (version 20230121) (generator eeschema) 2 | (paper "A4") 3 | (lib_symbols) 4 | (symbol_instances) 5 | ) 6 | -------------------------------------------------------------------------------- /hardware/mid_panel_r2.0/mid_panel_r2.0.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "board_outline_line_width": 0.09999999999999999, 7 | "copper_line_width": 0.19999999999999998, 8 | "copper_text_italic": false, 9 | "copper_text_size_h": 1.5, 10 | "copper_text_size_v": 1.5, 11 | "copper_text_thickness": 0.3, 12 | "copper_text_upright": false, 13 | "courtyard_line_width": 0.049999999999999996, 14 | "dimension_precision": 4, 15 | "dimension_units": 3, 16 | "dimensions": { 17 | "arrow_length": 1270000, 18 | "extension_offset": 500000, 19 | "keep_text_aligned": true, 20 | "suppress_zeroes": false, 21 | "text_position": 0, 22 | "units_format": 1 23 | }, 24 | "fab_line_width": 0.09999999999999999, 25 | "fab_text_italic": false, 26 | "fab_text_size_h": 1.0, 27 | "fab_text_size_v": 1.0, 28 | "fab_text_thickness": 0.15, 29 | "fab_text_upright": false, 30 | "other_line_width": 0.15, 31 | "other_text_italic": false, 32 | "other_text_size_h": 1.0, 33 | "other_text_size_v": 1.0, 34 | "other_text_thickness": 0.15, 35 | "other_text_upright": false, 36 | "pads": { 37 | "drill": 0.762, 38 | "height": 1.524, 39 | "width": 1.524 40 | }, 41 | "silk_line_width": 0.15, 42 | "silk_text_italic": false, 43 | "silk_text_size_h": 1.0, 44 | "silk_text_size_v": 1.0, 45 | "silk_text_thickness": 0.15, 46 | "silk_text_upright": false, 47 | "zones": { 48 | "min_clearance": 0.5 49 | } 50 | }, 51 | "diff_pair_dimensions": [], 52 | "drc_exclusions": [], 53 | "meta": { 54 | "version": 2 55 | }, 56 | "rule_severities": { 57 | "annular_width": "error", 58 | "clearance": "error", 59 | "connection_width": "warning", 60 | "copper_edge_clearance": "error", 61 | "copper_sliver": "warning", 62 | "courtyards_overlap": "error", 63 | "diff_pair_gap_out_of_range": "error", 64 | "diff_pair_uncoupled_length_too_long": "error", 65 | "drill_out_of_range": "error", 66 | "duplicate_footprints": "warning", 67 | "extra_footprint": "warning", 68 | "footprint": "error", 69 | "footprint_type_mismatch": "ignore", 70 | "hole_clearance": "error", 71 | "hole_near_hole": "error", 72 | "invalid_outline": "error", 73 | "isolated_copper": "warning", 74 | "item_on_disabled_layer": "error", 75 | "items_not_allowed": "error", 76 | "length_out_of_range": "error", 77 | "lib_footprint_issues": "warning", 78 | "lib_footprint_mismatch": "warning", 79 | "malformed_courtyard": "error", 80 | "microvia_drill_out_of_range": "error", 81 | "missing_courtyard": "ignore", 82 | "missing_footprint": "warning", 83 | "net_conflict": "warning", 84 | "npth_inside_courtyard": "ignore", 85 | "padstack": "warning", 86 | "pth_inside_courtyard": "ignore", 87 | "shorting_items": "error", 88 | "silk_edge_clearance": "warning", 89 | "silk_over_copper": "warning", 90 | "silk_overlap": "warning", 91 | "skew_out_of_range": "error", 92 | "solder_mask_bridge": "error", 93 | "starved_thermal": "error", 94 | "text_height": "warning", 95 | "text_thickness": "warning", 96 | "through_hole_pad_without_hole": "error", 97 | "too_many_vias": "error", 98 | "track_dangling": "warning", 99 | "track_width": "error", 100 | "tracks_crossing": "error", 101 | "unconnected_items": "error", 102 | "unresolved_variable": "error", 103 | "via_dangling": "warning", 104 | "zones_intersect": "error" 105 | }, 106 | "rules": { 107 | "max_error": 0.005, 108 | "min_clearance": 0.0, 109 | "min_connection": 0.0, 110 | "min_copper_edge_clearance": 0.0, 111 | "min_hole_clearance": 0.25, 112 | "min_hole_to_hole": 0.25, 113 | "min_microvia_diameter": 0.19999999999999998, 114 | "min_microvia_drill": 0.09999999999999999, 115 | "min_resolved_spokes": 2, 116 | "min_silk_clearance": 0.0, 117 | "min_text_height": 0.7999999999999999, 118 | "min_text_thickness": 0.08, 119 | "min_through_hole_diameter": 0.3, 120 | "min_track_width": 0.0, 121 | "min_via_annular_width": 0.09999999999999999, 122 | "min_via_diameter": 0.5, 123 | "solder_mask_clearance": 0.0, 124 | "solder_mask_min_width": 0.0, 125 | "solder_mask_to_copper_clearance": 0.005, 126 | "use_height_for_length_calcs": true 127 | }, 128 | "teardrop_options": [ 129 | { 130 | "td_allow_use_two_tracks": true, 131 | "td_curve_segcount": 5, 132 | "td_on_pad_in_zone": false, 133 | "td_onpadsmd": true, 134 | "td_onroundshapesonly": false, 135 | "td_ontrackend": false, 136 | "td_onviapad": true 137 | } 138 | ], 139 | "teardrop_parameters": [ 140 | { 141 | "td_curve_segcount": 0, 142 | "td_height_ratio": 1.0, 143 | "td_length_ratio": 0.5, 144 | "td_maxheight": 2.0, 145 | "td_maxlen": 1.0, 146 | "td_target_name": "td_round_shape", 147 | "td_width_to_size_filter_ratio": 0.9 148 | }, 149 | { 150 | "td_curve_segcount": 0, 151 | "td_height_ratio": 1.0, 152 | "td_length_ratio": 0.5, 153 | "td_maxheight": 2.0, 154 | "td_maxlen": 1.0, 155 | "td_target_name": "td_rect_shape", 156 | "td_width_to_size_filter_ratio": 0.9 157 | }, 158 | { 159 | "td_curve_segcount": 0, 160 | "td_height_ratio": 1.0, 161 | "td_length_ratio": 0.5, 162 | "td_maxheight": 2.0, 163 | "td_maxlen": 1.0, 164 | "td_target_name": "td_track_end", 165 | "td_width_to_size_filter_ratio": 0.9 166 | } 167 | ], 168 | "track_widths": [], 169 | "via_dimensions": [], 170 | "zones_allow_external_fillets": false 171 | }, 172 | "layer_presets": [], 173 | "viewports": [] 174 | }, 175 | "boards": [], 176 | "cvpcb": { 177 | "equivalence_files": [] 178 | }, 179 | "erc": { 180 | "erc_exclusions": [], 181 | "meta": { 182 | "version": 0 183 | }, 184 | "pin_map": [ 185 | [ 186 | 0, 187 | 0, 188 | 0, 189 | 0, 190 | 0, 191 | 0, 192 | 1, 193 | 0, 194 | 0, 195 | 0, 196 | 0, 197 | 2 198 | ], 199 | [ 200 | 0, 201 | 2, 202 | 0, 203 | 1, 204 | 0, 205 | 0, 206 | 1, 207 | 0, 208 | 2, 209 | 2, 210 | 2, 211 | 2 212 | ], 213 | [ 214 | 0, 215 | 0, 216 | 0, 217 | 0, 218 | 0, 219 | 0, 220 | 1, 221 | 0, 222 | 1, 223 | 0, 224 | 1, 225 | 2 226 | ], 227 | [ 228 | 0, 229 | 1, 230 | 0, 231 | 0, 232 | 0, 233 | 0, 234 | 1, 235 | 1, 236 | 2, 237 | 1, 238 | 1, 239 | 2 240 | ], 241 | [ 242 | 0, 243 | 0, 244 | 0, 245 | 0, 246 | 0, 247 | 0, 248 | 1, 249 | 0, 250 | 0, 251 | 0, 252 | 0, 253 | 2 254 | ], 255 | [ 256 | 0, 257 | 0, 258 | 0, 259 | 0, 260 | 0, 261 | 0, 262 | 0, 263 | 0, 264 | 0, 265 | 0, 266 | 0, 267 | 2 268 | ], 269 | [ 270 | 1, 271 | 1, 272 | 1, 273 | 1, 274 | 1, 275 | 0, 276 | 1, 277 | 1, 278 | 1, 279 | 1, 280 | 1, 281 | 2 282 | ], 283 | [ 284 | 0, 285 | 0, 286 | 0, 287 | 1, 288 | 0, 289 | 0, 290 | 1, 291 | 0, 292 | 0, 293 | 0, 294 | 0, 295 | 2 296 | ], 297 | [ 298 | 0, 299 | 2, 300 | 1, 301 | 2, 302 | 0, 303 | 0, 304 | 1, 305 | 0, 306 | 2, 307 | 2, 308 | 2, 309 | 2 310 | ], 311 | [ 312 | 0, 313 | 2, 314 | 0, 315 | 1, 316 | 0, 317 | 0, 318 | 1, 319 | 0, 320 | 2, 321 | 0, 322 | 0, 323 | 2 324 | ], 325 | [ 326 | 0, 327 | 2, 328 | 1, 329 | 1, 330 | 0, 331 | 0, 332 | 1, 333 | 0, 334 | 2, 335 | 0, 336 | 0, 337 | 2 338 | ], 339 | [ 340 | 2, 341 | 2, 342 | 2, 343 | 2, 344 | 2, 345 | 2, 346 | 2, 347 | 2, 348 | 2, 349 | 2, 350 | 2, 351 | 2 352 | ] 353 | ], 354 | "rule_severities": { 355 | "bus_definition_conflict": "error", 356 | "bus_entry_needed": "error", 357 | "bus_to_bus_conflict": "error", 358 | "bus_to_net_conflict": "error", 359 | "conflicting_netclasses": "error", 360 | "different_unit_footprint": "error", 361 | "different_unit_net": "error", 362 | "duplicate_reference": "error", 363 | "duplicate_sheet_names": "error", 364 | "endpoint_off_grid": "warning", 365 | "extra_units": "error", 366 | "global_label_dangling": "warning", 367 | "hier_label_mismatch": "error", 368 | "label_dangling": "error", 369 | "lib_symbol_issues": "warning", 370 | "missing_bidi_pin": "warning", 371 | "missing_input_pin": "warning", 372 | "missing_power_pin": "error", 373 | "missing_unit": "warning", 374 | "multiple_net_names": "warning", 375 | "net_not_bus_member": "warning", 376 | "no_connect_connected": "warning", 377 | "no_connect_dangling": "warning", 378 | "pin_not_connected": "error", 379 | "pin_not_driven": "error", 380 | "pin_to_pin": "warning", 381 | "power_pin_not_driven": "error", 382 | "similar_labels": "warning", 383 | "simulation_model_issue": "ignore", 384 | "unannotated": "error", 385 | "unit_value_mismatch": "error", 386 | "unresolved_variable": "error", 387 | "wire_dangling": "error" 388 | } 389 | }, 390 | "libraries": { 391 | "pinned_footprint_libs": [], 392 | "pinned_symbol_libs": [] 393 | }, 394 | "meta": { 395 | "filename": "mid_panel_r2.0.kicad_pro", 396 | "version": 1 397 | }, 398 | "net_settings": { 399 | "classes": [ 400 | { 401 | "bus_width": 12, 402 | "clearance": 0.2, 403 | "diff_pair_gap": 0.25, 404 | "diff_pair_via_gap": 0.25, 405 | "diff_pair_width": 0.2, 406 | "line_style": 0, 407 | "microvia_diameter": 0.3, 408 | "microvia_drill": 0.1, 409 | "name": "Default", 410 | "pcb_color": "rgba(0, 0, 0, 0.000)", 411 | "schematic_color": "rgba(0, 0, 0, 0.000)", 412 | "track_width": 0.25, 413 | "via_diameter": 0.8, 414 | "via_drill": 0.4, 415 | "wire_width": 6 416 | } 417 | ], 418 | "meta": { 419 | "version": 3 420 | }, 421 | "net_colors": null, 422 | "netclass_assignments": null, 423 | "netclass_patterns": [ 424 | { 425 | "netclass": "Default", 426 | "pattern": "GND" 427 | } 428 | ] 429 | }, 430 | "pcbnew": { 431 | "last_paths": { 432 | "gencad": "", 433 | "idf": "", 434 | "netlist": "", 435 | "specctra_dsn": "", 436 | "step": "", 437 | "vrml": "" 438 | }, 439 | "page_layout_descr_file": "" 440 | }, 441 | "schematic": { 442 | "annotate_start_num": 0, 443 | "drawing": { 444 | "dashed_lines_dash_length_ratio": 12.0, 445 | "dashed_lines_gap_length_ratio": 3.0, 446 | "default_line_thickness": 6.0, 447 | "default_text_size": 50.0, 448 | "field_names": [], 449 | "intersheets_ref_own_page": false, 450 | "intersheets_ref_prefix": "", 451 | "intersheets_ref_short": false, 452 | "intersheets_ref_show": false, 453 | "intersheets_ref_suffix": "", 454 | "junction_size_choice": 3, 455 | "label_size_ratio": 0.375, 456 | "pin_symbol_size": 25.0, 457 | "text_offset_ratio": 0.15 458 | }, 459 | "legacy_lib_dir": "", 460 | "legacy_lib_list": [], 461 | "meta": { 462 | "version": 1 463 | }, 464 | "net_format_name": "", 465 | "page_layout_descr_file": "", 466 | "plot_directory": "", 467 | "spice_current_sheet_as_root": false, 468 | "spice_external_command": "spice \"%I\"", 469 | "spice_model_current_sheet_as_root": true, 470 | "spice_save_all_currents": false, 471 | "spice_save_all_voltages": false, 472 | "subpart_first_id": 65, 473 | "subpart_id_separator": 0 474 | }, 475 | "sheets": [ 476 | [ 477 | "b4e47576-1fa2-4a5c-9d2e-86b725a63075", 478 | "" 479 | ] 480 | ], 481 | "text_variables": {} 482 | } 483 | -------------------------------------------------------------------------------- /hardware/mid_panel_r2.0/mid_panel_r2.0.kicad_sch: -------------------------------------------------------------------------------- 1 | (kicad_sch (version 20230121) (generator eeschema) 2 | 3 | (uuid b4e47576-1fa2-4a5c-9d2e-86b725a63075) 4 | 5 | (paper "A4") 6 | 7 | (lib_symbols 8 | (symbol "Device:R" (pin_numbers hide) (pin_names (offset 0)) (in_bom yes) (on_board yes) 9 | (property "Reference" "R" (at 2.032 0 90) 10 | (effects (font (size 1.27 1.27))) 11 | ) 12 | (property "Value" "R" (at 0 0 90) 13 | (effects (font (size 1.27 1.27))) 14 | ) 15 | (property "Footprint" "" (at -1.778 0 90) 16 | (effects (font (size 1.27 1.27)) hide) 17 | ) 18 | (property "Datasheet" "~" (at 0 0 0) 19 | (effects (font (size 1.27 1.27)) hide) 20 | ) 21 | (property "ki_keywords" "R res resistor" (at 0 0 0) 22 | (effects (font (size 1.27 1.27)) hide) 23 | ) 24 | (property "ki_description" "Resistor" (at 0 0 0) 25 | (effects (font (size 1.27 1.27)) hide) 26 | ) 27 | (property "ki_fp_filters" "R_*" (at 0 0 0) 28 | (effects (font (size 1.27 1.27)) hide) 29 | ) 30 | (symbol "R_0_1" 31 | (rectangle (start -1.016 -2.54) (end 1.016 2.54) 32 | (stroke (width 0.254) (type default)) 33 | (fill (type none)) 34 | ) 35 | ) 36 | (symbol "R_1_1" 37 | (pin passive line (at 0 3.81 270) (length 1.27) 38 | (name "~" (effects (font (size 1.27 1.27)))) 39 | (number "1" (effects (font (size 1.27 1.27)))) 40 | ) 41 | (pin passive line (at 0 -3.81 90) (length 1.27) 42 | (name "~" (effects (font (size 1.27 1.27)))) 43 | (number "2" (effects (font (size 1.27 1.27)))) 44 | ) 45 | ) 46 | ) 47 | (symbol "power:GND" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes) 48 | (property "Reference" "#PWR" (at 0 -6.35 0) 49 | (effects (font (size 1.27 1.27)) hide) 50 | ) 51 | (property "Value" "GND" (at 0 -3.81 0) 52 | (effects (font (size 1.27 1.27))) 53 | ) 54 | (property "Footprint" "" (at 0 0 0) 55 | (effects (font (size 1.27 1.27)) hide) 56 | ) 57 | (property "Datasheet" "" (at 0 0 0) 58 | (effects (font (size 1.27 1.27)) hide) 59 | ) 60 | (property "ki_keywords" "global power" (at 0 0 0) 61 | (effects (font (size 1.27 1.27)) hide) 62 | ) 63 | (property "ki_description" "Power symbol creates a global label with name \"GND\" , ground" (at 0 0 0) 64 | (effects (font (size 1.27 1.27)) hide) 65 | ) 66 | (symbol "GND_0_1" 67 | (polyline 68 | (pts 69 | (xy 0 0) 70 | (xy 0 -1.27) 71 | (xy 1.27 -1.27) 72 | (xy 0 -2.54) 73 | (xy -1.27 -1.27) 74 | (xy 0 -1.27) 75 | ) 76 | (stroke (width 0) (type default)) 77 | (fill (type none)) 78 | ) 79 | ) 80 | (symbol "GND_1_1" 81 | (pin power_in line (at 0 0 270) (length 0) hide 82 | (name "GND" (effects (font (size 1.27 1.27)))) 83 | (number "1" (effects (font (size 1.27 1.27)))) 84 | ) 85 | ) 86 | ) 87 | (symbol "power:PWR_FLAG" (power) (pin_numbers hide) (pin_names (offset 0) hide) (in_bom yes) (on_board yes) 88 | (property "Reference" "#FLG" (at 0 1.905 0) 89 | (effects (font (size 1.27 1.27)) hide) 90 | ) 91 | (property "Value" "PWR_FLAG" (at 0 3.81 0) 92 | (effects (font (size 1.27 1.27))) 93 | ) 94 | (property "Footprint" "" (at 0 0 0) 95 | (effects (font (size 1.27 1.27)) hide) 96 | ) 97 | (property "Datasheet" "~" (at 0 0 0) 98 | (effects (font (size 1.27 1.27)) hide) 99 | ) 100 | (property "ki_keywords" "flag power" (at 0 0 0) 101 | (effects (font (size 1.27 1.27)) hide) 102 | ) 103 | (property "ki_description" "Special symbol for telling ERC where power comes from" (at 0 0 0) 104 | (effects (font (size 1.27 1.27)) hide) 105 | ) 106 | (symbol "PWR_FLAG_0_0" 107 | (pin power_out line (at 0 0 90) (length 0) 108 | (name "pwr" (effects (font (size 1.27 1.27)))) 109 | (number "1" (effects (font (size 1.27 1.27)))) 110 | ) 111 | ) 112 | (symbol "PWR_FLAG_0_1" 113 | (polyline 114 | (pts 115 | (xy 0 0) 116 | (xy 0 1.27) 117 | (xy -1.016 1.905) 118 | (xy 0 2.54) 119 | (xy 1.016 1.905) 120 | (xy 0 1.27) 121 | ) 122 | (stroke (width 0) (type default)) 123 | (fill (type none)) 124 | ) 125 | ) 126 | ) 127 | ) 128 | 129 | (junction (at 113.03 78.74) (diameter 0) (color 0 0 0 0) 130 | (uuid 1a1a73d2-8ace-4db1-af45-87bc4bbf037e) 131 | ) 132 | 133 | (wire (pts (xy 113.03 78.74) (xy 118.745 78.74)) 134 | (stroke (width 0) (type default)) 135 | (uuid 49a1f05b-9b94-48ca-ae76-34783d537e8a) 136 | ) 137 | (wire (pts (xy 130.175 78.74) (xy 126.365 78.74)) 138 | (stroke (width 0) (type default)) 139 | (uuid b9a8b15a-6a45-4319-a7e3-b78d19ca87a9) 140 | ) 141 | 142 | (symbol (lib_id "power:PWR_FLAG") (at 113.03 78.74 0) (unit 1) 143 | (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) 144 | (uuid 2b03a337-ae26-4d3c-a7e4-7bc0b321d3cc) 145 | (property "Reference" "#FLG01" (at 113.03 76.835 0) 146 | (effects (font (size 1.27 1.27)) hide) 147 | ) 148 | (property "Value" "PWR_FLAG" (at 113.03 73.66 0) 149 | (effects (font (size 1.27 1.27))) 150 | ) 151 | (property "Footprint" "" (at 113.03 78.74 0) 152 | (effects (font (size 1.27 1.27)) hide) 153 | ) 154 | (property "Datasheet" "~" (at 113.03 78.74 0) 155 | (effects (font (size 1.27 1.27)) hide) 156 | ) 157 | (pin "1" (uuid 0bb20e1c-2341-4478-8982-f251d9cc6ace)) 158 | (instances 159 | (project "mid_panel_r2.0" 160 | (path "/b4e47576-1fa2-4a5c-9d2e-86b725a63075" 161 | (reference "#FLG01") (unit 1) 162 | ) 163 | ) 164 | ) 165 | ) 166 | 167 | (symbol (lib_id "power:GND") (at 113.03 78.74 0) (unit 1) 168 | (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) 169 | (uuid bcf34f05-8f4e-4c45-833b-8ae4784098bc) 170 | (property "Reference" "#PWR01" (at 113.03 85.09 0) 171 | (effects (font (size 1.27 1.27)) hide) 172 | ) 173 | (property "Value" "GND" (at 113.03 83.82 0) 174 | (effects (font (size 1.27 1.27))) 175 | ) 176 | (property "Footprint" "" (at 113.03 78.74 0) 177 | (effects (font (size 1.27 1.27)) hide) 178 | ) 179 | (property "Datasheet" "" (at 113.03 78.74 0) 180 | (effects (font (size 1.27 1.27)) hide) 181 | ) 182 | (pin "1" (uuid a1eca777-4ece-41bd-a244-994c3a2518c0)) 183 | (instances 184 | (project "mid_panel_r2.0" 185 | (path "/b4e47576-1fa2-4a5c-9d2e-86b725a63075" 186 | (reference "#PWR01") (unit 1) 187 | ) 188 | ) 189 | ) 190 | ) 191 | 192 | (symbol (lib_id "Device:R") (at 122.555 78.74 90) (unit 1) 193 | (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) 194 | (uuid cecce73a-d84b-4526-9c60-c1c5c3ee5f52) 195 | (property "Reference" "R1" (at 122.555 72.39 90) 196 | (effects (font (size 1.27 1.27))) 197 | ) 198 | (property "Value" "DNP" (at 122.555 74.93 90) 199 | (effects (font (size 1.27 1.27))) 200 | ) 201 | (property "Footprint" "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" (at 122.555 80.518 90) 202 | (effects (font (size 1.27 1.27)) hide) 203 | ) 204 | (property "Datasheet" "~" (at 122.555 78.74 0) 205 | (effects (font (size 1.27 1.27)) hide) 206 | ) 207 | (pin "1" (uuid cba880eb-dd43-440a-8340-bb9da4c9d019)) 208 | (pin "2" (uuid b2e583c1-abe1-4328-84fb-c963d5883375)) 209 | (instances 210 | (project "mid_panel_r2.0" 211 | (path "/b4e47576-1fa2-4a5c-9d2e-86b725a63075" 212 | (reference "R1") (unit 1) 213 | ) 214 | ) 215 | ) 216 | ) 217 | 218 | (symbol (lib_id "power:GND") (at 130.175 78.74 0) (unit 1) 219 | (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) 220 | (uuid d4f9c3fe-f164-4d35-a525-b2cbe0d34bd0) 221 | (property "Reference" "#PWR02" (at 130.175 85.09 0) 222 | (effects (font (size 1.27 1.27)) hide) 223 | ) 224 | (property "Value" "GND" (at 130.175 83.82 0) 225 | (effects (font (size 1.27 1.27))) 226 | ) 227 | (property "Footprint" "" (at 130.175 78.74 0) 228 | (effects (font (size 1.27 1.27)) hide) 229 | ) 230 | (property "Datasheet" "" (at 130.175 78.74 0) 231 | (effects (font (size 1.27 1.27)) hide) 232 | ) 233 | (pin "1" (uuid 5849548f-d56b-4f28-8df3-ed3c921135b3)) 234 | (instances 235 | (project "mid_panel_r2.0" 236 | (path "/b4e47576-1fa2-4a5c-9d2e-86b725a63075" 237 | (reference "#PWR02") (unit 1) 238 | ) 239 | ) 240 | ) 241 | ) 242 | 243 | (sheet_instances 244 | (path "/" (page "1")) 245 | ) 246 | ) 247 | -------------------------------------------------------------------------------- /hardware/new_mid_panel_r2.0/mid_panel_r2.0.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "apply_defaults_to_fp_fields": false, 7 | "apply_defaults_to_fp_shapes": false, 8 | "apply_defaults_to_fp_text": false, 9 | "board_outline_line_width": 0.1, 10 | "copper_line_width": 0.2, 11 | "copper_text_italic": false, 12 | "copper_text_size_h": 1.5, 13 | "copper_text_size_v": 1.5, 14 | "copper_text_thickness": 0.3, 15 | "copper_text_upright": false, 16 | "courtyard_line_width": 0.05, 17 | "dimension_precision": 4, 18 | "dimension_units": 3, 19 | "dimensions": { 20 | "arrow_length": 1270000, 21 | "extension_offset": 500000, 22 | "keep_text_aligned": true, 23 | "suppress_zeroes": false, 24 | "text_position": 0, 25 | "units_format": 1 26 | }, 27 | "fab_line_width": 0.1, 28 | "fab_text_italic": false, 29 | "fab_text_size_h": 1.0, 30 | "fab_text_size_v": 1.0, 31 | "fab_text_thickness": 0.15, 32 | "fab_text_upright": false, 33 | "other_line_width": 0.15, 34 | "other_text_italic": false, 35 | "other_text_size_h": 1.0, 36 | "other_text_size_v": 1.0, 37 | "other_text_thickness": 0.15, 38 | "other_text_upright": false, 39 | "pads": { 40 | "drill": 0.762, 41 | "height": 1.524, 42 | "width": 1.524 43 | }, 44 | "silk_line_width": 0.15, 45 | "silk_text_italic": false, 46 | "silk_text_size_h": 1.0, 47 | "silk_text_size_v": 1.0, 48 | "silk_text_thickness": 0.15, 49 | "silk_text_upright": false, 50 | "zones": { 51 | "min_clearance": 0.5 52 | } 53 | }, 54 | "diff_pair_dimensions": [], 55 | "drc_exclusions": [], 56 | "meta": { 57 | "version": 2 58 | }, 59 | "rule_severities": { 60 | "annular_width": "error", 61 | "clearance": "error", 62 | "connection_width": "warning", 63 | "copper_edge_clearance": "error", 64 | "copper_sliver": "warning", 65 | "courtyards_overlap": "error", 66 | "diff_pair_gap_out_of_range": "error", 67 | "diff_pair_uncoupled_length_too_long": "error", 68 | "drill_out_of_range": "error", 69 | "duplicate_footprints": "warning", 70 | "extra_footprint": "warning", 71 | "footprint": "error", 72 | "footprint_symbol_mismatch": "warning", 73 | "footprint_type_mismatch": "ignore", 74 | "hole_clearance": "error", 75 | "hole_near_hole": "error", 76 | "holes_co_located": "warning", 77 | "invalid_outline": "error", 78 | "isolated_copper": "warning", 79 | "item_on_disabled_layer": "error", 80 | "items_not_allowed": "error", 81 | "length_out_of_range": "error", 82 | "lib_footprint_issues": "warning", 83 | "lib_footprint_mismatch": "warning", 84 | "malformed_courtyard": "error", 85 | "microvia_drill_out_of_range": "error", 86 | "missing_courtyard": "ignore", 87 | "missing_footprint": "warning", 88 | "net_conflict": "warning", 89 | "npth_inside_courtyard": "ignore", 90 | "padstack": "warning", 91 | "pth_inside_courtyard": "ignore", 92 | "shorting_items": "error", 93 | "silk_edge_clearance": "warning", 94 | "silk_over_copper": "warning", 95 | "silk_overlap": "warning", 96 | "skew_out_of_range": "error", 97 | "solder_mask_bridge": "error", 98 | "starved_thermal": "error", 99 | "text_height": "warning", 100 | "text_thickness": "warning", 101 | "through_hole_pad_without_hole": "error", 102 | "too_many_vias": "error", 103 | "track_dangling": "warning", 104 | "track_width": "error", 105 | "tracks_crossing": "error", 106 | "unconnected_items": "error", 107 | "unresolved_variable": "error", 108 | "via_dangling": "warning", 109 | "zones_intersect": "error" 110 | }, 111 | "rules": { 112 | "max_error": 0.005, 113 | "min_clearance": 0.0, 114 | "min_connection": 0.0, 115 | "min_copper_edge_clearance": 0.0, 116 | "min_hole_clearance": 0.25, 117 | "min_hole_to_hole": 0.25, 118 | "min_microvia_diameter": 0.2, 119 | "min_microvia_drill": 0.1, 120 | "min_resolved_spokes": 2, 121 | "min_silk_clearance": 0.0, 122 | "min_text_height": 0.8, 123 | "min_text_thickness": 0.08, 124 | "min_through_hole_diameter": 0.3, 125 | "min_track_width": 0.0, 126 | "min_via_annular_width": 0.1, 127 | "min_via_diameter": 0.5, 128 | "solder_mask_clearance": 0.0, 129 | "solder_mask_min_width": 0.0, 130 | "solder_mask_to_copper_clearance": 0.005, 131 | "use_height_for_length_calcs": true 132 | }, 133 | "teardrop_options": [ 134 | { 135 | "td_onpadsmd": true, 136 | "td_onroundshapesonly": false, 137 | "td_ontrackend": false, 138 | "td_onviapad": true 139 | } 140 | ], 141 | "teardrop_parameters": [ 142 | { 143 | "td_allow_use_two_tracks": true, 144 | "td_curve_segcount": 0, 145 | "td_height_ratio": 1.0, 146 | "td_length_ratio": 0.5, 147 | "td_maxheight": 2.0, 148 | "td_maxlen": 1.0, 149 | "td_on_pad_in_zone": false, 150 | "td_target_name": "td_round_shape", 151 | "td_width_to_size_filter_ratio": 0.9 152 | }, 153 | { 154 | "td_allow_use_two_tracks": true, 155 | "td_curve_segcount": 0, 156 | "td_height_ratio": 1.0, 157 | "td_length_ratio": 0.5, 158 | "td_maxheight": 2.0, 159 | "td_maxlen": 1.0, 160 | "td_on_pad_in_zone": false, 161 | "td_target_name": "td_rect_shape", 162 | "td_width_to_size_filter_ratio": 0.9 163 | }, 164 | { 165 | "td_allow_use_two_tracks": true, 166 | "td_curve_segcount": 0, 167 | "td_height_ratio": 1.0, 168 | "td_length_ratio": 0.5, 169 | "td_maxheight": 2.0, 170 | "td_maxlen": 1.0, 171 | "td_on_pad_in_zone": false, 172 | "td_target_name": "td_track_end", 173 | "td_width_to_size_filter_ratio": 0.9 174 | } 175 | ], 176 | "track_widths": [], 177 | "tuning_pattern_settings": { 178 | "diff_pair_defaults": { 179 | "corner_radius_percentage": 80, 180 | "corner_style": 1, 181 | "max_amplitude": 1.0, 182 | "min_amplitude": 0.2, 183 | "single_sided": false, 184 | "spacing": 1.0 185 | }, 186 | "diff_pair_skew_defaults": { 187 | "corner_radius_percentage": 80, 188 | "corner_style": 1, 189 | "max_amplitude": 1.0, 190 | "min_amplitude": 0.2, 191 | "single_sided": false, 192 | "spacing": 0.6 193 | }, 194 | "single_track_defaults": { 195 | "corner_radius_percentage": 80, 196 | "corner_style": 1, 197 | "max_amplitude": 1.0, 198 | "min_amplitude": 0.2, 199 | "single_sided": false, 200 | "spacing": 0.6 201 | } 202 | }, 203 | "via_dimensions": [], 204 | "zones_allow_external_fillets": false 205 | }, 206 | "ipc2581": { 207 | "dist": "", 208 | "distpn": "", 209 | "internal_id": "", 210 | "mfg": "", 211 | "mpn": "" 212 | }, 213 | "layer_presets": [], 214 | "viewports": [] 215 | }, 216 | "boards": [], 217 | "cvpcb": { 218 | "equivalence_files": [] 219 | }, 220 | "erc": { 221 | "erc_exclusions": [], 222 | "meta": { 223 | "version": 0 224 | }, 225 | "pin_map": [ 226 | [ 227 | 0, 228 | 0, 229 | 0, 230 | 0, 231 | 0, 232 | 0, 233 | 1, 234 | 0, 235 | 0, 236 | 0, 237 | 0, 238 | 2 239 | ], 240 | [ 241 | 0, 242 | 2, 243 | 0, 244 | 1, 245 | 0, 246 | 0, 247 | 1, 248 | 0, 249 | 2, 250 | 2, 251 | 2, 252 | 2 253 | ], 254 | [ 255 | 0, 256 | 0, 257 | 0, 258 | 0, 259 | 0, 260 | 0, 261 | 1, 262 | 0, 263 | 1, 264 | 0, 265 | 1, 266 | 2 267 | ], 268 | [ 269 | 0, 270 | 1, 271 | 0, 272 | 0, 273 | 0, 274 | 0, 275 | 1, 276 | 1, 277 | 2, 278 | 1, 279 | 1, 280 | 2 281 | ], 282 | [ 283 | 0, 284 | 0, 285 | 0, 286 | 0, 287 | 0, 288 | 0, 289 | 1, 290 | 0, 291 | 0, 292 | 0, 293 | 0, 294 | 2 295 | ], 296 | [ 297 | 0, 298 | 0, 299 | 0, 300 | 0, 301 | 0, 302 | 0, 303 | 0, 304 | 0, 305 | 0, 306 | 0, 307 | 0, 308 | 2 309 | ], 310 | [ 311 | 1, 312 | 1, 313 | 1, 314 | 1, 315 | 1, 316 | 0, 317 | 1, 318 | 1, 319 | 1, 320 | 1, 321 | 1, 322 | 2 323 | ], 324 | [ 325 | 0, 326 | 0, 327 | 0, 328 | 1, 329 | 0, 330 | 0, 331 | 1, 332 | 0, 333 | 0, 334 | 0, 335 | 0, 336 | 2 337 | ], 338 | [ 339 | 0, 340 | 2, 341 | 1, 342 | 2, 343 | 0, 344 | 0, 345 | 1, 346 | 0, 347 | 2, 348 | 2, 349 | 2, 350 | 2 351 | ], 352 | [ 353 | 0, 354 | 2, 355 | 0, 356 | 1, 357 | 0, 358 | 0, 359 | 1, 360 | 0, 361 | 2, 362 | 0, 363 | 0, 364 | 2 365 | ], 366 | [ 367 | 0, 368 | 2, 369 | 1, 370 | 1, 371 | 0, 372 | 0, 373 | 1, 374 | 0, 375 | 2, 376 | 0, 377 | 0, 378 | 2 379 | ], 380 | [ 381 | 2, 382 | 2, 383 | 2, 384 | 2, 385 | 2, 386 | 2, 387 | 2, 388 | 2, 389 | 2, 390 | 2, 391 | 2, 392 | 2 393 | ] 394 | ], 395 | "rule_severities": { 396 | "bus_definition_conflict": "error", 397 | "bus_entry_needed": "error", 398 | "bus_to_bus_conflict": "error", 399 | "bus_to_net_conflict": "error", 400 | "conflicting_netclasses": "error", 401 | "different_unit_footprint": "error", 402 | "different_unit_net": "error", 403 | "duplicate_reference": "error", 404 | "duplicate_sheet_names": "error", 405 | "endpoint_off_grid": "warning", 406 | "extra_units": "error", 407 | "global_label_dangling": "warning", 408 | "hier_label_mismatch": "error", 409 | "label_dangling": "error", 410 | "lib_symbol_issues": "warning", 411 | "missing_bidi_pin": "warning", 412 | "missing_input_pin": "warning", 413 | "missing_power_pin": "error", 414 | "missing_unit": "warning", 415 | "multiple_net_names": "warning", 416 | "net_not_bus_member": "warning", 417 | "no_connect_connected": "warning", 418 | "no_connect_dangling": "warning", 419 | "pin_not_connected": "error", 420 | "pin_not_driven": "error", 421 | "pin_to_pin": "warning", 422 | "power_pin_not_driven": "error", 423 | "similar_labels": "warning", 424 | "simulation_model_issue": "ignore", 425 | "unannotated": "error", 426 | "unit_value_mismatch": "error", 427 | "unresolved_variable": "error", 428 | "wire_dangling": "error" 429 | } 430 | }, 431 | "libraries": { 432 | "pinned_footprint_libs": [], 433 | "pinned_symbol_libs": [] 434 | }, 435 | "meta": { 436 | "filename": "mid_panel_r2.0.kicad_pro", 437 | "version": 1 438 | }, 439 | "net_settings": { 440 | "classes": [ 441 | { 442 | "bus_width": 12, 443 | "clearance": 0.2, 444 | "diff_pair_gap": 0.25, 445 | "diff_pair_via_gap": 0.25, 446 | "diff_pair_width": 0.2, 447 | "line_style": 0, 448 | "microvia_diameter": 0.3, 449 | "microvia_drill": 0.1, 450 | "name": "Default", 451 | "pcb_color": "rgba(0, 0, 0, 0.000)", 452 | "schematic_color": "rgba(0, 0, 0, 0.000)", 453 | "track_width": 0.25, 454 | "via_diameter": 0.8, 455 | "via_drill": 0.4, 456 | "wire_width": 6 457 | } 458 | ], 459 | "meta": { 460 | "version": 3 461 | }, 462 | "net_colors": null, 463 | "netclass_assignments": null, 464 | "netclass_patterns": [ 465 | { 466 | "netclass": "Default", 467 | "pattern": "GND" 468 | } 469 | ] 470 | }, 471 | "pcbnew": { 472 | "last_paths": { 473 | "gencad": "", 474 | "idf": "", 475 | "netlist": "", 476 | "plot": "", 477 | "pos_files": "", 478 | "specctra_dsn": "", 479 | "step": "", 480 | "svg": "", 481 | "vrml": "" 482 | }, 483 | "page_layout_descr_file": "" 484 | }, 485 | "schematic": { 486 | "annotate_start_num": 0, 487 | "drawing": { 488 | "dashed_lines_dash_length_ratio": 12.0, 489 | "dashed_lines_gap_length_ratio": 3.0, 490 | "default_line_thickness": 6.0, 491 | "default_text_size": 50.0, 492 | "field_names": [], 493 | "intersheets_ref_own_page": false, 494 | "intersheets_ref_prefix": "", 495 | "intersheets_ref_short": false, 496 | "intersheets_ref_show": false, 497 | "intersheets_ref_suffix": "", 498 | "junction_size_choice": 3, 499 | "label_size_ratio": 0.375, 500 | "pin_symbol_size": 25.0, 501 | "text_offset_ratio": 0.15 502 | }, 503 | "legacy_lib_dir": "", 504 | "legacy_lib_list": [], 505 | "meta": { 506 | "version": 1 507 | }, 508 | "net_format_name": "", 509 | "page_layout_descr_file": "", 510 | "plot_directory": "", 511 | "spice_current_sheet_as_root": false, 512 | "spice_external_command": "spice \"%I\"", 513 | "spice_model_current_sheet_as_root": true, 514 | "spice_save_all_currents": false, 515 | "spice_save_all_voltages": false, 516 | "subpart_first_id": 65, 517 | "subpart_id_separator": 0 518 | }, 519 | "sheets": [ 520 | [ 521 | "b4e47576-1fa2-4a5c-9d2e-86b725a63075", 522 | "" 523 | ] 524 | ], 525 | "text_variables": {} 526 | } 527 | -------------------------------------------------------------------------------- /hardware/new_mid_panel_r2.0/mid_panel_r2.0.kicad_sch: -------------------------------------------------------------------------------- 1 | (kicad_sch (version 20230121) (generator eeschema) 2 | 3 | (uuid b4e47576-1fa2-4a5c-9d2e-86b725a63075) 4 | 5 | (paper "A4") 6 | 7 | (lib_symbols 8 | (symbol "Device:R" (pin_numbers hide) (pin_names (offset 0)) (in_bom yes) (on_board yes) 9 | (property "Reference" "R" (at 2.032 0 90) 10 | (effects (font (size 1.27 1.27))) 11 | ) 12 | (property "Value" "R" (at 0 0 90) 13 | (effects (font (size 1.27 1.27))) 14 | ) 15 | (property "Footprint" "" (at -1.778 0 90) 16 | (effects (font (size 1.27 1.27)) hide) 17 | ) 18 | (property "Datasheet" "~" (at 0 0 0) 19 | (effects (font (size 1.27 1.27)) hide) 20 | ) 21 | (property "ki_keywords" "R res resistor" (at 0 0 0) 22 | (effects (font (size 1.27 1.27)) hide) 23 | ) 24 | (property "ki_description" "Resistor" (at 0 0 0) 25 | (effects (font (size 1.27 1.27)) hide) 26 | ) 27 | (property "ki_fp_filters" "R_*" (at 0 0 0) 28 | (effects (font (size 1.27 1.27)) hide) 29 | ) 30 | (symbol "R_0_1" 31 | (rectangle (start -1.016 -2.54) (end 1.016 2.54) 32 | (stroke (width 0.254) (type default)) 33 | (fill (type none)) 34 | ) 35 | ) 36 | (symbol "R_1_1" 37 | (pin passive line (at 0 3.81 270) (length 1.27) 38 | (name "~" (effects (font (size 1.27 1.27)))) 39 | (number "1" (effects (font (size 1.27 1.27)))) 40 | ) 41 | (pin passive line (at 0 -3.81 90) (length 1.27) 42 | (name "~" (effects (font (size 1.27 1.27)))) 43 | (number "2" (effects (font (size 1.27 1.27)))) 44 | ) 45 | ) 46 | ) 47 | (symbol "power:GND" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes) 48 | (property "Reference" "#PWR" (at 0 -6.35 0) 49 | (effects (font (size 1.27 1.27)) hide) 50 | ) 51 | (property "Value" "GND" (at 0 -3.81 0) 52 | (effects (font (size 1.27 1.27))) 53 | ) 54 | (property "Footprint" "" (at 0 0 0) 55 | (effects (font (size 1.27 1.27)) hide) 56 | ) 57 | (property "Datasheet" "" (at 0 0 0) 58 | (effects (font (size 1.27 1.27)) hide) 59 | ) 60 | (property "ki_keywords" "global power" (at 0 0 0) 61 | (effects (font (size 1.27 1.27)) hide) 62 | ) 63 | (property "ki_description" "Power symbol creates a global label with name \"GND\" , ground" (at 0 0 0) 64 | (effects (font (size 1.27 1.27)) hide) 65 | ) 66 | (symbol "GND_0_1" 67 | (polyline 68 | (pts 69 | (xy 0 0) 70 | (xy 0 -1.27) 71 | (xy 1.27 -1.27) 72 | (xy 0 -2.54) 73 | (xy -1.27 -1.27) 74 | (xy 0 -1.27) 75 | ) 76 | (stroke (width 0) (type default)) 77 | (fill (type none)) 78 | ) 79 | ) 80 | (symbol "GND_1_1" 81 | (pin power_in line (at 0 0 270) (length 0) hide 82 | (name "GND" (effects (font (size 1.27 1.27)))) 83 | (number "1" (effects (font (size 1.27 1.27)))) 84 | ) 85 | ) 86 | ) 87 | (symbol "power:PWR_FLAG" (power) (pin_numbers hide) (pin_names (offset 0) hide) (in_bom yes) (on_board yes) 88 | (property "Reference" "#FLG" (at 0 1.905 0) 89 | (effects (font (size 1.27 1.27)) hide) 90 | ) 91 | (property "Value" "PWR_FLAG" (at 0 3.81 0) 92 | (effects (font (size 1.27 1.27))) 93 | ) 94 | (property "Footprint" "" (at 0 0 0) 95 | (effects (font (size 1.27 1.27)) hide) 96 | ) 97 | (property "Datasheet" "~" (at 0 0 0) 98 | (effects (font (size 1.27 1.27)) hide) 99 | ) 100 | (property "ki_keywords" "flag power" (at 0 0 0) 101 | (effects (font (size 1.27 1.27)) hide) 102 | ) 103 | (property "ki_description" "Special symbol for telling ERC where power comes from" (at 0 0 0) 104 | (effects (font (size 1.27 1.27)) hide) 105 | ) 106 | (symbol "PWR_FLAG_0_0" 107 | (pin power_out line (at 0 0 90) (length 0) 108 | (name "pwr" (effects (font (size 1.27 1.27)))) 109 | (number "1" (effects (font (size 1.27 1.27)))) 110 | ) 111 | ) 112 | (symbol "PWR_FLAG_0_1" 113 | (polyline 114 | (pts 115 | (xy 0 0) 116 | (xy 0 1.27) 117 | (xy -1.016 1.905) 118 | (xy 0 2.54) 119 | (xy 1.016 1.905) 120 | (xy 0 1.27) 121 | ) 122 | (stroke (width 0) (type default)) 123 | (fill (type none)) 124 | ) 125 | ) 126 | ) 127 | ) 128 | 129 | (junction (at 113.03 78.74) (diameter 0) (color 0 0 0 0) 130 | (uuid 1a1a73d2-8ace-4db1-af45-87bc4bbf037e) 131 | ) 132 | 133 | (wire (pts (xy 113.03 78.74) (xy 118.745 78.74)) 134 | (stroke (width 0) (type default)) 135 | (uuid 49a1f05b-9b94-48ca-ae76-34783d537e8a) 136 | ) 137 | (wire (pts (xy 130.175 78.74) (xy 126.365 78.74)) 138 | (stroke (width 0) (type default)) 139 | (uuid b9a8b15a-6a45-4319-a7e3-b78d19ca87a9) 140 | ) 141 | 142 | (symbol (lib_id "power:PWR_FLAG") (at 113.03 78.74 0) (unit 1) 143 | (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) 144 | (uuid 2b03a337-ae26-4d3c-a7e4-7bc0b321d3cc) 145 | (property "Reference" "#FLG01" (at 113.03 76.835 0) 146 | (effects (font (size 1.27 1.27)) hide) 147 | ) 148 | (property "Value" "PWR_FLAG" (at 113.03 73.66 0) 149 | (effects (font (size 1.27 1.27))) 150 | ) 151 | (property "Footprint" "" (at 113.03 78.74 0) 152 | (effects (font (size 1.27 1.27)) hide) 153 | ) 154 | (property "Datasheet" "~" (at 113.03 78.74 0) 155 | (effects (font (size 1.27 1.27)) hide) 156 | ) 157 | (pin "1" (uuid 0bb20e1c-2341-4478-8982-f251d9cc6ace)) 158 | (instances 159 | (project "mid_panel_r2.0" 160 | (path "/b4e47576-1fa2-4a5c-9d2e-86b725a63075" 161 | (reference "#FLG01") (unit 1) 162 | ) 163 | ) 164 | ) 165 | ) 166 | 167 | (symbol (lib_id "power:GND") (at 113.03 78.74 0) (unit 1) 168 | (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) 169 | (uuid bcf34f05-8f4e-4c45-833b-8ae4784098bc) 170 | (property "Reference" "#PWR01" (at 113.03 85.09 0) 171 | (effects (font (size 1.27 1.27)) hide) 172 | ) 173 | (property "Value" "GND" (at 113.03 83.82 0) 174 | (effects (font (size 1.27 1.27))) 175 | ) 176 | (property "Footprint" "" (at 113.03 78.74 0) 177 | (effects (font (size 1.27 1.27)) hide) 178 | ) 179 | (property "Datasheet" "" (at 113.03 78.74 0) 180 | (effects (font (size 1.27 1.27)) hide) 181 | ) 182 | (pin "1" (uuid a1eca777-4ece-41bd-a244-994c3a2518c0)) 183 | (instances 184 | (project "mid_panel_r2.0" 185 | (path "/b4e47576-1fa2-4a5c-9d2e-86b725a63075" 186 | (reference "#PWR01") (unit 1) 187 | ) 188 | ) 189 | ) 190 | ) 191 | 192 | (symbol (lib_id "Device:R") (at 122.555 78.74 90) (unit 1) 193 | (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) 194 | (uuid cecce73a-d84b-4526-9c60-c1c5c3ee5f52) 195 | (property "Reference" "R1" (at 122.555 72.39 90) 196 | (effects (font (size 1.27 1.27))) 197 | ) 198 | (property "Value" "DNP" (at 122.555 74.93 90) 199 | (effects (font (size 1.27 1.27))) 200 | ) 201 | (property "Footprint" "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" (at 122.555 80.518 90) 202 | (effects (font (size 1.27 1.27)) hide) 203 | ) 204 | (property "Datasheet" "~" (at 122.555 78.74 0) 205 | (effects (font (size 1.27 1.27)) hide) 206 | ) 207 | (pin "1" (uuid cba880eb-dd43-440a-8340-bb9da4c9d019)) 208 | (pin "2" (uuid b2e583c1-abe1-4328-84fb-c963d5883375)) 209 | (instances 210 | (project "mid_panel_r2.0" 211 | (path "/b4e47576-1fa2-4a5c-9d2e-86b725a63075" 212 | (reference "R1") (unit 1) 213 | ) 214 | ) 215 | ) 216 | ) 217 | 218 | (symbol (lib_id "power:GND") (at 130.175 78.74 0) (unit 1) 219 | (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced) 220 | (uuid d4f9c3fe-f164-4d35-a525-b2cbe0d34bd0) 221 | (property "Reference" "#PWR02" (at 130.175 85.09 0) 222 | (effects (font (size 1.27 1.27)) hide) 223 | ) 224 | (property "Value" "GND" (at 130.175 83.82 0) 225 | (effects (font (size 1.27 1.27))) 226 | ) 227 | (property "Footprint" "" (at 130.175 78.74 0) 228 | (effects (font (size 1.27 1.27)) hide) 229 | ) 230 | (property "Datasheet" "" (at 130.175 78.74 0) 231 | (effects (font (size 1.27 1.27)) hide) 232 | ) 233 | (pin "1" (uuid 5849548f-d56b-4f28-8df3-ed3c921135b3)) 234 | (instances 235 | (project "mid_panel_r2.0" 236 | (path "/b4e47576-1fa2-4a5c-9d2e-86b725a63075" 237 | (reference "#PWR02") (unit 1) 238 | ) 239 | ) 240 | ) 241 | ) 242 | 243 | (sheet_instances 244 | (path "/" (page "1")) 245 | ) 246 | ) 247 | -------------------------------------------------------------------------------- /hardware/top_panel_r2.0/top_panel_r2.0.kicad_pro: -------------------------------------------------------------------------------- 1 | { 2 | "board": { 3 | "3dviewports": [], 4 | "design_settings": { 5 | "defaults": { 6 | "board_outline_line_width": 0.09999999999999999, 7 | "copper_line_width": 0.19999999999999998, 8 | "copper_text_italic": false, 9 | "copper_text_size_h": 1.5, 10 | "copper_text_size_v": 1.5, 11 | "copper_text_thickness": 0.3, 12 | "copper_text_upright": false, 13 | "courtyard_line_width": 0.049999999999999996, 14 | "dimension_precision": 4, 15 | "dimension_units": 3, 16 | "dimensions": { 17 | "arrow_length": 1270000, 18 | "extension_offset": 500000, 19 | "keep_text_aligned": true, 20 | "suppress_zeroes": false, 21 | "text_position": 0, 22 | "units_format": 1 23 | }, 24 | "fab_line_width": 0.09999999999999999, 25 | "fab_text_italic": false, 26 | "fab_text_size_h": 1.0, 27 | "fab_text_size_v": 1.0, 28 | "fab_text_thickness": 0.15, 29 | "fab_text_upright": false, 30 | "other_line_width": 0.15, 31 | "other_text_italic": false, 32 | "other_text_size_h": 1.0, 33 | "other_text_size_v": 1.0, 34 | "other_text_thickness": 0.15, 35 | "other_text_upright": false, 36 | "pads": { 37 | "drill": 2.7, 38 | "height": 4.7, 39 | "width": 4.7 40 | }, 41 | "silk_line_width": 0.15, 42 | "silk_text_italic": false, 43 | "silk_text_size_h": 1.0, 44 | "silk_text_size_v": 1.0, 45 | "silk_text_thickness": 0.15, 46 | "silk_text_upright": false, 47 | "zones": { 48 | "min_clearance": 0.5 49 | } 50 | }, 51 | "diff_pair_dimensions": [], 52 | "drc_exclusions": [], 53 | "meta": { 54 | "version": 2 55 | }, 56 | "rule_severities": { 57 | "annular_width": "error", 58 | "clearance": "error", 59 | "connection_width": "warning", 60 | "copper_edge_clearance": "error", 61 | "copper_sliver": "warning", 62 | "courtyards_overlap": "error", 63 | "diff_pair_gap_out_of_range": "error", 64 | "diff_pair_uncoupled_length_too_long": "error", 65 | "drill_out_of_range": "error", 66 | "duplicate_footprints": "warning", 67 | "extra_footprint": "warning", 68 | "footprint": "error", 69 | "footprint_type_mismatch": "ignore", 70 | "hole_clearance": "error", 71 | "hole_near_hole": "error", 72 | "invalid_outline": "error", 73 | "isolated_copper": "warning", 74 | "item_on_disabled_layer": "error", 75 | "items_not_allowed": "error", 76 | "length_out_of_range": "error", 77 | "lib_footprint_issues": "warning", 78 | "lib_footprint_mismatch": "warning", 79 | "malformed_courtyard": "error", 80 | "microvia_drill_out_of_range": "error", 81 | "missing_courtyard": "ignore", 82 | "missing_footprint": "warning", 83 | "net_conflict": "warning", 84 | "npth_inside_courtyard": "ignore", 85 | "padstack": "warning", 86 | "pth_inside_courtyard": "ignore", 87 | "shorting_items": "error", 88 | "silk_edge_clearance": "warning", 89 | "silk_over_copper": "warning", 90 | "silk_overlap": "warning", 91 | "skew_out_of_range": "error", 92 | "solder_mask_bridge": "error", 93 | "starved_thermal": "error", 94 | "text_height": "warning", 95 | "text_thickness": "warning", 96 | "through_hole_pad_without_hole": "error", 97 | "too_many_vias": "error", 98 | "track_dangling": "warning", 99 | "track_width": "error", 100 | "tracks_crossing": "error", 101 | "unconnected_items": "error", 102 | "unresolved_variable": "error", 103 | "via_dangling": "warning", 104 | "zones_intersect": "error" 105 | }, 106 | "rules": { 107 | "max_error": 0.005, 108 | "min_clearance": 0.0, 109 | "min_connection": 0.0, 110 | "min_copper_edge_clearance": 0.0, 111 | "min_hole_clearance": 0.25, 112 | "min_hole_to_hole": 0.25, 113 | "min_microvia_diameter": 0.19999999999999998, 114 | "min_microvia_drill": 0.09999999999999999, 115 | "min_resolved_spokes": 2, 116 | "min_silk_clearance": 0.0, 117 | "min_text_height": 0.7999999999999999, 118 | "min_text_thickness": 0.08, 119 | "min_through_hole_diameter": 0.3, 120 | "min_track_width": 0.0, 121 | "min_via_annular_width": 0.09999999999999999, 122 | "min_via_diameter": 0.5, 123 | "solder_mask_clearance": 0.0, 124 | "solder_mask_min_width": 0.0, 125 | "solder_mask_to_copper_clearance": 0.005, 126 | "use_height_for_length_calcs": true 127 | }, 128 | "teardrop_options": [ 129 | { 130 | "td_allow_use_two_tracks": true, 131 | "td_curve_segcount": 5, 132 | "td_on_pad_in_zone": false, 133 | "td_onpadsmd": true, 134 | "td_onroundshapesonly": false, 135 | "td_ontrackend": false, 136 | "td_onviapad": true 137 | } 138 | ], 139 | "teardrop_parameters": [ 140 | { 141 | "td_curve_segcount": 0, 142 | "td_height_ratio": 1.0, 143 | "td_length_ratio": 0.5, 144 | "td_maxheight": 2.0, 145 | "td_maxlen": 1.0, 146 | "td_target_name": "td_round_shape", 147 | "td_width_to_size_filter_ratio": 0.9 148 | }, 149 | { 150 | "td_curve_segcount": 0, 151 | "td_height_ratio": 1.0, 152 | "td_length_ratio": 0.5, 153 | "td_maxheight": 2.0, 154 | "td_maxlen": 1.0, 155 | "td_target_name": "td_rect_shape", 156 | "td_width_to_size_filter_ratio": 0.9 157 | }, 158 | { 159 | "td_curve_segcount": 0, 160 | "td_height_ratio": 1.0, 161 | "td_length_ratio": 0.5, 162 | "td_maxheight": 2.0, 163 | "td_maxlen": 1.0, 164 | "td_target_name": "td_track_end", 165 | "td_width_to_size_filter_ratio": 0.9 166 | } 167 | ], 168 | "track_widths": [], 169 | "via_dimensions": [], 170 | "zones_allow_external_fillets": false 171 | }, 172 | "layer_presets": [], 173 | "viewports": [] 174 | }, 175 | "boards": [], 176 | "cvpcb": { 177 | "equivalence_files": [] 178 | }, 179 | "libraries": { 180 | "pinned_footprint_libs": [], 181 | "pinned_symbol_libs": [] 182 | }, 183 | "meta": { 184 | "filename": "top_panel_r2.0.kicad_pro", 185 | "version": 1 186 | }, 187 | "net_settings": { 188 | "classes": [ 189 | { 190 | "bus_width": 12, 191 | "clearance": 0.2, 192 | "diff_pair_gap": 0.25, 193 | "diff_pair_via_gap": 0.25, 194 | "diff_pair_width": 0.2, 195 | "line_style": 0, 196 | "microvia_diameter": 0.3, 197 | "microvia_drill": 0.1, 198 | "name": "Default", 199 | "pcb_color": "rgba(0, 0, 0, 0.000)", 200 | "schematic_color": "rgba(0, 0, 0, 0.000)", 201 | "track_width": 0.25, 202 | "via_diameter": 0.8, 203 | "via_drill": 0.4, 204 | "wire_width": 6 205 | } 206 | ], 207 | "meta": { 208 | "version": 3 209 | }, 210 | "net_colors": null, 211 | "netclass_assignments": null, 212 | "netclass_patterns": [] 213 | }, 214 | "pcbnew": { 215 | "last_paths": { 216 | "gencad": "", 217 | "idf": "", 218 | "netlist": "", 219 | "specctra_dsn": "", 220 | "step": "", 221 | "vrml": "" 222 | }, 223 | "page_layout_descr_file": "" 224 | }, 225 | "schematic": { 226 | "legacy_lib_dir": "", 227 | "legacy_lib_list": [] 228 | }, 229 | "sheets": [], 230 | "text_variables": {} 231 | } 232 | -------------------------------------------------------------------------------- /hardware/top_panel_r2.0/top_panel_r2.0.kicad_sch: -------------------------------------------------------------------------------- 1 | (kicad_sch (version 20230121) (generator eeschema) 2 | (paper "A4") 3 | (lib_symbols) 4 | (symbol_instances) 5 | ) 6 | -------------------------------------------------------------------------------- /other/calculations/dEdx.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import scipy.constants as sc 3 | 4 | E_K40 = 1.4e6 # eV 5 | m = 0.5e6 # eV 6 | z = 1 # e- charge 7 | ZoA = 0.5 # Z/A charge over atomic number of matter 8 | 9 | 10 | K = 0.307 # MeV mol/cm**2 11 | 12 | gamma = lambda E: E/m+1 13 | beta = lambda E: np.sqrt(1-1/gamma(E)**2) 14 | 15 | bethe = lambda E: K*z**2 16 | -------------------------------------------------------------------------------- /other/datasheets/hardware-design-with-rp2040.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/other/datasheets/hardware-design-with-rp2040.pdf -------------------------------------------------------------------------------- /other/datasheets/rp2040-datasheet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/other/datasheets/rp2040-datasheet.pdf -------------------------------------------------------------------------------- /other/digital_filter/demo_interf_code.py: -------------------------------------------------------------------------------- 1 | # filter coefficients obtained through scipy: 2 | from scipy.signal import butter, lfilter, freqz 3 | import numpy as np 4 | 5 | b, a = butter(1, 0.01, fs=1, btype='low', analog=False) 6 | 7 | print('a', ', '.join(map(str, a))) 8 | print('b', ', '.join(map(str, b))) 9 | print() 10 | 11 | scale = 2**24 # must be chosen to not saturate the integer size!! 12 | 13 | scale_a = scale / max(a) 14 | scale_b = scale / max(b) 15 | 16 | total_scale = np.round(scale_b / scale_a) 17 | 18 | b = np.round(b*scale_b).astype(np.int64) 19 | a = np.round(a*scale_a).astype(np.int64) 20 | 21 | print('a', ', '.join(map(str, a))) 22 | print('b', ', '.join(map(str, b))) 23 | print(total_scale) 24 | -------------------------------------------------------------------------------- /other/digital_filter/filter.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | from scipy.signal import welch, iirnotch, lfilter, butter, sosfilt 4 | from icecream import ic 5 | 6 | ## I think my way of scaling only wokrs on DF1 structure (otherwise the intermediate values seem to explode) 7 | 8 | def sos_custom(b, a, data): 9 | assert len(a) == len(b), f'len(a)={len(a)}, len(b)={len(b)}' 10 | assert len(a) == 3 11 | 12 | print('a', a) 13 | print('b', b) 14 | 15 | fbuf = [0, 0, 0] 16 | for x in data: 17 | # calculate 18 | fbuf = [0] + fbuf[:-1] 19 | fbuf[0] = x*a[0] + fbuf[1]*a[1]*(-1)# + fbuf[2]*a[2]*(-1) 20 | yield b[0]*fbuf[0] + b[1]*fbuf[1]# + b[2]*fbuf[2] 21 | # shift fbuf 22 | 23 | def sos_c_reimp(array): 24 | a1=-0.96906742; b0=0.98453371; b1=-0.98453371; 25 | 26 | last_value = 0; 27 | 28 | for i in range(len(array)): 29 | current_value = array[i] - a1*last_value; 30 | tmp = current_value*b0 + last_value*b1; 31 | last_value = current_value 32 | yield tmp 33 | 34 | def sos_fixed_point2(array): 35 | # a0 = 1; a1=-0.96906742; b0=0.98453371; b1=-0.98453371; # values for HPF with 0.01 relative freq 36 | # b0 = 0.99686824; b1 = -0.99686824; a0 = 1. ; a1 = -0.99373647 # values for HPF with 0.002 relative freq 37 | b0, b1, b2, a0, a1, a2 = butter(1, 0.02, btype='highpass', output='sos')[0] 38 | 39 | scale = 2**16 40 | a0 = int(a0*scale) 41 | a1 = int(a1*scale) 42 | b0 = int(b0*scale) 43 | b1 = int(b1*scale) 44 | 45 | ic(a0, a1, b0, b1) 46 | 47 | xp = 0; yp = 0; 48 | for i, x in enumerate(array): 49 | y = int( (b0*x + b1*xp - a1*yp) / a0 ) 50 | yield y 51 | if i < 30: 52 | print(i, x, y) 53 | yp = y 54 | xp = x 55 | 56 | def sos_fixed_point(array): 57 | a1=-0.96906742; b0=0.98453371; b1=-0.98453371; # values for HPF with 0.01 relative freq 58 | 59 | scale = 1 # 2**24 60 | a0 = 1 *scale 61 | a1 = a1*scale 62 | b0 = b0*scale 63 | b1 = b1*scale 64 | 65 | print(a0, a1) 66 | print(b0, b1) 67 | 68 | 69 | xp = 0 # x_{n-1} 70 | yp = 0 # y_{n-1} 71 | for x in array: 72 | y = (b0*x + b1*xp - a1*yp) / a0 73 | yield y 74 | xp = x 75 | yp = y 76 | 77 | ''' DF2 78 | last_value = 0 79 | for i in range(len(array)): 80 | current_value = a0*array[i] - a1*last_value; 81 | tmp = current_value*b0 + last_value*b1; 82 | last_value = current_value 83 | # print(tmp, current_value) 84 | yield tmp, current_value 85 | ''' 86 | 87 | N = int(1e6) 88 | 89 | FS = 1000e3 90 | 91 | # hpf = butter(1, 1000/FS, btype='highpass', output='sos') 92 | hpf = butter(1, 0.01, btype='highpass', output='sos') 93 | ic(hpf) 94 | 95 | noise = (np.random.uniform(0, 1, N) * 2**8).astype(np.int32) 96 | filtered = sosfilt(hpf, noise) 97 | filtered2 = list(sos_custom(hpf[0][:3], hpf[0][3:], noise)) 98 | # filtered3 = np.array(list(sos_fixed_point(noise))).T 99 | filtered4 = list(sos_fixed_point2(noise)) 100 | 101 | # plt.figure() 102 | # plt.plot(noise, label='in') 103 | # plt.plot(filtered3[0], label='out') 104 | # plt.plot(filtered3[1], label='hidden') 105 | # plt.legend() 106 | # plt.show() 107 | 108 | nperseg = 1024 109 | f, S_n = welch(noise, fs=FS, nperseg=nperseg) 110 | f, S_f = welch(filtered, fs=FS, nperseg=nperseg) 111 | f, S_f2 = welch(filtered2, fs=FS, nperseg=nperseg) 112 | # f, S_f3 = welch(filtered3[0], fs=FS, nperseg=nperseg) 113 | f, S_f4 = welch(filtered4, fs=FS, nperseg=nperseg) 114 | 115 | plt.plot(f, S_n, label='input') 116 | plt.plot(f, S_f, label='scipy') 117 | # plt.plot(f, S_f2, ls=':') 118 | plt.plot(f, S_f4, ls=':', label='me') 119 | 120 | plt.legend() 121 | plt.grid() 122 | 123 | plt.yscale('log') 124 | 125 | plt.show() 126 | -------------------------------------------------------------------------------- /other/img/avg_pulse_and_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/other/img/avg_pulse_and_spectrum.png -------------------------------------------------------------------------------- /other/img/first_pulse_maybe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/other/img/first_pulse_maybe.png -------------------------------------------------------------------------------- /other/img/hello_world.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/other/img/hello_world.gif -------------------------------------------------------------------------------- /other/img/noise_level_analysis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/other/img/noise_level_analysis.png -------------------------------------------------------------------------------- /other/img/noise_lpf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/other/img/noise_lpf.png -------------------------------------------------------------------------------- /other/img/picture_pcb_r1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/other/img/picture_pcb_r1.jpeg -------------------------------------------------------------------------------- /other/img/picture_pcb_r2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/other/img/picture_pcb_r2.jpeg -------------------------------------------------------------------------------- /other/img/r1.0_pcb_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/other/img/r1.0_pcb_back.png -------------------------------------------------------------------------------- /other/img/r1.0_pcb_front.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timbk/BetaBoard/33b2197cd6299ab60c43c874df2f76381c5b6b17/other/img/r1.0_pcb_front.png -------------------------------------------------------------------------------- /other/micropython/README.md: -------------------------------------------------------------------------------- 1 | # Old Micropython Firmware 2 | 3 | The initial micropython code used during the very first tests 4 | -------------------------------------------------------------------------------- /other/micropython/config.py: -------------------------------------------------------------------------------- 1 | PIN_LED1 = 18 2 | -------------------------------------------------------------------------------- /other/micropython/flash.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | rshell -p $1 cp *.py /pyboard/ 3 | -------------------------------------------------------------------------------- /other/micropython/flash_main.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | rshell -p $1 cp main.py /pyboard/ 3 | -------------------------------------------------------------------------------- /other/micropython/main.py: -------------------------------------------------------------------------------- 1 | from machine import Pin, I2C, PWM 2 | import machine 3 | import utime 4 | import gc 5 | import config 6 | # import math 7 | 8 | ############################## 9 | ## Pin config 10 | def gpio_init(): 11 | global led_1 12 | 13 | led_1 = Pin(config.PIN_LED1, Pin.OUT) 14 | 15 | ############################## 16 | # ADC setup 17 | import time, array, uctypes, rp_devices as devs 18 | 19 | def adc_dma_read(): 20 | ADC_CHAN = 2 21 | ADC_PIN = 26 + ADC_CHAN 22 | 23 | adc = devs.ADC_DEVICE 24 | pin = devs.GPIO_PINS[ADC_PIN] 25 | pad = devs.PAD_PINS[ADC_PIN] 26 | pin.GPIO_CTRL_REG = devs.GPIO_FUNC_NULL 27 | pad.PAD_REG = 0 28 | 29 | adc.CS_REG = adc.FCS_REG = 0 30 | adc.CS.EN = 1 31 | adc.CS.AINSEL = ADC_CHAN 32 | adc.CS.START_ONCE = 1 33 | # print(adc.RESULT_REG) 34 | 35 | # Multiple ADC samples using DMA 36 | DMA_CHAN = 0 37 | NSAMPLES = 10000 38 | RATE = 1000000 39 | dma_chan = devs.DMA_CHANS[DMA_CHAN] 40 | dma = devs.DMA_DEVICE 41 | 42 | adc.FCS.EN = adc.FCS.DREQ_EN = 1 43 | adc_buff = array.array('H', (0 for _ in range(NSAMPLES))) 44 | adc.DIV_REG = (48000000 // RATE - 1) << 8 45 | adc.FCS.THRESH = adc.FCS.OVER = adc.FCS.UNDER = 1 46 | 47 | dma_chan.READ_ADDR_REG = devs.ADC_FIFO_ADDR 48 | dma_chan.WRITE_ADDR_REG = uctypes.addressof(adc_buff) 49 | dma_chan.TRANS_COUNT_REG = NSAMPLES 50 | 51 | dma_chan.CTRL_TRIG_REG = 0 52 | dma_chan.CTRL_TRIG.CHAIN_TO = DMA_CHAN 53 | dma_chan.CTRL_TRIG.INCR_WRITE = dma_chan.CTRL_TRIG.IRQ_QUIET = 1 54 | dma_chan.CTRL_TRIG.TREQ_SEL = devs.DREQ_ADC 55 | dma_chan.CTRL_TRIG.DATA_SIZE = 1 56 | dma_chan.CTRL_TRIG.EN = 1 57 | 58 | while adc.FCS.LEVEL: 59 | x = adc.FIFO_REG 60 | 61 | adc.CS.START_MANY = 1 62 | while dma_chan.CTRL_TRIG.BUSY: 63 | # led_1.value((utime.ticks_ms()%500) < 150) 64 | time.sleep_ms(10) 65 | adc.CS.START_MANY = 0 66 | dma_chan.CTRL_TRIG.EN = 0 67 | 68 | if min(adc_buff) < 750: 69 | # split to use less memory 70 | # vals = [("%1.3f" % (val*3.3/4096)) for val in adc_buff] 71 | for vals_idx in range(0, len(adc_buff), 40): 72 | vals = ' '.join(f'{i:04X}' for i in adc_buff[vals_idx:min(vals_idx+40, len(adc_buff))]) 73 | print(vals, end=' ') 74 | time.sleep_ms(1) 75 | print() 76 | 77 | ############################## 78 | ## main 79 | gpio_init() 80 | 81 | while True: 82 | # led_1.value((utime.ticks_ms()%500) < 150) 83 | led_1.value(0) 84 | 85 | adc_dma_read() 86 | -------------------------------------------------------------------------------- /other/micropython/plot.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib 3 | # matplotlib.use('tkagg') # more stable on mac ?? 4 | import matplotlib.pyplot as plt 5 | from scipy.signal import welch, iirnotch, lfilter, butter, sosfilt 6 | import serial 7 | import sys 8 | 9 | FS = 1000000 10 | 11 | ser = serial.Serial(sys.argv[1]) 12 | 13 | clear = ser.readline() 14 | data = ser.readline().decode()[:-1] 15 | 16 | data = data.split(' ')[:-1] 17 | 18 | lens = [len(i) == 4 for i in data] 19 | lens = lens[:-1] 20 | assert np.all(lens), str(lens) 21 | 22 | data = map(lambda x: int(x, 16), data) 23 | data = np.array(list(data)) * 3.3 / 2**12 24 | 25 | # Apply notch filter 26 | # notch_filter50 = iirnotch(50, 30, FS) 27 | # notch_filter100 = iirnotch(100, 30, FS) 28 | # notch_filter200 = iirnotch(200, 30, FS) 29 | # notch_filter250 = iirnotch(250, 30, FS) 30 | # 31 | # data_notched = lfilter(*notch_filter50, list(reversed(data))) 32 | # data_notched = lfilter(*notch_filter50, list(reversed(data_notched))) 33 | # data_notched = lfilter(*notch_filter100, data_notched) 34 | # data_notched = lfilter(*notch_filter200, data_notched) 35 | # data_notched = lfilter(*notch_filter250, data_notched) 36 | 37 | hpf = butter(1, 3000/FS, btype='highpass', output='sos') 38 | print(hpf) 39 | data_notched = sosfilt(hpf, data) 40 | 41 | # data_notched = data 42 | 43 | T = np.arange(len(data)) / FS 44 | 45 | # data = data[1000:] 46 | # data_notched = data_notched[1000:] 47 | # T = T[1000:] 48 | 49 | 50 | plt.figure() 51 | plt.plot(T, data) 52 | plt.plot(T, data_notched) 53 | 54 | plt.axhline(np.mean(data)) 55 | plt.axhline(np.mean(data) - 0.055) 56 | plt.axhline(np.mean(data) - 0.2) 57 | plt.axhline(np.mean(data_notched), c='orange') 58 | plt.axhline(np.mean(data_notched) - 0.055, c='orange') 59 | plt.axhline(np.mean(data_notched) - 0.2, c='orange') 60 | 61 | plt.axhline(3.3*750/2**12, c='green') 62 | plt.xlabel('Samples') 63 | plt.grid() 64 | 65 | 66 | plt.figure() 67 | f, S = welch(data, fs=FS, nperseg=1024*64) 68 | plt.plot(f, S) 69 | 70 | f, S = welch(data_notched, fs=FS, nperseg=1024*64) 71 | plt.plot(f, S) 72 | 73 | plt.xlabel('f [Hz]') 74 | plt.grid() 75 | 76 | plt.show() 77 | 78 | -------------------------------------------------------------------------------- /other/micropython/rp_devices.py: -------------------------------------------------------------------------------- 1 | # RP2040 uctype definitions for MicroPython 2 | # See https://iosoft.blog/pico-adc-dma for description 3 | # 4 | # Copyright (c) 2021 Jeremy P Bentham 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # http://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | from uctypes import BF_POS, BF_LEN, UINT32, BFUINT32, struct 20 | 21 | GPIO_BASE = 0x40014000 22 | GPIO_CHAN_WIDTH = 0x08 23 | GPIO_PIN_COUNT = 30 24 | PAD_BASE = 0x4001c000 25 | PAD_PIN_WIDTH = 0x04 26 | ADC_BASE = 0x4004c000 27 | DMA_BASE = 0x50000000 28 | DMA_CHAN_WIDTH = 0x40 29 | DMA_CHAN_COUNT = 12 30 | 31 | # DMA: RP2040 datasheet 2.5.7 32 | DMA_CTRL_TRIG_FIELDS = { 33 | "AHB_ERROR": 31<