Hallo! Wer mein vorherigen Beitrag gelesen hat weiß, dass ich Probleme mit der Kommunikation mit einem RPLidar hatte, nun diese habe ich so halbwegs hinbekommen und jetzt stellt sich bei mir eine neue Frage...
Ich benutze ein Arduino Uno und das ist der Code:
#include <RPLidar.h>
// You need to create an driver instance
RPLidar lidar;
// The PWM pin for control the speed of RPLIDAR's motor.
// This pin should connected with the RPLIDAR's MOTOCTRL signal
#define RPLIDAR_MOTOR 3
bool transmit = false;
byte incomingByte;
int x = 0;
int y = 0;
void setup()
{
// bind the RPLIDAR driver to the arduino hardware serial
Serial.begin(115200);
lidar.begin(Serial);
// initialize both serial ports:
Serial.begin(115200); // Initialize Native USB port
// set pin modes
pinMode(RPLIDAR_MOTOR, OUTPUT);
analogWrite(RPLIDAR_MOTOR, 255);
}
void loop() {
if (IS_OK(lidar.waitPoint()))
{
float distance = lidar.getCurrentPoint().distance; //distance value in mm unit
float angle = lidar.getCurrentPoint().angle; //anglue value in degree
bool startBit = lidar.getCurrentPoint().startBit; //whether this point is belong to a new scan
byte quality = lidar.getCurrentPoint().quality; //quality of the current measurement
if (Serial.available() > 0)
{
incomingByte = Serial.read();
transmit = !transmit;
}
//Serial.print("dist: ");
Serial.print(distance);
Serial.print(";");
//Serial.print("\tangle: ");
Serial.print(angle);
Serial.print(";");
//Serial.print("\tsbit: ");
//Serial.print(startBit);
//Serial.print(";");
//Serial.print("\tquality: ");
Serial.print(quality);
Serial.print("\n");
}
else
{
analogWrite(RPLIDAR_MOTOR, 0); //stop the rplidar motor
// try to detect RPLIDAR...
rplidar_response_device_info_t info;
if (IS_OK(lidar.getDeviceInfo(info, 100)))
{
// detected...
lidar.startScan();
// start motor rotating at max allowed speed
analogWrite(RPLIDAR_MOTOR, 255);
delay(1000);
}
}
}
Nun spuckt mein serieller Monitor Werte aus aber auch viel zu viele 0.00 Werte zwischendurch, was ich nicht verstehe! Das sieht wie folgt aus:
Und diesen Fehler muss ich dringend behoben kriegen, da es überhaupt nicht Hilfreich dafür ist dass später mein Staubsaugroboter bzw. die Motoren auf die Messungen reagieren soll und bei einer Bestimmten Distanz zu einem Hinderniss ein umfahren dafür geplant ist!
Ich habe es eben als neues gesehen da ich vorher überhaupt keine Zahlen hatte! Tut mir ja leid, aber so intensiv immer auf einen Fehler gleich einzugehen statt einfach höflich vielleicht wieder den selben Tipp zu geben und ein hinweis darauf geben ist auch nicht das beste! Ich habe ja immerhin oben gesagt das ich das als neues problem empfinde! Aber ist okey ich werde es ausprobieren!
#include <RPLidar.h> // https://github.com/robopeak/rplidar_arduino
#include "SoftwareSerial.h"
SoftwareSerial lidarSerial(4, 5); // RX, TX
// You need to create an driver instance
RPLidar lidar;
// The PWM pin for control the speed of RPLIDAR's motor.
// This pin should connected with the RPLIDAR's MOTOCTRL signal
constexpr byte RPLIDAR_MOTOR {3};
bool transmit = false;
byte incomingByte;
int x = 0;
int y = 0;
void setup()
{
// bind the RPLIDAR driver to the arduino hardware serial
lidarSerial.begin(115200);
lidar.begin(lidarSerial);
// initialize both serial ports:
Serial.begin(115200); // Initialize Native USB port
// set pin modes
pinMode(RPLIDAR_MOTOR, OUTPUT);
analogWrite(RPLIDAR_MOTOR, 255);
}
void loop()
{
if (IS_OK(lidar.waitPoint()))
{
float distance = lidar.getCurrentPoint().distance; //distance value in mm unit
float angle = lidar.getCurrentPoint().angle; //anglue value in degree
bool startBit = lidar.getCurrentPoint().startBit; //whether this point is belong to a new scan
byte quality = lidar.getCurrentPoint().quality; //quality of the current measurement
if (Serial.available() > 0)
{
incomingByte = Serial.read();
transmit = !transmit;
}
//Serial.print("dist: ");
Serial.print(distance);
Serial.print(";");
//Serial.print("\tangle: ");
Serial.print(angle);
Serial.print(";");
//Serial.print("\tsbit: ");
//Serial.print(startBit);
//Serial.print(";");
//Serial.print("\tquality: ");
Serial.print(quality);
Serial.print("\n");
}
else
{
analogWrite(RPLIDAR_MOTOR, 0); //stop the rplidar motor
// try to detect RPLIDAR...
rplidar_response_device_info_t info;
if (IS_OK(lidar.getDeviceInfo(info, 100)))
{
// detected...
lidar.startScan();
// start motor rotating at max allowed speed
analogWrite(RPLIDAR_MOTOR, 255);
delay(1000);
}
}
}
Theoretisch erstmal ja.
Ich würde vermeiden wollen: SDA/SCL für den I2C, und ggfls. die 13 für die Verwendung der internen LED zu Kontrollzwecken.
Ob Du SPI brauchst, weiss ich nicht, aber dann blieben ggfls. noch die anderen analogPins, die auch als digitale gehen.
ACHTUNG!
Der softwareserial ist jetzt mit 115200 initialisiert.
Das kann der zwar aber sehr unsicher.
Eigentlich spricht man in Kreisen davon, das 19200 die obere sichere Grenze ist.
paasst.
[edit]
Noch ein Nachtrag.
Ich hab grad mal quer auf die Lidar-lib geschaut.
Die bricht Dir das Genick, wenn es die selbe ist, wie von mir im Code angegeben.
Die kann kein SW-Serial, weil die hart verdrahtet ist:
bool begin(HardwareSerial &serialobj);
Das wird eine etwas größere Operation.
In einem ersten Schritt alles wieder zurück auf Anfang und den Seriellen Monitor raus.
Um die Distance == 0 zu zeigen, könntest die LEd an Pin 13 einsetzen.
#include <RPLidar.h> // https://github.com/robopeak/rplidar_arduino
// You need to create an driver instance
RPLidar lidar;
// The PWM pin for control the speed of RPLIDAR's motor.
// This pin should connected with the RPLIDAR's MOTOCTRL signal
constexpr byte RPLIDAR_MOTOR {3};
bool transmit = false;
byte incomingByte;
int x = 0;
int y = 0;
float distance;
void setup()
{
// bind the RPLIDAR driver to the arduino hardware serial
Serial.begin(115200);
lidar.begin(Serial);
// set pin modes
pinMode(RPLIDAR_MOTOR, OUTPUT);
analogWrite(RPLIDAR_MOTOR, 255);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
if (IS_OK(lidar.waitPoint()))
{
distance = lidar.getCurrentPoint().distance; //distance value in mm unit
float angle = lidar.getCurrentPoint().angle; //anglue value in degree
bool startBit = lidar.getCurrentPoint().startBit; //whether this point is belong to a new scan
byte quality = lidar.getCurrentPoint().quality; //quality of the current measurement
if (Serial.available() > 0)
{
incomingByte = Serial.read();
transmit = !transmit;
}
}
else
{
analogWrite(RPLIDAR_MOTOR, 0); //stop the rplidar motor
// try to detect RPLIDAR...
rplidar_response_device_info_t info;
if (IS_OK(lidar.getDeviceInfo(info, 100)))
{
// detected...
lidar.startScan();
// start motor rotating at max allowed speed
analogWrite(RPLIDAR_MOTOR, 255);
delay(1000);
}
}
digitalWrite(LED_BUILTIN, distance < 0.1);
}
In einem zweiten Schritt dann entweder einen MEGA nehmen oder eine andere lidar-lib.
Na dann... Viel Spass!
Ein Mega wär natürlich perfekt gewesen, aber da haben ich und mein Partner überhaupt nicht dran gedacht gehabt weil wir uns das so nicht erwartet haben! Aber fürs nächste mal weiß ichs ja jetzt besser! Ich danke dir vielmals!