Ping Pong Ball Collector Robot




Introduction: Ping Pong Ball Collector Robot

Practicing sports is fun and good for your physical and mental health. However, there are drawbacks while practicing a sport, take for example table tennis also known as ping pong. It is one of the most popular sports in China and it is widely known. Ping pong is a fast paced sport which rewards good technique and fast reaction times. During a training session of ping pong the players engage in a dynamic match, hitting and smashing balls everywhere (preferebly on the table ;)) ). As a consequence, at the end of the training set, the floor is completely covered with small ping pong balls... and it is time to pick them up. This is really a chore, nobody likes doing it, it takes a lot of time and you hurt your back when constantly bending over to pick a ball up. To anyone to who this situation sounds familiar, we have a solution for you!

Our Ping Pong Ball Collector Robot saves you from ever having to pick up another ping pong ball from the ground. This allows you to take a rest in between training sets and possibly saving you from a trip to your physiotherapist.

Table Of Contents

  1. Project Motivation
  2. Project Working Modes/Functionality/Requirements
  3. Conceptual Design
  4. High Level Design
  5. Design Of Sub-Systems
  6. Mechanical Systems
  7. Circuitry, sensors and software
  8. Integration Guide
  9. Demo Project
  10. Review
  11. Sustainability
  12. Bill Of Materials
  13. Present Your Team
  14. Project Repository


For constructing this amazing robot you will need the following parts:

Some of the components have to be manufactered, for this you require:

  • Lasercutter (3mm MDF)
  • 3D printer (PLA)

Step 1: Project Motivation

As explained in the introduction, ping pong is a popular sport but a problem is to always have to pick up the balls from the ground. The product described in this instructables is meant to alleviate that problem. Essentially, when the training set is completed, the robot will be placed down on the court and activated and that's it. While you take your well deserved rest, it will collect and store all the balls for easy retrievel after operation.

The first step in the product development is the identification of the needs.

In order to identify the needs of the product, three crucial questions have to be answered:

  • What’s the product utility? Who will use it?

To provide an easy and fast way to autonomously collect ping pong balls from the ground without having to manually pick them up. It should be able to pick up and store all the balls that have been used during the session which lay on the ground and the balls should be easily removable from the robot. The robot should be able to work in different table tennis courts.

 It will be used during training sessions and/or matches of table tennis by ping pong ball clubs/players.

  •  What or who does the product interfere with?

Children and adults who play ping pong. More specifically the players and trainers at ping pong clubs and training centers will interfere with the robot.

 The robot will interfere with ping pong balls, the table tennis court, obstacles such as the table, air and external forces.

  •  To which purpose has this product been developed?

During a regular session of table tennis a lot of balls are being used and spread all over the floor. They each have to be manually picked up by crouching down which can cause discomfort such as back pain. The balls on the ground also cause a tripping hazard and/or stepping on the balls will also damage them.

From this analysis the needs are identified, these are grouped in two cathegories: objective & subjective needs.

Objective Needs

  • Performance:

The robot should collect all the balls on the ground fast. During operation it needs to be able to store all the balls that have been picked up so far. The balls should be easily removed after operation. 

  • Weight:

Preferably the robot can be picked up by the user and easily transported from one court to another, therefore it’s weight should be kept to a minimum.

  • Ergonomy:

Start up and use should be as convenient as possible. The robot should be activated simply by using a button or switch and no further human intervention should be required.

  • Safety:

Operation of the robot should be secure, no harm can be done to the user. Safety with respect to electronics and actuators has to be ensured. Moreover the robot should handle the balls with care as to not damage them.

Subjective Needs

  • Aesthetic:

Preferably the robot should have a nice design and fit into the training center setting.

  • Comfort:

Using the robot needs to feel as a relief and should be enjoyable. During operation it would need to be quiet as to not disturb the players during rest time.

Step 2: Project Working Modes/Functionality/Requirements

The next step in the design proces is to transform the earlier defined needs into concrete functions and requirements. To do this, first a quality deployment function was made. This graph links the customer requirements into functional requirements that the robot should have to be able to satisfy the customer.

Based on this QDF a requirement list is created. This serves as planning tool to clarify and quantify all the objectives that have to be reached. Priorities and tolerances are also defined as not all requirements are of equal importance. Lastly it serves as a checklist to return to at the end of the methodology to make sure that all the objectives have been fulfilled.

Step 3: Conceptual Design

From the requirement list and an abstract formulation of the problem the essential problems of the product are identified. To solve these problems the product should possess some features. The conceptual design aims to find appropriate working principles to asses these features. A summary of this reasoning is given in the morphological chart.

As stated before, these features have to be implemented by certain means. This can be done in multiple ways. To find the final design, a slightly different approach than suggested will be taken. Instead of generating different concepts by combining different means, the different means for a certain feature are discussed in detail and different concepts for implementing it are compared. These choices are then assembled to generate the most suitable, conceptual design of the robot.

Programming Robot

A microcontroller is compact, easily integrated with sensors and actuators and has enough computational power to satisfy the programming. So it seems to be the better choice than a large expensive computer. An Arduino Uno will be used seen as though this has already been supplied.

Pickup Mechanism

Four pickup mechanisms are considered:

  • The first idea is to use a roller which could be mounted at the front, while performing the rotational movement it would pick up the balls and store it on the inside. However this design of a roller to pick up ping pong balls has been patented and cannot be used.
  • Secondly a suction mechanism, using a pressure difference to suck up the balls, could be used.
  • Another possibility is to mechanically propel or push the balls into the basket.
  • Lastly a drop down mechanism is considered. A raster-like structure of rubber bands or flexible metal strings would be pushed down on the ping pong balls to pick them up.

These concepts are compared using a grading system from which it is clear that the propellor mechanism is the best option. This concept can be implemented in two different ways, either the axis of rotation is horizontal or vertical. The horizontal axis mechanism is better suited for guiding the balls into the basket, can pick up multiple balls at the same time and is easier to implement, so it’s the preferred method. 

Based on this rotating pickup mechanism with a horizontal axis, different concepts for moving the robot and the trajectory will be presented. Please note that upon choosing this mechanism, the inside of the robot will be used as the basket as this is the most convenient.


To make the robot drive around autonomously certain means of implementing a trajectory have to be considered. This can be done either by image processing, a programmed path or a random path.

Image processing is very difficult to implement because of computational restrictions with the Arduino. Also, rather expensive components such as the camera would have to be purchased. This would be a complex and expensive option which isn’t suitable for this product.

The robot could follow a programmed path in a raster or spiral pattern. However to implement this, the exact position of the robot should be known at all times. Moreover it is quite difficult to make the robot move in exactly a straight line and a lot of sensors and programming would be required to keep the robot on course.

These problems can be evaded by following a random path which is often used in for example cleaning robots. A sensor would be used to detect the walls and obstacles and a simple program would steer the robot away from them. The only drawback is efficiency. To clear the whole field the robot would need to pass it through multiple times, the robot should therefore be fast enough to clear the field during operation time.

Means Of Moving Robot

The robot should be able to move forward and upon sensing an obstacle should be turned easily, preferably with a small turning diameter as to not hit the obstacle. Seen as though a random path has been chosen it isn’t necessary for the robot to move in exactly a straight line.

The differential drive is preferred. It outperforms the other options because of it’s simplicity and ease of implementation. Only 2 motors have to be installed at the front and one steer wheel at the back. Stepper motors are proposed for this as their rotation angle is easily controlled, by making the 2 wheels rotate in opposite direction in-plane rotation is also achieved.

Power Supply

The robot needs a power supply for the electronics, actuators, etc. It is possible to use a socket and an extension cable, however this would limit it’s movement. The cable would need to be stored on the robot which will take up space and add extra weight. During operation it will act as an obstacle over which it has to drive and the cable can possibly get stuck. A better solution is to use a small, compact battery which can be mounted on the robot and is easily replaced. A battery power supply is also convenient to integrate with the microcontroller. 

Sensing Environment

For autonomous operation the robot needs to sense it’s environment. The robot needs to know when an obstacle is near so the program can steer clear of it. Distance sensors are widely used in electronics and can measure distances from centimeters up to meters. When close to an obstacle the robot can turn and move away from it. It’s also possible to use contact sensors. However the robot would need to bump into the obstacle. This could produce a shock that can potentially damage components. Preference goes to the distance sensor.

Ball Detection

Seen as though a random path has been chosen for the trajectory and a perpetual motion rotary mechanism for the pickup there is no need to detect balls. Therefore this feature does not have to be implemented. Two flexible bars are added to reach the balls in the corners and walls and pick up more balls by guiding the balls near the robot.

Step 4: High Level Design

The robot consists of a combination of a few subsystems.

  • Frame: Acts also as a basket to store the balls and is the base on which all other subsystems are placed.
  • Arduino: The brains of the robot and is tasked with the control of all the actuators and sensors as well as programming the random path. Consequently it is linked to the drive and propellor system.
  • Three Wheel Differential Drive: 2 motors at the front and a castor wheel at the back are mounted on the frame and serve to move the robot around. The robot should be able to move forward and rotate over a certain angle.
  • Propellor Mechanism: The pickup mechanism to push the balls inside the basket.

Step 5: Design of Sub-Systems

a. Mechanical Systems

Manufactering Processes And Materials For The Prototype

The two main manufactering processes available in the FabLab are lasercutting of MDF and 3D printing of PLA. The prototype of our robot will completely be constructed using these 2 processes and materials. Our preferred manufactering process is lasercutting as it is very fast compared to 3D printing, only small parts with complex shapes were printed. Additionally MDF is also relatively light (680 kg/m³), cheap (€5 for 3mm 1100x800mm) and is strong and stiff enough for our purposes. The only disadvantage is that MDF isn't recyclable, where as PLA is.


The robot is assembled by using nuts and bots. Finger joints are used to easily put components together and a cross-like shape was used to fasten it together, see figure 'Assembly Mechanism'.



As said, the basket is integrated into the frame on which everything is constructed. There are the following requirements:

  • Volume:

The basket should be big enough to store at least 60 balls.The following formula is used for calculating the desired volume inside the basket:

Volume_Basket = Number_Of_Balls * Volume_Ball / Packing Density

Because the balls are dropped randomly into the basket we have to consider the packing density because the balls will not be properly placed. For random placement of spherical objects the packing density is 0,64. This results in a volume of 0,0027m³ needed for storing the balls.

  • Stiffness And Strength:

The frame should be stiff and strong enough as to not bend too much or break when all components are assembled.

A square base for the frame is chosen as this the most convenient. For the calculations we considered that 2 rows of balls are stored on top of each other which determines the height of the basket, namely 8 cm, and based on this the dimensions of the width and length are 26cm and 13cm respectively. However to make sure that the balls cannot fall out the heigt is chosen a bit higher, 16 cm, while also taking the pick up mechanism requirements (the propellor and ramp) into account. The basket/frame is lasercutted from 3mm MDF as this gives it the required stiffness and strength.

Pickup Mechanism

The pickup mechanism is meant to pick up the balls that are in front of the robot. The following is taken into consideration:

  • Capacity:

Because there are a lot of balls simultaneously on the ground the pickup mechanism should preferably be able to pick up multiple balls at the same time. Consequently the entry of the mechanism is chosen to be 12cm wide to allow for 4 balls to be picked up next to each other.

  • Ball Safety:

The mechanism should not damage any of the balls while performing the pick up action.

This subystem is comprised of 4 parts: actuator, propellor shaft & blades, ramp and guiding bars.

The actuator drives the propellor. Seen as though ping pong balls are very light (2,7g) the motor isn’t required to develop much torque only sufficient to drive the inertia of the propellor. The main concern is therefore the rotor speed, the propellor should turn quickly to push the balls into the basket. The two most commonly used motors in the field of robotics are a DC motor or a stepper motor. For this application a DC motor is more suitable. Stepper motors are known to have high torque at low speeds which isn’t useful in this situation. The speed of the DC motor is proportional to it’s applied voltage following this law: U = Kω. However due to friction this isn’t very exact but for this application a high accuracy isn’t required so a DC motor is chosen because the speed can easily be controlled in open loop without a need for a driver. Some experiments were performed and a speed of 205 rpm has been proven adequate for this purpose. In the FabLab some motors were considered and eventually the GA25-370 DC motor was chosen because of it's speed range (0-350rpm).

The propellor blades have to be long enough to allow for some bending as to not crush the balls and to more efficiently pick up the balls. A length of 150mm is chosen. Different materials were considered for the propellor shaft and blades, namely 3D printed PLA or lasercutted MDF. At first we thought to print long, slender blades from PLA because they bend quite easy and deform elastically. However it is difficult to print these and moreover it takes a long time. Additionally they broke faster than expected due to the printdirection. So the choice was made to lasercut the shaft and the blades as one piece out of 3mm MDF. Two of these plates are screwed together to add more strength to the blades and the ends where it is coupled to the motor shaft and bearing.To improve the pickup action sandpaper at the end of the blades is used to make a slope instead of a sharp 90° edge. The propellor is supported by bearings on either side and couplings are used. These are printed from PLA because of their complex shape.

At the front of the robot a ramp is installed to get the balls inside the basket. The base of the robot should be as close to the ground as possible to reduce the heigth to which the balls should be propelled. To allow for some tolerance the base is 1cm from the gound. As we would like to store 2 rows of balls (8cm) the ramp should be 9cm from the ground. The width is 12cm to allow 4 balls at the entry. The ramp is angled at 45°. This was chosen arbitrarily but has proven to be effective based on experiments. Should the angle be bigger, the slope might be to steep for the balls to be pushed over efficiently, if the angle is smaller the ramp would take up more space inside the robot.

Lastly, guiding bars are installed at the front. These are meant to guide the balls to the propellor entrance and when faced with an obstacle or a wall they should slide against it to push the balls away from those hard to reach places. These bars are connected using a hinge to the base to allow for movement, a spring system is also added to keep them in place.

Driving Mechanism

The robot utilizes a three wheel differential drive to move around. This subsystem consists of 2 wheels at the front, a castor wheel at the back and an actuator for each frontal wheel.

A stepper motor is chosen as the actuator for the wheel. For driving forward, both stepper motors rotate in the same direction, for turning the robot they rotate in opposite direction. This can be achieved by using the incremental rotation of the stepper motor which is easily controlled by a driver in open loop (where as a more complex, closed loop control would be needed for a DC motor). The NEMA17 4202C is used in this project as one was already available to us and it proved to fullfill all our needs after experimentation.

To complete the three wheel differential drive a third whee l is needed. In this case the castor wheel is mounted at the back instead of underneath as there isn't enough space between the floor and the base. A Guitel Hervieu Castor Wheel is selected because it has a load capacity of 12kg which is sufficient.

Considering the dimensions and the placement of the stepper motors a wheel with a 68mm diameter is needed. We chose to make this ourselfs as this is the cheapest and fastest option (no need to wait on parts). The wheels are lasercutted (2 plates of 3mm screwed together) and than attached with a 3D printed coupling to the motor shaft. The motor shaft is supported by a bearing. To improve the friction between the wheel and the ground a leftover catterpillar track is glued to the wheels.

b. Circuitry, sensors and software

Now it is time to take a look at the electronics. The robot is blind, so we need to make sure it can sense the environment. Therefore, a sensor is needed to know the distance between robot and wall. Some motors are needed for actuation and a DC motor for the propellor. To receive and send information to/from the components an Arduino UNO is used. These motors and arduino needs to be powered. In the following sections the thought process for choosing the components and the final circuit diagram will be discussed. 

Consideration of components

To detect a wall, an ultrasonic sensor is selected. The lab provided us with the HC-SR04 Ultrasonic Sensor, it is cheap and the detection range, 2cm to 4m, is good enough for this application. Moreover it is easily integrated with the Arduino.

As previously discussed, stepper motors will be used to make sure the robot can drive straight (same rotation of wheels) and rotate (opposite rotation of wheels) when confronting an obstacle or wall. The resolution of the step angle (1.8°) is enough for this application, therefore full step resolution is used. To power the motor, a voltage between 8 and 35 V is needed. Therefore a 9V alkaline battery seemed good enough. But the problem with this battery is that it has a very low power density and stepper motors ask a lot of current. Therefore these batteries drain way too fast. It is therefore recommended to take another one. Nevertheless, for the demonstration, a 9V battery is chosen. Two 9V batteries are used for the stepper motors. It is not possible to use one battery for both motors because otherwise one stepper motor gets more power than the other and the robot is not able to move straight.

The Arduino also needs to be supplied with this battery. In addition, the propellor needs 6V. A 9V battery is chosen and the voltage is reduced by using a DC-DC converter. The propellor only needs to turn if the robot moves. Therefore, a relay is added that can be controlled by the Arduino.

A buzzer is needed to produce a sound to make sure the user is informed if the field is cleared. A RS Pro 7800715 buzzer is chosen because it is cheap and can produce sounds up to 90 dB, which is loud enough.

An arduino Uno SMD R3 is been used because it was already available. An Arduino will keep looping over the code, but we want it to work only if the players take a rest. Therefore a last component is needed to turn off the robot and to save power. Toggle Switch MTS-101 is chosen because it is very cheap and easy to work with.

A list with all necessary components is given in the 'supplies' section at the beginning of the instructables.

Final Circuit Diagram

Before making the final circuit, it is recommended to check the components one by one. Apply for example voltage on the DC motor to see if it turns. In a table attached to this section you can find which pin of the Arduino is connected with each of the components as well as an illustration of the final circuit.

Code Flow Diagram

When the switch at the back of the robot is flipped, the code flow diagram is started. The timer starts, the start condition will be set to true, the DC motor will be actuated. The ultrasonic sensor will read out the distance. The program will then check if the robot is near a wall. If this is the case, the robot will rotate over a fixed angle. We saw experimentally that sometimes due to the bars and random angle, the bars get stuck and the robot cannot turn. We can fix this by making the robot drive backward first and then rotate and making the guiding bars shorter. The robot will move forward if this is not the case. This process will be repeated until t_max (rest time of the players) is exceeded. The start conditions will be set to false and an audio signal will be produced to inform the user that the field is cleared. This process will be repeated until the switch is turned off.

The Arduino code can be downloaded from the project repository.

Step 6: Integration Guide

Once the design of all individual subsystems is finished it is time to construct the components and to integrate them together. Up next is a step by step guide (with pictures) on how to assemble the robot.

  • Step 1: Frame

Start construction by mounting the Front Wall, Inside Side Walls, Inside Back Wall and Ramp using the nut and bolt fastening mechanism.

Add Back Wall and the Side Walls. The basket is now already constructed.

  • Step 2: Propellor Mechanism

Add the ramp to the frame by using Triangle45 x 2.

Assemble the propellor by adding the 2 lasercutted PropellorMDF using a nut and bolt.

The left side of the propellor consists of 4 plates (Plate Right For Coupling x 1 and Plate Right For Bearing x 3) which can be connected using a bolt through the central hole. The Plate Right For Coupling is connected to the front plate using a Triangle Propellor and also an extra nut and bolt. Lastly the bearing and Coupling Propellor And Bearing can be placed inside.

The right side of the propellor is similar. Attach the DC motor to Plate Right For Motor using 2 bolts. Add the rest of the plates together (Plate Right For Coupling x 1, Plate Right For Bearing x 3, Plate Right For Motor x 1 and Plate Right For Motor Support x 3), don't forget to place the bearing inside, and connect them through the central hole. Attach the coupling to the motor through the bearing, you can fasten this by using a screw through the dedicated hole. The Plate Right For Coupling is connected to the front plate using a Triangle Propellor and also an extra nut and bolt.

Place the propellor inside the couplings (first right side than left) and tighten using bolts.

The guiding bar mechanism is constructed by placing LeadBall x 2 in the 3D printed CouplingLeadAndBase. Attach the 2 springs as shown in the picture (compressive spring on outside and tensive spring on inside).

  • Step 3: Drive System

Construct the wheels by attaching the Coupling Wheel to two plates of WheelMDF and fasten it with 3 bolts. Glue the catterpillar track to the weel. Take two Big Triangle and place the following plates on respecting the sequence; Bearing Back Plate x 1, Bearing Plate x 3 (place bearing inside), Stepperplate x 1. Attach this structure to the base and fasten it. Place the stepper motor shaft through the hole and fasten the motor to the plates. Attach the coupling (and wheel) to the motor shaft and tighten.

The castor wheel is mounted at the back by Big Triangle x 2 and CastorPlate.

  • Step 4: Electronics

The Arduino, buck converter, relay are mounted directly to the top plate. Construct the box for the electronics, this consists of BoxSide x 2, BoxFront, BoxBack and Top Plate x 2. The distance sensor is mounted by first placing it in the 3D printed holder, attach the holder to BoxFront. The breadbord can be glued to the top plate as well.

Connect all circuitry as previously shown.

All CAD files can be downloaded from the project repository.

Now that the robot is assembled is it time to show it of!

Step 7: Demo Project

Once the robot is constructed it is actually quite easy to operate. The following video shows operation of the robot. To operate it yourself please follow these steps:

  • Step 1: Place the robot on the table tennis court (or anywhere you want to pick up ping pong balls).
  • Step 2: Flip the switch at the back of the electronics box. The robot should start it's operation.
  • Step 3: After 10 minutes of operation (in the demo video after 1min30) the robot will stop moving, shut of the propellor and start beeping. That's your cue that the ground is cleared of all the ball.
  • Step 4: To turn off the sound just flip the switch back again. Reach down into the basket from the sides to retrieve the balls.

Step 8: Review

Overall we are pretty satisfied with the final robot. It achieves all of it's required functionalities; it can drive around (forward, backward and turning) in a random path and pick up the balls that are in front of it and store them inside the basket.

However, during operation some problems occured:

  • The motors are noisy.
  • The balls sometimes bounce of the propellor instead of being picked up
  • The batteries of the stepper motors drain quickly.

If time allowed we would try to fix all of these problems. Some changes could also be made to the design and additionally some extra features could be added:

  • To improve the pickup action a sensor could be mounted at the front which detects if a ball is near to be picked up. The balls wouldn't be able to bounce of the propellor anymore as it wouldn't be a perpetual motion. This would also conserve energy.
  • A damping material can be added under the motors to reduce the vibrations induced noise.
  • Because not all sizes of bolts were always available a lot of extra nuts were used to get the correct spacing. Another consequence of this is that there are quite a lot of nuts sticking out on the inside of the basket.
  • The robot could have a more aesthetic design.
  • A measurement of how many balls are inside could be added so the robot knows when the basket is completely filled up and needs to be emptied.
  • Alternative power supply which is better suited for powering the stepper motors.

Step 9: Sustainability

The prototype was designed with sustainability in mind. All of the connections are easily disassembled, this allows to take out a component which got damaged to replace it. Or should the robot be out of comission the parts can easily be reused such as the bearings, electronic components, nuts and bolts, etc.

The 3D printed parts from PLA are recyclable. However, the majority of the robot is made out of MDF which is non-recyclable. To make it more sustainable other materials should be considered for the frame which are recyclable and have a small impact on the environment. The amount of nuts and bolts can also be reduced, for the sake of structural integrity we sometimes used more than necessary.

Step 10: Bill of Materials

The prices are based on those of the FabLab, for the 3D printed and lasercutted parts only the material cost was considered.

The total price to realize this project is: 129€

Step 11: Present Your Team


Hello, my name is Maxime. I'm a VUB student currently in the first master Electromechanical Engineering Mechatronics - Robotics of the BRUFACE program. Together with Amir, I mostly focussed on the mechanical part of the project but I also helped with the electronics and software when necessary. The robot was firstly designed in Inventor. After the necessary CAD files were created I moved to my favorite machine, the lasercutter, and a less favorite machine, the 3D printer, to manufacter all components. The most fun part of this project was in assembling the robot. We were often faced with (mechanical) design challenges but we were always able to figure it out, Amir's technical experience was often useful.

Oumaima ACHKIF

I am Oumaima Achkif. I found it a very nice and fun project. I always find it very important to firstly understand something in depth before working with it. After this project, I learned that you also learn a lot by doing. I worked on the electronics together with Reda. In addition, it was sometimes difficult to reach a compromise. But with good communication it all worked out in the end. You also learn a lot from each other's thinking and doing. I am very satisfied with the result. In summary, perseverance, motivation and communication are the keys to success.


The project was a good experience, working as a team many things were learned from other memebers, me and oumaima worked on the electronics and coding part,we faced many obstacles on our path but communcation and motivation made it easy to overcome them .

It was a good phase were experience was learned and critical thinking was improved


Being a part of this project was an amazing experience for me. Working with industrious colleagues was a privilege for me, especially Maxime who we worked together on mechanical aspect of this project, and we shared lots of ideas, discussed about different possible approaches. Also, the accessibility to proper paraphernalia and equipment was another advantage to me. All in all, That was a great opportunity for me to level up my knowledge in mechatronics.

Step 12: Project Repository

Be the First to Share


    • Clocks Contest

      Clocks Contest
    • Game Design: Student Design Challenge

      Game Design: Student Design Challenge
    • Block Code Contest

      Block Code Contest



    24 days ago on Introduction

    Hats off, the amount of detail in this documentation is amazing, very well thought about and written down! I am saving it myself and come back for ideas on what to cover in a project, this could be almost teaching material.