From 416877f6c1a6d407a7445a5524e483d49d84ad8c Mon Sep 17 00:00:00 2001 From: Seth Fischer Date: Fri, 12 Jul 2024 21:19:20 +1200 Subject: [PATCH] chore: rpi hat electronic design --- docs/build-release.rst | 9 +- src/osr_elec/ato.yaml | 35 +++++ .../elec/src/lib/bourns/tvs-diodes.ato | 18 +++ .../elec/src/lib/can-controller-trx.ato | 78 +++++++++++ src/osr_elec/elec/src/lib/capacitors.ato | 9 ++ src/osr_elec/elec/src/lib/connectors.ato | 76 +++++++++++ src/osr_elec/elec/src/lib/fiducials.ato | 8 ++ src/osr_elec/elec/src/lib/headers.ato | 74 +++++++++++ src/osr_elec/elec/src/lib/interfaces.ato | 6 + src/osr_elec/elec/src/lib/leds.ato | 98 ++++++++++++++ .../elec/src/lib/maxlinear/SP3485.ato | 32 +++++ .../elec/src/lib/microchip/MCP2517FDT.ato | 57 +++++++++ .../elec/src/lib/microchip/MCP2562FD.ato | 37 ++++++ src/osr_elec/elec/src/lib/mosfets.ato | 51 ++++++++ src/osr_elec/elec/src/lib/nxp/SC16IS752.ato | 118 +++++++++++++++++ src/osr_elec/elec/src/lib/onsemi/eeproms.ato | 41 ++++++ src/osr_elec/elec/src/lib/oscillators.ato | 110 ++++++++++++++++ src/osr_elec/elec/src/lib/resistors.ato | 26 ++++ .../elec/src/lib/rpi-hat/id-eeprom.ato | 58 +++++++++ .../elec/src/lib/rpi-hat/ideal-diode.ato | 85 ++++++++++++ .../elec/src/lib/rpi-hat/mechanical.ato | 12 ++ .../src/lib/rpi-hat/robot-signal-light.ato | 44 +++++++ .../elec/src/lib/serial-transceivers.ato | 67 ++++++++++ .../elec/src/lib/spi-uart-converter.ato | 45 +++++++ src/osr_elec/elec/src/rpi-hat.ato | 121 +++++++++++++++++- 25 files changed, 1313 insertions(+), 2 deletions(-) create mode 100644 src/osr_elec/elec/src/lib/bourns/tvs-diodes.ato create mode 100644 src/osr_elec/elec/src/lib/can-controller-trx.ato create mode 100644 src/osr_elec/elec/src/lib/capacitors.ato create mode 100644 src/osr_elec/elec/src/lib/connectors.ato create mode 100644 src/osr_elec/elec/src/lib/fiducials.ato create mode 100644 src/osr_elec/elec/src/lib/headers.ato create mode 100644 src/osr_elec/elec/src/lib/interfaces.ato create mode 100644 src/osr_elec/elec/src/lib/leds.ato create mode 100644 src/osr_elec/elec/src/lib/maxlinear/SP3485.ato create mode 100644 src/osr_elec/elec/src/lib/microchip/MCP2517FDT.ato create mode 100644 src/osr_elec/elec/src/lib/microchip/MCP2562FD.ato create mode 100644 src/osr_elec/elec/src/lib/mosfets.ato create mode 100644 src/osr_elec/elec/src/lib/nxp/SC16IS752.ato create mode 100644 src/osr_elec/elec/src/lib/onsemi/eeproms.ato create mode 100644 src/osr_elec/elec/src/lib/oscillators.ato create mode 100644 src/osr_elec/elec/src/lib/resistors.ato create mode 100644 src/osr_elec/elec/src/lib/rpi-hat/id-eeprom.ato create mode 100644 src/osr_elec/elec/src/lib/rpi-hat/ideal-diode.ato create mode 100644 src/osr_elec/elec/src/lib/rpi-hat/mechanical.ato create mode 100644 src/osr_elec/elec/src/lib/rpi-hat/robot-signal-light.ato create mode 100644 src/osr_elec/elec/src/lib/serial-transceivers.ato create mode 100644 src/osr_elec/elec/src/lib/spi-uart-converter.ato diff --git a/docs/build-release.rst b/docs/build-release.rst index 2a2f468..393988e 100644 --- a/docs/build-release.rst +++ b/docs/build-release.rst @@ -37,6 +37,9 @@ Prerequisites * `Python`_ >=3.11, and python-venv. * `Poetry`_ for Python dependency management. * `Mayo 3D CAD viewer and converter`_ for exporting PNG images. +* `KiCad EDA`_ v8 (a dependency of `atopile`_) for building PCB manufacturing files. + - ``KICAD8_3D_MODEL_DIR`` should point to version 8.0.3 of `KiCad Packages3D`_. + - ``KICAD8_FOOTPRINT_DIR`` should point to version 8.0.3 of `KiCad Footprints`_. * Optional: - `ImageMagick`_ for manipulating images. - `exiftool`_ for manipulating EXIF headers. @@ -54,7 +57,7 @@ Install prerequisites sudo apt-get install git python3.11 python3.11-venv imagemagick optipng exiftool -Poetry, Mayo, and git-lfs should be installed according to their respective documentation, +Poetry, Mayo, git-lfs, and KiCad should be installed according to their respective documentation, and be available in your path. @@ -114,6 +117,10 @@ Run linters and tests: .. _`Git`: https://git-scm.com/ .. _`Poetry`: https://python-poetry.org/ .. _`Mayo 3D CAD viewer and converter`: https://github.com/fougue/mayo +.. _`KiCad EDA`: https://www.kicad.org/ +.. _`atopile`: https://atopile.io/ +.. _`KiCad Packages3D`: https://gitlab.com/kicad/libraries/kicad-packages3D +.. _`KiCad Footprints`: https://gitlab.com/kicad/libraries/kicad-footprints .. _`ImageMagick`: https://imagemagick.org/ .. _`exiftool`: https://exiftool.org/ .. _`git-lfs`: https://git-lfs.com/ diff --git a/src/osr_elec/ato.yaml b/src/osr_elec/ato.yaml index 136b9ee..0a9566c 100644 --- a/src/osr_elec/ato.yaml +++ b/src/osr_elec/ato.yaml @@ -2,3 +2,38 @@ ato-version: ^0.2.57 builds: rpi-hat: entry: elec/src/rpi-hat.ato:RpiHat +dependencies: + - name: generics + version_spec: '@4e056dec822566592798abb059fd7aad1f970885' + link_broken: false + path: .ato/modules/generics + + - name: rpi-header + version_spec: '@d41fc0044336bcf77a9387521e90547570c0bd52' + link_broken: false + path: .ato/modules/rpi-header + + - name: ams1117-33 + version_spec: '@29f49d7b6b6db24be0282f6c3524f49b71e71b48' + link_broken: false + path: .ato/modules/ams1117-33 + + - name: https://github.com/sethfischer/headers + version_spec: '@07544e27c71ef3d528268b7dc78d38ce871a4b64' + link_broken: false + path: .ato/modules/headers + + - name: https://github.com/sethfischer/ck-js-series + version_spec: '@7966abbac3d54090fe57a52b69af8855d0d54f31' + link_broken: false + path: .ato/modules/ck-js-series + + - name: https://github.com/sethfischer/koa-speer-rc-series + version_spec: '@3e76c2d7896923adff9df4924fa15924dd08a057' + link_broken: false + path: .ato/modules/koa-speer-rc-series + + - name: https://github.com/sethfischer/combo-power-connectors + version_spec: '@36ce69930fbd2186f9581fc63e33e4254fc89fd4' + link_broken: false + path: .ato/modules/combo-power-connectors diff --git a/src/osr_elec/elec/src/lib/bourns/tvs-diodes.ato b/src/osr_elec/elec/src/lib/bourns/tvs-diodes.ato new file mode 100644 index 0000000..f2f4694 --- /dev/null +++ b/src/osr_elec/elec/src/lib/bourns/tvs-diodes.ato @@ -0,0 +1,18 @@ +"""Bourns TVS diodes.""" + + +component Cdsot23Sm712: + """ + CDSOT23-SM712 - Surface Mount TVS Diode. + + # Reference + + * [CDSOT23-SM712 Surface Mount TVS Diode](https://www.bourns.com/pdfs/CDSOT23-SM712.pdf) + """ + footprint = "Package_TO_SOT_SMD:SOT-23-3" + lcsc_id = "C404012" + mpn = "C404012" # CDSOT23-SM712 + + signal p1 ~ pin 1 + signal p2 ~ pin 2 + signal common ~ pin 3 diff --git a/src/osr_elec/elec/src/lib/can-controller-trx.ato b/src/osr_elec/elec/src/lib/can-controller-trx.ato new file mode 100644 index 0000000..1a8d2f6 --- /dev/null +++ b/src/osr_elec/elec/src/lib/can-controller-trx.ato @@ -0,0 +1,78 @@ +"""CAN controller and transceiver.""" + +from "generics/interfaces.ato" import Power, SPI + +from "ck-js-series/smd.ato" import CkJs102011jcqn + +from "lib/capacitors.ato" import PowerDecouplingCap100nf +from "lib/connectors.ato" import JstGhHorizontalCan +from "lib/leds.ato" import LedIndicatorsCanTtl, LEDIndicatorUser +from "lib/microchip/MCP2517FDT.ato" import MCP2517FDT +from "lib/microchip/MCP2562FD.ato" import MCP2562FD +from "lib/oscillators.ato" import ABM8_20MHzOscillator +from "lib/resistors.ato" import Resistor1608 + + +module CanControllerTrx: + """CAN controller and transceiver.""" + # power + power = new Power + power.voltage = 3.1V to 3.3V + signal gnd ~ power.gnd + + spi = new SPI + + controller = new MCP2517FDT + controller.power ~ power + controller.spi ~ spi + + # controller power decoupling capacitor + controller_power_cap = new PowerDecouplingCap100nf + controller_power_cap.power ~ power + + # controller oscillator + oscillator = new ABM8_20MHzOscillator + oscillator.gnd ~ gnd + oscillator.xin.io ~ controller.xin + oscillator.xout.io ~ controller.xout + + # user LED on controller GPIO 0 + user_led_indicator = new LEDIndicatorUser + user_led_indicator.v_in = power.voltage + user_led_indicator.input ~ controller.gpio0.io + user_led_indicator.gnd ~ gnd + + # transceiver + transceiver = new MCP2562FD + transceiver.power ~ power + controller.can_ttl ~ transceiver.can_ttl + + # indicator LEDs + can_leds = new LedIndicatorsCanTtl + can_leds.voltage = power.voltage + can_leds.power ~ power + can_leds.can_ttl ~ controller.can_ttl + + # transceiver power decoupling capacitor + transceiver_power_cap = new PowerDecouplingCap100nf + transceiver_power_cap.power ~ power + + # CAN termination switch + switch = new CkJs102011jcqn + switch.common ~ transceiver.can.CANH + + # CAN termination resistor + termination_resistor = new Resistor1608 + termination_resistor.value = 120 ohm +/- 5% + termination_resistor.p1 ~ switch.p1 + termination_resistor.p2 ~ transceiver.can.CANL + + # CAN in connector + can_in = new JstGhHorizontalCan + can_in.can ~ transceiver.can + can_in.power ~ power + + # CAN out connector + can_out = new JstGhHorizontalCan + can_out.can ~ transceiver.can + can_out.power ~ power diff --git a/src/osr_elec/elec/src/lib/capacitors.ato b/src/osr_elec/elec/src/lib/capacitors.ato new file mode 100644 index 0000000..673e92c --- /dev/null +++ b/src/osr_elec/elec/src/lib/capacitors.ato @@ -0,0 +1,9 @@ +"""Capacitors.""" + +from "generics/capacitors.ato" import Capacitor + + +component PowerDecouplingCap100nf from Capacitor: + """100nF power decoupling capacitor.""" + value = 100nF +/- 20% + package = "0603" # equivalent to 1608 diff --git a/src/osr_elec/elec/src/lib/connectors.ato b/src/osr_elec/elec/src/lib/connectors.ato new file mode 100644 index 0000000..099687d --- /dev/null +++ b/src/osr_elec/elec/src/lib/connectors.ato @@ -0,0 +1,76 @@ +"""Connectors.""" + +from "generics/interfaces.ato" import CAN, Power + +from "lib/interfaces.ato" import RS485 + + +component _Connector: + """Connector base.""" + designator_prefix = "J" + + +component JstB2bPhKS from _Connector: + """ + JST B2B-PH-K-S top entry 2-pin PH header. + + 2.0 mm pitch disconnectable crimp style connector. + + # Reference + + * [PH connectors](https://www.jst.com/wp-content/uploads/2021/09/ePH.pdf) + """ + footprint = "Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical" + lcsc_id = "C5251182" + mpn = "C5251182" # B2B-PH-K-S + + signal p1 ~ pin 1 + signal p2 ~ pin 2 + + +component PhoenixPt1x3P3mm5Horizontal from _Connector: + """Phoenix Contact terminal block 3-way side entry 3.5mm PCB + + Phoenix Contact PT 1,5 Series 3.5mm 3-way terminal block. + """ + footprint = "TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-3-3.5-H_1x03_P3.50mm_Horizontal" + lcsc_id = "" + mpn = "" # 1984620 + + signal p1 ~ pin 1 + signal p2 ~ pin 2 + signal p3 ~ pin 3 + + +component JstGhHorizontalCan from _Connector: + """ + UAVCAN/CAN Micro connector. + + JST GH connector Header Surface Mount, Right Angle 4 position 1.25mm. + + # Reference + + * [GH connectors](https://www.jst-mfg.com/product/pdf/eng/eGH.pdf) + """ + footprint = "Connector_JST:JST_GH_SM04B-GHS-TB_1x04-1MP_P1.25mm_Horizontal" + lcsc_id = "C189895" + mpn = "C189895" # SM04B-GHS-TB(LF)(SN) + + can = new CAN + power = new Power + signal gnd ~ power.gnd + + power.vcc ~ pin 1 + can.CANH ~ pin 2 + can.CANL ~ pin 3 + gnd ~ pin 4 + gnd ~ pin MP + + +component Rs485Connector from PhoenixPt1x3P3mm5Horizontal: + """RS-485 board to wire connector.""" + signal gnd ~ pin 3 + + rs485 = new RS485 + rs485.a ~ pin 1 + rs485.b ~ pin 2 diff --git a/src/osr_elec/elec/src/lib/fiducials.ato b/src/osr_elec/elec/src/lib/fiducials.ato new file mode 100644 index 0000000..ada9658 --- /dev/null +++ b/src/osr_elec/elec/src/lib/fiducials.ato @@ -0,0 +1,8 @@ +"""Fiducial markers.""" + + +component Fiducial0mm75Mask1mm5: + """Circular Fiducial, 0.75mm bare copper, 1.5mm solder mask opening (Level B).""" + designator_prefix = "FD" + footprint = "Fiducial:Fiducial_0.75mm_Mask1.5mm" + exclude_from_bom = True diff --git a/src/osr_elec/elec/src/lib/headers.ato b/src/osr_elec/elec/src/lib/headers.ato new file mode 100644 index 0000000..f046d43 --- /dev/null +++ b/src/osr_elec/elec/src/lib/headers.ato @@ -0,0 +1,74 @@ +"""Headers.""" + +from "generics/interfaces.ato" import GPIO, I2C, Power, UART + + +component _Header: + """Header base.""" + designator_prefix = "J" + + +component PinHeader1x02P2mm54Vertical from _Header: + """1x2 2.5mm pitch vertical pin header.""" + footprint="Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" + lcsc_id = "C5360898" + mpn = "C5360898" # PZ2.54-1*2 + + signal p1 ~ pin 1 + signal p2 ~ pin 2 + + +component PinHeader1x03P2mm54Vertical from _Header: + """1x3 2.5mm pitch vertical pin header.""" + footprint="Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical" + lcsc_id = "C2894926" + mpn = "C2894926" # PZ254-1-03-Z-8.5 + + signal p1 ~ pin 1 + signal p2 ~ pin 2 + signal p3 ~ pin 3 + + +component PinHeader1x05P2mm54Vertical from _Header: + """1x5 2.5mm pitch vertical pin header.""" + footprint="Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical" + lcsc_id = "C3328227" + mpn = "C3328227" # M20-9990546 + + signal p1 ~ pin 1 + signal p2 ~ pin 2 + signal p3 ~ pin 3 + signal p4 ~ pin 4 + signal p5 ~ pin 5 + + + +component PinHeaderUartTHT from PinHeader1x03P2mm54Vertical: + """UART pin header.""" + uart = new UART + + uart.gnd ~ pin 1 + uart.tx ~ pin 2 + uart.rx ~ pin 3 + + +component PinHeaderI2cTHT from PinHeader1x05P2mm54Vertical: + """I2C pin header. + + Follows Pimoroni Breakout Garden specification. + """ + i2c = new I2C + power = new Power + int = new GPIO + + signal gnd ~ pin 1 + + int.io ~ pin 2 + int.gnd ~ gnd + + power.vcc ~ pin 5 + power.gnd ~ gnd + + i2c.sda ~ pin 4 + i2c.scl ~ pin 3 + i2c.gnd ~ gnd diff --git a/src/osr_elec/elec/src/lib/interfaces.ato b/src/osr_elec/elec/src/lib/interfaces.ato new file mode 100644 index 0000000..ea225b8 --- /dev/null +++ b/src/osr_elec/elec/src/lib/interfaces.ato @@ -0,0 +1,6 @@ +"""Interfaces.""" + + +interface RS485: + signal a + signal b diff --git a/src/osr_elec/elec/src/lib/leds.ato b/src/osr_elec/elec/src/lib/leds.ato new file mode 100644 index 0000000..e430df5 --- /dev/null +++ b/src/osr_elec/elec/src/lib/leds.ato @@ -0,0 +1,98 @@ +"""LEDs.""" + +from "generics/interfaces.ato" import CAN_TTL, Power, UART +from "generics/leds.ato" import LED, LEDIndicator, LEDIndicatorBlue, LEDIndicatorGreen, LEDIndicatorRed + + +component SML_D12D1WT86 from LED: + """ + Amber LED. + + # Reference + + * [Rohm SML-D12x1W series LEDs](https://datasheet.octopart.com/SML-D12U1WT86-Rohm-datasheet-62059860.pdf) + * [SML-D12D1WT86](https://fscdn.rohm.com/en/products/databook/datasheet/opto/led/chip_mono/sml-d12d1wt86-e.pdf) + """ + designator_prefix = "D" + footprint = "LED_SMD:LED_0603_1608Metric" + lcsc_id = "C2690338" + mpn = "C2690338" # SML-D12D1WT86 + + v_f = 2.2V + i_max = 20mA + + signal anode ~ pin 2 + signal cathode ~ pin 1 + + +module LEDIndicatorAmber from LEDIndicator: + """Amber LED indicator.""" + led -> SML_D12D1WT86 + resistor.package = "0603" + + +module LEDIndicatorPowerRail from LEDIndicatorGreen: + """Power rail LED indicator.""" + current = 1mA to 5mA + led.designator_prefix = "D" + led.footprint = "LED_SMD:LED_0603_1608Metric" + resistor.package = "0603" + + +module LEDIndicatorUser from LEDIndicatorBlue: + """User LED indicator.""" + current = 1mA to 5mA + led.designator_prefix = "D" + led.footprint = "LED_SMD:LED_0603_1608Metric" + resistor.package = "0603" + + +module LEDIndicatorRx from LEDIndicatorGreen: + """Receive LED indicator.""" + current = 1mA to 4mA + led.designator_prefix = "D" + led.footprint = "LED_SMD:LED_0603_1608Metric" + resistor.package = "0603" + + +module LEDIndicatorTx from LEDIndicatorRed: + """Transmit LED indicator.""" + current = 1mA to 4mA + led.designator_prefix = "D" + led.footprint = "LED_SMD:LED_0603_1608Metric" + resistor.package = "0603" + + +module LedIndicatorsUart: + """UART LED indicators.""" + voltage: voltage + + uart = new UART + + led_tx = new LEDIndicatorTx + led_tx.v_in = voltage + led_tx.input ~ uart.tx + led_tx.gnd ~ uart.gnd + + led_rx = new LEDIndicatorRx + led_rx.v_in = voltage + led_rx.input ~ uart.rx + led_rx.gnd ~ uart.gnd + + +module LedIndicatorsCanTtl: + """CAN TTL LED indicators.""" + voltage: voltage + + can_ttl = new CAN_TTL + power = new Power + + led_tx = new LEDIndicatorTx + led_tx.v_in = voltage + led_tx.input ~ power.vcc + led_tx.gnd ~ can_ttl.rx + + led_rx = new LEDIndicatorRx + led_rx.v_in = voltage + led_rx.input ~ power.vcc + led_rx.gnd ~ can_ttl.tx diff --git a/src/osr_elec/elec/src/lib/maxlinear/SP3485.ato b/src/osr_elec/elec/src/lib/maxlinear/SP3485.ato new file mode 100644 index 0000000..6941798 --- /dev/null +++ b/src/osr_elec/elec/src/lib/maxlinear/SP3485.ato @@ -0,0 +1,32 @@ +"""MaxLinear RS-485 Transceiver.""" + +from "generics/interfaces.ato" import Power + + +component Sp3485: + """ + SP3485 RS-485 Transceiver. + + 3.3V Low Power Half-Duplex RS-485 Transceivers with 10 Mbit/s Data Rate. + + # Reference + + * [SP3485 datasheet](https://maxlinear-assets.azureedge.net/web/documents/sp3485.pdf) + * [SP3485 product information](https://www.maxlinear.com/product/interface/serial-transceivers/rs485-422/sp3485) + """ + footprint = "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + lcsc_id = "C916153" + mpn = "C916153" # SP3485CN-L + + # power + power = new Power + signal gnd ~ power.gnd + power.vcc ~ pin 8 # Vcc + gnd ~ pin 5 # GND + + signal ro ~ pin 1 # RO; receiver output + signal re ~ pin 2 # RE (active LOW); receiver output enable + signal de ~ pin 3 # DE (active HIGH); driver output enable + signal di ~ pin 4 # DI; driver input + signal a ~ pin 6 # A; non-inverting driver output / receiver input + signal b ~ pin 7 # B: inverting driver output / receiver input diff --git a/src/osr_elec/elec/src/lib/microchip/MCP2517FDT.ato b/src/osr_elec/elec/src/lib/microchip/MCP2517FDT.ato new file mode 100644 index 0000000..79522c0 --- /dev/null +++ b/src/osr_elec/elec/src/lib/microchip/MCP2517FDT.ato @@ -0,0 +1,57 @@ +"""MCP2517FD CAN Controller.""" + +from "generics/interfaces.ato" import CAN_TTL, GPIO, Power, SPI + + +component MCP2517FDT: + """ + MCP2517FD CAN Controller. + + External CAN FD Controller with SPI Interface. + + # Reference + + * [MCP2517FD](https://www.microchip.com/en-us/product/mcp2517fd) + * [MCP2517FD External CAN FD Controller with SPI Interface](https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/MCP2517FD-External-CAN-FD-Controller-with-SPI-Interface-20005688B.pdf) + """ + footprint = "Package_SO:SOIC-14_3.9x8.7mm_P1.27mm" + lcsc_id = "C512185" + mpn = "C512185" # MCP2517FD + + # power + power = new Power + signal gnd ~ power.gnd + gnd ~ pin 7 # VSS + power.vcc ~ pin 14 # VDD + + # CAN TTL + can_ttl = new CAN_TTL + can_ttl.tx ~ pin 1 + can_ttl.rx ~ pin 2 + + # SPI + spi = new SPI + spi.mosi ~ pin 11 # SDI + spi.miso ~ pin 12 # SDO + spi.sck ~ pin 10 # SCK + spi.cs ~ pin 13 # nCS + spi.gnd ~ gnd + + # GPIO0 + gpio0 = new GPIO + gpio0.io ~ pin 9 + gpio0.gnd ~ gnd + + # GPIO1 + gpio1 = new GPIO + gpio1.io ~ pin 8 + gpio1.gnd ~ gnd + + signal clk0 ~ pin 3 + signal sof ~ pin 3 + signal int ~ pin 4 + signal xout ~ pin 5 # osc2; external oscillator output + signal xin ~ pin 6 # osc1; external oscillator input + signal int1 ~ pin 8 + signal int0 ~ pin 9 + signal xstby ~ pin 9 diff --git a/src/osr_elec/elec/src/lib/microchip/MCP2562FD.ato b/src/osr_elec/elec/src/lib/microchip/MCP2562FD.ato new file mode 100644 index 0000000..7bf1c36 --- /dev/null +++ b/src/osr_elec/elec/src/lib/microchip/MCP2562FD.ato @@ -0,0 +1,37 @@ +"""MCP2562FD CAN Transceiver.""" + +from "generics/interfaces.ato" import CAN, CAN_TTL, Power + + +component MCP2562FD: + """ + MCP2562FD CAN Transceiver. + + High-Speed CAN Flexible Data Rate Transceiver. + + # Reference + + * [MCP2561/2FD High-Speed CAN Flexible Data Rate Transceiver](https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/20005284A.pdf) + """ + footprint = "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + lcsc_id = "C124016" + mpn = "C124016" # MCP2562FD + + # power + power = new Power + signal gnd ~ power.gnd + gnd ~ pin 2 # VSS + power.vcc ~ pin 3 # VDD + + # CAN TTL interface + can_ttl = new CAN_TTL + can_ttl.tx ~ pin 1 + can_ttl.rx ~ pin 4 + + # CAN interface + can = new CAN + can.CANH ~ pin 7 + can.CANL ~ pin 6 + + signal vio ~ pin 5 + signal stby ~ pin 8 diff --git a/src/osr_elec/elec/src/lib/mosfets.ato b/src/osr_elec/elec/src/lib/mosfets.ato new file mode 100644 index 0000000..c0090a9 --- /dev/null +++ b/src/osr_elec/elec/src/lib/mosfets.ato @@ -0,0 +1,51 @@ +"""MOSFETs.""" + +from "generics/interfaces.ato" import Load, Pair, Power +from "generics/mosfets.ato" import NFET +from "generics/resistors.ato" import Resistor + + +component NFET_2N7002 from NFET: + """ + NFET 2N7002 60V 115mA. + + N-Channel Enhancement Mode Field Effect Transistor. + + # Reference + + * [Onsemi 2N7002T](https://www.onsemi.com/download/data-sheet/pdf/2n7002t-d.pdf) + """ + footprint = "Package_TO_SOT_SMD:SOT-23-3" + lcsc_id = "C8545" + mpn = "C8545" # 2N7002 + + signal drain ~ pin 3 + signal gate ~ pin 1 + signal source ~ pin 2 + + +module LowSideSwitch: + """Low side switch.""" + fet = new Mosfet_nchannel + gate_resistor = new Resistor + pulldown_resistor = new Resistor + + power = new Power + load = new Load + input = new Pair + + input.io ~ gate_resistor.p1 + gate_resistor.p2 ~ fet.gate + input.gnd ~ power.gnd + pulldown_resistor.p1 ~ fet.gate + pulldown_resistor.p2 ~ power.gnd + + power.vcc ~ load.p + load.n ~ fet.drain + + fet.source ~ power.gnd + + +module LowSideSwitch60V115mA from LowSideSwitch: + """Low side switch 60V 115mA.""" + fet -> NFET_2N7002 diff --git a/src/osr_elec/elec/src/lib/nxp/SC16IS752.ato b/src/osr_elec/elec/src/lib/nxp/SC16IS752.ato new file mode 100644 index 0000000..c2dd9ea --- /dev/null +++ b/src/osr_elec/elec/src/lib/nxp/SC16IS752.ato @@ -0,0 +1,118 @@ +"""NXP SPI to UART protocol converters.""" + +from "generics/interfaces.ato" import GPIO, I2C, Power, SPI, UART + + +component SC16IS752: + """ + SC16IS752 Dual UART. + + Dual UART with I2C-bus/SPI interface, 64 bytes of transmit and receive + FIFOs, IrDA SIR built-in support. + + # Reference + + * [SC16IS752/SC16IS762 product information](https://www.nxp.com/products/analog-and-mixed-signal/bridges/dual-uart-with-ic-bus-spi-interface-64-bs-of-transmit-and-receive-fifos-irda-sir-built-in-support:SC16IS752_SC16IS762) + * [NXP low-power bridges brochure](https://www.nxp.com/docs/en/brochure/75015676.pdf) + * [SC16IS752/SC16IS762 datasheet](https://www.nxp.com/docs/en/data-sheet/SC16IS752_SC16IS762.pdf) + """ + footprint = "Package_SO:TSSOP-28_4.4x9.7mm_P0.65mm" + lcsc_id = "C57156" + mpn = "C57156" # SC16IS752 + + # power + power = new Power + signal gnd ~ power.gnd + + gnd ~ pin 22 # VSS + power.vcc ~ pin 8 # VDD + + # SPI + spi = new SPI + spi.mosi ~ pin 11 # SI/A1; SPI data input pin + spi.miso ~ pin 12 # SO; SPI data output pin + spi.sck ~ pin 13 # SCL/SCLK; SPI input clock. + spi.cs ~ pin 10 # CS/A0; SPI chip select + spi.gnd ~ gnd + + # I2C + i2c = new I2C + signal sda ~ pin 14 + signal scl ~ pin 13 + signal gnd ~ gnd + signal a0 ~ pin 10 # A0; I2C-bus device address select + signal a1 ~ pin 11 # A1; I2C-bus device address select + + # UART A + uart_a = new UART + uart_a.tx ~ pin 3 + uart_a.rx ~ pin 4 + uart_a.gnd ~ gnd + signal cts_a ~ pin 2 # CTS (active LOW); UART clear to send + + # UART B + uart_b = new UART + uart_b.tx ~ pin 23 + uart_b.rx ~ pin 24 + uart_b.gnd ~ gnd + signal cts_b ~ pin 16 # CTS (active LOW); UART clear to send + + # modem A + signal dsr_a ~ pin 25 + signal dtr_a ~ pin 26 + signal cd_a ~ pin 27 + signal ri_a ~ pin 28 + signal rts_a ~ pin 1 # RTS (active LOW); UART request to send + + # modem B + signal dsr_b ~ pin 18 + signal dtr_b ~ pin 19 + signal cd_b ~ pin 20 + signal ri_b ~ pin 21 + signal rts_b ~ pin 17 # RTS (active LOW); UART request to send + + signal reset ~ pin 5 # RESET (active LOW); device hardware reset + signal xin ~ pin 6 # XTAL1; crystal input + signal xout ~ pin 7 # XTAL2; crystal output + signal interface_select ~ pin 9 # I2C/SPI (SPI LOW); I2C-bus or SPI interface select + signal irq ~ pin 15 + + # GPIO0 + gpio0 = new GPIO + gpio0.io ~ pin 18 + gpio0.gnd ~ gnd + + # GPIO1 + gpio1 = new GPIO + gpio1.io ~ pin 19 + gpio1.gnd ~ gnd + + # GPIO2 + gpio2 = new GPIO + gpio2.io ~ pin 20 + gpio2.gnd ~ gnd + + # GPIO3 + gpio3 = new GPIO + gpio3.io ~ pin 21 + gpio3.gnd ~ gnd + + # GPIO4 + gpio4 = new GPIO + gpio4.io ~ pin 25 + gpio4.gnd ~ gnd + + # GPIO5 + gpio5 = new GPIO + gpio5.io ~ pin 26 + gpio5.gnd ~ gnd + + # GPIO6 + gpio6 = new GPIO + gpio6.io ~ pin 27 + gpio6.gnd ~ gnd + + # GPIO7 + gpio7 = new GPIO + gpio7.io ~ pin 28 + gpio7.gnd ~ gnd diff --git a/src/osr_elec/elec/src/lib/onsemi/eeproms.ato b/src/osr_elec/elec/src/lib/onsemi/eeproms.ato new file mode 100644 index 0000000..df43579 --- /dev/null +++ b/src/osr_elec/elec/src/lib/onsemi/eeproms.ato @@ -0,0 +1,41 @@ +"""EEPROMs.""" + +from "generics/interfaces.ato" import I2C, Power + + +component CAT24C32WI_GT3: + """ + CAT24C32WI-GT3 EEPROM. + + CAT24C32 EEPROM Serial 32-Kb I2C. + + # Reference + + * [CAT24C32 EEPROM Serial 32-Kb I2C datasheet](https://www.onsemi.com/pdf/datasheet/cat24c32-d.pdf) + """ + footprint = "Package_SO:SOIC-8_3.9x4.9mm_P1.27mm" + lcsc_id = "C81193" + mpn = "C81193" # CAT24C32WI-GT3 + + # power + power = new Power + signal gnd ~ power.gnd + gnd ~ pin 4 + power.vcc ~ pin 8 + + # I2C + i2c = new I2C + signal i2c_sda ~ pin 5 + signal i2c_scl ~ pin 6 + i2c.sda ~ i2c_sda + i2c.scl ~ i2c_scl + i2c.gnd ~ gnd + + signal a0 ~ pin 1 + signal a1 ~ pin 2 + signal a2 ~ pin 3 + signal vss ~ pin 4 + signal sda ~ pin 5 + signal scl ~ pin 6 + signal wp ~ pin 7 + signal vcc ~ pin 8 diff --git a/src/osr_elec/elec/src/lib/oscillators.ato b/src/osr_elec/elec/src/lib/oscillators.ato new file mode 100644 index 0000000..40638d5 --- /dev/null +++ b/src/osr_elec/elec/src/lib/oscillators.ato @@ -0,0 +1,110 @@ +"""Oscillators.""" + +from "generics/capacitors.ato" import Capacitor +from "generics/oscillators.ato" import Oscillator + + +component _ABM8_20MHz: + """ + Crystal ABM8 20MHz 12pF. + + Crystal ABM8 20MHz 12pF -40°C~85°C ±10ppm ±20ppm. + + Manufacturer + : Abracon LLC + + # Reference + + * [ABM8 Ceramic SMD Crystal](https://abracon.com/Resonators/abm8.pdf) + """ + designator_prefix = "X" + footprint = "Crystal:Crystal_SMD_Abracon_ABM8G-4Pin_3.2x2.5mm" + lcsc_id = "C6491131" + mpn = "C6491131" # ABM8-20.000MHZ-12-D1X-T + + signal xin ~ pin 1 + signal xout ~ pin 3 + signal gnd ~ pin 4 + gnd ~ pin 2 + + +component _ABM8_20MHzLoadCap from Capacitor: + """ + Load capacitor for ABM8-20.000MHZ-12 crystal. + + C = 2 * (CL - Cstray) + where: + CL = 12pF + Cstray = 3pF + """ + # TODO begin work-around: manually select 0603 package + # TODO https://github.com/atopile/atopile/pull/391 + footprint = "C0603" + lcsc_id = "C6719420" + mpn = "C6719420" # 0603RF220J500NT + # TODO end work-around + + package = "0603" # equivalent to 1608 + c_load = 12pF +/- 20% + c_stray = 3pF + value = 2 * (c_load - c_stray) + + +module ABM8_20MHzOscillator from Oscillator: + """40MHz oscillator.""" + crystal -> _ABM8_20MHz + load_cap_1 -> _ABM8_20MHzLoadCap + load_cap_2 -> _ABM8_20MHzLoadCap + + +component ABM8_14MHz7456: + """ + Crystal ABM8 14.7456MHz 12pF. + + Crystal ABM8 14.7456MHz 12pF -40°C~85°C ±10ppm ±20ppm. + + Manufacturer + : Abracon LLC + + # Resources + + * [ABM8 Ceramic SMD Crystal](https://abracon.com/Resonators/abm8.pdf) + """ + designator_prefix = "X" + footprint = "Crystal:Crystal_SMD_Abracon_ABM8G-4Pin_3.2x2.5mm" + lcsc_id = "C7065054" + mpn = "C7065054" # ABM8-14.7456MHZ-12-D1X-T + + signal xin ~ pin 1 + signal xout ~ pin 3 + signal gnd ~ pin 4 + gnd ~ pin 2 + + +component _ABM8_14MHz7456LoadCap from Capacitor: + """ + Load capacitor for ABM8-14.7456MHZ-12 crystal. + + C = 2 * (CL - Cstray) + where: + CL = 12pF + Cstray = 3pF + """ + # TODO begin work-around: manually select 0603 package + # TODO https://github.com/atopile/atopile/pull/391 + footprint = "C0603" + lcsc_id = "C6719420" + mpn = "C6719420" # 0603RF220J500NT + # TODO end work-around + + package = "0603" # equivalent to 1608 + c_load = 12pF +/- 20% + c_stray = 3pF + value = 2 * (c_load - c_stray) + + +module ABM8_14MHz7456Oscillator from Oscillator: + """Oscillator for SC16IS750 UART.""" + crystal -> ABM8_14MHz7456 + load_cap_1 -> _ABM8_14MHz7456LoadCap + load_cap_2 -> _ABM8_14MHz7456LoadCap diff --git a/src/osr_elec/elec/src/lib/resistors.ato b/src/osr_elec/elec/src/lib/resistors.ato new file mode 100644 index 0000000..be7fab4 --- /dev/null +++ b/src/osr_elec/elec/src/lib/resistors.ato @@ -0,0 +1,26 @@ +"""Resistors.""" + +from "generics/resistors.ato" import Resistor + +from "lib/interfaces.ato" import RS485 + + +component Resistor1608 from Resistor: + """Resistor 1608 metric package.""" + package = "0603" # equivalent to 1608 + + +module Rs485SeriesResistors: + """RS-485 series resistors.""" + rs415_in = new RS485 + rs415_out = new RS485 + + r_a = new Resistor1608 + r_a.value = 10ohm +/- 5% + rs415_in.a ~ r_a.p1 + rs415_out.a ~ r_a.p2 + + r_b = new Resistor1608 + r_b.value = 10ohm +/- 5% + rs415_in.b ~ r_b.p1 + rs415_out.b ~ r_b.p2 diff --git a/src/osr_elec/elec/src/lib/rpi-hat/id-eeprom.ato b/src/osr_elec/elec/src/lib/rpi-hat/id-eeprom.ato new file mode 100644 index 0000000..043ad2a --- /dev/null +++ b/src/osr_elec/elec/src/lib/rpi-hat/id-eeprom.ato @@ -0,0 +1,58 @@ +"""Raspberry Pi HAT EEPROM.""" + +from "generics/interfaces.ato" import I2C, Power +from "generics/resistors.ato" import I2CPullup + +from "lib/capacitors.ato" import PowerDecouplingCap100nf +from "lib/headers.ato" import PinHeader1x02P2mm54Vertical +from "lib/onsemi/eeproms.ato" import CAT24C32WI_GT3 +from "lib/resistors.ato" import Resistor1608 + + +module RpiHatIdEeprom: + """ + Raspberry Pi HAT EEPROM + + # Reference + + * [Raspberry Pi HAT+ Specification](https://datasheets.raspberrypi.com/hat/hat-plus-specification.pdf) + * [Raspberry Pi HAT EEPROM circuit diagram](https://github.com/raspberrypi/hats/blob/5f2058bf8eebf43dd19d7218f1e38d14a9835231/eeprom-circuit.png) + """ + # power + power_3v3 = new Power + signal gnd ~ power_3v3.gnd + + # EEPROM I2C + i2c = new I2C + + # write protect pull-up resistor + wp_pullup = new Resistor1608 + wp_pullup.value = 1kohm +/- 5% + + # write enable header (fit jumper to enable write) + we_header = new PinHeader1x02P2mm54Vertical + we_header.p1 ~ gnd + we_header.p2 ~ wp_pullup.p1 + + # EEPROM + eeprom = new CAT24C32WI_GT3 + eeprom.power ~ power_3v3 + eeprom.wp ~ wp_pullup.p2 + eeprom.i2c ~ i2c + # EEPROM at address 0x50 (A0-A2 tied to ground) + eeprom.a0 ~ gnd + eeprom.a1 ~ gnd + eeprom.a2 ~ gnd + + # power decoupling capacitor + power_cap = new PowerDecouplingCap100nf + power_cap.power ~ power_3v3 + + # I2C pull-up resistors + i2c_pullup = new I2CPullup + i2c_pullup.r_scl.value = 3.9kohm +/- 20% + i2c_pullup.r_scl.package = "0603" + i2c_pullup.r_sda.value = 3.9kohm +/- 20% + i2c_pullup.r_sda.package = "0603" + i2c_pullup.power ~ power_3v3 + i2c_pullup.i2c ~ i2c diff --git a/src/osr_elec/elec/src/lib/rpi-hat/ideal-diode.ato b/src/osr_elec/elec/src/lib/rpi-hat/ideal-diode.ato new file mode 100644 index 0000000..4dd7965 --- /dev/null +++ b/src/osr_elec/elec/src/lib/rpi-hat/ideal-diode.ato @@ -0,0 +1,85 @@ +"""Ideal diode.""" + +from "generics/interfaces.ato" import Power +from "generics/mosfets.ato" import PFET + +from "lib/resistors.ato" import Resistor1608 + + +component Dmmt5401PnpMatchedPair: + """ + DMMT5401 PNP Matched Pair. + + # Reference + + * [Diodes Incorporated DMMT5401](https://www.diodes.com/assets/Datasheets/DMMT5401.pdf) + """ + designator_prefix = "U" + footprint = "Package_TO_SOT_SMD:SOT-23-6" + lcsc_id = "C154733" + mpn = "C154733" # DMMT5401 + + signal q1_base ~ pin 2 + signal q1_collector ~ pin 1 + signal q1_emitter ~ pin 6 + signal q2_base ~ pin 3 + signal q2_collector ~ pin 4 + signal q2_emitter ~ pin 5 + + +component Dmg2305uxPfet from PFET: + """ + DMG2305UX P-channel Enhancement Mode MOSFET. + + # Reference + + * [Diodes Incorporated DMG2305UX](https://www.diodes.com/assets/Datasheets/DMG2305UX.pdf) + """ + footprint = "Package_TO_SOT_SMD:SOT-23-3" + lcsc_id = "C150470" + mpn = "C150470" # DMG2305UX + + signal gate ~ pin 1 + signal drain ~ pin 3 + signal source ~ pin 2 + + +module IdealDiode: + """ + Ideal Diode. + + Ideal (or zero voltage) diode. + + # Reference + + * [ZVD circuit - raspberrypi/hats](https://github.com/raspberrypi/hats/blob/348dbf88d870bf50d6b4f23dbe2b64d60363f23c/zvd-circuit.png) + """ + input = new Power + load = new Power + + signal gnd ~ input.gnd + gnd ~ load.gnd + + pnp_pair = new Dmmt5401PnpMatchedPair + fet = new Dmg2305uxPfet + + r_input = new Resistor1608 + r_input.value = 10kohm +/- 5% + r_input.p2 ~ gnd + + r_load = new Resistor1608 + r_load.value = 47kohm +/- 5% + r_load.p2 ~ gnd + + input.vcc ~ fet.drain + input.vcc ~ pnp_pair.q1_emitter + + load.vcc ~ fet.source + load.vcc ~ pnp_pair.q2_emitter + + fet.gate ~ pnp_pair.q2_collector + fet.gate ~ r_load.p1 + + pnp_pair.q1_collector ~ pnp_pair.q1_base + pnp_pair.q1_collector ~ pnp_pair.q2_base + pnp_pair.q1_collector ~ r_input.p1 diff --git a/src/osr_elec/elec/src/lib/rpi-hat/mechanical.ato b/src/osr_elec/elec/src/lib/rpi-hat/mechanical.ato new file mode 100644 index 0000000..387638e --- /dev/null +++ b/src/osr_elec/elec/src/lib/rpi-hat/mechanical.ato @@ -0,0 +1,12 @@ +"""Raspberry Pi HAT mechanical features.""" + +from "lib/fiducials.ato" import Fiducial0mm75Mask1mm5 + + +module RpiHatMechanical: + """Raspberry Pi HAT mechanical features.""" + # fiducial markers + fd1 = new Fiducial0mm75Mask1mm5 + fd2 = new Fiducial0mm75Mask1mm5 + fd3 = new Fiducial0mm75Mask1mm5 + fd4 = new Fiducial0mm75Mask1mm5 diff --git a/src/osr_elec/elec/src/lib/rpi-hat/robot-signal-light.ato b/src/osr_elec/elec/src/lib/rpi-hat/robot-signal-light.ato new file mode 100644 index 0000000..1bb1266 --- /dev/null +++ b/src/osr_elec/elec/src/lib/rpi-hat/robot-signal-light.ato @@ -0,0 +1,44 @@ +"""Robot signal light.""" + +from "generics/interfaces.ato" import Pair, Power + +from "lib/connectors.ato" import JstB2bPhKS +from "lib/leds.ato" import LEDIndicatorAmber +from "lib/mosfets.ato" import LowSideSwitch60V115mA + + +module RobotSignalLight: + """ + Robot signal light. + + Consists of an on-board LED, and a connector for a remote off-board signal + light. + """ + # power + power_5v = new Power + power_5v.voltage = 4.9V to 5.1V + signal gnd ~ power_5v.gnd + + input = new Pair + input.gnd ~ power_5v.gnd + + # low side switch + switch = new LowSideSwitch60V115mA + switch.gate_resistor.value = 100ohm +/- 20% + switch.pulldown_resistor.package = "0603" # TODO this is not working + switch.pulldown_resistor.value = 1.2Mohm +/- 20% + switch.input.io ~ input.io + switch.input.gnd ~ gnd + switch.power ~ power_5v + + # on-board signal LED + status_indicator = new LEDIndicatorAmber + status_indicator.current = 5mA to 10mA + status_indicator.v_in = power_5v.voltage + status_indicator.input ~ switch.load.p + status_indicator.gnd ~ switch.load.n + + # off-board signal connector + connector = new JstB2bPhKS + connector.p1 ~ switch.load.p + connector.p2 ~ switch.load.n diff --git a/src/osr_elec/elec/src/lib/serial-transceivers.ato b/src/osr_elec/elec/src/lib/serial-transceivers.ato new file mode 100644 index 0000000..cda3dc3 --- /dev/null +++ b/src/osr_elec/elec/src/lib/serial-transceivers.ato @@ -0,0 +1,67 @@ +"""MaxLinear Serial Transceivers.""" + +from "generics/interfaces.ato" import Power, UART + +from "lib/bourns/tvs-diodes.ato" import Cdsot23Sm712 +from "lib/capacitors.ato" import PowerDecouplingCap100nf +from "lib/interfaces.ato" import RS485 +from "lib/maxlinear/SP3485.ato" import Sp3485 +from "lib/resistors.ato" import Resistor1608, Rs485SeriesResistors + +module Rs485Transceiver: + """RS485 transceiver.""" + trx = new Sp3485 + + # power + power = new Power + power = trx.power + signal gnd ~ power.gnd + + # power decoupling capacitor + decoupling_cap = new PowerDecouplingCap100nf + decoupling_cap.power ~ power + + signal output_enable ~ trx.de + + ro_resistor = new Resistor1608 + ro_resistor.value = 20ohm +/- 5% + ro_resistor.p1 ~ trx.ro + + di_resistor = new Resistor1608 + di_resistor.value = 20ohm +/- 5% + di_resistor.p1 ~ trx.di + + # output enable pull down + de_pull_down = new Resistor1608 + de_pull_down.value = 10kohm +/- 5% + de_pull_down.p1 ~ trx.de + de_pull_down.p2 ~ gnd + + # serial + uart = new UART + uart.tx ~ di_resistor.p2 + uart.rx ~ ro_resistor.p2 + uart.gnd ~ gnd + + # series resistors + series_resistors = new Rs485SeriesResistors + series_resistors.rs415_in.a ~ trx.a + series_resistors.rs415_in.b ~ trx.b + + # ESD and surge protection + tvs_diode = new Cdsot23Sm712 + tvs_diode.common ~ gnd + tvs_diode.p1 ~ series_resistors.rs415_out.a + tvs_diode.p2 ~ series_resistors.rs415_out.b + + # termination resistor + termination_resistor = new Resistor1608 + termination_resistor.value = 120 ohm +/- 5% + termination_resistor.p1 ~ series_resistors.rs415_out.a + termination_resistor.p2 ~ series_resistors.rs415_out.b + + # RS-485 + rs485 = new RS485 + rs485 ~ series_resistors.rs415_out + + trx.de ~ trx.re diff --git a/src/osr_elec/elec/src/lib/spi-uart-converter.ato b/src/osr_elec/elec/src/lib/spi-uart-converter.ato new file mode 100644 index 0000000..7235953 --- /dev/null +++ b/src/osr_elec/elec/src/lib/spi-uart-converter.ato @@ -0,0 +1,45 @@ +"""NXP SPI to UART protocol converters.""" + + +from "generics/interfaces.ato" import Power, SPI, UART + +from "lib/capacitors.ato" import PowerDecouplingCap100nf +from "lib/leds.ato" import LEDIndicatorUser +from "lib/nxp/SC16IS752.ato" import SC16IS752 +from "lib/oscillators.ato" import ABM8_14MHz7456Oscillator + + +module SpiToUart: + """SPI to UART converter.""" + power = new Power + power.voltage = 3.1V to 3.3V + spi = new SPI + uart_a = new UART + uart_b = new UART + + converter = new SC16IS752 + converter.spi ~ spi + converter.power ~ power + converter.interface_select ~ power.gnd + + # power decoupling capacitor + power_cap = new PowerDecouplingCap100nf + power_cap.power ~ power + + # configure interface as SPI + converter.interface_select ~ power.gnd + + # oscillator + converter_osc = new ABM8_14MHz7456Oscillator + converter.xin ~ converter_osc.xin.io + converter.xout ~ converter_osc.xout.io + + # UARTs + uart_a ~ converter.uart_a + uart_b ~ converter.uart_b + + # user LED indicator + user_led_indicator = new LEDIndicatorUser + user_led_indicator.v_in = power.voltage + user_led_indicator.input ~ converter.gpio0.io + user_led_indicator.gnd ~ power.gnd diff --git a/src/osr_elec/elec/src/rpi-hat.ato b/src/osr_elec/elec/src/rpi-hat.ato index 9d73569..945229c 100644 --- a/src/osr_elec/elec/src/rpi-hat.ato +++ b/src/osr_elec/elec/src/rpi-hat.ato @@ -1,5 +1,24 @@ """Raspberry Pi HAT PCB for sethfischer/rover.""" +from "generics/interfaces.ato" import I2C, Power + +from "ams1117-33/elec/src/ams1117-33.ato" import AMS111733 +from "combo-power-connectors/connectors.ato" import Xt30pwmHorizontalTerminalBlock5mmHorizontal +from "koa-speer-rc-series/rc.ato" import RcwcteTestPoint +from "rpi-header/elec/src/rpi.ato" import ConnectorRaspberryPi + +from "lib/can-controller-trx.ato" import CanControllerTrx +from "lib/connectors.ato" import Rs485Connector +from "lib/headers.ato" import PinHeaderI2cTHT +from "lib/headers.ato" import PinHeaderUartTHT +from "lib/leds.ato" import LEDIndicatorPowerRail, LedIndicatorsUart +from "lib/rpi-hat/id-eeprom.ato" import RpiHatIdEeprom +from "lib/rpi-hat/ideal-diode.ato" import IdealDiode +from "lib/rpi-hat/mechanical.ato" import RpiHatMechanical +from "lib/rpi-hat/robot-signal-light.ato" import RobotSignalLight +from "lib/serial-transceivers.ato" import Rs485Transceiver +from "lib/spi-uart-converter.ato" import SpiToUart + module RpiHat: """ @@ -14,4 +33,104 @@ module RpiHat: * [Raspberry Pi 40-pin header pin-out](https://github.com/raspberrypi/documentation/blob/c2ef9202f16e49e664ae604dff3bb4c3ec1f1fab/documentation/asciidoc/computers/os/using-gpio.adoc) * [Raspberry Pi 3B mechanical drawing](https://datasheets.raspberrypi.com/rpi3/raspberry-pi-3-b-mechanical-drawing.pdf) """ - signal gnd + mechanical = new RpiHatMechanical + + # power + power_3v3 = new Power # peripheral power supply + power_3v3.voltage = 3.1V to 3.3V + power_5v = new Power + power_5v.voltage = 4.9V to 5.1V + # common ground for both power rails + signal gnd ~ power_3v3.gnd + gnd ~ power_5v.gnd + + # 5V power input connector + power_connector = new Xt30pwmHorizontalTerminalBlock5mmHorizontal + power_connector.do_not_populate = True + + # back power protection + ideal_diode = new IdealDiode + ideal_diode.input ~ power_connector.power + + # 3V3 regulator + ldo_3v3 = new AMS111733 + ldo_3v3.power_in ~ power_connector.power + ldo_3v3.power_out ~ power_3v3 + + # power test points + # gnd + test_point_gnd_a = new RcwcteTestPoint + test_point_gnd_a.input ~ gnd + test_point_gnd_b = new RcwcteTestPoint + test_point_gnd_b.input ~ gnd + # 3V3 regulator output + test_point_power_3v3 = new RcwcteTestPoint + test_point_power_3v3.input ~ power_3v3.vcc + # 5V power input + test_point_power_5v = new RcwcteTestPoint + test_point_power_5v.input ~ power_5v.vcc + + # Raspberry Pi GPIO socket header + rpi_header = new ConnectorRaspberryPi + rpi_header.designator_prefix = "J" + # as header is on bottom layer, use a pin socket footprint + rpi_header.footprint = "PinSocket_2x20_P2.54mm_Vertical_Oval_Pads" + rpi_header.gnd ~ gnd + rpi_header.power5v ~ ideal_diode.load + + # UART header + uart_header = new PinHeaderUartTHT + uart_header.uart ~ rpi_header.uart + + # ID EEPROM module + id_eeprom = new RpiHatIdEeprom + id_eeprom.power_3v3 ~ power_3v3 + id_eeprom.i2c ~ rpi_header.i2c_id + + # 3.3V power rail LED indicator + power_indicator_3v3 = new LEDIndicatorPowerRail + power_indicator_3v3.v_in = power_3v3.voltage + power_indicator_3v3.power ~ power_3v3 + + # 5V power rail LED indicator + power_indicator_5v = new LEDIndicatorPowerRail + power_indicator_5v.v_in = power_5v.voltage + power_indicator_5v.power ~ power_5v + + # robot signal light + robot_signal_light = new RobotSignalLight + robot_signal_light.power_5v ~ power_5v + robot_signal_light.input.io ~ rpi_header.gpio17 + + # UART converter on SPI0-CE0 + uart_converter = new SpiToUart + uart_converter.spi ~ rpi_header.spi0 + uart_converter.power ~ power_3v3 + + # UART converter UART A + uart_leds = new LedIndicatorsUart + uart_leds.voltage = power_3v3.voltage + uart_leds.uart ~ uart_converter.uart_a + uart_a_header = new PinHeaderUartTHT + uart_a_header.uart ~ uart_converter.uart_a + + # RS-485 on UART converter UART B + rs485_trx = new Rs485Transceiver + rs485_trx.power ~ power_3v3 + rs485_trx.uart ~ uart_converter.uart_b + rs485_connector = new Rs485Connector + rs485_connector.gnd ~ gnd + rs485_trx.rs485 ~ rs485_connector.rs485 + + # CAN controller and transceiver on SPI1-CE1 + can_con_trx = new CanControllerTrx + can_con_trx.power ~ power_3v3 + can_con_trx.spi ~ rpi_header.spi1 + can_con_trx.controller.int ~ rpi_header.gpio7 + + # pin header on I2C + i2c_header = new PinHeaderI2cTHT + i2c_header.power ~ power_3v3 + i2c_header.i2c ~ rpi_header.i2c + i2c_header.int.io ~ rpi_header.gpio4 + i2c_header.int.gnd ~ gnd