new Stepper Controll and fix scan anomali

This commit is contained in:
Lukas Droste
2021-07-31 20:32:11 +02:00
parent bd9410519a
commit 36d33b6286
4 changed files with 6556 additions and 387 deletions

View File

@@ -1,18 +1,18 @@
#include <AFMotor.h> #include <CheapStepper.h>
double degreeY = 0; double degreeY = 0;
String rxData = ""; //Empfangen String rxData = ""; //Empfangen
// Connect a stepper motor with 200 steps per revolution (1.8 degree) CheapStepper stepper (8,9,10,11);
// to motor port #1 (M1 and M2)
AF_Stepper motor(200, 1);
void setup() { void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
motor.setSpeed(60); // 60 rpm stepper.setRpm(24);
} }
void loop() { void loop() {
stepper.run();
// send data only when you receive data: // send data only when you receive data:
if (Serial.available() > 0) { if (Serial.available() > 0) {
// read the incoming byte: // read the incoming byte:
@@ -37,23 +37,27 @@ void loop() {
} }
String moveMotor(double y){ String moveMotor(double y){
if(y < degreeY){ if(y < degreeY){
motor.step((int)calculateStepps(degreeY - y), BACKWARD, INTERLEAVE); //"interleave" means that it alternates between single and double to get twice the resolution (but of course its half the speed) stepper.newMoveDegrees (true, calculateMove(y)); //true = im Uhrzeigersinn drehen
motor.release(); // Strom sparen und Überhitzung des Controllers vorbeugen! //motor.step((int)calculateStepps(degreeY - y), BACKWARD, INTERLEAVE); //"interleave" means that it alternates between single and double to get twice the resolution (but of course its half the speed)
//motor.release(); // Strom sparen und Überhitzung des Controllers vorbeugen!
} }
else{ else{
motor.step((int)calculateStepps(y - degreeY), FORWARD, INTERLEAVE); stepper.newMoveDegrees (false, calculateMove(y)); //false = gegen Uhrzeigersinn drehen
motor.release(); //motor.step((int)calculateStepps(y - degreeY), FORWARD, INTERLEAVE);
//motor.release();
} }
degreeY = y; degreeY = y;
return "<move><" + (String)y + ">"; return "<move><" + (String)y + ">";
} }
double calculateStepps(double y){ double calculateMove(double y){
double temp = 0; double temp = 0;
if(y < degreeY) if(y < degreeY)
temp = degreeY - y; temp = degreeY - y;
else else
temp = y - degreeY; temp = y - degreeY;
return (y / 1.8) * 2; // *2 wegen interleave stepps / Falls Untersetzung, multiplikator anpassen! return temp * 7.37 ;// Übersetzung 96/11 4,4/30,5
} }

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@ import time # Time module
#port = input("Enter port name which lidar is connected:") #windows #port = input("Enter port name which lidar is connected:") #windows
#port = "/dev/ttyUSB0" #linux #port = "/dev/ttyUSB0" #linux
f = open("PoinCloudWeb.Scanner\datafile.txt","wt") f = open("PoinCloudWeb.Scanner\datafile.txt","wt")
Obj = PyLidar3.YdLidarX4(port='COM6',chunk_size=10000) #PyLidar3.your_version_of_lidar(port,chunk_size) Obj = PyLidar3.YdLidarX4(port='COM6',chunk_size=20000) #PyLidar3.your_version_of_lidar(port,chunk_size)
if(Obj.Connect()): if(Obj.Connect()):
print(Obj.GetDeviceInfo()) print(Obj.GetDeviceInfo())
gen = Obj.StartScanning() gen = Obj.StartScanning()
@@ -13,7 +13,7 @@ if(Obj.Connect()):
data = next(gen) data = next(gen)
#print(data) #print(data)
for x,y in data.items(): for x,y in data.items():
f.write("a:" + str(x) + " d:" + str(y) + "\n") f.write(str(x) + " / " + str(y) + "\n")
f.close() f.close()
Obj.StopScanning() Obj.StopScanning()
Obj.Disconnect() Obj.Disconnect()

View File

@@ -1,43 +1,88 @@
# Importing Libraries # Importing Libraries
import serial import serial
import time import time
import PyLidar3
arduino = serial.Serial(port='COM5', baudrate=9600) arduino = serial.Serial(port='COM8', baudrate=9600)
lidar = PyLidar3.YdLidarX4(port='COM6',chunk_size=20000) #PyLidar3.your_version_of_lidar(port,chunk_size)
f = open("PoinCloudWeb.Scanner\datafile.txt","wt")
print("Start ...") print("Start ...")
time.sleep(2) time.sleep(2)
print("Ready:") print("Ready:")
def write_read(x): def arduino_write_read(x):
arduino.write(bytes(x, 'utf-8')) arduino.write(bytes(x, 'utf-8'))
data = arduino.readline() data = arduino.readline()
return filterY(str(data)) return filterY(str(data))
def setY(y): def setY(y):
print(write_read("<set><"+str(y)+">")) print(arduino_write_read("<set><"+str(y)+">"))
def getY(): def getY():
print(write_read("<get>")) print(arduino_write_read("<get>"))
def resetY(): def resetY():
print(write_read("<reset>")) print(arduino_write_read("<reset>"))
def zerotY(): def zerotY():
print(write_read("<zero>")) print(arduino_write_read("<zero>"))
def filterY(data): def filterY(data):
temp = data[data.find("<"):data.find(">")] temp = data[data.find("<"):data.find(">")]
return temp + data[data.find("><"):data.find(">", data.find("><")+2)+1] return temp + data[data.find("><"):data.find(">", data.find("><")+2)+1]
def startScan(mode): def senddata(data,posy):
print("Scan gestartet") for x,y in data.items():
f.write("y:" + str(posy) + "x:" + str(x) + "d:" + str(y) + "\n")
def stopScan(): def startScaner(mode):
print("Scan gestoppt") if(lidar.Connect()):
print(lidar.GetDeviceInfo())
gen = lidar.StartScanning()
t = time.time() # start time
if(mode == "0"):
print("Mode 0")
for y in range(18):
senddata(next(gen),y*10)
time.sleep(2)
setY(y*10)
time.sleep(2)
setY(0)
elif(mode == "1"):
print("Mode 1")
for y in range(90):
senddata(next(gen),y*2)
time.sleep(1)
setY(y*2)
time.sleep(1)
setY(0)
elif(mode == "2"):
print("Mode 2")
for y in range(360):
senddata(next(gen),y*0.5)
time.sleep(1)
setY(y*0.5)
time.sleep(1)
setY(0)
def getScanStatus(): else:
return "%" print("Mode Error")
# data = next(gen)
# #print(data)
# for x,y in data.items():
# f.write("a:" + str(x) + " d:" + str(y) + "\n")
f.close()
lidar.StopScanning()
lidar.Disconnect()
print("Scaner gestoppt")
else:
print("Error connecting to device")
while True: while True:
for x in range(11): startScaner(input("Scan Modus(0,1,2):"))
setY(x*36) # for x in range(18):
# setY(x*10)
# time.sleep(1)