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
PCB
Schematic
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>
)
}