Skip to content

Final project journey (all weeks)

Note

Dear reader. This page can be seen as a journey that shows my progress related to my final project; more or less seperate from my weekly assignments. There might be some overlap of course. Related are a number of other pages regarding specific topics which are mentioned below.

Week 01

The last couple of months I collected a lot of ideas.

Based on video's / work we saw during bootcamp, the local session, I got inspired to try to make it big but not too big.

Swim monitor

Every Saturday morning I go to the indoor pool to improve my swimming technique / speed. I always swim in the 2nd lane (whereas 6 being the ones for the masters). To improve I need to focus on technique and then speed. But swmming around I've no idea of how my body is floating in the water. And speed drills? Actually I hate those.

Of course I followed a course and was once filmed in the water using a camera on a stick; whereby a coach walks along side to film, you. But that has been a long time ago. And it is both costly and time consuming to do that again.

Regarding the speed drills. Yes I have a watch but Ihave to manualle activate and deactivate it. So I'm always starting with one hand on the other, give myself some speed and the end I have to find the right button again. Depending on how good I do this, the speed measurement is kind of inaccurate.

What if there was a way to (more accurately) measure my speed and make get frequently inside into the way I swim?

Solution

The [swim monitor] is a system that enables swimmers to:

  • Track their speed, lap time, distance while swimming
  • Be challenged/paced by a pre-programmed exercise
  • Compete with another swimmer (gamefication)
  • Afterwards see how they moved through the water

Visuals/ mockups

The [swim monitor] is a system that consists of multiple parts:

  • Start/ stop (on both sides of the pool) that the swimmer can use to start/stop the monitor
  • Lap monitor that keeps track of time, speed
  • Pacer that shows how fast a swimmer should swim to meet his/her criteria
  • Camera that films a swimmer from the front, side and behind
  • Storage that combines timely data with visual data

Non-functionals

  • It has to be safe especially around/ in water
  • It is not allowed to pollute the water in any way (pool water is clean water)
  • It should be possible to install/ deinstall in 10 minutes time (as other people might need the pool)

Open water buddy

I personally like to swim in open water whether it is to improve my distance or just to cool down. Usually I do this in a rive ("de Vecht") which is very near by. This river is very popular and, especially in the summer, populated with boats.

So when I swim a longer distance I'm constantly looking around to navigate but also to look around whether boats actually see me. And as I swim alone there is nobody who can take a picture of me (just for fun later on).

And when I'm in the water to cool down I usually get out quit quickly as I have no fun just being in the water; I like to do something. Even if I'm with one of my kids throwing a ball, it gets boring after a while.

What if I could have buddy that guides me and plays with me in the water?

Solution

The [Open water buddy] is a device that:

  • Shows you the way (pre programmed route/ geo-fence)
  • Tries to catch you or any other person that is close by (like a shark)
  • Follows you around while you swim
  • Monitors you while you swim (distance, photo, video)
  • Randomly goes any direction so that you have to catch it
  • Can be set to stealth mode to film wildlife
  • Comes to you when needed
  • Can be controlled remotely

Visuals/ mockups

The [Open water buddy] is a device that consists of multiple parts:

  • Simple interface to activate a function / user feedback
  • Camera to film and take photo's
  • GPS tracker for loaction\
  • Light(s) for guidance / protection
  • Intelligence to recognize people/ objects / birds
  • Storage that combines location data with visual data

Non-functionals

  • It has to be safe especially around/ in water
  • It is not allowed to pollute the water in any way (although it is open water)
  • It should be small/ strong enough to be thrown away (like a ball)
  • It should be quiet
  • It should be possible to put a shark vin in top
  • It should be possible to put a yellow rubber duck on top of it

Week 2

I thought about creating a new page but just updated this one for now. Biggest decision is that my final project will be, what I now call, the Open Water Buddy. The main reason: I have no idea how to make it πŸ˜‰. Sounds silly but what the heck; I only live once. First change is the working title.

UWO

Udentified Water Object. Which in a sense does not do justice to what it will be able to do. To better help me design I will decribe it's functions from a users perspective. I will therefore call this person "User".

The object supports 2 main type of modes: normal and game mode.

NORMAL MODE

Scenario 01: GUIDE ME
  • User wants to go for a swim
  • User enters the water and turns on UWO
  • User selects "GUIDE ME"
  • User sets total distance in meters
  • User sets interval distance in meters
  • User selects "ACTIVATE"
  • UWO starts moving away from the user and keeps a safe distance
  • User start swimming
  • UWO signals when the total/ interval distance has been reached

Optional:

  • User selects photo on/off at interval
  • User selects video on/off
    • User selects continuous or interval/duration in seconds
Scenario 02: FOLLOW ME

Basically the same as GUIDE ME only now the user is followed by UWO.

Optional: - User puts a shark vin on top of the object or a rubber duck

GAME MODE

Scenario 03: CATH ME IF YOU CAN

Looks similar to "GUIDE ME". Object moves away from the user. Difference is that the movements of the object are random but always meant to get away from the swimmer. Of course you can set the maximum radius in which the oject is allowed to move. Also the maximum speed while moving.

Scenario 04: JAWS

Looks similar to "FOLLOW ME". Object tracks the user but tries to catch it. There is a multi-player mode which means that it will try to catch any swimmer it can. Again here you can set a max radius and max speed while moving.

WILDLIFE MODE

  • User wants to film wildlife on the water from nearby
  • User turns on UWO
  • User selects "WILDLIFE"
  • User sets total radius in meters
  • User sets total time in minutes
  • User selects "ACTIVATE"
  • User puts UWO in the water
  • UWO starts moving away from the user away from the shore
  • UWO goes into stealth mode
  • UWO moves towards wildlife
  • UWO films wildlife
  • UWO returns to the starting point once time is up

Non-functionals

I adjusted my non-functionals accordingly

  • It has to be safe. This means
    • no sharp edges that can cut you
    • soft impact if you get hit or you hit the object yourself
    • no change/ low risk of an electric shok when you touch the object (especially in water)
  • It is not allowed to pollute the water in any way (although it is open water)
  • It should be small/ strong enough to be thrown away (like a disc/ frisbee)
  • It should be quiet when in stealth mode
    • so animals are not disturbed or spooked by it
  • It should be self-supporting regarding energy
    • at least 30 minutes when in game mode
    • at least 2 hours when in guidance mode
    • at least 4 hous when in stealth mode
  • It should be difficult to detect it
    • only external sensors are above water
    • overal height above water should be kept to a minimum
  • It is able to put itself in an upright position
  • It should be possible to attach special accessoiries on it. For example
    • a shark vin (game mode)
    • a rubber duck (stealth mode)
  • It's direction should be clear for other vessels on the water when it is dark

System integration

UWO as a system will consist of several subsystems.

UX

Imagine being the water; maybe the user already has goggles on. This means that the interface should be easy to use and it's information clearly visible; even when it is dark(er). Rotating knobs? LED display in numbers. On the other hand may be the interface should be outside UWO. This would make it lighter? But what if you want to change some stuff while you are swimming. If the UX is outside how do you operate it then. Hmm..

Based on the directions from the user this subsystem is able to navigate in the right direction, the right speed. It's inputs are:

  • GPS location
  • Object detection (distance in meters, direction)
  • Swimmer detection (distance in meters, direction)
  • GeoFence
  • Mode/ scenario

It uses this information to pick a path at the right speed. For instance depending on the scenario it will I go toward or away from a swimmer.

While it is navigating it will output traveled distance in regular intervals.

Awareness

This subsystem is all about detecting objects; surroundings. It's input are:

  • GPS location
  • Map data (water side, buoys)
  • Camera/Image feed (maybe 360?)

Whether the camera feed is continous or just images I don't know yey

It uses the information to detect and output:

  • if UWO will hit something (if continuing in the direction)
  • what that something could actually be (could be wildlife, buoy, shore, swimmer)
  • at what distance
Imagery

This subsystem is responsible for detecting/ recording UWO's surrounding and storing it. It's input are:

  • GPS Location
  • Time/date
  • Continous camera feed (maybe 360?)

There is no output at this time but this could be cleaned images that are needed for the awareness subsystem

This subsystem is responsible for all lights above (ships, vessels) and under water (to follow UWO). It's input are:

  • Navigation lights on/off
  • Guidance lights on/off
  • System warning lights on/off (this is to show what the status is of UWO)
    • low battery
    • stuck/ don't know what to do
    • ...
Central unit

This part is responsible for the overall command structure; for receiving and providing information to the different subsystems.

Visuals/ mockups

Must stuff I can visualize myself but my biggest concern at the moment is the propulsion. I would like to use some type of jet engine (the ones that create forward motion based on pumping water; so no propellor). I think this would be fast and safe. So before I start creating a newer version of my 2D/ 3D sketch I asked for inspiration from GenAI. Short summary it also came up with a waterjet propulsion idea. For now I will assume I can create this.

GenAI also mentioned the term holonomic robot In short if I could accomplish this UWO would be able to "move in any direction from any orientation, creating an incredibly mobile robot. So, it's easy to move the robot in a congested area".

First 3D model in Solvespace

See week 2 for a description of the process. Just again the result for now.

Week 03

During our local session on Thursday, Henk suggested to discuss our final projects with Bas Pijls; just as an independent person. Regarding my idea he had some thoughts/ tips:

  • Student Mkhitar (2025) made a submarine; look into that
  • Water pressure from a "peralstaltic movement" is not fast enough
  • By the pump; it is very tricky to make yourself
  • Water tight is possible using epoxy.
  • Maybe I can create my model from "piepschuim" and cut out what I want (I will learn this during CNC week), then put epoxy in it and suc it vacuum (sounds nice πŸ˜„)
  • Overall do-able but choose what you make yourself

Week 09

So it has been a while since I've updated this page but assignments took over πŸ˜‰. Anyway this week I again thought about my final project. I think that RoboQuack 3000 is a more suitable name for it.

RoboQuack 3000 is an autonomous swimming fetch companion cleverly disguised as a classic yellow rubber duck.

alt text

created with Grok Imagine using the prompt a cute yellow rubber duck floating in open water, actively trying to catch swimming people, dynamic action scene, realistic water splashes, duck with determined expression pursuing swimmers

At first glance it looks like an innocent bath toy, but inside it hides custom-designed electronics, AI vision, navigation, powerfull thrust engine and a couple distinct operating modes (also see week09):

  • Game mode β€” it actively chases and tags swimmers with a cheerful quack
  • Swim mode β€” it swims steadily in front, maintaining perfect distance to lead the road
  • Stealth mode β€” it goes quiet and observes wildlife/ takes photos without disturbing the scene

Week 10

I decided to use the current duck I have. It's no too big, it's nice looking, it's already there. So now I only have to attach a motor in it, give it eyes and some kind of GPS sensor to know where it is.

I therefore took time to 3D scan the duck for the single purpose of using it later on in 3D programs like Blender or FreeCad or whatever. Why? Because I can then take it's measurements and use it to attach a floating platform on the outside and a plaform inside the duck to hold electronics; etc. It's nice for me to do that with a real duck in front of me.

Anyway please see [Scanning RoboDuck]](../finalproject/scanning_roboquack3000.md). And yes I changed it's name again to RoboDuck 3000 (a name says it all).

Week 11

So at the end of global class yesterday (1st of April) Neil mentioned again that midterm review is coming up and I should have finalised my plan by then. Also make sure to explain choices; they should answer a question. Specifically important are:

  • system diagram
  • tasks to complete
  • schedule

I'll therefore use this page as a diary and keep track of questions/thoughts and decisions and use sub pages for more in depth detail (like system diagram, tasks, design, bill of material, etc). I already started with this last week but now I'm sure that's the way I want to go forward.

Thoughts/questions

  • Based on input devices week and this week were I could try the Grove Vision AI v2 module, I still think that detecting heads/faces is able using an AI sensor. What's going to be a challenge is that it's also able to detect upon a range of 10 meters and under shaking circumstances.
  • How to prevent the duck from flipping over in water with waves and wind? It is very light.
  • How to attach the water jet engine to the duck?
  • How to control the device in early stages; like having a remote kill switch? If it goes off into the distance then I should be able to stop it remotely. Maybe I should just make it completely remotely?
  • What about water inside the duck? Were do I put the electronics?

Answers?

  • Maybe I can train my own model on these objects? Using Sensecraft it's not that hard I think; doable. I can then train first with object A and extend that with more objects.
  • I could make some kind of platform under the duck. I can then also use this platform to attach/ store the batteries. Maybe a catmaran design were the batteries are on both sides? I could attach the water jet in between and just stick the duck on top of it.

image>?

  • From Irja I got a link to chemicals to make 3D prints water tight. But I'm thinking of making the underwater hull during the molding and casting week; epoxy is water proof. So then the electronics could go in the duck it self. Probably as high as possible; maybe in the head? Also nice place to receive GPS signals and near the camera that I want to use.

image

  • Regarding remote control ... maybe I should just make it completely remote control. That way I can keep the duck like it is as much as possible. But of course the remote control should then be water tight as well as it will be used near the water.
  • Maybe a general switch on the duck (on/off)?
  • Remote control means a way to communicate through air. So not only receiving but also sending (to let the remote controller know everything is ok). What kind of technique can I use for this? From the global class I learned that it depends on power, required functionality and distance.

Trying out

alt text

Received my water jet pump with motor

My idea was first to squeeze this pump into an already floating device ...

alt text

I ordered a cheap RC ship before

alt text

Get an idea how this works and how they keep it dry from the inside

... but the ships plastic was very hard and I'm not sure how to attach it; maybe first watch a video or something.

Week 12/13

Still in middle of machine week but I also want to work on some ideas for my RoboDuck 3000.

During my midterm review with Henk and Take (global evalator) Henk mentioned that floating would actually be the first priority; and that is true. Once a base platform with my duck on top floats I can add other things. I did also mention that I bought the product Dichtol based on the YouTube video to make any 3D print water resistance (that was a tip from Irja (one of the interns)). But it was their shared opinion hat the coming molding & casting week would be the answer to creating my platform because the base needs to be water resistance; Take also did a lot of experimenting with 3D and water and found it to be very difficult.

Inspiration from others

I mentioned that I'm especially fearfull for my 3D skills with FreeCad/ Blender. So I like to see if/how others made objects that float using molding/casting/3D printing. What kind of shapes and how did thy make it water tight?

I found a couple of websites that I found to be interesting ...

Radio Controlled Duck

alt text

source: RC controlled duck. Platform is 3D printed and requires a hole in the bottom of the duck (standard off the shelf)

alt text

also uses a waterjet

alt text

platform below is fixated permanently with kit

alt text

but this means that for access the top of the duck has to be opened up

Kit-bashing a duck

alt text

source: Kit-bashing a duck. Platform is taken from a off-the-shelf RC boat.

alt text

advantage is that the propellors stay outside; already taken care off

How to Build an RC Duck - With Arduino and Wi-Fi

alt text

something on top and on the bottom; wires run around the duck

alt text

use a mount plate which is fixated with kit on the bottom; so no cutting in the duck

alt text

hmmm there are underwater motors appearantly

alt text

looks cool but I think it will be difficult to balance it because of the weight on top of the duck

Rene the rubber duck boat with a nice video

alt text

completely 3D printed

alt text

designed internally for motors and electronics

alt text

video shows a white duck; good view from the outside; the duck's body is place on top of it

How I built the fastest RC Duck boat

An extension by the same maker to his radio controlled duck. He does this by using a waterjet propulsion. Good tip is to use velcro (klittenband) inside to attach parts so it can easily be removed/ attached again later on.

alt text

most important part is the platform under the duck that will hold the waterjet

Molding and casting

There's a lot of info to take from this. But first I notice that this is mainly 3D printed. So why would I need molding/ casting? What is this anyway? So I looked up a video using a search phrase like what is molding and casting.

I watched about half of it and my take on this:

  • molding is the process of creating a container or "negative" impression of an object
  • casting is the process of filling a mold cavity/ container with a liquid material (for instance silicone, plaster, epoxy, or steel). The end result is the "positive" object again.

And yes I understand that I could use it to make a more water resistance platform on which the duck sits. I mean using silicon would even make it a bit soft so that when somebody hits the platform of the duck they are not hurt that much.

From my 3rd week I wrote down that the advise then was to make a mold from foam, use epoxy and then vacuum it. I don't know yet how that works and why that would be usefull but it sounds fun πŸ˜„

So for now I'll assume that the platform will be created using molding/casting.

alt text

To access all the inner parts it would be wise to create a hedge on top of it that can be closed with some screws. To make sure no water comes in I can use a sealing.

alt text

alt text

Other parts

The camera/ gps sensor will be mounted on the outside of the duck as high as possible. One way I can do that is by making it really look like a Robo duck; for instance by putting on a helmet like RoboCop.

As I have a scan of the duck I could 3D print the helmet and paint it later on with a silver metallic spray. Behind the visor I could make sure the camera can see outside. The GPS sensor could be just under the top of the helmet!?

Week 14

I used the Sunday to work mostly on my final project. As I promised myself I need to get something to float. As I bought a 3D printer I want to have an idea whether or not the duck will float when it's on top of a platform. So I decided to 3D print a first version of the platform.

Design process (again)

Here are pictures with explanation of the process.

alt text

take the measurements of the duck

alt text

so I can draw on paper

Then I started playing around with different layout's of possible components. Largely influenced by the power bank I want to use and the water propulsion system.

alt text

top level view

alt text

maybe the power bank can be under/ below?

alt text

but when looking from the side you can see I'll have problem to let water into the propulsion that way

alt text

ok so maybe the other way around; power bank on top

alt text

or power bank rotated

alt text

maybe I can make some kind of tail outside just for the propulsion

alt text

not very nice

alt text

I have another one but that one delivers only 7.4volts

alt text

but maybe I can buy another version so just for simulation I also added a PCB to pretend it's the logic

alt text

battery on the side

alt text

so from the side it could look like this

alt text

battery flat looking from the side; then I need less depth for the platform

Oh and I need to be able to use my hand from the top to change batteries later on. Let's test if there's space.

alt text

well I have big hands but it should be enough

Ok enough for now. I will try to find other batteries that provide 12V (for the motor; could also be 2x6V of course). Time to take some first measurements to desing it/ something in SolveSpace.

alt text

alt text

SolveSpace

I'm getting more familiar with SolveSpace. But I still found it time consuming. Here are some in between mistakes.

alt text

idea was to draw in 2D/ a plane and then revolve it around a line/ axis

alt text

well yes and no

alt text

nice a basket ... but why

I found out that for revolving I should only draw part of the drawing. So half a rectangle or half an object instead of it's symmetry alread. So when I started doing that I got better results.

alt text

Well it's not the result I really want but spiral desing and will it float so let's just print this one.

alt text

after 2 hours and using a draft kind of setting this came out; nice

alt text

Oh but the back/ wing has overhang ... hmmm have to find a solution for that

But will it float ...

alt text

yes it does πŸ˜„

alt text

and with some maneuvring even the duck will sit on top of it

Ok well yes I have somethig that floats but I found that:

  • needs to be deeper or needs side baland aotherwise duck wil flipover / wings
  • and place hodler for the duck/ so it stays in place

alt text

how about the weight it can take and does water come in? Well this looks ok.

What about weight that might actually be used

alt text

just some elements with a heavy power bank

alt text

not sure if I'll use this power bank but for the test it's nice to assume

Well it floats and water is NOT coming in

Design proces (again)

alt text

nossle how it should be attached at the back

alt text

just use drilling tools to make the hole; will fix later in 3D design

alt text

result sofar

alt text

used a drill to make a water inlet

alt text

this is how it should be fixated

alt text

bought a small 1mm drill use the bolts that came with the waterjet

alt text

idea is that I use those to put the water jet in place

alt text

but found that there were not long enough to also go through the 5mm bottom.

I ended up using duck tape to fixate the motor and to keep the water out. I used an older battery I had (7.4v 1300mAh) to power the motor for now and just turned it on and see what it would do.

it floats, it has some thrust despite the nossle not being attached

Learned/ decided/ questions:

  • the 3D printed platform does not let any water through despite being printed with DRAFT like settings.
  • the 3d printed platform is light; what if I change that for epoxy; won't it become to heavy?
  • I'm definitively NOT opening up the rubber duck. It would have to make some kind of mechanisme to close it of and attach it to the platform etc... This would only create more problems. So I'll stick to the helmet idea
  • to enable thrust the platform is to be below water. So it must be made heavier. A power bank will do that I think. BUT I should lower the point of gravity to make it more stable (like a sailing boat)
  • It also means that the service hole (the one I need to get into the hull) needs to really be water proof. This I could solve making some kind of hatch that has silicone/ flexible rubber as an inlay and use screws to close it
  • The bottom can be a bit thinner I think; now it's 5mm; my guess is that 3mm is enough

Week 14

At the start of the week Henk/ Remco gave me nice input.

alt text

How to fix the Duck onto the platform? Well use magnets

  • Epoxy is indeed much heavier than printed plastic. So idea to continue with 3D printed hull is ok for now
  • Why not move the GPS sensor in the hull? Does not need to be on top; in a building you can receive the signal as well; so will do fine in the hull. This also means that the electronic parts for this can move into the hull
  • Helmet with electronics; why not use a longer cable and different camera? Then electronics for this can also move to the hull. Henk send me two links: https://nl.aliexpress.com/item/1005009339247009.html and https://nl.aliexpress.com/item/32820946214.html

alt text

Remco suggested to make goggles and put the camera in there. I like it. I could CNC a mold and use Dragon skin type of material as casting material. Same material Remco used for last week's assignment.

Week 15

Ok 3 weeks to go; it's going to be fun.

During the week's assignment I tested the range of the connection between my laptop and the ESP32C6 via BLE. I ended up with a ESP32S3 that runs a Wifi access point that is connected to the Grove AI module. Wifi gives me a two way communication and enough range. I also built a small UI to talk to the the ESP32S3 using web sockets. The content for the UI is sent by the ESP32S3; it consists of Javascript with p5.js library and html.

Training AI model

I also found this article. It explains another way to create a model from scratch and convert it so it can be uploaded via SenseCraft.

alt text

using Edge Impulse; a leading development platform for machine learning on edge devices

It's good to know for now.

Working on the hull

alt text

Ripped apart this RC boat to see how they sealed the top

alt text

Old remote control from 10 years ago

to my surprise I got it working again with the receiver; even with the micro server I intend to use

Working on the hull prototype

My idea is to first complete the prototype of the hull and use this to try out everything. But for this I need to put it also into the water.

alt text

Used silicone kit to add the nozzle at the outside

alt text

I measured the thickness of the steering rod that the servo will use to move the angle of the nozzle. It will run through a small tube that I ordered online.

Time to unbox the GPS module from SeeedStudio that's based on the GPS Air530Z. I bought it a while ago because of the benefits for my outside project.

It supports GPS / Beidou / Glonass / Galileo / QZSS / SBAS, which makes it suitable for GNSS positioning applications such as car navigation, smart wear, and drone. Meanwhile, this module is capable of receiving more than 6 satellites at the same time and is able to work excellently even if there's a very bad signal. Low power consumption at only 31uA

It has a nice manual which is in Chinese πŸ˜‰ The wiki tells me more.

The basic code they provide

#include <SoftwareSerial.h>
SoftwareSerial SoftSerial(2, 3);
unsigned char buffer[64];                   // buffer array for data receive over serial port
int count=0;                                // counter for buffer array
void setup()
{
    SoftSerial.begin(9600);                 // the SoftSerial baud rate
    Serial.begin(9600);                     // the Serial port of Arduino baud rate.
}

void loop()
{
    if (SoftSerial.available())                     // if date is coming from software serial port ==> data is coming from SoftSerial shield
    {
        while(SoftSerial.available())               // reading data into char array
        {
            buffer[count++]=SoftSerial.read();      // writing data into array
            if(count == 64)break;
        }
        Serial.write(buffer,count);                 // if no data transmission ends, write buffer to hardware serial port
        clearBufferArray();                         // call clearBufferArray function to clear the stored data from the array
        count = 0;                                  // set counter of while loop to zeroΒ 
    }
    if (Serial.available())                 // if data is available on hardware serial port ==> data is coming from PC or notebook
    SoftSerial.write(Serial.read());        // write it to the SoftSerial shield
}


void clearBufferArray()                     // function to clear buffer array
{
    for (int i=0; i<count;i++)
    {
        buffer[i]=NULL;
    }                      // clear all index of array with command NULL
}

So I tried this out with a basic setup using an older PCB I made

alt text

After turning it on

Knows where it is

Ok then switching wire, uploading code I got a lot rubbish ... maybe to fast? I adjusted the speed to 9600 and then it worked fine.

I looked for info on the info coming out of this sensor. Via this article I was directed to an English translation of the Chinese manual. From this I get that I can send commands to it. But also that a lot of people are using this and that there are libraries.

Below is piece of the output that goes on and on

$GPTXT,01,01,01,ANTENNA OK*35
$GNGGA,164442.000,5218.96475,N,00503.42767,E,1,19,0.7,3.9,M,43.0,M,,*40
$GNGLL,5218.96475,N,00503.42767,E,164442.000,A,A*47
$GNGSA,A,3,01,03,04,06,09,17,19,28,31,,,,1.4,0.7,1.2,1*3F
$GNGSA,A,3,07,10,11,12,19,20,23,29,32,35,,,1.4,0.7,1.2,4*37
$GPGSV,3,1,12,01,31,139,36,02,,,15,03,62,075,41,04,66,174,29,0*52
$GPGSV,3,2,12,06,40,304,37,09,37,209,34,12,,,26,17,33,234,37,0*57
$GPGSV,3,3,12,19,39,271,37,25,,,25,28,18,040,30,31,28,068,33,0*56
$BDGSV,3,1,12,07,25,045,32,10,26,056,20,11,25,173,30,12,82,225,32,0*7D
$BDGSV,3,2,12,19,52,239,27,20,76,066,39,23,11,051,20,25,,,13,0*4F
$BDGSV,3,3,12,29,41,192,38,30,,,14,32,18,062,22,35,50,281,36,0*4F
$GNRMC,164442.000,A,5218.96475,N,00503.42767,E,0.00,102.38,040526,,

Appearantly the output is in the NMEA format.

NMEA is an acronym for the National Marine Electronics Association. NMEA existed well before GPS was invented. The purpose of NMEA is to give equipment users the ability to mix and match hardware and software. NMEA-formatted GPS data also makes life easier for software developers to write software for a wide variety of GPS receivers instead of having to write a custom interface for each GPS receiver. There are different NMEA sentence type, and the type is indicated by the first characters before the comma

Ok, this is rabit hole, so it would be helpful to use a libary. As Arduino itself does not provide one (I've looked but nothing with GPS Air etc..) I found an option. Looking at the header file and the example code the author provides a way to send commands to the sensor to only get what you want.

My plan is to keep it simple for now, just pick out the lines that are related to my regional area and later on send commands if needed. But what info is for my region?

alt text

According to Wikipedia it starts with a Talker ID followed by a sentence.

alt text

So when I want to use GPS information and want to know were I am and how fast I'm going than RMC is my guy/ girl.

Example: $GPRMC,092750.000,A,5321.6802,N,00630.3372,W,0.02,31.66,280511,,,A*43 Means: UTC Time 09:27:50, location 53Β°21.6802β€²N 6Β°30.3372β€²W. Speed over ground 0.02 knots, course over ground 31.66Β°. Date is 28 May 2011.

Without a big library I should be able to read lines from the output and then split that string into these parts.

Looking at the output I don't see GPSRMC but I do see GNRMC. This indicates appearantly that the data comes from a combination of multiple satellite navigation systems, not just one; GN = GNSS (Global Navigation Satellite System).

I then worked on a basic setup of the code which let me think about the PCB design.

PCB

So the Navigation module will take care of managing the motor, the micro server while getting input from a GPS sensor. On top of that it takes commands from the central unit via I2C; also to communicate back. Based on that idea I extended a design I made a time ago.

alt text

page number refers to Practical Electronics for inventors

alt text

something old and something new

Is everything ok enough to switch to Kicad?

  • During the group assignment we worked with I2C between PCB's so this should work here as well.

  • I tried the micro-servo before and remembered that Kris (from Finland) suggested to add a capacitor. Because they can create big, sudden current spikes when they move for a fraction of a second. This can lead to: jitter or even the MC resetting because of the power drainage.

Looking at AdaFruit

You can usually cure it by adding a high value capacitor (470uF or greater) between GND and 5V on the breadboard. The capacitor acts as a reservoir of electricity for the motor to use, so that when it starts, it takes charge from the capacitor as well as the Arduino supply. The longer lead of the capacitor is the positive lead and this should be connected to 5V. The negative lead is also often marked with a '-' symbol.

  • What about the Mosfet?

Well at home I used the book Practical Electronics for inventors to come up with this and according to this source I need to add a pull-down resistor between the GATE and SOURCE of the MOSFET.

alt text

Note

It gave me the idea to have an atonomous home function built-in. If the duck would loose it's connection during more than 5 minutes it would go home to a pre-programmed location.

Week 16

At home, I spend the last part of Wednesday drawing schematics and options of my logic/PCB's etc.

System design

alt text

option 1 leaves AI interpreation to the brain and get info from AI via UART; in option 2 I moved object recognisition completely to seperate MC, now the brain talks via I2C to everybody

alt text

Navigation unit extended with new ideas

alt text

The brain will control everything and talk to the other units

Note

I'm aware that the RP2040 that will run the navigation unit is going to be busy. I was also concerned that it could not do these tasks in parallel (PWM on micro servo, PWM for the motor and reading UART). But a quick search on the internet linked me to a Github repo that enables me to use Hardware-based PWM channels on RP2040-based boards. Again a todo thingie.

Hull design v2

Based on input from the group I struggled with the idea of a tunnel and then attach the battery below that. I also worried more about the possible speed of the duck (meaning not at all πŸ˜‰) and what's does it mean to be a RoboDuck then?

Long story short I did a bit of flip thinking. Why not use 2 jets.

alt text

alt text

The hatch problem does not get worse or better but sure enough I can now lower the battery like the keel of a sailing boat for more stability. The 2 jets will at least mean more speed than 1.

Regarding steering ... Option: I don't need the micro servo's anymore. To steer I could just have more power on 1 jet and less power on the other. Other option: have a central rudder attached to the micro-servo.

alt text

measuring one of the waterjet pumps

alt text

measuring the protection that is attached below the inlet

alt text

the power bank that's going to act as battery

alt text

some kind of pocket needs to be created in which the battery goes vertical below the duck

alt text

enough width for 2 power jets and 1 battery

alt text

Idea is that the battery is positioned in such a way that both the center of gravity of the duck and the battery are around the same spot. Idea is that it will not lean forward or backward.

alt text

if the battery is positioned like this then we should be ok. But for space I need to somehow place the waterjets a bit outside at the back

Visualize design hull v2

First I switched to the latest stable version of Solvespace; release 3.2 from March 2026. Good to know they are still enhancing the software.

Before lunch I wanted to print the battery holder. Piece of cake. BUT NO :sad: .. I had a lot of trouble with the boolean operations.

alt text

After exporting my 'hollow' design as STL (at least I thought it was) and importing it in PrusaSlicer it was in fact a brick

alt text

Some of my trials before creating the design of the battery holder. I found out that I have to start from the outside in.

alt text

Then finally I got the ring in which the battery should fit. But as my daugter is learning for exams I can't print it right now. It looks good in Prusaslicer though.

alt text

Then still a struggle to create a hole in the bottom of the platform ... Arghh

Later that day I just started again; this time with better results.

alt text

only part of the hull but this time smoother than version 1 which was really a box

alt text

bottom view shows the rounded outside and inside hull

alt text

piece of the hull and battery holder

alt text

doesn't have to be perfect just want it asap

alt text

But anyway this fits very nicely

alt text

Might a bit too wide but let's wait and see. Two powerjet's and a battery in the middle should be no problem

Then updated my documentation until that moment.

Visual design battery holder

alt text

one block with curved corners

alt text

created similar structure on the inside leaving a wall that's 3mm thick

So the holder will be under the bottom and fixated using silicone kit. But if the bottom of the holder brakes the power bank could slip out. So I wanted to enforce the structure by creating two crossbars on the side with a pin going through just for extra safety.

alt text

yes getting there

alt text

but .. not really cross

alt text

cross indeed

alt text

now even with hole

alt text

In PrusaSlice it all looks good but why only on two sides?

alt text

Let's make it 4 sides

alt text

yes much better

alt text

let's print this

BUT WHERE'S THE BOTTOM OF THE HOLDER??

alt text

back to work

alt text

ah yes this is what I want

alt text

Oh no, straight corners :sad: This way it won't glide into the hole inside the hull

alt text

Back to work

alt text

Left (green) is the one I want

alt text

Finally let's print this version

alt text

Took around 1 hour 45 minutes

alt text

Powerbank fits nicely

Visual design hull v3

With my notes/ measurements I went back to SolveSpace to model my hull; specifically the outer parts where the waterjets should be fitted. So a hole in the back and below. This time I described the process in week 16 assignment. To summarize I hgad Some of the images I've duplicated here as well

alt text

partly print to test fitting of the waterjets

alt text

looks good

alt text

to see in perspective of other components

alt text

at the end of the day

Week 17

Working on wiring

alt text

laying out the materials; heat shrink tubes; diameter 2.5 mm

alt text

soldered wires to the motors and added shrinking tubes around it

alt text

heat gun set to 410 degrees Celcius

alt text

easy peacy ... just a bit of hot air

Then I changed the end of the Grove cable, the one coming from the Grove Vision AI module, to have the same type of 4 connector as the one I already attached to the GPS sensor earlier on

alt text

currently ends with propriatery comnnector

alt text

just cut it, add the connector and squeez it

alt text

and voilΓ‘

Visual design hull v4

My goal is to design the lid and see where I can put the electronic components. So I first inspected the outcome of the previous design.

alt text

Hmmm the hull is too wide; I could take 60mm off easily.

alt text

and too long; here I got also get rid of another 50mm

Improving this and maintaining the centre of gravity would help me reduce time to create the hull and make it nicer. Like the duck really sitting on top of the hull. Bit let's first start with the lid.

I drew the option of the classic idea of something that could be places on top with some kind of sealing on both sides of the "contour of the hull" .. And to close it and unclose it (to take out the battery etc) I decided to use bolts on the outside. Not everywhere but for instance 3 on both sides and 1 at the back.

Experiment

I did some experiments in SolveSpace how to draw this. That was a good idea as I still mix up the boolean operations; it appeared to be a horrible exercise; took a lot of time. I started with some experiments in a new design

alt text

creating a mockup contour

alt text

making it only 3mm in depth

alt text

pretend a lid goes over it; using difference; it wanted to leave the inside is of the hull; now it just removes it

alt text

but intersection doesn't work either of course because it will keep only what's in common

Then I remembered again to start from outside in. So I created the bigger hull first(!) and then subtracted the outer contour from it

alt text

Yes looks promising

alt text

PrusaSlicer agrees; this is nice

Ok now let's add areas for the future bolts to go through

alt text

works

Then I worked from the same idea to have a big area and subtract my design from it. So I first tried this inside my current design.

alt text

but as you can see it leaves me only with the contour; not the lid and inside the contour

So I fugured out that this can only be done by making a new design and linking the old one as assembly; then it could be treated with the option difference

alt text

alt text

This means however that I will have to copy the contour of the hull at the top and copy it to a new design later on. Because I can't now shift layers in my current design (or at least I can't find that option).

Experiment 2

So I thought to change my current design and then later make the lid; in the way I just described.

alt text

adding a bolt area

alt text

yes comes through all the way

But then I exported the contour just for fun and viewed it in PrusaSlice

alt text

I could not lay it down because it was too big, even for a Prusa Core ONE (arggghhh). I can't print it that way. The only way to do that is to make the design smaller like I suggested earlier that day. So I started again with a new design. The big difference this time was that I really tried to WORK FROM OUTSIDE IN

alt text

alt text

alt text

alt text

alt text

alt text

Prusa likes it to and it can now be printed flat

Remark: I did stop the printer 2 times just before it would start

alt text

the area for the power bank is skewed

alt text

the opening for the bolts are to near the outlets

estimated time is 1h45m; that's 1 hour less than the previous design

It came out like this

alt text

The lid

The next morning I subtracted the design from the extruded contour of the duck itself. Like I tried the day before. I printed this

alt text

view in PrusaSlicer

alt text

ended up like this

alt text

fits very well on the outer side of the hull

alt text

much nicer shape overall design despite the 2 holes at the back

PrusaSlicer trick

alt text

When in cut mode you can use the SHIFT to draw a line in a plane. This will cut it right were the line was drawn. That way you can just try out parts of the design and not print everything all the time

PCB Navigation

After our group work regarding the use of composite materials I went on with the design of navigation pcb.

alt text

I exported my hull design as DXF and used this as background to layout mmy PCB

alt text

It took me 2.5 hours to get it in a shape that would meet all the rules

alt text

Just before milling it I decided to save space for now and make it like a rectangular. If it works then I can always adjust it for the shape I need and mill second one.

Milling the PCB Navigation

Because Remco had some problems this week I discussed his latest settings. Based on this I used a cut depth of 0.004 inch instead of the usual 0.003inch and offset 4 (as usual).

alt text

saving my home position before milling the top layer

alt text

the cutout went right through by pcb??

Henk and I discussed how this could have happened but we ended up having no clue. Just try again. Restart the browser. Also Henk mentioned that the top layer was not cut deep enough? Again strange. Henk releveld the bit in the middle of the PCB(!!) using a paper to see if it was bearly holding it. After this i tried again.

Even then the top layer was still not milled properly; much better than the first time though. Henk suggested to mill it again using 0.005inch cut depth.

alt text

even after using 0.005inch cut depth it was still not entirely ok. I removed this by hand with a very small screw driver

Soldering the PCB Navigation

Both MOSFET's have a surface that needs to be soldered onto the pcb area itself.

alt text

Henk showed me how to use a bit of FLUX on the spot

alt text

Then put a little solder on it which flows all directions (because of the FLUX)

alt text

After which you place the MOSFET on top of the solder and use a heat gun to make the solder soft again. And voilΓ‘

alt text

This time I tried myself

alt text

All the pieces on the board

Testing the PCB Navigation

In the evening I saw that at least the power line worked

The ESP32S3 (on the left) is powered by a USB cable. From there the RP2040 is powered and from there the GPS sensor

alt text

Then used some old code to see that the RP2040 could still communicate with GPS sensor

Note

The ESP32S3 could communicate via I2C with the RP2040 so that's good. I then tried to get power out of the MOSFETS. Basically I got something but it is either 12V or nothing. Work in progress.

Design motorholders

alt text

the space I have to mount the motor; as it is very little I can't just slide in a motor from aside; so I'll create a holder that I can later glue inside

Started with a design in my sketchbook after measuring everything. My idea is to have 2 rings: one at the front and one at the back leaving an opening for cooling in the middle

alt text

diameter 27.2mm; near the waterjet 3mm elevation; 4mm near the other side. So it's angle is skewed.

alt text

sliced with organic support

alt text

after it was printed

alt text

Problem with this design: a) too thin and b) forgot to have the outer hull all the way through

alt text

But I the because the centre line was skewed the circles would not match. I didn't know how to make a tube in a different angle

alt text

So I went for 1 tube all the way through; that way I would now it would at least fit; but the angle would probably be a bit off

alt text

this time no support needed as I printed it on the side

alt text

came out nicely but it was way to narrow for the motor to fit in

So extended the inner ring diameter and tried again

alt text

well yes it did allow me to fit in the motor but it was stuck

alt text

had to brake it apart with plyers

But before just printing a newer version I want to solve the angle; I managed to do so creating a seperate plane that was skewed and used that to draw the outer and inner circle

alt text

so the centre axis of the circles are now in an angle

alt text

and decided to allow the back of the motor to cool and only attach it at the front; for this reason I made the outer wall thicker

After printing this it the inner diameter was still to narrow; why?

alt text

alt text

you can see the angle from aside

So I printed a new one (again) but still not ok; huh????

alt text

I measured the inner diameter of the last version and found it to be 27.3mm exact as specified in SolveSpace; amazing! But it should be at least 27.35mm as I measured the diameter of the motor again. Well yes that explain a lot. I now changed it to 27.45mm. It is still very tight and if the motor heats a lot it will expand. So I will try another version with 27.55mm inside diameter.

Design Grove AI module holder

Parallel to printing the motor holder I worked on a holder for the Grove AI module v2. As it has the ESP32S3 chip on top with Wifi, I want it as far away as possible from the GPS sensor and a bit elevated from the bottom in case some water comes in.

alt text

First again on paper

I iterated through a couple of designs and printed it almost right away; sometimes with the motor holder together.

alt text

version 1

alt text

2nd version

alt text

3rd version

alt text

so the whole construction rise above the top level

I printed a 4th version which is now ok.

alt text

for the motor holder and this holder I quickly printed it using .28mm PLA, 5% infill and only neccesary support

alt text

result

Lid with magnets

Before working on a 2nd version of the lid I went over the design, got rid of (almost) all degrees of freedom and found that the centre line of the power bank was not exactly the middle.

alt text

a bit of centre

I found a new way of creating the lid:

alt text

I used the normal trick to point both the lid and assembly object in the same direction

alt text

using a circle and a bezier curve to match the duck's contour

alt text

extruded this to 6mm thicknes and created a plane inside at the middle

alt text

subtracted the platform as assemly object and attached it to this plane

alt text

then place insert for the GPS antenna at the front

alt text

then designed place hodlers for several magnets

alt text

and marked the duck at those places

Floating experiment

Bringing it all together ...

alt text

latest version printed during the night

alt text

battery holder fits more nicely; still overhang type of problems at the front but I didn't use support so that might explain it

alt text

the new lid sticks to the top like a brick

alt text

for now just tape it

alt text

also this of course

alt text

centre line of the duck seems to match the centre line of the power bank

When I put it in the water ...

Houston we have a problem

So it needs weight .. and I don't want to put in my power bank just yet. It ways around 390gr.

alt text

replaced the power bank with screws that weigh around 400gr.

alt text

ready again

ok no flipping anymore; but it's skewed?

So the cause is most probably a bit of balance and the fact that water was coming in that choose one side to go too

alt text

somehow the tape is not good enough

But I have another issue ... the water jet intakes are under water but the nozzles are not. No thrust if it's just throwing out water in the air. I need more weight for now.

alt text

I found that 4 oranges actually are enough (without the duck even)

alt text

they weigh 644 grams; that's another power bank at least

Week 18

Back to PWM

So at least it does something; but why again?. To be honest, I'm a bit rusty on explaining Pulse Width Modulation to myself so I looked up the standard Arduino documentation about this subject.

Pulse Width Modulation, or PWM, is a technique for getting analog results with digital means.

So digital control is used to create a square wave = a signal switched between on and off

alt text

src: https://docs.arduino.cc/learn/microcontrollers/analog-output/

So in case of PWM frequency is set to 500Hz it means that each green line represents 2msec (2 miliseconds; 1/500). The value I set via analogWrite() basically means that I tell the microcontroller how much of the time I want it to set this cycle to on.

In my case, were I use it in combination with a MOSFET, it will produce an average voltage to run the motors; like with the LED dimming exercise we did a while back.

But what frequency should I use? It doesn't say anything about the frequency that is suitable for DC brushed motors though.

I found this article.

Rotor coil inductance becomes an important factor to consider when using PWM for motor speed control. The motor coil works best when the applied voltage is relatively steady since it needs time for its magnetic field to reach the needed strength. At higher PWM frequencies, the pulses from the motor controller board change too quickly to provide enough energy to spin the motor ... When the PWM frequency is lowered, the motor’s coils extract more energy from the pulsed PWM signal. That means that the motor will start spinning at a lower equivalent voltage and will operate with improved torque at low speeds.

The article even mentions a frequency of 20Hz or, if this leads to too much chatter, use 400Hz. But it also refes to a geared motor.

My take on this:

  • Higher PWM frequency means that the motor has less time per pulse to build up power to move; lower torque; but smoother operation
  • Lower PWM frequency means that the motor almost reacts right a way, higher torque but may feel/ sound a bit rough.

So when silence is the thing I want (and I want this) a higher PWM frequency is preferable. But does it have to be 20kHz?

Let's test all of this.

I therefore did a small experiment performing the same loop at different frequencies:

  • 20Khz: fine, spinning start audible around a value of 30
  • 10Khz: smiliar to 20KHz
  • 5000Khz: a distance anoying sound is in my ears which disappears when the value reaches around 200
  • 2500KHz: even worse than 5000Khz
  • 1000Khz: I hear the motor having trouble; it doesn't like it
  • anything lower than this ended up in a lot of noise and poor performance

So start 20Khz is good enough for now.

Testing the motors

I hooked up one of the motors to the right output and run a small PWM program consisting of

// setting the motor pins as output
pinMode(MOTOR_LEFT, OUTPUT);
pinMode(MOTOR_RIGHT, OUTPUT);

// setting the PWM frequence to 20kHz
analogWriteFreq(20000); 

// then use
analogWrite(MOTOR_LEFT, <number>); // this to increase the duty cycle and therefore increase the load on the motor

I ran a loop increasing from 0 to 255 and have small breaks in between them. Well the good news is that motors actually work/run.

At full speed the motor draws around 0.18A of current at 12V; given that is has no workload at the moment!

Note

When at max they draw each around 0.18A at 12V. I even tried to stop one with my fingers and that was difficult to do but then the load increased to 0.35A. When I really tried to stop it I burned my fingers a bit and the current reached around 0.9A.

Note

I measured the amount of decibels between a frequency of 20kHz and 10kHz. Although the 10kHz sounded/ felt a bit louder it was around the same; between 69-71 decibels.

I then tried to increase the range to 270 but found it didn't matter; a value of 270 gave the same loudness/ result as 255.

Note

Looking up the function analogWrite() this makes sense. The value has a range of [0,255] = the duty cycle: between 0 (always off) and 255 (always on). Any value higher than 255 doesn't make a difference.

Next related function is analogWriteResolution(). Looking it up I found

Its meant to leverage the full range of the DAC and PWM outputs It defaults to 8 bits (values between 0 - 255) for backward compatibility with AVR based boards. The value can range from 1 to 32

The microcontroller is the limiting factor. So if it supports 10bits resolution this means it slices the PWM duty cycle in 1024 steps.

analogWriteResolution(10); // sets the resolution to 10bits
analogWrite(<pin>, map(<value>, 0, 499, 0, 1024)); // given the value has a range between [0,499]

So how about the XIAO RP2040? Time for its datasheet. Paragraph 4.6 mentions:

It has 2 PWM channels A & B GPIO's are attached to either A or B A channel can be set to a certain frequency (paragraph 4.6.2.4. Clock Divider)

Do I need to set different frequencies per motor? No I don't so using the standard analogWriteFreq() is enough. No special libraries needed specifically for the RP2040.

Next I need an idea whether or not the resolution makes a difference. I therefore made some code to experiment with 8 and 10 bits resolution. My conclusion it that you build up more slowly to the amount of power you want to apply BUT the final output stays the same.

Another question is IF, once I set a value via analogWrite() this remains that way until I set another value. The idea is that micro-controller can do other stuff in between.

Power

I also found the my powerbank just stopped when the current stayed below 0.05A during a longer time. For this I also did a small experiment. I set the motors to 20% during 1 minute; this lead to the power bank turning off. Jaiks ...

I therefore connected everything to see if it would draw enough current to keep the powerbank going.

alt text

I found out that when I connect the USB output for my 12V to IN/OUT USB-C type then on the display PD shows in green. Now it is still running without a problem.

And what if I connect my micro-controller to this same output? So I connected the brain via USB-C to the powerbank and watched it for a while. It kept running. And on a type USB-A output? (reason for this is because I have just one USB-C type of exit on this powerbank). And after 10 minutes it was still running.

Note

Hooking everything up led to the burn-out of my ESP32S3 :sad: ... The only thing I can think of is that it somehow got more power on a pin then it could handle. Because instead of hooking up the ESP32S3 to the USB power directly (as designed) I hooked up the RP2040 instead. I did a test earlier which was not a problem but I guess I must have turned the connector around somehow. Anyway, it was still blinking though; no white smoke or something.

Note

When I hook up the RP2040 to the USB-C directly it throws out 5V to the GPS sensor. According to the specs this should not be a problem. I see it's blinking again so never mind.

alt text

When I both hook up the motors and the brain to the powerbank then it defaults to 5V power that is requested by the brain. So this means that I have to use a different supply for the motors; luckily I already thought of this a while ago and it arrived today.

Lessons learned - design updated

Lessons learned sofar:

  • frequency 20kHz
  • 8-bit resolution
  • connect 12V to the USB-C type of the powerbank to power the brain
  • power the motors via a seperate 12V source (which I ordered a while ago and just received)
  • use the cables as designed to power the rest

My final setup will probably look something like this. 12V from a seperate battery and 5V from the USB-C socket to the brain via the powerbank

GPS sensor

Most of my morning on Friday I spent on getting reconnected with my GPS sensor. I measured if it would get power, I revert to very simple code to read it, I read the manual again. But because it already worked again a couple of days ago I was really lost.

alt text

Attached pins directly on the cable of the sensor but couldn't get any reading out of it

I therefore just tried a completely different GPS GT-U7 GPS Module. I soldered the pins onto it and gave it power via a small micro-usb connection. When I started the serial monitor instantly I saw data. I then wrote some code to work on the ESP32C6 and there it worked as well. I then switched to the RP2040 using PlatformIO and just changing a few lines of code it worked there as well.

alt text

GPS sensor connected directly on the pins of the ESP32C6

alt text

Yes ... I'm getting data

My guess is that it might be the cable and/or attachment that's not working or I also burned this one to the ground yesterday.

Result ... appearantly one time per second, less than the Grove sensor .. but fine for now

Wifi access point

Henk gave me a new ESP32S3 to which I soldered pins. I then referred to old code I wrote a couple of weeks ago were I made a hand-gesture game using the ESP32S3 as Wifi access point and front-end code that I uploaded via little filesystem. So I spent time on cleaning that code up as a base for my Roboduck3000.

alt text

I asked help from AI to generate the UI front-end code. This time I didn't want a ps5.js library as it was way to heavy for it's purpose and it took a long time load from the ESP32S3. It gave me a nice simple colorfull interface.

I worked on the code until it was sending every command from the UI to the Wifi server where it showed up in the serial monitor.

alt text

Hooked up the Grove Vision module again and that worked as well (still ;-))

Now I want the brain talk to the navigation unit. So I added just a piece of code in the brain's code

    Wire.requestFrom(I2C_NAV_ADDRESS, 6);    // request 6 bytes from peripheral device #8
    while (Wire.available()) { // peripheral may send less than requested
        char c = Wire.read(); // receive a byte as character
        Serial.print(c);         // print the character
    }

I then updated the code for the RP2040 to always respond something (at least 6 characters). This was based on the experiment that I saw the master send a request only once. But of course looking at the loop above this is normal. I would send "" (empty string) so it just waited there.

The brain asks for detection of images from the camera via the AI module. At the same time 123456 means it get's a response from the navigation unit after it asked for an update

My short conclusion is that my PCB is ok. I attached the wires exactly like my PCB and the system is just working.

Back to design of the parts

On Saturday morning I first sat down and started with notes on what I still had todo.

alt text

current design of the motor holder can also be placed on the side wall; it needs to be flat thought then

alt text

I want to lower the whole hull by 15mm. This means the duck will come down as well making it more near the water and less wobly. So the power bank needs to be lowered

alt text

Somehow it is still difficult to fit the waterjet in at the back. Needs a bit more space there

alt text

Yes now I have another battery to store. Where do I put it? My thought now is to put it in the keel behind the power bank

alt text

To turn on/off the system I'm using a magnetic pogo pin. I'll place it at the back

alt text

Based also on input from Remco and Heleen .... I'll find another way to attach the lid to the hull but these things have to go

I basically picked these up one by one in SolveSpace.

Motor holders

In between I adjusted the motor holder and printed newer versions using transparent PETG filament (just to see what it would do).

Remark: The filament I used was from a Dutch company Real filament. They provided special config files for their filament which I installed on Prusa slicer according to their manual. Yes I saw a list but as soon as I selected my own 3D printer they were gone. So I choose the Prusa PETG config for now.

alt text

Tweaking in SolveSpace

alt text

Doing a quick fit test using .28 draft and 5% infill with no support

alt text

This one is still a bit too wide (but very nice though)

alt text

Good fit on the second try

Overall length and height of the hull

Back to picking up the changes I also changed the overall length/height of the platform; no reason to have a lot of air inside when it's not needed and it also lowers the centre of gravity. Because I also wanted to test the water proofing my idea was to now print at 0.2mm instead of 0.28 to reduce the width of the holes inside which enable the Dichtol to do it's work. And I like the motors I wanted to use PETG for the hull as well because it would make it lighter.

alt text

using 5% infill, 0.2mm and organic support; looking good ... but wait no way to attach the lid where are the anchors?

But just before I pressed start I remembered to also adjust the system by which I close the lid. I want to bolts going from the top from the lid through the lid to the inside of the hull were there are nuts.

alt text

lowered the anchors 4mm down to not interfere with the lid

alt text

I want to place nuts here using the pause option in PrusaSlicer

alt text

But most probably the support will be in the hole!?!? Let's just try

alt text

Indeed, there's filament support so no place for my nut. And the hole is too little also.

alt text

I then designed the lid and printed that

alt text

Result at the end of the day

Next day I inspected everything more closely again. It needs some tweaks.

on top the holes for the bolts should be a bit wider so theh fall in like the magnets / /the

alt text

The squares make it difficult to close the lid; should lower them

alt text

magnets fit; bit more space is ok as well

alt text

Inner hull were the bolts should be attached should be lowered 4mm so they don't interfere with the lid (now one of them broke off while opening the lid again)

alt text

Because it's all very tight it broke

Again making notes for myself

alt text

alt text

alt text

move the formost bolt more to the inside

alt text

alt text

waterjets do fit

Back to design and printing again; making adjustments according to plan

alt text

lower the anchors

alt text

floating anchors? No that's not a good idea πŸ˜‰

alt text

give them some body

alt text

yes that's better

So the result

alt text

alt text

And the lid

alt text

Later on I also made a small test object with a lid.

alt text

The idea is to have a bolt going all the way through the hull from bottom to top. It is possible

Waterproofing

alt text

I created a small test object to simulate the hull

alt text

And used Dichtol to make it water proof; letting it dry for around 3hr (as it's 1mm per hour)

alt text

Put it to the test in water and leave it there

alt text

Next morning was still dry

alt text

Below you can see the stuff that dried up

alt text

And to complete it all I took some tube from a bicycle; plan is to use this as seal for the bolts

Converting 12V to 5V

I've to make a decision regarding power.

alt text

I can combine the powerbank (5v) with a 12v battery OR I can just the 12v battery and use a buck converter/ step down converter to create 5v from 12v (the one I show is something I have at home)

alt text

the step down works

alt text

And the RP2040 is able to get 5v IN on it's 5V pin (the ESP32S3 does NOT allow this)

alt text

And the 12V fits nicely into the holder I already designed including the converter

So 12V it is

So at our Fablab I showed Henk my 'off-the-shelf' solution for the 12V to 5V conversion (and the RP2040 can take 5V as input on it's pin and yes I can store this converter inside the battery holder).

"But Henk, it must be possible to make it smaller right?"

And yes indeed, Henk provided me with a couple of links to so called voltage regulators that are available at our Fablab:

  • https://www.digikey.com/en/products/detail/diodes-incorporated/AZ1117IH-3-3TRG1/5699682
  • https://www.digikey.com/en/products/detail/onsemi/NCV1117ST50T3G/1792666
  • (towards mA) https://www.digikey.com/en/products/detail/texas-instruments/LM3480IM3-5-0-NOPB/270721
  • https://www.digikey.com/en/products/detail/texas-instruments/LM3480IM3-3-3-NOPB/270720

Remark: the ESP32S3 can have 5v input but only via USB-C; on it's pin it can handle 3.7V.

To focus I need to convert 12V to 5v or 3v3. But what kind of current are we talking about? Well the information about the RP2040 is not very helpfull; basically no info there. But I remember from the tests I did last Thursday (using the Mosfets) it uses around 0.04A = 40mA ... The ESP32S3 uses around 50mA in active state.

So (like Henk suggested) I can use seperate regulators for both the RP2040 and ESP32S3 and I will use one that's in the range of 100mA (because that's enough). This leads me to:

alt text

For now I just added them in my Kicad schema so I have a footprint to work with

Fixating electronics on the inside of the lid

Regarding fixating several electronic components / Navigation PCB on the inside of the lid Henk mentioned the use of double sided tape and inserts.

3D inserts

I watched this video and learned:

  • temperature should be set to around 240 degrees Celsius
  • use a square solder tip if possible (usually soldering tips are conical) because it will otherwise stuck to the nut you just inserted
  • don't push them all the way in because they leave burn marks around them. Instead leave 1mm and turn it around and put it on a flat surface which will push it all the way in
  • for inside holes you can use a flat bolt to push it in

Regarding the diameter of the holes in the 3D design they all refer to the specs from the supplier.

alt text

So in my case that would be a diameter of 3.2mm with a depth of 4mm when I'm using the M2

Anyway it looks promising.

When using the M2 bolts than I'm dealing with these specs

alt text

I therefore created a 3D printed block that contains a lot of different diameters.

alt text

first row from the top starts with 3.1mm diameter; 2nd row with 4.1 and 3rd row with 5.1

alt text

equal depth for all

alt text

PrusaSlicer mentions 4hours????? Appearantly I made a mistake in my design using 60mm thickness instead of 6mm

alt text

this will only take around 25 minutes

alt text

So as soon as I have the inserts I can test the right diameter for M2 and M3

On/off switch

My idea of a general on/off switch is to use magenetic pogo pin. It will go through the lid. Part of it will be attached to the duck

Once it clicks, it can act as a switch

Intermediate reflection

alt text

Still a lot of stuff to do

I made a couple of decisions sofar:

  • PETG looks nice but for the hull I'll use PLA (tougher and more smooth)
  • (optional) Use PETG for the lid as it is more flexible and I can see a bit what's going on inside.
  • Switch to 1 12v power source BUT use the current battery holder design
  • Use a pogo pin as a general on/off switch (which is now more easy because of the one power source)
  • Use inserts to attach the lid to the hull
  • Use inserts to attach electronic components to holders
  • Use doublde sided tape to attach the Navigation PCB and the holders to the lid
  • Use the GPS GT-U7 GPS Module instead of that of Seeedstudio; it's flat and I can solder wires to it (and it worked last time)

Consequences:

  • Design holders for the electronic components
  • Experiment with inserts / diameters to see how I should design the space for inserts
  • Adjust design of the anchors in the hull

Holders for GPS

alt text

alt text

alt text

alt text

What I learned:

  • enough as a holder for the brain
  • use double sided tape to fixate the holder
  • use bolts to fixate the chip itselfs

Holder for AI/brain

alt text

alt text

alt text

What I learned:

  • enough as a holder for the brain
  • use double sided tape to fixate the holder
  • use bolts to fixate the chip itself

Motor and waterjet fixation

I'm still not happy with the way the waterjet is connected to the hull. And I don't want it to move forward or backward too much.

alt text

will be attached on the outside of the hull; has a nozzle as well

alt text

structure on the inside so the waterjet can't come inwards

alt text

took 20 minutes or so

alt text

and not too bad but needs to be longer at the bottom so that it can cover the whole area

When I tested it ... on the inside there was a lot of stress because the structure was just to near; so I added just 1mm more space and printed a small portion again to see.

alt text

still a bit too much on the outside

alt text

to tight; stressfull; force the bottom of the hull to bend

alt text

to save on my blue PLA I just print this one with PETG again

alt text

nice; fits like a glove

What I learned:

  • new inner design for motors should be enough to keep them in place
  • outer design of nozzle with holder should cover it

The lid

I still think it's too difficult to get the lid on the hull. The reason of course being that I take the shape of the hull and perform a boolean difference to get the base shape of the lid. I want to try to scale up the hull a bit to see if the contours of the lid on the inside will just be that looser. If that doesn't work then I can always do some sanding.

alt text

two pieces with just different scales; top was scaled 1.03 and the bottom one with 1.05

alt text

Both fit better put poses another problem of course (why didn't I think of that) ...

But that means I need to extend the hull again? No than I would end up in an endless loop πŸ˜‰

Next idea is to, whenever I have a new version of the hull (and when the outer rings has changed), to copy it as new version. In that version I will increase the wall thickens from 2.0mm to 2.45mm. That version is then imported into the lid version.

alt text

keep the outer wall the same but make the wall 2.45mm thick

alt text

still looks fine; same depth

alt text

use it with a boolean difference operator on the inside of the lid

alt text

to really know I need 3 corners

alt text

much better fit

alt text

even better when just sanding it a bit on the inside

I learned:

  • use the copy technique
  • scale the inner wall to 2.45mm thick
  • use that version to create the inside of the lid

Week 19

Converting 12V to 5V and 3V3 (continued)

Based on Henk's idea I'll convert 12V to 5V and 12V to 3V3 (for the ESP32S3) so that the RP2040 does not have to provide all juice to the GPS sensor and the ESP32S3.

alt text

Layout corresponds to the one I created inside the lid

Important: to include a switch like connector so that the pogo-pin can power on/off the whole system

The datasheet for the MIC5205-150mA-Low-Noise-LDO-Regulator shows this info

alt text

I can connect pin 1 and 3, I can skip pin 4 because of basic operation BUT I need a small capacitor on pin 5 of at least 1microF connected to ground

Leading to an updated schema

alt text

But I have problems with tracing the 12v-3v3 converter.

alt text

Error is that my rules prevent me from placing a trace in between

Now I need pin1 and pin3 because otherwise it won't do anything. I can use a wire etc but that's not prefered. So I tried to see what others did. I found Bowen who mentioned using a 3v3 - 1A converter. It has the same kind of shape as the 12v-5v converter with only 3 pins. And then I started to doubt ... why not just 1A as max ... The grove can be consume together with the ESP32S3 (wifi etc) .. it's a small change I can still make; and why not do the same for the 5V to the RP2040; just in case.

I looked at the lab inventory and found these 2; both can be found in Kicad as SOT223 family

alt text

alt text

5v and 3v3 datasheet

So for both I have to add 2 capacitors

alt text

alt text

Looking in Kicad I find 2 types of footprint; no special mention of the ones I need. So I guess I just need either a C_1206 or C_0603.

I therefore measured the 10muF as 3.1mm long and 1.5mm wide. According to (for instance) this info I need a footprint that's equal to C_1206

It took a while but I finally managed to create a PCB that wasn't too big

alt text

Milling it with the MDX ...

alt text

first time it wasn't yet all the way through.

alt text

Henk suggested to use 0.007 inch instead of 0.004inch.

Second time it didn't go through again. This time Henk centered the bit on the middle of the area and now it was ok.

alt text

After cleaning up

Experimenting with inserts

alt text

my personal insert

alt text

after trying out 3 sorts of bolt

alt text

added one for the GPS board

alt text

Works fine however a bit tight

alt text

Used a M3 bolt to measure how high/low the inserts should be in the hull

alt text

Testing the bolts with washers

alt text

conclusion for now I'll use M3 bolts with the appropiate insert and a silicone washers

What I learned:

  • heat up around 10-20 degrees more than the printing temperature (in my case PLA 170 so used 190 degrees)
  • make sure there's room underneath the insert; because plastic has to go somewhere
  • just insert until 1mm and push the remaining part with another tool or just press it on the table if possible. That way it won't go in too far

Soldering

alt text

Most of the components I need; starting point

alt text

I used soldering and the heat gun

alt text

Appearantly my choice for the size of the footprint for the Schotkky was 0603 but the diode itself was way bigger than that. So I solved it like this. //

All and all it took me 1.5 hours. Then I tested most of the traces and all looked ok.

Regarding the diode I could only think of the fact that the previous PCB were I used it, it was soldered on the trace so I didn't see it as a problem because I could fit is.

Power!!!!

First of all I made nice attachments for the 12v DC power supply and a self made on/off switch

alt text

as designed made female connectors to go on the male headers on the PCB

alt text

protecting it using shrink tube

alt text

self-made on/off switch

alt text

No I can safely turn on/off the PCB AND the RP2040 works!!!

Remark: eventually the on/off switch will be replaced by a pogo pin on the outside

Oh and I really like the heat gun

ESP32S3 power problems

Appearantly I tested until now powering the ESP32S3 using USB and that gave power to the underlying AI vision module as well. Now I misread and thought that the Grove wwould power the ESP32 but it doesn't.

alt text

Yes the PCB produces 3v3 for the Grove AI module which runs on 3v3

alt text

Adding the ESP32S3 on top of it does NOT turn the ESP32S3 on

alt text

powering the ESP32S3 with 5v from the RP2040 does work

alt text

and powering the grove with 5V? YES that works well

BUT .. when the Grove AI module is powered by 5v it does NOT provide 5v to the ESP32S3. That only happens when I power the Grove AI module using USB-C

alt text

so time for a small trick ... 5v from the RP2040 and ground from the grove cable. YES works

alt text

So I made this small wire directly soldered on the 5V pin of the ESP32S3

alt text

the 5v comes from the RP2040's 5v pin

alt text

then connected it and it worked

Remark: I also tried to solder 2 wires at the bottom of the ESP32S3 and power it with 3V3; that didn't work. It would blink briefly and then restart. It really needs 3v7.

Putting it together

Now with the power problem solved it was time for the finishing touches.

alt text

soldering the GPS module and made a cable

alt text

which worked

alt text

getting info was hard because I switched one cable

but the cable fix worked

alt text

time to put it all at work at the same time

Everyting powered by the 12v battery; motors on for 60 seconds and 2 seconds off

Network issues

I was very happy with the result; until I notices that my network connection with the Wifi server dropped and reconnected again. Also weird messages like "your password is wrong" but when I hooked it up to a computer it wasn't???

Ok so yes there was one code issue. Appearantly in the code of the ESP32S3 I waited for the serial USB connection to come up which of course never happens when you are not using USB.

So at the end of the day I had a working PCB board but only the ESP32S3 just didn't get enough. Why? It was connected to the 5V of the RP2040 which got it's power from a voltage regulator that was maxed to 1A.

Back to hull design

I had some small fixes I wanted to make

alt text

make enough room for the 4.75 diameter for the inserts

alt text

created 2 new placeholders at the front because I expect some water there

alt text

adding the holes for the inserts

alt text

tweaking and tuning to take away material to make an edge at the front as well

alt text

So looked good in SolveSpace but PrusaSlice showed some holes because there were intersecting edges

alt text

I could not get the new edge to work. I had problems with so called intersecting edges which I can usually get away with. But now I didn't know how to solve that. So I returned back to the original front. Main priority is getting my duck in the water and test it.

Back to the desing of the lid

On Friday morning, now that the hull was printed, I redesigned the lid

alt text

Need hole with a diameter of 4.7; as my printer does a tighter job I changed it to 4.75

alt text

added more attachments point to make sure I can seal it

alt text

Looked good in Solvespace but PrusaSlicer should be the possible reality

alt text

And this one

alt text

Finally I started to print this one

Waterproofing

At the end of Friday I took the results of my prints sofar.

alt text

alt text

I sanded the lid until the fit was not too tight

Then I soaked both of them and the battery holder in Dichtol to make them water proof

alt text

alt text

Next time I will wear gloves πŸ˜‰

The next morning I found it like this

alt text

alt text

alt text

alt text

Another lesson learned is to NOT dry it on paper.

From power issue to possible shortcut

My main taks for today was to find out how to improve the power to the ESP32S3. My theory was that every Serial.println somehow caused an issue ... Henk didn't think so. So I just did some simple checks again:

First I powered the ESP32S3 via the USB of my laptop. Everything was fine and I could connect my phone to the Wifi network "RD3000". Then I just switched power source to the power bank. Same deal it worked.

Then I switched back to 12V battery using the PCB. Appearantly it all worked. Huh? Was there no problem anymore? Nope ..look again. My phone was not able to keep the connection and reloading the home page. Also the ESP32S3 showed it's startup red led once in a time. Which would explain the network dropping out; it was rebooting probably because of lack of power.

Note

According to the website of Seeedstudio the ESP32S3 itself draws around 40mA, and when using Wifi around 100mA.

Ok but how much was it drawing on current right now. So I played around with the multi-meter and found that both voltage regulators worked fine; showed 3v3 and 5v. But how about that current? Well long story short at one moment I put 12V directly on the 5V pin of the RP2040 and the ESP32S3 which was, at that time, connected to the RP2040.

I thought that everything was basically dead ...

So I retested all components like the Grove AI module, the ESP32S# and the RP2040 using direct connection with my laptop via USB. They all still worked. Ok!

Then I saw why my PCB didn't work anymore ... I had burned through the GND trace. I fixed it with a small blak wire.

alt text

alt text

Then retested my PCB which still worked also. Then reconnected the RP2040, the GPS and the motors. It all worked!!!

Note

The idea is simple ... your multimeter has to become part of the circuit in order to measure current. By doing this the wrong way ... well .. bad idea. So I found this video which told me stuff that I kind of knew. Difficult part was being part of the circuit.

I finally hooked up a motor and used that to make the multimeter part of the circuit. It showed 0.7A of currrent being drawn from the battery at 12V.

So with all that back to my problem from this morning ...

I still want to power the esp32s3 seperately ...And in my search found this guy who created a mini-drone using a battery powered ESP32S3. And there it is, a battery of 3v7 ... So that is what I need not the 3v3.

For now I stick to the solution of using the power bank to power the ESP32S3 and the 12V battery to power the rest.

Back to communication

So more in the afternoon I had the following setup ...

alt text

By powering both the ESP32S3 and the RP2040 via USB I could activate the serial monitor and see that the RP2040 actually did get messages from the ESP32S3 via the cable.

alt text

At the end I did manage to solder at least a part on the pogo pin as it has to go inside of the hull

Back to the motorholders

alt text

the last version I have; try to fit it with the latest hull design

I updated the design of the motorholders slightly.

alt text

Increased diameter of the outer ring so that it's more part of the base/ foundation. This should increase it's strength when then motors spins. Also increased the thickness of the base so that I can fixate the base to the wall instead of the base of the plaform

alt text

To test I'll just take a portion

alt text

So that if I'm wrong I spare some filament and time waiting for it to finish

alt text

Came out fine but it appeared to be too wide; it would lift the motor's axis and it would not touch the inner hull

Then increased the base just a bit and reduced the diameter to it's original size

alt text

But now at the base of the axis there is still some room

So added another 1mm and ...

alt text

that looks perfect; but just needed a small addition of 0.5mm

Based on that I printed the final version twice

alt text

alt text

Back to the nozzles

Actually nothing to do here but print them in the same red color

alt text

alt text

System integration

I want to show all the components that are needed and how they fit together ... So I got all the materials that I need and laid them out

alt text

3D printed material

alt text

electronics

alt text

waterjets, insert and bolts

alt text

tools/ other

alt text

and finally the/a duck itself //

Then tried to pre-assemble everything and found some minor issues

alt text

I discovered earlier that the GPS holder was ok but that the insert needs to move just a bit to the left.

alt text

And to let the flow of cables run smoothly I decided to adjust the holder for the Grove AI / brain part.

alt text

Back to SolveSpace

alt text

Print both of them again

alt text

Including a new part to fill up the inside of the lid

alt text

Just a small plate of 1mm thick

Assembly preparation

Time to apply silicone to the insight if the lid and attach the battery holder to the hull

alt text

Using fast drying transparent Acryl silicone (2hr to make it waterproof; 24h to make it stress proof)

alt text

there is no neat way to do the front; just add and adjust with my fingers

alt text

It looks ugly but I hope it works

alt text

Use the wait of the powerbank to keep it in place while drying

VIDEO

I learned from this that it would have been better to fixate the battery holder at the end as it will be more difficult to work on the hull.

Next morning I decided to fixate the water jet using fast drying glue or glue pistol. The main reason is speed! I want to put the duck in the water as fast as possible. I can always apply extra sealing with silicon once it's fixated.

alt text

Showed me that it's fast, sticky and, if needed, I can get it off afterwards

alt text

So I laid down the warterjets and, assuming that they could not move anymore, found that it was almost impossible to add the motors later. This means that I'll have to pre-assemble the whole waterjet-motor-motorholder at once. And it also means that my idea of fixating the motorholder with tape at the back doesn't work; there's no room afterwards.

alt text

Also when position the base to the side, if not done right, the outer ring is still to narrow so it will weigh on the motors axis and prevent a smooth operation

alt text

On top of that, the base almost touches the inside of the lid; needs to be smaller

But I also noticed/ remembered that the waterjets can be fixated using small bolts

alt text

This would be nicer as I can attach more strongly and detach if needed easier

alt text

I therefore took a 1mm bit, scratch the surface and drilled the hole

![alt text]../finalproject/assets/IMG_8659.HEIC.jpg)

That could actually work

Ok then ... now let's see how it all fits together. But then I found some serious issues because of the fact that, for now, the electronic components will not fit at all now because I still need the powerbank; there's simply put not enough space.

![alt text]../finalproject/assets/IMG_8660.HEIC.jpg)

I did not plan for this; that's why I wanted to get rid of the powerbank and use a 12V battery

![alt text]../finalproject/assets/IMG_8661.HEIC.jpg)

This was the idea, no power bank then it fits

Other smaller adjustments I need:

  • the wiring in general needs to be more flexible so it can easily be tucked away
  • the holder for the AI needs be reduces in length; just use the bare minimum space I need
  • the male connectors to the motors should be in a 90 degree angle; now they have to be bend

Adjustments to be made:

  • extend the outer circle of the motor holder with 1mm
  • reduce the footprint of the base of the motorholder
  • at the time use some glue at the top of the base to fixate it
  • use small bolts that go trough the hull to attach the waterjets
  • then use silicone to close any leaks

Note

The main reason for the powerbank to be there is that I need 5v for the ESP32S2. I redesigned to use only the 12V battery which would give me more space.

![alt text]../finalproject/assets/IMG_8662.HEIC.jpg)

It can't put the 12V on top because then I can't have a USB-C cable from the power ban

![alt text]../finalproject/assets/IMG_8663.HEIC.jpg)

And vice versa

Besides that ... enlarging the batteryholder does not fit my 3d printer

So nothing to integrate yet ... back to printing first = small adjustment. I therefore started a new print containing:

alt text

  • newer version of the electronic plate
  • newer version of the motorholder
  • newer version of the Grove AI holder
  • special version of the hull to later test the lid

While printing the 3D printer made a lot of noise. I thought it were the belts or something but during larger movements the noise was gone. So I looked at what it was doing but I didn't see any filament coming out. Jaiks ...it appeared that my filament was entangled at the side

![alt text]../finalproject/assets/IMG_8664.HEIC.jpg)

Next time check this before printing

![alt text]../finalproject/assets/IMG_8665.HEIC.jpg)

Marks from the extruder

The results

![alt text]../finalproject/assets/IMG_8667.HEIC.jpg)

Fits like a glove

![alt text]../finalproject/assets/IMG_8669.HEIC.jpg)

Perfect now

![alt text]../finalproject/assets/IMG_8671.HEIC.jpg)

Yes also ok now

Coding

Besides making the duck float, it needs software.

GPS

I remembered that there is a library to interpret NMEA codes = what is spit out by the GPS sensor. Searching in Google for arduino library gps gives me links to:

So TinyGPSPlus runs on all types of Arduino boards and claims to be lightweight. It also claims

Like its predecessor, TinyGPS, this library provides compact and easy-to-use methods for extracting position, date, time, altitude, speed, and course from consumer GPS devices. However, TinyGPSPlus’s programmer interface is considerably simpler to use than TinyGPS, and the new library can extract arbitrary data from any of the myriad NMEA sentences out there, even proprietary ones.

When I look for it in the library manager I also see other variants like TinyGPS which is now in it's 13th release. TinyGPSPlus is in its 1st release. Looking at the example code TinGPS should give be LATITUDE and LONGITUDE. And it also gives me speed and course; stuff that I need. Also NeoGPS looks promising as a light weight variant with a lot functionality.

TinyGPS latest update was 7 years ago; TinyGPSPlus was 2 years ago. So in that case I prefer TinyGPSPlus for now.

Looking into an example called KitchenSink I like this piece of code

      static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
      double distanceToLondon =
        TinyGPSPlus::distanceBetween(
          gps.location.lat(),
          gps.location.lng(),
          LONDON_LAT, 
          LONDON_LON);
      double courseToLondon =
        TinyGPSPlus::courseTo(
          gps.location.lat(),
          gps.location.lng(),
          LONDON_LAT, 
          LONDON_LON);

This suggests I can also calculate the course to a new destination (not being London of course).

Tank steering

Well the word tank is something I saw earlier on. In fact steering with 2 waterjet is in fact the same as steering a tank. I make some assumptions:

  • there's a general speed settting (none, silent, low, medium, fast, max)
  • using frequency of 20Khz and 8-bit resolution (this is from earlier experience) to use PWM
  • from experience ... both motors start to turn when a value of around 30 is set so the actual range is [30,255]
  • this means:
    • 0 = stop
    • 30 = silent
    • 60 = low
    • 120 = medium
    • 180 = fast
    • 255 = max
  • straight ahead means both motors get the same speed setting
  • if the duck has to go left it means reduced power on the left motor and vice versa

Scenario's:

  • duck is set to fast and has to go left --> left/right motor = 120/180
  • duck is set to low and has to go right --> left/right motor = 60/30
  • duck is set to silent and has to left --> left/right motor = 0/30

Importantly ... whatever the power on a motor it has to increased or decreased gradually. This will be easier on the structure/ platform/ hull. The electronics are protected by a diode.

Back to converting 12V to 5V via USB-C

The assembly pre-test made me aware that I really need to get rid of the powerbank; I can't use it; not even for aa concept unless I want to redesign the hull ... Nope! Idea stays the same. By powering the ESP32S3 with 5v via a USB-C connection it will a) run a smooth Wifi connection and b) will power the Grove AI module as well.

At our FabLab I found a very small board that has a USB-C output and 12 through-hole pins.

![alt text]../finalproject/assets/IMG_8666.HEIC.jpg)

Lot of new abbreviations here like CC1, SUB1, etc

My guess is that it's a standard inventory thingie .. But I could only find something from AdaFruits in the list that looks similar. Reading the related datsasheet it points to a more general datasheet about USB-C and its terminology.

alt text

The USB Type-C connector has 24 pins. Because of its reversibility, the pins are arranged in a mirrored configuration. There are a total of 6 differential pairs in a full-featured cable assembly.

What I understand from this:

  • The CC1 and CC2 pins are critical for basic USB Type-C operation. They deal with detection of cable attachment and removal, orientation detection, basic USB Type-C current capability advertisement (all communication regarding power delivery occurs over CC wire)
  • The SBU wires are lower speed signal wires that is allocated for Alternate Mode use only (these are the SUB1 and SUB2 on my board)
  • D+/D- are meant for USB2.0 only
  • I need to connect both CC1 and CC2 so that the ESP32S3 will get power however the cable is flipped

alt text

Using a basic setup using USB2.0 it will support 5v/500mA max which should be enough for the ESP32S3 (as the Grove module get's its own 3v3)

Another good article. This article also makes clear that, regarding the C1/C2 pins I have to be carefull. Because I can act as a power source (= advertiser) or a device that draws power. As I'm a provider I need to use 56kOhm resistors. This is also acknowlegded by this article.

So to summarize:

  • create a small PCB that uses a voltage regulator to convert 12V to 5v (using the same one with a max current of 1A)
  • Connect the GND of the USB-C breakoutt board to the GND of my PCB
  • Connect the 5v output from the voltage regulator to the VCC on the USB-C breakoutt board
  • Both CC1 and CC2 need to be connected to 5V as well BUT in between each there needs to be a 56kOhm resistor

alt text

This means I have to make a split of my 12v source or solder it on the existing PCB

alt text

PCB 1.9cm x 1.6cm .. idea is to not use the male headers buut solder wires directly on them and then onto the USB-C breakout board

Back to waterproofing the lid - hull connection

alt text

Although the print succeeded it does bring forward another problem

I tested the sealing of the lid by pressing on it very hard; it leaves too many gaps; this is not going to work; ships ...

video!!!

Testing GPS

I included the TinyGPSPlus library and tested my GPS sensor ...

alt text

I changed the code a bit and went on the water with a boat and tested it. That at least was fun to do and it showed me that it can work.

VIDEO!!!