BILO

When art meets technology, 3.10e-4 hp of pure power for a 200g robot. An unprecedented computing power questioning a cornerstone of mankind, the unanswered question of the emergence of art.
This project explores the poetic potential of reactive robotics in drawing. Rather than blindly following a path, the robot engages in a dynamic conversation with both the human and the environment. A line is drawn — not as a command to be executed, but as an invitation. At the same time, the robot encounters the physical world, its obstacles, its resistances.
Through its sensors and programmed autonomy, the robot perceives, interprets, and responds. It hesitates, adapts, and chooses. Its trajectory is not predefined but shaped in real time by the encounter between intention and contingency.
The result is a graphic trace — a drawing born from interaction, not instruction. It is neither entirely controlled nor purely random. It is a shared creation, in which the robot becomes more than a machine: it becomes a performer, responding to presence, space, and gesture.
Supplies

Components description
- 1 Breadboard
- 2 Supporting frame – Level 4
- 3 Arduino Uno
- 4 Supporting frame – Level 3
- 5 Supporting frame – Level 2
- 6 Supporting frame – Level 1
- 7 Line sensors support
- 8 Ultrasonic sensor HC-SR04
- 9 VCC and GND cables
- 10 Trig and echo cables
- 11 Connection cables for the first Line Tracking Sensor (VCC, GND, OUT)
- 12 Connection cables for the second Line Tracking Sensor
- 13 Connection cables for the third Line Tracking Sensor
- 14 ULN2003 power cables (right)
- 15 ULN2003 power cables (left)
- 16 Breadboard power cables
- 17 Marker pen and elastic bands to hold it
- 18 ULN2003 (right)
- 19 ULN2003 (left)
- 20 28BYJ-48 stepper motor (right)
- 21 28BYJ-48 stepper motor (left)
- 22 Line tracking sensor HW-006 V1.3 (right)
- 23 Line tracking sensor HW-006 V1.3 (center)
- 24 Line tracking sensor HW-006 V1.3 (left)
- 25 Power supply 9V Block
- 26 Elastic bands for better grip of the wheels
VCC: Voltage at the Common Collector (positive power supply)
GND: Ground (negative power supply)
Trig: output pin to trigger the ultrasonic pulse
Echo: input pin to receive the reflected pulse
OUT: output
ULN2003: Amplify the Arduino control signals to drive the 28BYJ-48 stepper motor
Assembly


Our robot is built like a vertical, multi-story structure — a miniature architectural system where each level has its own function and logic. The design is modular: every "floor" of the robot hosts a specific component, and can be independently removed, replaced, or upgraded. This approach makes the machine highly adaptable, both in form and function.
Each layer is supported by a stack of vertical bolts, allowing for clean assembly and easy reconfiguration. At the top sits the HC-SR04 ultrasonic sensor, acting like a pair of eyes that scan the environment. Just below, the Arduino Uno forms the central processing unit — the robot’s brain — orchestrating movement and response based on sensor input.
The ULN2003 driver board handles the power and control of the 28BYJ-48 stepper motors, mounted at the base to drive the wheels. Finally, the HW-006 V1.3 infrared sensor array at the lowest level allows the robot to detect and interpret the line on the ground — not as a strict path, but as a suggestion.
All structural components are 3D printed, allowing for lightweight yet robust construction and full design control. The result is a robot that is not only functional and autonomous, but also expressive — a machine capable of engaging with its environment like a performer on a stage, housed in an architectural body of its own.
Code Explanation

The robot uses stepper motors controlled via the AccelStepper library (stepperL and stepperR) to ensure smooth and precise wheel movement. It detects nearby obstacles using an ultrasonic sensor (HC-SR04), which measures distance approximately every 50 milliseconds with the help of the NewPing library. For line following, the robot relies on three analog line sensors (left, center, and right). These sensors detect a black line on a lighter surface, with any reading below 800 considered a positive detection.
At each loop iteration, the robot reads its sensors and decides how to move according to a clear priority system:
1. Obstacle Detection (Every 50 ms – Highest Priority)
- The ultrasonic sensor checks the distance ahead.
- If an object is detected closer than 15 cm, the robot immediately pivots away to avoid collision.
- This behavior temporarily overrides all others and is treated like a line event to maintain motion fluidity.
2. Line Following
If no obstacle is detected, the robot checks its line sensors:
- Center sensor detects line → Go straight.
- Left sensor detects line → Turn slightly left.
- Right sensor detects line → Turn slightly right.
- When a line is detected, the current time and speed settings are saved.
3. Line Loss Buffer (Short-Term Memory)
- If no line is detected, but the last detection was recent (within a time window called lineHoldTime), the robot continues with the last known speeds.
- This prevents twitchy or erratic behavior when the line briefly disappears (e.g., at a gap or corner).
4. Wandering Mode (Default / Fallback)
- If there’s no obstacle and the line hasn’t been seen recently, the robot enters wandering mode.
- Every few seconds (based on wanderInterval, e.g., 2 seconds), it randomly chooses to:
- Move forward
- Pivot left
- Pivot right
- This simulates an exploratory, lifelike behavior when idle.
Arduino Code
Downloads
Circuit and Connections

Connecting the ultrasonic sensor to the breadboard - 1,3,8,9,10
- Placing the sensor (8) on the breadboard (1)
- Connecting the VCC (9, red cable) and the GRD (9, black cable) respectively to the positive and negative power supply of the breadboard (1)
- Connecting the TRIG (10, blue cable) and the ECHO (10, yellow cable) respectively to the digital 12 and 13 of the Arduino Uno (3)
Connecting the stepper motors - 1,3,14,15,18,19,20,21
- Connecting the ULN 2003 (18,19) respectively to the stepper motors (20,21)
- Connecting the positive terminal (14 - red cable, 15 – orange cable) and the negative terminal (14 – black cable, 15 – grey cable) of the ULN 2003 (18,19) respectively to the positive and negative power supply of the breadboard (1)
- Connecting the terminals IN1, IN2, IN3, IN4 (green, orange, yellow, blue) of the ULN 2003 (18) and (19) respectively to the digital 6-11 and 4-7 of the Arduino Uno (3)
Connecting the Line Tracking Sensors - 1,3,11,12,13,22,23,24
- Connecting the output (OUT) of the Line Tracking Sensors (22,23,24) respectively to the inputs A0 (11- green cable), A1 (12 - yellow cable), A2 (13 - grey cable) of the Arduino Uno (3)
- Connecting the positive and negative terminals VCC and GRD of the sensors respectively to the positive and negative power supply of the breadboard (1)
Power supplying the breadboard - 1, 3
- Connecting the positive and negative power supply of the breadboard (1) to the positive terminal 5V and the GRD terminal of the Arduino Uno
Power supplying the Arduino Uno - 3, 25
- Plugging the 9V Block cable (25) to the Arduino Uno (3)
Testings






Video
