0hmX/ov7670-camera-module

This code defines the hardware layout and schematic connectivity for an OV7676 camera module featuring a CSP5 sensor package, power regulation, and interface connectors.

Version
1.2.0
License
unset
Stars
0

index.circuit.tsx

PCBPCB preview for index.circuit.tsx
SchematicSchematic preview for index.circuit.tsx
import { OV7676_CSP5 } from "./imports/OV7676_CSP5"
import { PZ254V_12_18P } from "./imports/PZ254V_12_18P"
import { SN74LVC1G17DBVR } from "./imports/SN74LVC1G17DBVR"
import { SN74LVC2G02DCTR } from "./imports/SN74LVC2G02DCTR"
import { XC6206P282MR } from "./imports/XC6206P282MR"
import { Fragment } from "react"

const POWER = "power"
const SENSOR = "sensor"
const CONTROL = "control"
const INTERFACE = "interface"

const headerLabels = [
  "3V3", "GND", "SIOC", "SIOD", "VSYNC", "HREF", "PCLK", "XCLK",
  "D7", "D6", "D5", "D4", "D3", "D2", "D1", "D0", "RESET", "PWDN",
]

const signalConnections = [
  ["SIOC", "SIOC"], ["SIOD", "SIOD"], ["VSYNC", "VSYNC"],
  ["HREF", "HREF"], ["PCLK", "PCLK"], ["D7", "D7"], ["D6", "D6"],
  ["D5", "D5"], ["D4", "D4"], ["D3", "D3"], ["D2", "D2"],
  ["D1", "D1"], ["D0", "D0"],
]

const sensorBreakoutPoints = [
  { pin: "pin1", x: 5, y: -5.9999 },
  { pin: "pin2", x: 3, y: -5.9999 },
  { pin: "pin8", x: 1, y: -5.9999 },
  { pin: "pin3", x: -1, y: -5.9999 },
  { pin: "pin4", x: -3, y: -5.9999 },
  { pin: "pin5", x: -5, y: -5.9999 },
  { pin: "pin6", x: 6.9999, y: -3 },
  { pin: "pin7", x: 6.9999, y: -1 },
  { pin: "pin12", x: 6.9999, y: 1 },
  { pin: "pin11", x: 6.9999, y: 3 },
  { pin: "pin16", x: 5, y: 5.9999 },
  { pin: "pin17", x: 3, y: 5.9999 },
  { pin: "pin13", x: 1, y: 5.9999 },
  { pin: "pin18", x: -1, y: 5.9999 },
  { pin: "pin19", x: -3, y: 5.9999 },
  { pin: "pin20", x: -5, y: 5.9999 },
  { pin: "pin10", x: -6.9999, y: -3 },
  { pin: "pin9", x: -6.9999, y: -1 },
  { pin: "pin14", x: -6.9999, y: 1 },
  { pin: "pin15", x: -6.9999, y: 3 },
]

const parts = {
  c1u: { jlcpcb: ["C15849"], mpn: "CL10A105KB8NNNC" },
  c100n: { jlcpcb: ["C14663"], mpn: "CC0603KRX7R9BB104" },
  r4k7: { jlcpcb: ["C23162"], mpn: "0603WAF4701T5E" },
  r10k: { jlcpcb: ["C2906982"], mpn: "FRC0603F1002TS" },
}

function NamedTrace({ from, to }: { from: string; to: string }) {
  const clean = (value: string) => value.replace(/[^a-zA-Z0-9]+/g, "_")
  return <trace name={`${clean(from)}_TO_${clean(to)}`} from={from} to={to} />
}

export default function BareOV7676CameraModule() {
  return (
    <board
      name="OV7676_BARE_SENSOR_MODULE"
      width="28mm"
      height="28mm"
      borderRadius="0.5mm"
      thickness="1.6mm"
      layers={4}
      solderMaskColor="black"
      silkscreenColor="white"
      doubleSidedAssembly
      minBoardEdgeClearance="0.2mm"
      autorouter="auto"
      autorouterVersion="beta_pipeline1"
      autorouterEffortLevel="10x"
      minTraceWidth="0.08mm"
      defaultTraceWidth="0.08mm"
      minTraceToPadEdgeClearance="0.07mm"
      minViaEdgeToPadEdgeClearance="0.08mm"
      minViaHoleDiameter="0.2mm"
      minViaPadDiameter="0.45mm"
    >
      {[
        "V3V3", "V2V8", "GND", "SIOC", "SIOD", "VSYNC", "HREF", "PCLK",
        "XCLK_HEADER", "XCLK_2V8", "D7", "D6", "D5", "D4", "D3", "D2",
        "D1", "D0", "RESET", "RESET_INV", "PWDN", "XSHUTDOWN", "VN",
      ].map((name) => (
        <Fragment key={name}>
          <net name={name} />
        </Fragment>
      ))}

      <schematicsection name={POWER} displayName="3.3 V to 2.8 V power" />
      <schematicsection name={SENSOR} displayName="Bare OV7676 CSP sensor" />
      <schematicsection name={CONTROL} displayName="Clock and shutdown control" />
      <schematicsection name={INTERFACE} displayName="18-pin module interface" />

      <PZ254V_12_18P
        name="P1"
        displayName="2x9 CAMERA HEADER"
        pinAttributes={{
          pin1: { requiresPower: true, includeInBoardPinout: true },
          pin2: { requiresGround: true, includeInBoardPinout: true },
          pin3: { includeInBoardPinout: true }, pin4: { includeInBoardPinout: true },
          pin5: { includeInBoardPinout: true }, pin6: { includeInBoardPinout: true },
          pin7: { includeInBoardPinout: true }, pin8: { includeInBoardPinout: true },
          pin9: { includeInBoardPinout: true }, pin10: { includeInBoardPinout: true },
          pin11: { includeInBoardPinout: true }, pin12: { includeInBoardPinout: true },
          pin13: { includeInBoardPinout: true }, pin14: { includeInBoardPinout: true },
          pin15: { includeInBoardPinout: true }, pin16: { includeInBoardPinout: true },
          pin17: { includeInBoardPinout: true }, pin18: { includeInBoardPinout: true },
        }}
        schSectionName={INTERFACE}
        schX={15}
        schY={0}
        schWidth={2.2}
        pcbX={0}
        pcbY={10.5}
      />

      <XC6206P282MR
        name="U2"
        displayName="2.8 V LDO"
        pinAttributes={{
          VSS: { mustBeConnected: true, requiresGround: true },
          VOUT: { mustBeConnected: true, requiresPower: true, requiresVoltage: "2.8V" },
          VIN: { mustBeConnected: true, requiresPower: true, requiresVoltage: "3.3V" },
        }}
        schSectionName={POWER}
        schX={-15}
        schY={2}
        schWidth={1.6}
        schHeight={0.4}
        pcbX={-10}
        pcbY={-9}
        pcbRotation={90}
      />
      <capacitor
        name="C1" displayName="1uF IN" capacitance="1uF" footprint="0603"
        supplierPartNumbers={{ jlcpcb: parts.c1u.jlcpcb }}
        manufacturerPartNumber={parts.c1u.mpn}
        schSectionName={POWER} schX={-17} schY={-1} schOrientation="vertical"
        pcbX={-12.6} pcbY={-9} pcbRotation={90}
      />
      <capacitor
        name="C2" displayName="1uF OUT" capacitance="1uF" footprint="0603"
        supplierPartNumbers={{ jlcpcb: parts.c1u.jlcpcb }}
        manufacturerPartNumber={parts.c1u.mpn}
        schSectionName={POWER} schX={-13} schY={-1} schOrientation="vertical"
        pcbX={-7.4} pcbY={-9} pcbRotation={90}
      />

      <breakout
        name="SENSOR_BREAKOUT"
        pcbX={0}
        pcbY={-2}
        width="14mm"
        height="12mm"
      >
        <OV7676_CSP5
          name="U1"
          displayName="OV7676-H20A (CSP5-20)"
          schSectionName={SENSOR}
          schX={-5}
          schY={1}
          schWidth={2.53}
          schHeight={2.2}
          schPinArrangement={{
            leftSide: {
              pins: ["AVDD", "DOVDD", "VN", "AGND", "DOGND", "XVCLK", "XSHUTDOWN", "SIOC", "SIOD", "HREF"],
              direction: "top-to-bottom",
            },
            rightSide: {
              pins: ["PCLK", "VSYNC", "D7", "D6", "D5", "D4", "D3", "D2", "D1", "D0"],
              direction: "top-to-bottom",
            },
          }}
          pinAttributes={{
            AVDD: { mustBeConnected: true, requiresPower: true, requiresVoltage: "2.8V" },
            DOVDD: { mustBeConnected: true, requiresPower: true, requiresVoltage: "2.8V" },
            VN: { mustBeConnected: true },
            AGND: { mustBeConnected: true, requiresGround: true },
            DOGND: { mustBeConnected: true, requiresGround: true },
            XVCLK: { mustBeConnected: true }, XSHUTDOWN: { mustBeConnected: true },
            SIOC: { mustBeConnected: true }, SIOD: { mustBeConnected: true },
            PCLK: { mustBeConnected: true }, VSYNC: { mustBeConnected: true },
            HREF: { mustBeConnected: true }, D7: { mustBeConnected: true },
            D6: { mustBeConnected: true }, D5: { mustBeConnected: true },
            D4: { mustBeConnected: true }, D3: { mustBeConnected: true },
            D2: { mustBeConnected: true }, D1: { mustBeConnected: true },
            D0: { mustBeConnected: true },
          }}
          pcbX={0}
          pcbY={0}
          pcbRotation={180}
        />
        {sensorBreakoutPoints.map(({ pin, x, y }) => (
          <Fragment key={`breakout-${pin}`}>
            <breakoutpoint
              connection={`.U1 > .${pin}`}
              pcbX={x}
              pcbY={y}
            />
          </Fragment>
        ))}
      </breakout>

      <capacitor
        name="C3" displayName="1uF AVDD" capacitance="1uF" footprint="0603"
        supplierPartNumbers={{ jlcpcb: parts.c1u.jlcpcb }}
        manufacturerPartNumber={parts.c1u.mpn}
        schSectionName={SENSOR} schX={-8} schY={-3} schOrientation="vertical"
        layer="bottom" pcbX={-2.2} pcbY={-2} pcbRotation={90}
      />
      <capacitor
        name="C4" displayName="100nF DOVDD" capacitance="100nF" footprint="0603"
        supplierPartNumbers={{ jlcpcb: parts.c100n.jlcpcb }}
        manufacturerPartNumber={parts.c100n.mpn}
        schSectionName={SENSOR} schX={-5} schY={-3} schOrientation="vertical"
        layer="bottom" pcbX={2.2} pcbY={-2} pcbRotation={90}
      />
      <capacitor
        name="C5" displayName="1uF VN" capacitance="1uF" footprint="0603"
        supplierPartNumbers={{ jlcpcb: parts.c1u.jlcpcb }}
        manufacturerPartNumber={parts.c1u.mpn}
        schSectionName={SENSOR} schX={-2} schY={-3} schOrientation="vertical"
        layer="bottom" pcbX={0} pcbY={-4.6}
      />
      <resistor
        name="R1" displayName="4k7 SIOC" resistance="4.7kohm" footprint="0603"
        supplierPartNumbers={{ jlcpcb: parts.r4k7.jlcpcb }}
        manufacturerPartNumber={parts.r4k7.mpn}
        schSectionName={SENSOR} schX={-8} schY={5} schRotation={90}
        pcbX={5} pcbY={1} pcbRotation={90}
      />
      <resistor
        name="R2" displayName="4k7 SIOD" resistance="4.7kohm" footprint="0603"
        supplierPartNumbers={{ jlcpcb: parts.r4k7.jlcpcb }}
        manufacturerPartNumber={parts.r4k7.mpn}
        schSectionName={SENSOR} schX={-5} schY={5} schRotation={90}
        pcbX={7} pcbY={1} pcbRotation={90}
      />

      <SN74LVC2G02DCTR
        name="U3" displayName="RESET_N / PWDN LOGIC"
        pinAttributes={{
          "1A": { mustBeConnected: true }, "1B": { mustBeConnected: true },
          "1Y": { mustBeConnected: true }, "2A": { mustBeConnected: true },
          "2B": { mustBeConnected: true }, "2Y": { mustBeConnected: true },
          GND: { mustBeConnected: true, requiresGround: true },
          VCC: { mustBeConnected: true, requiresPower: true, requiresVoltage: "2.8V" },
        }}
        schPinArrangement={{
          leftSide: { pins: ["1A", "1B", "2A", "2B"], direction: "top-to-bottom" },
          rightSide: { pins: ["VCC", "1Y", "2Y", "GND"], direction: "top-to-bottom" },
        }}
        schSectionName={CONTROL} schX={5} schY={0} schWidth={1.675}
        schHeight={1}
        pcbX={9.5} pcbY={-9} pcbRotation={90}
      />
      <capacitor
        name="C6" displayName="100nF CTRL" capacitance="100nF" footprint="0603"
        supplierPartNumbers={{ jlcpcb: parts.c100n.jlcpcb }}
        manufacturerPartNumber={parts.c100n.mpn}
        schSectionName={CONTROL} schX={8} schY={-1} schOrientation="vertical"
        pcbX={12.5} pcbY={-9} pcbRotation={90}
      />
      <resistor
        name="R3" displayName="10k RESET_N PU" resistance="10kohm" footprint="0603"
        supplierPartNumbers={{ jlcpcb: parts.r10k.jlcpcb }}
        manufacturerPartNumber={parts.r10k.mpn}
        schSectionName={CONTROL} schX={3} schY={-4} schRotation={90}
        pcbX={8} pcbY={-4.3} pcbRotation={90}
      />
      <resistor
        name="R4" displayName="10k PWDN PD" resistance="10kohm" footprint="0603"
        supplierPartNumbers={{ jlcpcb: parts.r10k.jlcpcb }}
        manufacturerPartNumber={parts.r10k.mpn}
        schSectionName={CONTROL} schX={6} schY={-4} schRotation={90}
        pcbX={11} pcbY={-4.3} pcbRotation={90}
      />
      <SN74LVC1G17DBVR
        name="U4" displayName="2.8 V XCLK BUFFER"
        noConnect={["pin1"]}
        pinAttributes={{
          pin1: { doNotConnect: true }, A: { mustBeConnected: true },
          GND: { mustBeConnected: true, requiresGround: true },
          Y: { mustBeConnected: true },
          VCC: { mustBeConnected: true, requiresPower: true, requiresVoltage: "2.8V" },
        }}
        schSectionName={CONTROL} schX={4} schY={4} schWidth={1.7}
        schHeight={0.6}
        pcbX={4} pcbY={-9} pcbRotation={90}
      />
      <capacitor
        name="C7" displayName="100nF XCLK" capacitance="100nF" footprint="0603"
        supplierPartNumbers={{ jlcpcb: parts.c100n.jlcpcb }}
        manufacturerPartNumber={parts.c100n.mpn}
        schSectionName={CONTROL} schX={7} schY={4} schOrientation="vertical"
        pcbX={1} pcbY={-9} pcbRotation={90}
      />

      <NamedTrace from="P1.pin1" to="net.V3V3" />
      <NamedTrace from="P1.pin2" to="net.GND" />
      {headerLabels.slice(2).map((label, index) => (
        <Fragment key={`header-${label}`}>
          <NamedTrace
            from={`P1.pin${index + 3}`}
            to={`net.${label === "XCLK" ? "XCLK_HEADER" : label}`}
          />
        </Fragment>
      ))}

      <NamedTrace from="U2.VIN" to="net.V3V3" />
      <NamedTrace from="U2.VSS" to="net.GND" />
      <NamedTrace from="U2.VOUT" to="net.V2V8" />
      <NamedTrace from="C1.pin1" to="net.V3V3" />
      <NamedTrace from="C1.pin2" to="net.GND" />
      <NamedTrace from="C2.pin1" to="net.V2V8" />
      <NamedTrace from="C2.pin2" to="net.GND" />

      <NamedTrace from="U1.AVDD" to="net.V2V8" />
      <NamedTrace from="U1.DOVDD" to="net.V2V8" />
      <NamedTrace from="U1.AGND" to="net.GND" />
      <NamedTrace from="U1.DOGND" to="net.GND" />
      <NamedTrace from="U1.VN" to="net.VN" />
      <NamedTrace from="C3.pin1" to="net.V2V8" />
      <NamedTrace from="C3.pin2" to="net.GND" />
      <NamedTrace from="C4.pin1" to="net.V2V8" />
      <NamedTrace from="C4.pin2" to="net.GND" />
      <NamedTrace from="C5.pin1" to="net.VN" />
      <NamedTrace from="C5.pin2" to="net.GND" />
      <NamedTrace from="R1.pin1" to="net.V2V8" />
      <NamedTrace from="R1.pin2" to="net.SIOC" />
      <NamedTrace from="R2.pin1" to="net.V2V8" />
      <NamedTrace from="R2.pin2" to="net.SIOD" />
      {signalConnections.map(([pin, net]) => (
        <Fragment key={`sensor-${pin}`}>
          <NamedTrace from={`U1.${pin}`} to={`net.${net}`} />
        </Fragment>
      ))}

      <NamedTrace from="U4.A" to="net.XCLK_HEADER" />
      <NamedTrace from="U4.Y" to="net.XCLK_2V8" />
      <NamedTrace from="U4.VCC" to="net.V2V8" />
      <NamedTrace from="U4.GND" to="net.GND" />
      <NamedTrace from="C7.pin1" to="net.V2V8" />
      <NamedTrace from="C7.pin2" to="net.GND" />
      <NamedTrace from="U1.XVCLK" to="net.XCLK_2V8" />

      <NamedTrace from="U3.1A" to="net.RESET" />
      <NamedTrace from="U3.1B" to="net.RESET" />
      <NamedTrace from="U3.1Y" to="net.RESET_INV" />
      <NamedTrace from="U3.2A" to="net.RESET_INV" />
      <NamedTrace from="U3.2B" to="net.PWDN" />
      <NamedTrace from="U3.2Y" to="net.XSHUTDOWN" />
      <NamedTrace from="U3.VCC" to="net.V2V8" />
      <NamedTrace from="U3.GND" to="net.GND" />
      <NamedTrace from="U1.XSHUTDOWN" to="net.XSHUTDOWN" />
      <NamedTrace from="R3.pin1" to="net.RESET" />
      <NamedTrace from="R3.pin2" to="net.V3V3" />
      <NamedTrace from="R4.pin1" to="net.PWDN" />
      <NamedTrace from="R4.pin2" to="net.GND" />
      <NamedTrace from="C6.pin1" to="net.V2V8" />
      <NamedTrace from="C6.pin2" to="net.GND" />

      <silkscreencircle pcbX={0} pcbY={-2} radius="4.5mm" strokeWidth="0.2mm" />
      <silkscreentext
        text="BARE OV7676 CSP / LENS KEEP-OUT"
        pcbX={0} pcbY={-12.8} fontSize="0.55mm" anchorAlignment="center"
      />
      <silkscreentext text="A1" pcbX={2.7} pcbY={-4} fontSize="0.45mm" anchorAlignment="center" />
      <silkscreentext text="P1" pcbX={12.6} pcbY={10.5} fontSize="0.55mm" anchorAlignment="center" />
      <silkscreentext text="1" pcbX={-12.2} pcbY={9.2} fontSize="0.6mm" anchorAlignment="center" />
      {headerLabels.map((label, index) => {
        const pair = Math.floor(index / 2)
        const pcbX = -10.16 + pair * 2.54
        const pcbY = index % 2 === 0 ? 7.2 : 13.2
        return (
          <Fragment key={`label-${label}`}>
            <silkscreentext
              text={label}
              pcbX={pcbX}
              pcbY={pcbY}
              fontSize="0.42mm"
              anchorAlignment="center"
            />
          </Fragment>
        )
      })}
    </board>
  )
}