├── .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 | 
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 | 
37 | 
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 | 
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 | 
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<