
Amp cpw hmc311
loxodes/vna
Under development open hardware microwave vector network analyzer

PCB Visit Card designed around nRF 52832 Nordic chip
NRF52832 visitcard is an open-source printed circuit board by codeandrelax, from the codeandrelax/nRF-Visit-Card repository on GitHub, published under the MIT licence. It is a 4-layer board of 91 × 50 mm with 67 parts on 73 nets, routed with 1,029 tracks and 149 vias.
Its parts include 21 resistors, 18 diodes, 16 capacitors, 3 inductors and 2 ICs. It belongs with the nRF52 and nRF5x boards of this library.
This project is a personal showcase of my skills in PCB design, embedded firmware development, and Android application programming—centered around a custom-built Bluetooth-enabled digital compass.
I created this project as a demonstration of my capability to design and manufacture a clean, self-contained PCB solution, free from the reliance on off-the-shelf BLE modules. It’s a manifestation of my passion for building systems from scratch, with a focus on RF design and embedded software.
The reset pin is repurposed as a user input button. The reset functionality is disabled in software to allow this.
Firmware is built on Zephyr RTOS, enabling modular and modern embedded software design.
A custom Bluetooth service, CompassService, is implemented, exposing three key characteristics:
int16_t value = (MSB << 8) | LSB;float angle_rad = atan2f((float)mag_y, (float)mag_x);
float angle_deg = angle_rad * (180.0f / M_PI);
if (angle_deg < 0) angle_deg += 360.0f;The direction value is then:
The system runs on the internal RC oscillator, while the external crystal is reserved for BLE operations.
Developed using Android Studio, the app uses the Processing library to render a dynamic compass needle.
BluetoothCompassDirection characteristicThis part was relatively straightforward and served as a creative outlet for UI/UX.
This project was built as a self-test and demonstration of:
Building this project wasn't without hiccups—but every mistake taught me something valuable:
Reversed Magnetometer Pins
Costly PCB error discovered only post-manufacturing. Lesson: Triple-check schematic-to-layout connections.
QFN Soldering Difficulties
My aging soldering iron made soldering QFN packages (magnetometer, MCU) unreliable. Eventually outsourced to JLCPCB assembly for these parts.
Signed-to-Unsigned Mistake
I accidentally cast signed 16-bit values from the magnetometer to uint16_t, causing direction errors—reminding me of the infamous Ariane 5 bug.
Magnetometer Proximity to Battery
The CR2032 placement near the magnetometer introduced magnetic interference. If I were to redo the board, I’d increase their separation.
No Tilt Compensation
Since the magnetometer acts as a compass only when the board is level, tilts skew the readings. A better design would include an accelerometer for tilt compensation:
heading = atan2(-Y, X)
pitch = asin(Z / sqrt(X² + Y² + Z²))
compensated_heading = heading adjusted for pitch/rollThis project embodies my passion for electronics, firmware engineering, and RF system design. Despite having a Master’s degree in electronics and professional experience in embedded development, this personal build was a humbling and rewarding journey. Interestingly, the Android app—which I only work on as a hobby—turned out to be the smoothest part of the whole process!
I enjoy building things I can be proud of—and I’m always open to feedback and suggestions.
If anything in this project sparks your interest or you’d like to collaborate, feel free to reach out.
This is how it started:
nRF52 DK can be used to program the visit card.
nRF Visit Card board has exposed pads that are used for programming.
To enable internal oscilator for nRF52832 in the proj.conf file add:
CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC_CALIBRATION=y
CONFIG_CLOCK_CONTROL_NRF_CALIBRATION_LF_ALWAYS_ON=yIn the overlay file add:
&uicr {
/delete-property/ gpio-as-nreset;
};after it make sure to call:
nrfjprog --eraseuicr
nrfjprog --program <path to hex file> --verifyYou might need to reset the board after this - unplug it and plug it back in.
In the proj.conf file add:
CONFIG_CONSOLE=yPins P0.09 and P0.10 are NFC pins and if you wan't to use them as GPIO pins you need to disable NFC. nrf52 enabling gpio on nfc pins
CONFIG_NFCT_PINS_AS_GPIOS=yIn the proj.conf file add:
CONFIG_LOG=y
CONFIG_UART_CONSOLE=n
CONFIG_RTT_CONSOLE=y
CONFIG_USE_SEGGER_RTT=ythen you can use printf function.
uint16_t a = getAzimuth();
printf("Azimuth: %d\n", a);Make sure to connect to RTT (Real-Time Transfer).
| Qty | Value | Footprint | References |
|---|---|---|---|
| 18 | 1k | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R3, R4, R5, R6, R7, R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20 +2 |
| 18 | LED | LED_SMD:LED_0603_1608Metric_Pad1.05x0.95mm_HandSolder | D1, D2, D3, D4, D5, D6, D7, D10, D11, D12, D13, D14, D15, D16, D17, D18 +2 |
| 3 | 100n | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C1, C4, C8 |
| 2 | 100n | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C11, C16 |
| 2 | 100p | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C13, C14 |
| 2 | 12p | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C5, C6 |
| 2 | 2k2 | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R1, R2 |
| 2 | 4u7 | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C2, C10 |
| 2 | 8p | Capacitor_SMD:C_0402_1005Metric_Pad0.74x0.62mm_HandSolder | C7, C15 |
| 1 | 10k | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R21 |
| 1 | 10u | Inductor_SMD:L_0603_1608Metric_Pad1.05x0.95mm_HandSolder | L1 |
| 1 | 10u | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C12 |
| 1 | 15n | Inductor_SMD:L_0603_1608Metric_Pad1.05x0.95mm_HandSolder | L2 |
| 1 | 1u | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C3 |
| 1 | 32 MHz | Crystal:Crystal_SMD_2016-4Pin_2.0x1.6mm | Y1 |
| 1 | 3n9 | Inductor_SMD:L_0603_1608Metric_Pad1.05x0.95mm_HandSolder | L3 |
| 1 | Antenna_Dipole | RF_Antenna:Texas_SWRA117D_2.4GHz_Right | AE1 |
| 1 | Battery_Cell | Battery:BatteryHolder_Multicomp_BC-2001_1x2032 | BT1 |
| 1 | Gauge_50mm_Type1_SilkScreenTop | Calibration_Scale:Gauge_50mm_Type1_SilkScreenTop | |
| 1 | Programming | SMD_edgeConnector_4pin:SMD_edgeConnector_4pin | J1 |
| 1 | SW_Push | Button_Switch_SMD:SW_Push_1P1T_NO_6x6mm_H9.5mm | SW1 |
| 1 | UART | SMD_edgeConnector_4pin:SMD_edgeConnector_4pin | J2 |
| 1 | u22 | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C9 |
| 1 | ~ | Package_LGA:LGA-16_3x3mm_P0.5mm | U2 |
| 1 | ~ | Package_DFN_QFN:QFN-48-1EP_6x6mm_P0.4mm_EP4.6x4.6mm | U1 |
It measures 91 × 50 mm and has 4 copper layers, 1.3 mm thick.
67 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the codeandrelax/nRF-Visit-Card repository on GitHub, at the commit this page was made from: the board is nRF52832_visitcard/nRF52832_visitcard.kicad_pcb and its schematic nRF52832_visitcard/nRF52832_visitcard.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

loxodes/vna
Under development open hardware microwave vector network analyzer

deltabeard/DBGC
A Game Boy cartridge using the Raspberry Pi RP2040 with RTC and MBC support.


mirdej/synkie
The Synkie is a modular open source analog video processor, developed by Michael Egger, Max Egger and Flo Kaufmann

calithameridi/corevus
High-flexibility, low-cost mechatronics controller for 3D printers


LIV2/RIDE
To add the A0 Bonus RAM to the system you will need to use the addram command included in the RIDE-Software adf/lha found under Releases.
