Laser turret bestuurbaar met muis via websocket

In deze blog leg ik uit hoe ik een laser turret heb gebouwd om deze op afstand te kunnen besturen met mijn muis. Leuk speelgoed voor bijvoorbeeld een kat/hond.

Stap 1: Benodigdheden

De onderdelen voor deze laserturret zijn:

  • ESP32 WEMOS d1 mini (link)
  • 3V laser (link)
  • 2x servo motor sg90 (link)
  • Een aantal jumper cables

Stap 2: Software

Om de laserturret met je muis te besturen via een socketverbinding heb je een server en een client nodig. De server is de laserturret en de client is in dit geval een html pagina in combinatie met een php script.

De code die ik gebruikt heb is te vinden in de downloads onderaan de pagina.

Stap 2.1: Arduino firmware

De laserturret wordt bestuurd door een (kleine) microcontroller met Wi-Fi. Er kan uiteraard ook een andere microcontroller worden gebruikt als bijvoorbeeld een ESP8266, echter is de ESP32 net wat sneller en beschikt deze ook over Bluetooth.

De omgeving waarin ik de Arduino firmware heb ontwikkeld is PlatformIO echter zou er ook een andere IDE voor kunnen worden gebruikt.

Om de turret te laten verbinden met je Wi-Fi moet je de volgende regels code aanpassen in main.cpp:

const char* ssid     = "SSID"; 
const char* password = "Password";

Waarbij de waardes in "SSID" en "Password" je Wi-Fi gegevens zijn. Zodra je deze juist hebt ingevuld maakt de turret automatisch verbinding met je Wi-Fi.

Als je de code hebt geflasht naar de ESP32, maakt deze verbinding met je Wi-Fi en print je IP adres op de seriele output. De ESP32 luistert vervolgens op dit IP adres op poort 80 naar inkomende socket verbindingen.

Zodra er een client verbind met de server, wacht de ESP32 totdat er een commando binnenkomt die wordt afgesloten met een "@". Het commando is als volgt opgebouwt:

xCoords/yCoords/Speed/Laser@

xCoords: De x coordinaten van de servo motor (0 tot 180)

yCoords: De y coordinaten van de servo motor (0 tot 180)

Speed: De snelheid hoe snel de turret moet bewegen (0 tot 100)

Laser: Laser aan = 1 Laser uit = 0

@ = terminating character. Zonder deze character weet de server niet dat het einde bericht is ontvangen.

Stap 2.2: Socket client

Als socket client heb ik een html/javascript pagina gemaakt die via een ajax call de coordinaten van de muis binnen een zwart vlak doorgeeft aan de socket server. Dit is hoe ik het heb opgelost echter zijn er meerdere oplossingen mogelijk om te communiceren via websockets met de esp32 (bijvoorbeeld via een python script op een raspberry Pi)

index.php bevat de html pagina met javascript die de coordinaten doorgeeft aan de turret. Een afbeelding van hoe dit er uitziet is te vinden onderaan de pagina.

Het php script om te communiceren met de ESP32 staat in turretComm.php

Om de socket client te laten werken is het nodig om beide bestanden op een webserver te zetten, dit kan een dedicated webserver zijn maar ook bijvoorbeeld een WAMP omgeving binnen windows. Op regel 32 in index.php zie je de volgende regel staan:

var turretCommURL 	= "URL_TO_TURRET_COMM";

Dit is de URL die verwijst naar turretComm.php en moet je dus wijzigen waar je deze hebt geplaatst op je webserver.

Als je turretComm.php opent moeten de volgende regels overeenkomen met de ESP32:

$port = 80;
$ip = 'IP_ADDRESS_TURRET';

Standaard staat de poort in de code van de ESP32 op 80, echter als je deze gewijzigt hebt moet je deze hier ook wijzigen. De waarde "IP_ADDRESS_TURRET" moet worden gewijzigd naar het IP adres van de ESP32. Let op dat je wel de quotes om het ip adres laat staan.

Als je deze stappen hebt gevolgd zou je op index.php moeten kunnen communiceren met de laser turret. De positie binnen het zwarte vlak worden elke 25 ms doorgegeven aan de socketserver.

Stap 3: Behuizing

De behuizing in dit voorbeeld is geprint in PLA (Zwart en wit), echter zou het ook in andere materialen geprint kunnen worden. De STL bestanden hiervoor staan onderaan de pagina. Om de ESP32 en de Laser te vast te zetten heb ik smeltlijm gebruikt. De servo motoren kunnen worden vastgeschroefd in de bestemde schroefgaten, echter klemmen deze ook al redelijk in elkaar door het plastic zelf.

Stap 4: Electronica

De ESP32 moet worden verbonden met de laser en de servo motoren op de volgende manier:

Servo motor X:

  • Rood -> VCC (5V)
  • Zwart -> GND
  • Oranje -> GPIO4

Servo motor Y:

  • Rood -> VCC (5V)
  • Zwart -> GND
  • Oranje -> GPIO2

Laser:

  • Rood -> GPIO27
  • Zwart -> GND



© Prompt. All rights reserved. Crafted by Kevin Assen