Skip to the content
2 layers63.5 × 21.8 mmButtons, the printed circuit board in 3D

This is a marine steering system designed to track and steer a boat during a rowing outing. It is made up of a cross-platform mobile app built in React Native, along with an Arduino-operated servo designed to control…

Size
63.5 × 21.8 mm
Copper layers
2
Thickness
1.6 mm
Parts
14
Nets
35
Pads
59
Tracks, vias
96, 8
Pours
6
Routed
Yes
KiCad
KiCad 5 (file 20171130)
Created
2 Feb 2019
Updated
6 Dec 2022

Overview

Buttons is an open-source printed circuit board by suchanekj, from the suchanekj/rowing_steering repository on GitHub. It is a 2-layer board of 63.5 × 21.8 mm with 14 parts on 35 nets, routed with 96 tracks and 8 vias.

Its parts include 7 resistors, 3 diodes and 3 connectors. It belongs with the AVR (ATmega, ATtiny) boards of this library.

README

README.md

Marine Steering System (Buccaneer)

This is a marine steering system designed to track and steer a boat during a rowing outing. It is made up of a cross-platform mobile app built in React Native, along with an Arduino-operated servo designed to control the boat's rudder and a game controller.

The system features three modes:

1. Tracking only

This mode tracks your outing without providing any sort of control. Simply line the phone up in the direction of the boat and it will record your outing and useful information like distance and average speed. Past outings can then be reviewed from the history tab.

2. Manual mode

In addition to tracking your outing, manual mode allows you to control the boat's rudder from a wireless game controller that can be kept in your hand whilst rowing. Simply connect the servo and controller to the app via bluetooth in the settings tab, and then select manual mode to enable.

3. Automatic mode

Lastly, the ultimate goal of the system is to enable fully automated steering. This is a achived by a simple PID controller. The boat's current heading is compared to an average of the river's bearing over the next 100m, weighted by proximity. This forms the error input to a PID controller, which provides a corrective rudder angle output. Simply connect the servo via bluetooth in the settings tab and select automatic mode to enable.

Screenshots

alt text alt text alt text alt text alt text

Running the app

The app has been built in React Native, a cross-platform framework for developing mobile apps using Javascript.

To work on the app, you'll need to set up a few tools that allow you to run the app on your iOS or Android device. For Android, this involves installing Node and Watchman, followed by the Java Development Kit and Android Studio. See the docs for more details and also for instructions for iOS. Select "React Native CLI Quickstart" rather than "Expo CLI Quickstart". Expo is a set of tools that make React Native development easier, but sadly bluetooth functionality is not yet available in Expo, so we're following the ordinary React Native CLI workflow, sometimes called the "bare workflow".

Once the tools are set up, enable USB debugging on your Android device, connect it via USB and run:

text
npx react-native run-android

See the docs for more details and also for instructions for iOS. They also provide instructions on building an APK build of the app.

To do

The functionality of the app is largely complete. It has been tested on Android and the tracking mode works well. The app also correctly scans for and picks up surrounding bluetooth devices. However, manual and automatic modes have yet to be tested in conjunction with the hardware.

In terms of hardware, the servo and game controller must be able to receive and send the following bluetooth messages from the phone:

alt text

All bluetooth messages consist of signed 8-bit integers. The servo receives from the phone a rudder angle between -90 and 90, and sends the phone a battery level between 0 and 100. The controller receives from the phone the servo's battery level between 0 and 100, and sends a change in rudder angle between -128 and 127. The phone will add this received value to the current rudder angle to determine the new rudder angle.

The following UUIDs are used for each message. Note that I've come up with new ones, so you'll have to replace the UUIDs used in the current servo code.

text
export const SERVO_SERICE = "802af24b-b40a-488b-b740-4c0405c1f955";
export const BATTERY_LEVEL_CHARACTERISTIC =
  "27468c1f-2915-4b5a-ac6a-6efb97dd764e"; // the servo to phone battery level message (0 to 100)
export const RUDDER_ANGLE_CHARACTERISTIC =
  "948c9983-d637-405b-be86-4565e3c0b7dd"; // the phone to servo rudder angle message (-90 to 90)

export const CONTROLLER_SERVICE = "8be2ecbd-047b-4af5-99fc-ad5a571a99c8";
export const RUDDER_CHANGE_CHARACTERISTIC =
  "1aa10f81-2712-4eb1-a4fc-6c2b0ba74671"; // the controller to phone rudder angle change message (-128 to 127)
export const BATTERY_INFO_CHARACTERISTIC =
  "3a7b1270-435a-4927-86fb-cd135bee2ca5"; // the phone to servo battery level message (0 to 100)

Notes

Bluetooth device names in the app

The bluetooth library the app uses currently has a bug. When you scan for nearby bluetooth devices, the discovered devices don't have names, only MAC ID addresses. Hopefully this will be fixed in a future release, but for now the app displays the MAC ID addresses of possible devices instead of their names. This isn't ideal but if you keep a note of the MAC ID address of the servo and controller you can connect to the right devices.

Parts

14
QtyValueFootprintReferences
7RResistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolderR1, R2, R3, R4, R5, R6, R7
3Conn_01x03_MaleConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ1, J2, J3
3LEDLED_THT:LED_D5.0mmD1, D2, D3
1Arduino_Nano_v3.x1_Project_Specific:NANO_33_Footprint_SMD_CastellA1

More from suchanekj/rowing_steering

1
  • 2 layers100 × 22 mmRowing steerting, the printed circuit board in 3D

    Rowing steerting

    suchanekj/rowing_steering

    This is a marine steering system designed to track and steer a boat during a rowing outing. It is made up of a cross-platform mobile app built in React Native, along with an Arduino-operated servo designed to control…

    25 parts2

Similar boards

  • 2 layers116.8 × 30 mmType d, the printed circuit board in 3D

    Type d

    google/mozc-devices

    Circuit diagrams and firmware source code for Gboard DIY keyboards

    14 parts3kApache-2.0
  • 2 layers32 × 22 mmDiff driver, the printed circuit board in 3D

    Diff driver

    rene-dev/stmbl

    AC Servo Driver for STM32F4

    14 parts990GPL-3.0
  • 2 layers34 × 45 mm2032Charger, the printed circuit board in 3D

    2032Charger

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    14 parts915
  • 2 layers34 × 109.9 mmTdisplay s3, the printed circuit board in 3D

    Tdisplay s3

    landonr/homeThing

    Wifi Smart Home Remotes that run on ESPHome

    14 parts551GPL-3.0
  • 2 layers45.3 × 42.7 mmMainPcb, the printed circuit board in 3D

    MainPcb

    adamb314/ServoProject

    Getting the most out of your hobby servo

    14 parts545
  • 2 layers42.5 × 28.8 mmC5VRX JACK DIY, the printed circuit board in 3D

    C5VRX JACK DIY

    Twotoz/C5VRX

    Ultra-minimal, zero-CPU 5.8 GHz analog FPV video receiver using ESP32-C5 Wi-Fi 6 PHY MODEM_DIAG, BitScrambler WBFM demodulation & resistor DAC CVBS

    14 parts515GPL-3.0
  • 2 layers62 × 24 mmMai button, the printed circuit board in 3D

    Mai button

    whowechina/mai_pico

    Pico controller for Maimai

    14 parts475

Questions

How big is the Buttons PCB?

It measures 63.5 × 21.8 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Buttons use?

14 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.

Where can I download the Buttons KiCad files?

From the suchanekj/rowing_steering repository on GitHub, at the commit this page was made from: the board is electronics/buttons/buttons/buttons.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Buttons design in my own project?

Its repository states no licence, so its author keeps all rights: ask suchanekj before reusing the design.