Lego Power Functions met Arduino & Bluetooth Besturen – Complete Handleiding
Onderdelen en benodigdheden
| Onderdeel | Aantal | Opmerking |
|---|---|---|
| Arduino UNO | 1 | |
| Texas Instruments L293D Dual H-brug motor driver | 1 | Kies versie met lange pennen, geen SMD |
| Breadboard (standaard) | 1 | |
| 9V naar Barrel Jack connector | 1 | |
| Lego Power Functions Verlengdraad (item 8886) | 3 | |
| HC-05 Bluetooth Module | 1 |
Over dit project
Heb je een geweldig Lego Power Functions model met motoren en servomotoren? In deze tutorial laat ik zien hoe je je Lego-model bestuurt met een Arduino en een minimum aan elektronica. Ik leg schakelingen en programmering gedetailleerd uit – geschikt voor beginners. Het Lego-model bouw je zelf (als je geen zoon hebt), daar help ik niet mee.
We leren ook hoe je met MIT App Inventor je eigen Android-remote maakt. Binnenkort heb je je eigen Lego Mars-rover in de tuin!
Dit is mijn eerste Arduino-project. Mijn zoon heeft een prachtige Lego Technic auto (9398 4X4 Crawler) met Power Functions: één servomotor voor sturing, twee L-motoren voor rijden. Hij leende me de auto (mits ik geen kabels inknipt). Hier testen we de prototype:
De Power Functions bedrading begrijpen
Koop Lego Power Functions Verlengdraden (item 8886). Knip ze door – we maken „break-out” kabels met Lego-stekker aan één kant en pennen aan de andere. Soldeer pennen aan.

- GND = minpol (-) van batterijpak (anode).
- C1 en C2 kunnen polariteit wisselen om motor/servo richting om te keren.
TechnicRobot heeft een uitgebreide videouitleg. WAARSCHUWING: op eigen risico – ik ben niet verantwoordelijk voor schade.
- Servo-connector: soldeer pennen op alle 4 draden. Gebruik de lichtgrijze stekker.
- Voedingskabel (batterijdoos → breadboard): alleen +9V en GND nodig, maar donkergrijze stekker gebruiken (male connector).
- Motorkabel: alleen C1 en C2, lichtgrijze stekker. (Zie schema's voor details).

Een Lego-motor besturen met de L293D-chip
We willen variabele snelheid (DC-motoren) en positie (servo). Dat doen we met Pulse Width Modulation (PWM). Arduino maakt PWM makkelijk: analogWrite(pin, dutyCycle) (0–255). PWM-pinnen zijn gemarkeerd met ~.
Arduino pinnen: 5V, max 30 mA. Lego-motoren: 9V, >100 mA. We hebben een „schakelapparaat” nodig: een H-brug. De L293D bevat twee H-bruggen op één chip → we kunnen de twee L-motoren parallel aan de ene kant koppelen, de servo aan de andere kant. (Voor onafhankelijke motorbesturing heb je een tweede L293D nodig). De servo heeft ook GND en +9V nodig.
Belangrijk: De chip houdt Lego +9V en Arduino +5V volledig gescheiden. Nooit verbinden! Wel alle ground-lijnen met elkaar en met de L293D GND-pinnen verbinden.

Pin-indeling:
- Motor: pin 9 (PWM snelheid), pins 2 en 5 (richting)
- Servo: pin 3 (PWM positie), pins 6 en 8 (richting links/rechts)
Globale constanten en variabelen
// Motor control pins
const int controlPin1A = 2;
const int controlPin2A = 5;
const int ENablePin = 9;
// Servo control pins
const int controlPin3A = 6;
const int controlPin4A = 8;
const int servoENablePin = 3;
// Motor variabelen
int motorSpeed = 0; // 0..255
int motorDirection = 1; // 1 = forward, 0 = reverse
// Servo variabelen
int steering = 0; // 0..255
int steeringDirection = 0; // 0 = left, 1 = right
Setup
void setup() {
pinMode(controlPin1A, OUTPUT);
pinMode(controlPin2A, OUTPUT);
pinMode(ENablePin, OUTPUT);
pinMode(controlPin3A, OUTPUT);
pinMode(controlPin4A, OUTPUT);
pinMode(servoENablePin, OUTPUT);
digitalWrite(ENablePin, LOW);
digitalWrite(servoENablePin, LOW);
}
L293D logica voor richting
Signalen (High = 5V, Low = 0V):
| EN1,2 | 1A | 2A | Resultaat |
|---|---|---|---|
| High | High | Low | Motor linksom (Forward; motorDirection=1) |
| High | Low | High | Motor rechtsom (Reverse; motorDirection=0) |
| EN3,4 | 3A | 4A | Resultaat |
|---|---|---|---|
| High | High | Low | Servo links (steeringDirection=0) |
| High | Low | High | Servo rechts (steeringDirection=1) |
Besturings-subroutine
void SetMotorControl() {
if (motorDirection == 1) { // Forward
digitalWrite(controlPin1A, HIGH);
digitalWrite(controlPin2A, LOW);
} else { // Reverse
digitalWrite(controlPin1A, LOW);
digitalWrite(controlPin2A, HIGH);
}
analogWrite(ENablePin, motorSpeed);
if (steeringDirection == 0) { // Left
digitalWrite(controlPin3A, HIGH);
digitalWrite(controlPin4A, LOW);
} else { // Right
digitalWrite(controlPin3A, LOW);
digitalWrite(controlPin4A, HIGH);
}
analogWrite(servoENablePin, steering);
}
Eenvoudige RC Android-app met joystick
We bouwen een app met MIT App Inventor 2 (web-based, beginner-vriendelijk). Google's Mark Friedman en MIT-professor Hal Abelson zijn de initiators.
- Op Android: installeer MIT AI2 Companion uit Play Store.
- Op computer: open mijn RC-app link in Firefox/Chrome (IE niet ondersteund). Log in met Gmail, maak account aan om broncode te zien.
- Open Companion-app op telefoon → bekijk broncode in browser, wijzig, test direct op telefoon.
In de Designer-view zie je onderaan een oranje pad met blauwe joystick-bal.

In Blocks-view is het hart een when-blok dat vingerbewegingen volgt:

Vingerpositie → variabelen currentX en currentY → bereken steering en speed (bereik -100..0..+100). Begrenzing als vinger buiten pad. Vervolgens wordt een commando-string gegenereerd:
RC,steering,speed,\n
RC = remote control (voor toekomstige uitbreiding). Newline (\n) signaleert einde van commando. String wordt via Bluetooth naar Arduino gestuurd en op scherm getoond.
Bluetooth-commando's inlezen op de Arduino
Sluit HC-05 Bluetooth-module aan.

Mijn module heeft 6 pinnen, we gebruiken 4:
- VCC → Arduino 5V (module verdraagt 6V)
- GND → GND
- TXD → Arduino RX (pin 0) gekreust!
- RXD → Arduino TX (pin 1) gekreust!
LET OP: Module is 3,3V logica. RXD (3,3V) mag niet direct op Arduino TX (5V). Maak een spanningsdeler met 3 × 1 kΩ weerstanden (uitgang 2/3 × 5V ≈ 3,3V). TXD (3,3V) kan wel direct op Arduino RX (herkent 3,3V als HIGH).
Pinnen 0 en 1 zijn gedeeld met USB. Tijdens upload RXD/TXD loskoppelen!
Koppel HC-05 met Android: Bluetooth aan, app starten, „Bluetooth connect”, telefoon zichtbaar maken, zoek HC-05, code „1234”. Terug in app: „connected” in groen.
Arduino-code voor Bluetooth-opvragen
#define INPUT_SIZE 30
void loop() {
char input[INPUT_SIZE + 1];
byte size = Serial.readBytesUntil('\n', input, INPUT_SIZE);
input[size] = 0;
char* command = strtok(input, ","); // "RC"
char* RCsteering = strtok(NULL, ","); // -100..100
char* RCspeed = strtok(NULL, ","); // -100..100
int iRCsteering = atoi(RCsteering);
int iRCspeed = atoi(RCspeed);
// Verwerken...
SetMotorControl();
}
Serial.readBytesUntil('\n', ...) leest tot newline → compleet commando in input. strtok() splitst op komma. atoi() zet string om in integer.
Vermenigvuldig met 2,55 voor PWM-bereik (0–255). Roep SetMotorControl() aan. Bestudeer de volledige code in de Code-sectie, bouw de schakeling en test!
Wat nu?
- Gebruik het model als robotics-platform: voeg ultrasone sensoren toe, programmeer obstakelvermijding, maak een zelfrijdende Mars-rover.
- Voeg meer commando's en functies toe.
- Eerst: bedenk hoe de Arduino detecteert dat het model buiten Bluetooth-bereik is en stopt.
- Breadboard en losse kabels zijn slecht voor bewegende modellen. Overstap op Adafruit Motor Shield met grote terminalblokken – vrij ook digitale pinnen voor sensoren. Overweeg een Sensor Shield.
Laat me weten wat je bouwt!
Code
Legocar_v3_bluetooth Arduino
/* Lego Powerfunctions car model controlled over bluetooth
Arduino Uno controls motors and servo
Remote controlled with android app developed with MIT App Inventor 2
Circuit:
* Serial communication (uses Uno pin 0,1) Bluetooth-module attached (detach when loading over USB)
* L293D with motor (uses Uno digital pins 2,5,9)
* L293D with servo (uses Uno digital pins 6,8,3)
*/
#include <SPI.h>
#include <String.h>
#define INPUT_SIZE 30
const int controlPin1A = 2;
const int controlPin2A = 5;
const int ENablePin = 9;
const int controlPin3A = 6;
const int controlPin4A = 8;
const int servoENablePin = 3;
int motorSpeed = 0;
int motorDirection = 1;
int steering = 0;
int steeringDirection = 0;
void setup() {
Serial.begin(9600);
Serial.setTimeout(1000);
pinMode(controlPin1A, OUTPUT);
pinMode(controlPin2A, OUTPUT);
pinMode(ENablePin, OUTPUT);
pinMode(controlPin3A, OUTPUT);
pinMode(controlPin4A, OUTPUT);
pinMode(servoENablePin, OUTPUT);
digitalWrite(ENablePin, LOW);
digitalWrite(servoENablePin, LOW);
}
void loop() {
char input[INPUT_SIZE + 1];
byte size = Serial.readBytesUntil('\n', input, INPUT_SIZE);
input[size] = 0;
char* command = strtok(input, ",");
char* RCsteering = strtok(NULL, ",");
char* RCspeed = strtok(NULL, ",");
int iRCsteering = atoi(RCsteering);
int iRCspeed = atoi(RCspeed);
if (iRCsteering > 0) steeringDirection = 1; else steeringDirection = 0;
steering = int(2.55 * abs(iRCsteering));
if (iRCspeed > 0) motorDirection = 1; else motorDirection = 0;
motorSpeed = int(2.55 * abs(iRCspeed));
SetMotorControl();
}
void SetMotorControl() {
if (motorDirection == 1) {
digitalWrite(controlPin1A, HIGH);
digitalWrite(controlPin2A, LOW);
} else {
digitalWrite(controlPin1A, LOW);
digitalWrite(controlPin2A, HIGH);
}
analogWrite(ENablePin, motorSpeed);
if (steeringDirection == 0) {
digitalWrite(controlPin3A, HIGH);
digitalWrite(controlPin4A, LOW);
} else {
digitalWrite(controlPin3A, LOW);
digitalWrite(controlPin4A, HIGH);
}
analogWrite(servoENablePin, steering);
}
GitHub Lego-car-Arduino
Broncode Arduino, Fritzing-schema, Android-app broncode voor MIT App Inventor:
https://github.com/Notthemarsian/Lego-car-Arduino
Schema's
GitHub repo bevat Fritzing-diagram (Lego rc car v2.fzz).
Productieproces
- Betrouwbaarheid van Krachtoverdracht Componenten Verhogen: Bewezen Strategieën voor Mijnbouw, Productie & Industriële Operaties
- Betrouwbare energie & HVAC-verhuur voor naadloze klimaatregeling
- Anticonceptiepil: Geschiedenis, Voordelen, Risico's en Productie
- Windenergie: Omzetten van Luchtbeweging in Schone Elektriciteit
- Elektrische Bedieningspanelen: Ontwerpessentiëls voor Veiligheid & ROI
- UK fabrikanten verliezen £2,5 mln aan het corrigeren van ontwerpfouten in automatiseringsprojecten
- Acht Bewezen Stappen om Uw Procescontrolsysteem te Diagnosticeren en Repareren
- Spanningsregeling in webaanvulling beheersen: essentiële componenten uitgelegd
- Differentieren van Exponentiële Functies met Basis e
- Stamfuncties van Exponentiële Machtsfuncties Vinden
- SaaS Beheersen: Strategieën om Controle te Behouden Terwijl u de Cloud Benut