Skip to content

Commit e83c164

Browse files
committed
Merge branch 'master' into smuv3.2
2 parents 7246482 + 34f0e3b commit e83c164

File tree

8 files changed

+417
-3
lines changed

8 files changed

+417
-3
lines changed

edg/parts/Lcd_Er_Tft1_28_3.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
from .PassiveConnector_Fpc import Fpc050Bottom
2+
from ..abstract_parts import *
3+
4+
5+
class Er_Tft_128_3_Outline(InternalSubcircuit, FootprintBlock):
6+
"""Footprint for TFT panel outline"""
7+
8+
def contents(self) -> None:
9+
super().contents()
10+
self.footprint('U', 'edg:Lcd_Er_Tft1_28_3_Outline', {},
11+
'EastRising', 'ER-TFT1.28-3',
12+
datasheet='https://www.buydisplay.com/download/manual/ER-TFT1.28-3_Datasheet.pdf')
13+
14+
15+
class Er_Tft_128_3_Device(InternalSubcircuit, Nonstrict3v3Compatible, Block):
16+
"""15-pin FPC connector for the ER-TFT1.28-3 device"""
17+
18+
def __init__(self) -> None:
19+
super().__init__()
20+
21+
self.conn = self.Block(Fpc050Bottom(length=15)) # Pin numbering in the doc is flipped in the footprint
22+
23+
# Power pins
24+
self.vdd = self.Export(self.conn.pins.request('12').adapt_to(VoltageSink(
25+
voltage_limits=self.nonstrict_3v3_compatible.then_else(
26+
(2.5, 3.6) * Volt, # abs max is 4.6v
27+
(2.5, 3.3) * Volt),
28+
)))
29+
30+
self.gnd = self.Export(self.conn.pins.request('15').adapt_to(Ground()))
31+
# Backlight control
32+
self.ledk = self.Export(self.conn.pins.request('14'))
33+
self.leda = self.Export(self.conn.pins.request('13'))
34+
35+
dio_model = DigitalBidir.from_supply(
36+
self.gnd, self.vdd,
37+
voltage_limit_tolerance=(-0.3, 0.3)*Volt,
38+
input_threshold_factor=(0.3, 0.7)
39+
)
40+
41+
self.rs = self.Export(self.conn.pins.request('11').adapt_to(DigitalSink.from_bidir(dio_model)))
42+
43+
# Control pins
44+
self.spi = self.Port(SpiPeripheral.empty())
45+
self.cs = self.Export(self.conn.pins.request('10').adapt_to(DigitalSink.from_bidir(dio_model)))
46+
self.connect(self.spi.sck, self.conn.pins.request('9').adapt_to(DigitalSink.from_bidir(dio_model)))
47+
self.connect(self.spi.mosi, self.conn.pins.request('8').adapt_to(DigitalSink.from_bidir(dio_model)))
48+
49+
self.miso_nc = self.Block(DigitalBidirNotConnected())
50+
self.connect(self.spi.miso, self.miso_nc.port)
51+
52+
self.rst = self.Export(self.conn.pins.request('7').adapt_to(DigitalSink.from_bidir(dio_model)))
53+
54+
# Capacitive Touch Panel (CTP)
55+
self.ctp_i2c = self.Port(I2cTarget(DigitalBidir.empty(), addresses=[0x15]),)
56+
57+
self.ctp_vdd = self.Export(self.conn.pins.request('6').adapt_to(VoltageSink(
58+
voltage_limits=(2.7, 3.6) * Volt,
59+
current_draw=(5 * uAmp, 2.5 * mAmp)
60+
)))
61+
62+
self.connect(self.gnd, self.conn.pins.request('5').adapt_to(Ground()))
63+
64+
self.ctp_rst = self.Export(self.conn.pins.request('4').adapt_to(DigitalSink.from_bidir(dio_model)))
65+
self.ctp_int = self.Export(self.conn.pins.request('3').adapt_to(DigitalSink.from_bidir(dio_model)))
66+
self.connect(self.ctp_i2c.sda, self.conn.pins.request('2').adapt_to(dio_model))
67+
self.connect(self.ctp_i2c.scl, self.conn.pins.request('1').adapt_to(DigitalSink.from_bidir(dio_model)))
68+
69+
70+
class Er_Tft_128_3(Lcd, Resettable, Block):
71+
"""GC9A01-based 1.28" 240x240 TFT, with optional CST816S-based capacitive touch panel."""
72+
73+
def __init__(self) -> None:
74+
super().__init__()
75+
self.ic = self.Block(Er_Tft_128_3_Device())
76+
self.gnd = self.Export(self.ic.gnd, [Common])
77+
self.pwr = self.Export(self.ic.vdd, [Power])
78+
self.spi = self.Export(self.ic.spi)
79+
self.cs = self.Export(self.ic.cs)
80+
self.dc = self.Export(self.ic.rs)
81+
# touch interface
82+
self.ctp_i2c = self.Export(self.ic.ctp_i2c, optional=True, doc='Touch panel interface i2c')
83+
self.ctp_rst = self.Export(self.ic.ctp_rst, optional=True, doc='Touch panel interface')
84+
self.ctp_int = self.Export(self.ic.ctp_int, optional=True, doc='Touch panel interface')
85+
86+
def contents(self):
87+
super().contents()
88+
self.connect(self.reset, self.ic.rst)
89+
self.require(self.reset.is_connected())
90+
91+
self.lcd = self.Block(Er_Tft_128_3_Outline()) # for ic outline
92+
93+
self.connect(self.ic.ledk.adapt_to(Ground()), self.gnd)
94+
forward_current = (24, 30)*mAmp
95+
forward_voltage = 2.9*Volt
96+
self.led_res = self.Block(Resistor(
97+
resistance=((self.pwr.link().voltage.upper() - forward_voltage) / forward_current.upper(),
98+
(self.pwr.link().voltage.lower() - forward_voltage) / forward_current.lower())))
99+
self.connect(self.led_res.a.adapt_to(VoltageSink(current_draw=forward_current)), self.pwr)
100+
self.connect(self.led_res.b, self.ic.leda)
101+
self.connect(self.pwr, self.ic.ctp_vdd)
102+
self.require(self.ctp_i2c.is_connected() == self.ctp_rst.is_connected())
103+
self.require(self.ctp_i2c.is_connected() == self.ctp_int.is_connected())
104+

edg/parts/Lsm6dsv16x.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from .JlcPart import JlcPart
2+
from ..abstract_parts import *
3+
4+
5+
class Lsm6dsv16x_Device(InternalSubcircuit, FootprintBlock, JlcPart):
6+
def __init__(self) -> None:
7+
super().__init__()
8+
self.vdd = self.Port(VoltageSink(
9+
voltage_limits=(1.71, 3.6) * Volt,
10+
current_draw=(2.6 * uAmp, 0.65 * mAmp) # Values for low-power and high-performance modes
11+
))
12+
self.vddio = self.Port(VoltageSink(
13+
voltage_limits=(1.08, 3.6) * Volt # Extended range
14+
))
15+
self.gnd = self.Port(Ground())
16+
17+
dio_model = DigitalBidir.from_supply(
18+
self.gnd, self.vddio,
19+
voltage_limit_abs=(-0.3 * Volt, self.vddio.voltage_limits.upper() + 0.3),
20+
# datasheet states abs volt to be [0.3, VDD_IO+0.3], likely a typo
21+
current_limits=(-4, 4) * mAmp,
22+
input_threshold_factor=(0.3, 0.7)
23+
)
24+
self.i2c = self.Port(I2cTarget(dio_model))
25+
26+
dout_model = DigitalSource.low_from_supply(self.gnd)
27+
self.int1 = self.Port(dout_model, optional=True)
28+
self.int2 = self.Port(dout_model, optional=True)
29+
30+
self.qvar1 = self.Port(Passive(), optional=True)
31+
self.qvar2 = self.Port(Passive(), optional=True)
32+
33+
def contents(self) -> None:
34+
self.footprint(
35+
'U', 'Package_LGA:Bosch_LGA-14_3x2.5mm_P0.5mm',
36+
{
37+
'1': self.gnd, # sa0
38+
'2': self.qvar1, # not used in mode 1
39+
'3': self.qvar2, # not used in mode 1
40+
'4': self.int1,
41+
'5': self.vddio,
42+
'6': self.gnd,
43+
'7': self.gnd,
44+
'8': self.vdd,
45+
'9': self.int2,
46+
# '10': self.nc, # leave unconnected
47+
# '11': self.nc, # leave unconnected
48+
'12': self.vddio, # cs pin
49+
'13': self.i2c.scl,
50+
'14': self.i2c.sda,
51+
},
52+
mfr='STMicroelectronics', part='LSM6DSV16X',
53+
datasheet='https://www.st.com/resource/en/datasheet/lsm6dsv16x.pdf'
54+
)
55+
self.assign(self.lcsc_part, 'C5267406')
56+
self.assign(self.actual_basic_part, False)
57+
58+
59+
class Lsm6dsv16x(Accelerometer, Gyroscope, DefaultExportBlock):
60+
"""Integrated High-edn smartphone 3d accelerometer (ranging over +/- 2/4/8/16 g) and 3d gyroscope
61+
(ranging over +/- 125/250/500/1000/2000 dps). Onboard sensor fusion for quaternion calculation.
62+
Supports external qvar for tap detections, etc."""
63+
64+
def __init__(self):
65+
super().__init__()
66+
self.ic = self.Block(Lsm6dsv16x_Device())
67+
self.gnd = self.Export(self.ic.gnd, [Common])
68+
self.pwr = self.Export(self.ic.vdd, [Power])
69+
self.pwr_io = self.Export(self.ic.vddio, default=self.pwr, doc="IO supply voltage")
70+
71+
self.i2c = self.Export(self.ic.i2c)
72+
self.int1 = self.Export(self.ic.int1, optional=True,
73+
doc="Programmable interrupt. This can be configured as push-pull / open-drain.")
74+
self.int2 = self.Export(self.ic.int2, optional=True,
75+
doc="Programmable interrupt. This can be configured as push-pull / open-drain.")
76+
77+
self.qvar1 = self.Export(self.ic.qvar1, optional=True, doc="qvar input pin 1")
78+
self.qvar2 = self.Export(self.ic.qvar2, optional=True, doc="qvar input pin 2")
79+
80+
def contents(self):
81+
super().contents()
82+
self.vdd_cap = self.Block(DecouplingCapacitor(100 * nFarad(tol=0.2))).connected(self.gnd, self.ic.vdd)
83+
self.vddio_cap = self.Block(DecouplingCapacitor(100 * nFarad(tol=0.2))).connected(self.gnd, self.ic.vddio)

edg/parts/Microcontroller_Esp.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,25 @@ def __init__(self) -> None:
1919

2020

2121
class EspProgrammingAutoReset(BlockInterfaceMixin[EspProgrammingHeader]):
22-
"""Mixin for ESP programming header with auto-reset and auto-boot pins"""
23-
def __init__(self, *args, **kwargs) -> None:
22+
"""Mixin for ESP programming header with auto-reset and auto-boot pins.
23+
By default, these are required to be connected (since it doesn't make sense to instantiate
24+
this without connecting the additional pins to the micro), but can be disabled with parameters."""
25+
@init_in_parent
26+
def __init__(self, *args, require_auto_reset: BoolLike = True, **kwargs) -> None:
2427
super().__init__(*args, **kwargs)
2528

2629
self.en = self.Port(DigitalSource.empty(), optional=True) # effectively a reset pin
2730
self.boot = self.Port(DigitalSource.empty(), optional=True) # IO0 on ESP32, IO9 on ESP32C3
2831

32+
self.require_auto_reset = self.ArgParameter(require_auto_reset)
33+
34+
def contents(self) -> None:
35+
super().contents()
36+
self.require(self.require_auto_reset.implies(self.en.is_connected() & self.boot.is_connected()),
37+
"auto-reset programming header without auto-reset pins connected, "
38+
"either connect by setting programming='uart-auto' or 'uart-auto-button' on the microcontroller "
39+
"or set require_auto_reset=False to disable this check")
40+
2941

3042
class EspProgrammingPinHeader254(EspProgrammingHeader):
3143
"""Programming header for ESP series micros using 2.54mm headers, matching the pinning in the reference schematics."""

edg/parts/Microcontroller_Stm32l432.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ class Stm32l432k_Device(Stm32l432Base_Device):
210210
}
211211
PACKAGE = 'Package_DFN_QFN:QFN-32-1EP_5x5mm_P0.5mm_EP3.45x3.45mm'
212212
PART = 'STM32L432Kxxx'
213-
LCSC_PART = 'C94784' # KBU6 variant
213+
LCSC_PART = 'C1337280' # KCU6 variant, maximum memory variant
214214

215215

216216
@abstract_block

edg/parts/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@
116116
from .Neopixel import Neopixel, Ws2812b, Sk6812Mini_E, Sk6805_Ec15, Sk6812_Side_A, NeopixelArray, NeopixelArrayCircular
117117
from .Lcd_Qt096t_if09 import Qt096t_if09
118118
from .Lcd_Ch280qv10_Ct import Ch280qv10_Ct
119+
from .Lcd_Er_Tft1_28_3 import Er_Tft_128_3
119120
from .Oled_Er_Oled_091_3 import Er_Oled_091_3
120121
from .Oled_Er_Oled_096_1_1 import Er_Oled_096_1_1
121122
from .Oled_Er_Oled_096_1c import Er_Oled_096_1c
@@ -161,6 +162,7 @@
161162
from .StepperDriver_A4988 import A4988, PololuA4988
162163

163164
from .Imu_Lsm6ds3trc import Lsm6ds3trc
165+
from .Lsm6dsv16x import Lsm6dsv16x
164166
from .Mag_Qmc5883l import Qmc5883l
165167
from .EnvironmentalSensor_Sensirion import Shtc3
166168
from .EnvironmentalSensor_Bme680 import Bme680
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
(export (version D)
2+
(components
3+
(comp (ref "bat.cell[0]")
4+
(value "2460")
5+
(footprint "Battery:BatteryHolder_Keystone_2460_1xAA")
6+
(property (name "Sheetname") (value "bat"))
7+
(property (name "Sheetfile") (value "edg.parts.Batteries.AaBatteryStack"))
8+
(property (name "edg_path") (value "bat.cell[0]"))
9+
(property (name "edg_short_path") (value "bat.cell[0]"))
10+
(property (name "edg_refdes") (value "U1"))
11+
(property (name "edg_part") (value "2460 (Keystone)"))
12+
(sheetpath (names "/bat/") (tstamps "/025f0138/"))
13+
(tstamps "0ab40289"))
14+
(comp (ref "bat.cell[1]")
15+
(value "2460")
16+
(footprint "Battery:BatteryHolder_Keystone_2460_1xAA")
17+
(property (name "Sheetname") (value "bat"))
18+
(property (name "Sheetfile") (value "edg.parts.Batteries.AaBatteryStack"))
19+
(property (name "edg_path") (value "bat.cell[1]"))
20+
(property (name "edg_short_path") (value "bat.cell[1]"))
21+
(property (name "edg_refdes") (value "U2"))
22+
(property (name "edg_part") (value "2460 (Keystone)"))
23+
(sheetpath (names "/bat/") (tstamps "/025f0138/"))
24+
(tstamps "0ab6028a"))
25+
(comp (ref "bat.cell[2]")
26+
(value "2460")
27+
(footprint "Battery:BatteryHolder_Keystone_2460_1xAA")
28+
(property (name "Sheetname") (value "bat"))
29+
(property (name "Sheetfile") (value "edg.parts.Batteries.AaBatteryStack"))
30+
(property (name "edg_path") (value "bat.cell[2]"))
31+
(property (name "edg_short_path") (value "bat.cell[2]"))
32+
(property (name "edg_refdes") (value "U3"))
33+
(property (name "edg_part") (value "2460 (Keystone)"))
34+
(sheetpath (names "/bat/") (tstamps "/025f0138/"))
35+
(tstamps "0ab8028b"))
36+
(comp (ref "bat.cell[3]")
37+
(value "2460")
38+
(footprint "Battery:BatteryHolder_Keystone_2460_1xAA")
39+
(property (name "Sheetname") (value "bat"))
40+
(property (name "Sheetfile") (value "edg.parts.Batteries.AaBatteryStack"))
41+
(property (name "edg_path") (value "bat.cell[3]"))
42+
(property (name "edg_short_path") (value "bat.cell[3]"))
43+
(property (name "edg_refdes") (value "U4"))
44+
(property (name "edg_part") (value "2460 (Keystone)"))
45+
(sheetpath (names "/bat/") (tstamps "/025f0138/"))
46+
(tstamps "0aba028c"))
47+
(comp (ref "mcu")
48+
(value "XIAO RP2040")
49+
(footprint "Seeed Studio XIAO Series Library:XIAO-Generic-Hybrid-14P-2.54-21X17.8MM")
50+
(property (name "Sheetname") (value ""))
51+
(property (name "Sheetfile") (value ""))
52+
(property (name "edg_path") (value "mcu"))
53+
(property (name "edg_short_path") (value "mcu"))
54+
(property (name "edg_refdes") (value "U5"))
55+
(property (name "edg_part") (value "XIAO RP2040"))
56+
(sheetpath (names "/") (tstamps "/"))
57+
(tstamps "02850146"))
58+
(comp (ref "led.package")
59+
(value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")
60+
(footprint "LED_SMD:LED_0603_1608Metric")
61+
(property (name "Sheetname") (value "led"))
62+
(property (name "Sheetfile") (value "edg.abstract_parts.AbstractLed.IndicatorLed"))
63+
(property (name "edg_path") (value "led.package"))
64+
(property (name "edg_short_path") (value "led.package"))
65+
(property (name "edg_refdes") (value "D1"))
66+
(property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)"))
67+
(sheetpath (names "/led/") (tstamps "/02750136/"))
68+
(tstamps "0b4e02cd"))
69+
(comp (ref "led.res")
70+
(value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")
71+
(footprint "Resistor_SMD:R_0603_1608Metric")
72+
(property (name "Sheetname") (value "led"))
73+
(property (name "Sheetfile") (value "edg.abstract_parts.AbstractLed.IndicatorLed"))
74+
(property (name "edg_path") (value "led.res"))
75+
(property (name "edg_short_path") (value "led.res"))
76+
(property (name "edg_refdes") (value "R1"))
77+
(property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))"))
78+
(sheetpath (names "/led/") (tstamps "/02750136/"))
79+
(tstamps "0296014b")))
80+
(nets
81+
(net (code 1) (name "mcu.pwr_vin")
82+
(node (ref bat.cell[3]) (pin 1)))
83+
(net (code 2) (name "mcu.gnd")
84+
(node (ref mcu) (pin 13))
85+
(node (ref bat.cell[0]) (pin 2))
86+
(node (ref led.res) (pin 2)))
87+
(net (code 3) (name "led.signal")
88+
(node (ref mcu) (pin 7))
89+
(node (ref led.package) (pin 2)))
90+
(net (code 4) (name "bat.cell[0].pwr")
91+
(node (ref bat.cell[0]) (pin 1))
92+
(node (ref bat.cell[1]) (pin 2)))
93+
(net (code 5) (name "bat.cell[1].pwr")
94+
(node (ref bat.cell[1]) (pin 1))
95+
(node (ref bat.cell[2]) (pin 2)))
96+
(net (code 6) (name "bat.cell[2].pwr")
97+
(node (ref bat.cell[2]) (pin 1))
98+
(node (ref bat.cell[3]) (pin 2)))
99+
(net (code 7) (name "mcu.pwr_out")
100+
(node (ref mcu) (pin 12)))
101+
(net (code 8) (name "mcu.vusb_out")
102+
(node (ref mcu) (pin 14)))
103+
(net (code 9) (name "led.res.a")
104+
(node (ref led.res) (pin 1))
105+
(node (ref led.package) (pin 1))))
106+
)

0 commit comments

Comments
 (0)