Arduino - Zeichnen über das Web mit Schrittmotorsteuerung
Komponenten und Verbrauchsmaterialien
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 |
Über dieses Projekt
Vorführung
Wenn Sie neu bei Arduino sind, können Sie mit :
. beginnen- Arduino-Tutorials für Neulinge.
- Alles über den Motor für Arduino
Wie es funktioniert
Wenn ein Finger den Zeichenbereich auf der Webseite berührt, wird die XY-Koordinate des Berührungspunkts an Arduino gesendet. Nach dem Skalieren der Koordinate bewegt Arduino zwei Schrittmotoren, um den Stift zu dieser Koordinate zu lokalisieren. Während der Bewegungsphase sendet Arduino kontinuierlich die Flugbahn des Stifts an die Web-App, die Web-App zeichnet die Flugbahn auf der Leinwand.
Quellcode
Der Quellcode umfasst zwei Teile:Arduino-Code und Web-Benutzeroberflächen-Code.
Arduino-Code
Dies ist Arduino-Code, der in einer Endlosschleife ausgeführt wird, um:
- Empfangen des Befehls von der Webseite und Erledigen der Aufgabe gemäß dem Befehl.
- CMD_MOVE:Bewegen Sie den Stift zu einer Position, indem Sie den Zweischrittmotor steuern
- CMD_PEN_UP:Heben Sie den Stift an, indem Sie den Winkel des Servomotors ändern
- CMD_PEN_DOWN:Senken Sie den Stift, indem Sie den Winkel des Servomotors ändern
- Lesen Sie kontinuierlich die aktuelle Position des Stifts und senden Sie sie an die Webseite
Webbenutzeroberfläche
Siehe Code im Abschnitt Code
- Bereitstellung der Benutzeroberfläche
- Behandeln des Benutzerereignisses und Senden des Befehls mit Koordinate an Arduino
- Erhalte die Flugbahn von Arduino und zeichne sie auf der Webseite
remote_draw.php ist eine Datei, die die Webbenutzeroberfläche enthält. Es muss auf dem PHPoC [WiFi] Shield gespeichert werden. Um die Datei auf PHPoC [WiFi] Shield hochzuladen, führen Sie bitte die folgenden Schritte aus:
- Kopieren Sie den folgenden Code und speichern Sie ihn in der Datei remote_draw.php.
- PHoC-Debugger installieren
- Verbinden Sie PHPoC mit dem PHPoC [WiFi] Shield über ein Micro-USB-Kabel gemäß dieser Anleitung. Beachten Sie, dass Arduino mit Strom versorgt werden muss.
- Laden Sie die Datei remote_draw.php gemäß dieser Anleitung in das PHPoC [WiFi] Shield hoch
Anleitung
- Netzwerkinformationen für PHPoC-Schild oder PHPoC-WiFi-Schild konfigurieren
- PHoC-Bibliothek installieren
- PHoC-Erweiterungsbibliothek installieren
- Code kompilieren und auf Arduino hochladen
- Web-Benutzeroberfläche auf PHPoC [WiFi]-Schild hochladen
- Öffne den Serial Monitor und kopiere die IP-Adresse von PHPoC Shield
- Zugriff auf die Webbenutzeroberfläche über einen Webbrowser:http://ip_address_of_shield /remote_draw.php
- Über das Web zeichnen
Um elektronische Komponenten zu kaufen, können Sie diese bei utsource.net bestellen
Das beste Arduino Starter Kit für Anfänger
Siehe Das beste Arduino-Kit für Anfänger
Funktionsreferenzen
- Seriell.begin()
- Seriell.println()
- verzögerung()
- millis()
- for-Schleife
- while-Schleife
- wenn sonst
- Schleife()
- setup()
- String.toInt()
- String.substring()
- String.indexOf()
- String.remove()
- String.equals()
Code
- Arduino-Code
- Web-Benutzeroberfläche
Arduino-CodeArduino
#include#include #include #define MAX_X 55550 // Einheit ist Schritt#define MAX_Y 68780 // Einheit ist Schritt#define TOUCH_OFFSET 5000 // Einheit ist step#define PEN_STATE_UP 0#define PEN_STATE_DOWN 1#define CMD_PEN_UP 0#define CMD_PEN_DOWN 1#define CMD_MOVE 2#define STEP_MODE 32#define SPEED_X_COEF ((lang)40 * STEP_MODE)#define SPEED_Y_COEF (lange) ((long)1500 * STEP_MODE)#define SPEED_Y_MAX ((long)1500 * STEP_MODE)#define ACCEL_X_MAX ((long)6000 * STEP_MODE)#define ACCEL_Y_MAX ((long)6000 * STEP_MODE)#define STEP_STATE_STOP 0#define STEP_STATE_LOCK 1# define RESOLUTION 500#define MIN_UPDATE_INTERVAL 100 // in MillisekundenPhpocServer server(80);ExpansionStepper stepX(14);ExpansionStepper stepY(13);Servoservo;long preX =0;long preY =0;byte penState =PEN_STATE_UP;bool isUnlockedX =false;bool isUnlockedY =false;int forwardDirX =-1; /* Richtung des XY-Plotters bei Vorwärtsbewegung von Motor X, je nach Installation, Es sollte getestet werden, um die Werte zu bestimmen*/int forwardDirY =+1; /* Richtung des XY-Plotters wenn Motor Y nach oben bewegt, je nach Installation, Es sollte getestet werden, um die Werte zu bestimmen */unsigned long lastUpdateMillis;void penUp() { servo.write(110); penState =PEN_STATE_UP;}void penDown() {servo.write(180); penState =PEN_STATE_DOWN;}void xyWait() { while(stepX.getState()> 1 || stepY.getState()> 1);}void xyInit() { penUp(); stepX.setMode(STEP_MODE); stepX.setVrefStop(4); stepX.setVrefDrive(15); stepX.setResonance(120, 250); stepX.setSpeed(20000); stepX.setAccel(50000); stepY.setMode(STEP_MODE); stepY.setVrefStop(4); stepY.setVrefDrive(15); stepY.setResonance(120, 250); stepY.setSpeed(20000); stepY.setAccel(50000); // Stift nach (0, 0) bewegen stepX.stepGotoSW (0, -forwardDirX); stepY.stepGotoSW(0, -forwardDirY); xyWait(); stepX.setPosition(0); stepY.setPosition(0); // Entkommentieren Sie diesen Block für den ersten Durchlauf und ändern Sie den Wert in Zeile 6, 7 dieser Datei und Zeile 33 von index.php entsprechend dem Wert in der IDE-Konsole /* // Überprüfen Sie die maximalen Schritte stepX.stepGotoSW(1, forwardDirX); stepY.stepGotoSW(1, forwardDirY); xyWait(); // ändern Sie diesen Wert in Zeile 45 von index.php Serial.print(F("MAX_X:")); Serial.println (stepX.getPosition() * forwardDirX); Serial.print (F("MAX_Y:")); Serial.println (stepY.getPosition() * forwardDirY); */ xyGoto(TOUCH_OFFSET, TOUCH_OFFSET); xyWait(); stepX.setEioMode(0, EIO_MODE_LOCK); stepX.setEioMode(1, EIO_MODE_LOCK); stepY.setEioMode(0, EIO_MODE_LOCK); stepY.setEioMode(1, EIO_MODE_LOCK);}void xyGoto(long x, long y) { if(x (MAX_X – TOUCH_OFFSET)) x =MAX_X – TOUCH_OFFSET; if(y (MAX_Y – TOUCH_OFFSET)) y =MAX_Y – TOUCH_OFFSET; x *=forwardDirX; y *=forwardDirY; int32_t deltaX =x - stepX.getPosition(); int32_t deltaY =y - stepY.getPosition(); deltaX =abs(deltaX); deltaY =abs(deltaY); lange speedX =SPEED_X_COEF * abs(deltaX); lange GeschwindigkeitY =SPEED_Y_COEF * abs(deltaY); if(speedX> speedY) { if(speedX> SPEED_X_MAX) speedX =SPEED_X_MAX; doppeltes Verhältnis =deltaY / (doppeltes)deltaX; speedY =(lang) (Verhältnis * speedX); aufrechtzuerhalten. Sonst { if (speedY> SPEED_Y_MAX) speedY =SPEED_Y_MAX; doppeltes Verhältnis =deltaX / (doppeltes)deltaY; speedX =(lang) (Verhältnis * speedY); } long accelX; lange Beschleunigung; if (speedX MIN_UPDATE_INTERVAL) isUpdate =true; long curX =stepX.getPosition(); long curY =stepY.getPosition(); langes deltaX =curX - preX; langes deltaY =curY - preY; long dist =sqrt(pow(deltaX, 2) + pow(deltaY, 2)); if(dist> RESOLUTION) isUpdate =true; if(isUpdate ==false || dist ==0) return false; lastUpdateMillis =curMillis; preX =curX; preY =curY; sendPositionToWeb(); // aktuelle Position zur Anzeige im Web senden}void sendPositionToWeb() { char wbuf[20]; long x =stepX.getPosition() * forwardDirX; long y =stepY.getPosition() * forwardDirY; Stringdaten =String(F("[")) + x + String(F(",")) + y + String(F(",")) + penState + String(F("]\n")); data.toCharArray(wbuf, data.length() + 1); server.write (wbuf, data.length ());}void setup () { Serial.begin (9600); while(!Seriell); Phpoc.begin(PF_LOG_SPI | PF_LOG_NET); server.beginWebSocket("xy_plotter"); Serial.print("WebSocket-Serveradresse:"); Serial.println (Phpoc.localIP()); Erweiterung.begin(460800); servo.attach(8); /** HINWEIS:Für den ersten Lauf:* - Entkommentieren Sie den letzten Block in xyInit() * - Führen Sie Arduino-Code aus * - Ändern Sie den Wert in Zeile 6, 7 dieser Datei und Zeile 33 von index.php entsprechend dem Wert in IDE Konsole. **/ xyInit(); lastUpdateMillis =millis();}void loop() { // auf einen neuen Client warten:PhpocClient client =server.available(); if(client) { String data =client.readLine(); if (Daten) {//Serial.println (Daten); Byte-TrennzeichenPos1 =data.indexOf(':'); Byte-TrennzeichenPos2 =data.lastIndexOf(':'); Byte cmd =data.substring(0, separatorPos1).toInt(); long x =data.substring(separatorPos1 + 1,separatorPos2).toInt(); long y =data.substring(separatorPos2 + 1).toInt(); switch(cmd) { case CMD_PEN_DOWN:xyGoto(x, y); //xyWait(); while(stepX.getState()> 1 || stepY.getState()> 1) xyCheckUpdateToWeb(); penDown(); brechen; Fall CMD_PEN_UP://xyWait(); while(stepX.getState()> 1 || stepY.getState()> 1) xyCheckUpdateToWeb(); penUp(); brechen; Fall CMD_MOVE:xyGoto(x, y); brechen; } } } xyCheckUpdateToWeb();}
Web-BenutzeroberflächePHP
Arduino - PHPoC Shield - XY-Plotter WebSocket :null
Herstellungsprozess
- DTMF-Decoder, der nur Arduino verwendet
- Webbetriebener DMX-Controller
- Robotersystem zur Erkennung von Menschen mit Arduino Uno
- Arduino-Gamecontroller
- Arduino-Alarmsystem:SERENA
- Android-gesteuertes Spielzeug mit Raspberry Motor Shield
- Linienfolger-Roboter
- Steuern Sie Arduino Rover mit Firmata und Xbox One-Controller
- Arduino - Temperatur über eine serielle Schnittstelle an das Web senden
- Arduino - Freischaltung von Webmustern