Bluetooth-gestuurde Arduino gemotoriseerde camerashuif voor soepel filmische opnames
Onderdelen en benodigdheden
| Arduino UNO | × | 1 |
| PCBWay Custom PCB (projectlink) | × | 1 |
| V-Slot 20×40 Lineaire Rail (lengte naar keuze) | × | 1 |
| Solid V Wheel Kit | × | 4 |
| Drop In Tee Nuts | × | 4 |
| Excentrische spacer | × | 2 |
| 9 mm Aluminium spacer | × | 2 |
| 3 mm Aluminium spacer | × | 2 |
| Low Profile M5 schroeven 20 mm met moeren | × | 4 |
| Low Profile M5 schroeven 10 mm | × | 4 |
| M3 Allen HEX schroeven 16 mm met moeren | × | 8 |
| 8 mm Zelf-uitlijnende Kussenflens Lagerblokken | × | 2 |
| GT2 Bore 8 mm 20 Tanden Tijdband Aluminium Katrol | × | 1 |
| 8 mm Lineaire railas (60 mm lengte) | × | 1 |
| GT2 Bore 5 mm 20 Tanden Tijdband Aluminium Katrol | × | 1 |
| GT2-6 mm Open Tijdband (lengte afhankelijk van rail) | × | 1 |
| Bipolaire NEMA17 Stapelmotor | × | 1 |
| A4988 Stapelmotor driver | × | 1 |
| 12V 3A Op laadbare accu | × | 1 |
| HC-05 Bluetooth Module | × | 1 |
Benodigde tools en machines
- 3D-printer (generic)
Apps en online diensten
- Autodesk Fusion 360
- Autodesk Eagle
- Arduino IDE
Over dit project
Projectoverzicht
Als iemand die graag hobbyfilmpjes maakt, is een professionele gemotoriseerde camerashuif vaak te duur. Daarom bouwde ik er zelf een. In deze tutorial loop ik stap voor stap door het bouwproces van een eigen Bluetooth-gestuurde motorische camerashuif.
We bouwen een camerashuif die draadloos via Bluetooth te bedienen is met een zelfgemaakte Android-app. De app is gemaakt met MIT App Inventor en biedt controle over snelheid, afstand, versnelling/vertraging en meer. De app is robuust: je kunt de lengte van je schuif (tot 10 meter) instellen, zodat je vrij bent in de afmetingen van je build.

Als actuator dient een NEMA17 stapelmotor, wat precieze stapsgewijze beweging mogelijk maakt. Voor de aansturing gebruiken we de A4988 Pololu stapelmotor driver, die vijf microstap-resoluties ondersteunt (tot 1/16 stap) voor maximale nauwkeurigheid en vloeiende beweging.

Het project is ontworpen met maakbaarheid in een fablab/makerspace in gedachten.
CAD en 3D-modellering
De camerashuif is ontworpen in Fusion 360. We kozen voor standaard, makkelijk verkrijgbare mechanische componenten die overal ter wereld te koop zijn.

We gebruiken OpenBuilds hardware voor de mechanische structuur: de V-slot 2040 lineaire rail als geleiding. Twee katrollen – één op de motoras, de andere op een 8 mm lineaire as aan de overkant – met een open tijdband ertussen zetten de rotatiebeweging om in lineaire beweging.


De 8 mm lineaire as zit tussen twee zelf-uitlijnende kussenflens lagerblokken, bevestigd met vier M5 schroeven op de boven- en onderplaat.

Vier Delrin V-slot wielen lopen in de V-groef van de rail voor extreem soepele beweging. De cameraplaat heeft een standaard 1/4-inch gat voor een statiefschroef.

Tot slot een behuizing voor de elektronica. Alle onderdelen worden samengehouden met M3×16 mm schroeven en moeren.

Digitale fabricatie (3D-printen)
Alle 3D-geprinte delen worden geprint met 0,2 mm laaghogte en 20% infill, behalve de linker- en rechterpoot van de schuif (50% infill voor extra stevigheid).
STL-bestanden zijn te downloaden via Thingiverse.
V-Wiel kit montage
De montage is eenvoudig. Elk Solid V-wiel kit bevat een rubber wiel, twee lagers, twee precisiespacers en een borgmoer.
- Plaats een lager aan één kant van het rubber wiel.
- Keer het wiel om en plaats een precisiespacer.
- Plaats het tweede lager aan de andere kant.
- Bevestig met de borgmoer.




Mechanische montage camerashuif
Cameraplaat en wielen
Monteer de vier V-wielen op de cameraplaat met de 9 mm aluminium spacers, precisiespacers en borgmoeren. Bij de twee rechter wielen gebruik je de 9 mm spacer; bij de linker wielen de excentrische spacer met een 3 mm spacer.



Schuif de cameraplaat in het V-slot profiel. Als er spel is, draai de excentrische moer vast tot de plaat stevig zit.


Profiel en poten
Plaats twee drop-in tee nuts aan elk uiteinde van het V-slot profiel. Schuif de linker- en rechterpoot erop en bevestig met vier M5×10 mm schroeven.






Stapelmotor montage
Monteer de NEMA17 motor op zijn plaat en bevestig met vier M3×16 mm schroeven. Plaats vervolgens de motorplaat op de linker poot en bevestig met twee M3×16 mm schroeven.




Plaats de GT2 5 mm boor katrol op de motoras en vastzetschroef vast.


Rechter poot: lagers en katrol
Plaats vier M3 moeren in de rechter poot. Monteer de twee lagerplaten en bevestig met vier M3×16 mm schroeven.








Monteer de twee 8 mm flenslagerblokken (boven en onder) met M5×20 mm schroeven en moeren.






Schuif de 8 mm lineaire as door de lagerblokken (van onder naar boven). Plaats de 8 mm boor katrol op de as en vast de zetschroef.



Tijdband montage
Leg de 6 mm tijdband om beide katrollen en spen het vast aan de cameraplaat.



Elektronica behuizing
Plaats de Cairo Camera Slider Arduino Shield op de Arduino UNO. Monteer alles in de behuizing en bevestig deze aan de linker poot met M3×16 mm schroeven. Sluit de behuizing met twee M3 schroeven en moeren.











Stapelmotor test & A4988 driver uitleg
Na montage testen we de motor via de A4988 driver. De A4988 fungeert als vertaler tussen Arduino en de bipolaire stapelmotor. Belangrijkste kenmerken:
- Tot 2A per spoel
- Alleen 2 digitale pinnen nodig (STEP, DIR)
- Stroom instelbaar via onboard potentiometer
- Microstap resoluties: full, half, 1/4, 1/8, 1/16



Belangrijkste pinnen:
- VMOT, GND: Motorvoeding 8-35V (hier 12V 3A + 100µF condensator)
- 2B, 2A / 1A, 1B: Motor spoel uitgangen
- VDD, GND: Logica voeding 3-5.5V
- EN: Enable (actief LAAG, standaard ingeschakeld)
- MS1, MS2, MS3: Microstap selectie (standaard full-step)
- RST, SLP: Reset en Sleep (actief LAAG)
- STP, DIR: Stap en richting controle
NEMA17 Stapelmotor
De bipolaire NEMA17 heeft 4 draden (2 spoelen), staphoek 1,8°, werkt op 9-12V voor maximale kracht.


Schema en bedrading

Arduino Code - Test met AccelStepper
Installeer de AccelStepper bibliotheek (Mike McCauley) via Library Manager.
// Bounce stepper test
#include <AccelStepper.h>
#define stepPin 2
#define dirPin 3
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
void setup() {
stepper.setMaxSpeed(100);
stepper.setAcceleration(20);
stepper.moveTo(500);
}
void loop() {
if (stepper.distanceToGo() == 0)
stepper.moveTo(-stepper.currentPosition());
stepper.run();
}
Volledige draadloze controle via Bluetooth
Mobiele app (MIT App Inventor)
De app communiceert via Bluetooth (HC-05) met de Arduino. Functies: snelheid, afstand, versnelling, vertraging, vertraagde start (15s), homing (links/rechts), microstap modus (1/4 = Smooth, 1/16 = Very Smooth). De broncode is open source.



Bluetooth module aansluiten (HC-05)
- Arduino TX → HC-05 RX
- Arduino RX → HC-05 TX
- 5V → VCC
- GND → GND

PCB Shield (PCBWay)
Een custom Arduino UNO shield houdt alle componenten netjes op hun plaats. De PCB is gefabriceerd bij PCBWay ($5) met uitstekende kwaliteit.





Arduino Code & Bluetooth Communicatie (Finale versie)
De code gebruikt een state machine voor opstart-configuratie (homing, microstap, rail-lengte) en verwerkt daarna real-time commando's van de app. Belangrijke datacodes:
- 1 = Links, 2 = Rechts, 3 = Stop
- 201-1200 = Afstand in cm
- 5001-9000 = Snelheid (stappen/sec)
- 11-15 = Versnelling (Very High tot Very Low)
- 16/17 = Homing links/rechts
- 18/19 = Microstap 1/4 of 1/16
- 1301-2300 = Rail lengte in cm
/* Cairo Camera Slider - Finale Arduino Code */
#include <MultiStepper.h>
#include <AccelStepper.h>
#define stepPin 2
#define dirPin 3
bool homingPositionFlag = false;
int startupSetupFlag = 0;
bool delayedStart = false;
int incomingData = 0;
int movementDistance = 50;
long steps = 0;
int microStepResolution = 0; // 4 of 16
long railLength = 0;
int sliderSpeed = 10;
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
void setup() {
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
Serial.begin(9600);
stepper.setMaxSpeed(10.00);
stepper.setAcceleration(500.00);
while (startupSetupFlag < 3) {
if (Serial.available() > 1) {
unsigned int dataOne = Serial.read();
unsigned int dataOne1 = Serial.read();
unsigned int incomingData = (dataOne1 * 256) + dataOne;
// Homing
if (incomingData == 16) { stepper.setCurrentPosition(steps); homingPositionFlag = false; startupSetupFlag++; }
else if (incomingData == 17) { stepper.setCurrentPosition(-(steps)); homingPositionFlag = true; startupSetupFlag++; }
// Microstap
if (incomingData == 18) { microStepResolution = 4; startupSetupFlag++; }
else if (incomingData == 19) { microStepResolution = 16; startupSetupFlag++; }
// Rail lengte
if (incomingData >= 1301 && incomingData <= 2300) {
railLength = incomingData - 1300;
if (microStepResolution == 4) steps = ((6100L * railLength) / 50L);
else if (microStepResolution == 16) steps = ((25000L * railLength) / 50L);
startupSetupFlag++;
}
}
}
}
void loop() {
if (Serial.available() > 1) {
unsigned int dataOne = Serial.read();
unsigned int dataOne1 = Serial.read();
unsigned int incomingData = (dataOne1 * 256) + dataOne;
// Motor controle
if (incomingData == 1 && !stepper.isRunning() && stepper.currentPosition() != 6050 && homingPositionFlag) {
if (delayedStart) delay(15000);
stepper.setCurrentPosition(0);
stepper.moveTo(steps);
homingPositionFlag = false;
}
else if (incomingData == 2 && !stepper.isRunning() && stepper.currentPosition() != -6050 && !homingPositionFlag) {
if (delayedStart) delay(15000);
stepper.setCurrentPosition(0);
stepper.moveTo(-(steps));
homingPositionFlag = true;
}
else if (incomingData == 3 && stepper.isRunning()) homing();
// Snelheid
else if (incomingData >= 5001 && incomingData <= 9000) {
sliderSpeed = incomingData - 5000;
stepper.setMaxSpeed(sliderSpeed);
}
// Vertraagde start
else if (incomingData == 7) delayedStart = true;
else if (incomingData == 8) delayedStart = false;
// Afstand
else if (incomingData >= 201 && incomingData <= 1200) {
movementDistance = incomingData - 200;
if (microStepResolution == 4) steps = ((6100L * movementDistance) / 50L);
else if (microStepResolution == 16) steps = ((25000L * movementDistance) / 50L);
}
// Versnelling
else if (incomingData == 11 && !stepper.isRunning()) stepper.setAcceleration(3000);
else if (incomingData == 12 && !stepper.isRunning()) stepper.setAcceleration(1000);
else if (incomingData == 13 && !stepper.isRunning()) stepper.setAcceleration(500);
else if (incomingData == 14 && !stepper.isRunning()) stepper.setAcceleration(4000);
else if (incomingData == 15 && !stepper.isRunning()) stepper.setAcceleration(10);
}
stepper.run();
}
void homing() {
homingPositionFlag = (stepper.currentPosition() > 0);
stepper.moveTo(0);
}
Gebruikshandleiding & Troubleshooting
- Sluit 12V voeding aan, schakel Bluetooth in op telefoon, koppel met HC-05.
- Open app, druk op "Press here to connect with Cairo camera slider", selecteer HC-05.
- App vraagt: Microstap modus (Smooth 1/4 of Very Smooth 1/16) – moet overeenkomen met hardware instelling op A4988 (MS1/MS2/MS3).
- App vraagt: Rail lengte in cm.
- App vraagt: Homing positie (linker of rechter uiteinde) – plaats de cameraplaat fysiek op het gekozen uiteinde voordat je kiest.
- Bevestig instellingen, klaar voor gebruik!







Bestanden
- Code: Cairo Camera Slider Final Code (Arduino)
- 3D-modellen: STL-bestanden op Thingiverse
- Schema: Zie schematics sectie
Productieproces
- De Evolutie en Ontwerp van Moderne Camera's
- Cameraobjectieven Begrijpen: Ontwerp, Geschiedenis en Toekomstige Innovaties
- BrickPi Bookreader: Kindle Lezen Automatiseren met Raspberry Pi en LEGO Mindstorms
- Bluetooth-gecontroleerde Arduino Spybot bouwen
- FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen
- DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
- Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
- Find Me: Slimme Item Locator met Arduino en Bluetooth
- Geoptimaliseerde Voedingsoplossingen voor Arduino Projecten
- Arduino Boter-Kaas-Eieren met MAX7219 LED Matrix en Kartonnen Behuizing
- Geavanceerde THz imaging camera onthult hoge-resolutie interne beelden van vaste objecten