Skip to the content
2 layers100 × 22 mmRowing steerting, 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
100 × 22 mm
Copper layers
2
Thickness
1.6 mm
Parts
25
Nets
41
Pads
83
Tracks, vias
117, 4
Pours
3
Routed
Yes
KiCad
KiCad 5 (file 20171130)
Created
2 Feb 2019
Updated
6 Dec 2022

Overview

Rowing steerting is an open-source printed circuit board by suchanekj, from the suchanekj/rowing_steering repository on GitHub. It is a 2-layer board of 100 × 22 mm with 25 parts on 41 nets, routed with 117 tracks and 4 vias.

Its parts include 11 connectors, 7 resistors, 3 diodes and 2 switches. 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

25
QtyValueFootprintReferences
7RResistor_SMD:R_1206_3216Metric_Pad1.42x1.75mm_HandSolderR1, R2, R3, R4, R5, R6, R7
6Conn_01x03_FemaleConnector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ6, J7, J8, J9, J10, J11
5Conn_01x02_MaleCanSat:TX30_verticalJ1, J2, J3, J4, J5
3LEDConnector_PinSocket_2.54mm:PinSocket_1x02_P2.54mm_VerticalD1, D2, D3
2SW_SPSTCanSat:TX30_verticalSW1, SW2
1Arduino_Nano_v3.xModule:Arduino_NanoA1
1Conn_01x01_FemaleConnector_PinSocket_2.54mm:PinSocket_1x01_P2.54mm_VerticalServo

More from suchanekj/rowing_steering

1
  • 2 layers63.5 × 21.8 mmButtons, the printed circuit board in 3D

    Buttons

    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…

    14 parts2

Similar boards

  • 2 layers159.5 × 30 mmType f, the printed circuit board in 3D

    Type f

    google/mozc-devices

    Circuit diagrams and firmware source code for Gboard DIY keyboards

    25 parts3kApache-2.0
  • 2 layers113.5 × 95.1 mmSweep high, the printed circuit board in 3D

    Sweep high

    davidphilipbarr/Sweep

    Sweep - a small promicro based keyboard inspired by the Ferris.

    25 parts2.1k
  • 2 layers58.4 × 114.3 mmPicoPedal, the printed circuit board in 3D

    PicoPedal

    hackclub/OnBoard

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

    25 parts915
  • 2 layers54 × 15 mmXyp gpib, the printed circuit board in 3D

    Xyp gpib

    xyphro/UsbGpib

    Versatile, cheap and portable USB to GPIB converter (USBTMC class based)

    25 parts690MIT
  • 2 layers50 × 76 mmVoron 0, the printed circuit board in 3D

    Voron 0

    dennisss/dacha

    Monorepo for awesome tools/projects/libraries

    25 parts397Apache-2.0
  • 2 layers237.5 × 102.9 mmStorage, the printed circuit board in 3D

    Storage

    jes/scamp-cpu

    A homebrew 16-bit CPU with a homebrew Unix-like-ish operating system.

    25 parts301Unlicense
  • 2 layers43.3 × 21 mmNanoS3 Carrier, the printed circuit board in 3D

    NanoS3 Carrier

    UnexpectedMaker/esp32s3

    Assorted files for my ESP32-S3 development boards

    25 parts296

Questions

How big is the Rowing steerting PCB?

It measures 100 × 22 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Rowing steerting use?

25 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 Rowing steerting KiCad files?

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

Can I use the Rowing steerting design in my own project?

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