Diesen Post habe ich bereits, bisher leider erfolglos im englischen Forum platziert. Somit erlaube ich mir die deutschsprachige Community um Unterstützung zu bitten.
Mein Ziel ist es mit dem Nicla Vision einen Servo in Abhängigkeit von der Entfernung zu steuern.
Hardware:
Arduino IDE Version 2.2.1 für Mac
Nicla Vision mit (ToF)-Sensor VL53L1X
Servo Reels S-3003 analog
Beispiel: Bei einem Abstand von 40 mm bewegt sich das Servo auf 0°, bei 4000 mm bewegt sich das Servo auf 180°.
Ich habe nun den kompletten Sketch zur Abstandserkennung mit Arduino Nicla Vision auf Nicla hochgeladen.
Gemäss diesem Tutorial:
[https://docs.arduino.cc/tutorials/nicla-vision/proximity]
Ergebnis: OK - die LED blinkt nun abhängig von der Entfernung.
In der Arduino IDE:
Ich wähle -> Board -> Arduino Mbed OS Nicla Boards -> Nicla Vision
Dann finde ich das Servo-Beispiel unter File -> Examples -> Servo -> Sweep
Meine Fragen:
Wie integriere ich diesen Servo-Sketch in den oben erwähnten Nicla Vision-Sketch?
Hat jemand Erfahrung damit und kann mir freundlicherweise weiterhelfen?
Deine Chance, eine Antwort zu bekommen erhöht sich erheblich, wenn Du die beiden Sketche hier in Codetags einstellst und Deinen eventuell schon vorhanden Versuch postest.
Klar,gerne hier den Sketch zur Abstandserkennung mit Arduino Nicla Vision
#include "VL53L1X.h"
VL53L1X proximity;
bool blinkState = false;
int reading = 0;
int timeStart = 0;
int blinkTime = 2000;
void setup() {
Serial.begin(115200);
Wire1.begin();
Wire1.setClock(400000); // use 400 kHz I2C
proximity.setBus(&Wire1);
pinMode(LEDB, OUTPUT);
digitalWrite(LEDB, blinkState);
if (!proximity.init()) {
Serial.println("Failed to detect and initialize sensor!");
while (1);
}
proximity.setDistanceMode(VL53L1X::Long);
proximity.setMeasurementTimingBudget(10000);
proximity.startContinuous(10);
}
void loop() {
reading = proximity.read();
Serial.println(reading);
if (millis() - timeStart >= reading) {
digitalWrite(LEDB, blinkState);
timeStart = millis();
blinkState = !blinkState;
}
}
und hier den Sketch für den Servo:
/* Sweep
by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.
modified 8 Nov 2013
by Scott Fitzgerald
https://www.arduino.cc/en/Tutorial/LibraryExamples/Sweep
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15 ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15 ms for the servo to reach the position
}
}
In der Zwischenzeit habe ich mit GTP Hilfe angehängtes Skript ausprobiert.
Der Servo ruckelt nur und macht nicht was er sollte:
Nämlich in Abhängigkeit zur Distanz, zwischen 0 und 180 Grad hin und her schwenken.
Kann mir irgend jemand weiterhelfen?
#include "VL53L1X.h"
#include <Servo.h>
VL53L1X proximity;
Servo myservo;
bool blinkState = false;
int reading = 0;
int timeStart = 0;
int blinkTime = 2000;
void setup() {
Serial.begin(115200);
Wire1.begin();
Wire1.setClock(400000); // use 400 kHz I2C
proximity.setBus(&Wire1);
pinMode(LEDB, OUTPUT);
digitalWrite(LEDB, blinkState);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
if (!proximity.init()) {
Serial.println("Failed to detect and initialize sensor!");
while (1);
}
proximity.setDistanceMode(VL53L1X::Long);
proximity.setMeasurementTimingBudget(10000);
proximity.startContinuous(10);
}
void loop() {
reading = proximity.read();
Serial.println(reading);
if (millis() - timeStart >= reading) {
digitalWrite(LEDB, blinkState);
timeStart = millis();
blinkState = !blinkState;
// Servo-Steuerung basierend auf der Entfernung
int servoPosition = map(reading, 40, 4000, 0, 180);
// Erhöhen Sie die Schritte beim Durchlaufen der Servo-Positionen
for (int pos = myservo.read(); pos <= servoPosition; pos += 2) {
myservo.write(pos);
delay(50); // Verzögerung erhöhen
}
for (int pos = myservo.read(); pos >= servoPosition; pos -= 2) {
myservo.write(pos);
delay(50); // Verzögerung erhöhen
}
}
}