Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar
- Hummerfresse
- Beiträge: 1975
- Registriert: 22.02.2006 13:54:32
- Wohnort: Chiemgau
#1 Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar
Hi Leute
da ich bezüglich meines Tiger-Projektes noch eine andere Möglichkeit testen wollen würde, hätte ich an die Programmier-Spezialisten bzw. Cracks am Arduino eine Bitte:
Evtl kann mir den Code jemand um einen Servosignal-Eingang erweitern. Z.b. an Pin 9.
Ich habe bereits diesen fertigen Code hier.
Er bewegt 2 Servos per Zufall mit Random-Werten hin und her.
Die Geschwindigkeit lässt sich auch variabel einstellen.
Ich würde das ganze jetzt gerne noch via RC-Signal schaltbar gestalten.
Dazu hätte ich gerne einstellbar in welchem Bereich von 1000 µs to 2000 µs die Schaltung auf AN geht.
Leider übersteigt das meine doch sehr geringen Progmmierkenntnisse im Bereich "Arduino bzw. C"
Anbei mein bisheriger Code:
Verwendet habe ich einen Pro Mini 5V 16Hz
Vor dem Arduino befindet sich noch ein kleiner Spannungswandler der mir die Spannung vom 2s LIPO auf genau 5V regelt.
Endausschläge und Geschwindigkeit für das jeweilige Servo sind einstellbar.
Die Servoposition an die das Servo geschickt wird, wird per Zufall via Random-Wert generiert.
Video:
https://vimeo.com/113400037
Man benötigt folgende Library sowie unten stehenden Code
Library:
VarSpeedServo.h
kann man hier downloaden:
https://github.com/netlabtoolkit/VarSpeedServo
Code:
#include <VarSpeedServo.h>
#define SERVO_P1 10 // Servo connected to PIN 10
#define SERVO_P2 11 // Servo connected to PIN 11
#define WAIT_I 1000 // wait after init in ms
#define POS_L 20 // left endstop
#define POS_R 160 // right endstop
#define POS_O 20 // oben endstop
#define POS_U 160 // unten endstop
#define WAIT_EN 350 // wait time at endstop in ms
#define WAIT_IN 500 // wait time at each angular increment in ms
VarSpeedServo servo1; // create servo object to control a servo
VarSpeedServo servo2; // Zusatzservo für oben unten
void setup()
{
servo1.attach(SERVO_P1); // attaches the servo on pin 10 to the servo object
servo1.write(POS_L); // tell servo to go to init position
servo2.attach(SERVO_P2); // attaches the servo on pin 11 to the servo object
servo2.write(POS_O); // tell servo to go to init position
delay(WAIT_I); // wait a little bit
}
void loop()
{
int posX = 0; // variable to store the servo position
int posY = 0; // variable to store the servo position
int gotoX = (int) random(POS_L, POS_R);
int gotoY = (int) random(POS_O, POS_U);
servo1.write(gotoX,40); // tell servo to go to position in variable 'pos'
servo2.write(gotoY,10); // tell servo to go to position in variable 'pos'
delay(WAIT_IN); // waits for the servo to reach the position
}
Vielen Dank
Gruß
Manuel
da ich bezüglich meines Tiger-Projektes noch eine andere Möglichkeit testen wollen würde, hätte ich an die Programmier-Spezialisten bzw. Cracks am Arduino eine Bitte:
Evtl kann mir den Code jemand um einen Servosignal-Eingang erweitern. Z.b. an Pin 9.
Ich habe bereits diesen fertigen Code hier.
Er bewegt 2 Servos per Zufall mit Random-Werten hin und her.
Die Geschwindigkeit lässt sich auch variabel einstellen.
Ich würde das ganze jetzt gerne noch via RC-Signal schaltbar gestalten.
Dazu hätte ich gerne einstellbar in welchem Bereich von 1000 µs to 2000 µs die Schaltung auf AN geht.
Leider übersteigt das meine doch sehr geringen Progmmierkenntnisse im Bereich "Arduino bzw. C"
Anbei mein bisheriger Code:
Verwendet habe ich einen Pro Mini 5V 16Hz
Vor dem Arduino befindet sich noch ein kleiner Spannungswandler der mir die Spannung vom 2s LIPO auf genau 5V regelt.
Endausschläge und Geschwindigkeit für das jeweilige Servo sind einstellbar.
Die Servoposition an die das Servo geschickt wird, wird per Zufall via Random-Wert generiert.
Video:
https://vimeo.com/113400037
Man benötigt folgende Library sowie unten stehenden Code
Library:
VarSpeedServo.h
kann man hier downloaden:
https://github.com/netlabtoolkit/VarSpeedServo
Code:
#include <VarSpeedServo.h>
#define SERVO_P1 10 // Servo connected to PIN 10
#define SERVO_P2 11 // Servo connected to PIN 11
#define WAIT_I 1000 // wait after init in ms
#define POS_L 20 // left endstop
#define POS_R 160 // right endstop
#define POS_O 20 // oben endstop
#define POS_U 160 // unten endstop
#define WAIT_EN 350 // wait time at endstop in ms
#define WAIT_IN 500 // wait time at each angular increment in ms
VarSpeedServo servo1; // create servo object to control a servo
VarSpeedServo servo2; // Zusatzservo für oben unten
void setup()
{
servo1.attach(SERVO_P1); // attaches the servo on pin 10 to the servo object
servo1.write(POS_L); // tell servo to go to init position
servo2.attach(SERVO_P2); // attaches the servo on pin 11 to the servo object
servo2.write(POS_O); // tell servo to go to init position
delay(WAIT_I); // wait a little bit
}
void loop()
{
int posX = 0; // variable to store the servo position
int posY = 0; // variable to store the servo position
int gotoX = (int) random(POS_L, POS_R);
int gotoY = (int) random(POS_O, POS_U);
servo1.write(gotoX,40); // tell servo to go to position in variable 'pos'
servo2.write(gotoY,10); // tell servo to go to position in variable 'pos'
delay(WAIT_IN); // waits for the servo to reach the position
}
Vielen Dank
Gruß
Manuel
no pain no gain
#2 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb
Hi,
bin zwar nicht gerade der Programmierprofi, aber über die pulseIn-Funktion sollte es doch eigentlich gehen:
#include <VarSpeedServo.h>
#define SERVO_P1 10 // Servo connected to PIN 10
#define SERVO_P2 11 // Servo connected to PIN 11
#define WAIT_I 1000 // wait after init in ms
#define RecIn 9 //Pin für Eingang
#define pulseV 1000 // Pulslänge Vorgabe
#define off 50 //Offset für Pulslänge
#define POS_L 20 // left endstop
#define POS_R 160 // right endstop
#define POS_O 20 // oben endstop
#define POS_U 160 // unten endstop
#define WAIT_EN 350 // wait time at endstop in ms
#define WAIT_IN 500 // wait time at each angular increment in ms
VarSpeedServo servo1; // create servo object to control a servo
VarSpeedServo servo2; // Zusatzservo für oben unten
unsigned long pulse; // Pulslänge gemessen
void setup()
{
pinMode(RecIn, INPUT);
servo1.attach(SERVO_P1); // attaches the servo on pin 10 to the servo object
servo1.write(POS_L); // tell servo to go to init position
servo2.attach(SERVO_P2); // attaches the servo on pin 11 to the servo object
servo2.write(POS_O); // tell servo to go to init position
delay(WAIT_I); // wait a little bit
}
void loop()
{
int posX = 0; // variable to store the servo position
int posY = 0; // variable to store the servo position
pulse = pulseIn(RecIn, HIGH);
if ((pulseV-off)<pulse && (pulseV+off>pulse)){
int gotoX = (int) random(POS_L, POS_R);
int gotoY = (int) random(POS_O, POS_U);
servo1.write(gotoX,40); // tell servo to go to position in variable 'pos'
servo2.write(gotoY,10); // tell servo to go to position in variable 'pos'
delay(WAIT_IN); // waits for the servo to reach the Position
}
}
Viele Grüße,
Marc
bin zwar nicht gerade der Programmierprofi, aber über die pulseIn-Funktion sollte es doch eigentlich gehen:
#include <VarSpeedServo.h>
#define SERVO_P1 10 // Servo connected to PIN 10
#define SERVO_P2 11 // Servo connected to PIN 11
#define WAIT_I 1000 // wait after init in ms
#define RecIn 9 //Pin für Eingang
#define pulseV 1000 // Pulslänge Vorgabe
#define off 50 //Offset für Pulslänge
#define POS_L 20 // left endstop
#define POS_R 160 // right endstop
#define POS_O 20 // oben endstop
#define POS_U 160 // unten endstop
#define WAIT_EN 350 // wait time at endstop in ms
#define WAIT_IN 500 // wait time at each angular increment in ms
VarSpeedServo servo1; // create servo object to control a servo
VarSpeedServo servo2; // Zusatzservo für oben unten
unsigned long pulse; // Pulslänge gemessen
void setup()
{
pinMode(RecIn, INPUT);
servo1.attach(SERVO_P1); // attaches the servo on pin 10 to the servo object
servo1.write(POS_L); // tell servo to go to init position
servo2.attach(SERVO_P2); // attaches the servo on pin 11 to the servo object
servo2.write(POS_O); // tell servo to go to init position
delay(WAIT_I); // wait a little bit
}
void loop()
{
int posX = 0; // variable to store the servo position
int posY = 0; // variable to store the servo position
pulse = pulseIn(RecIn, HIGH);
if ((pulseV-off)<pulse && (pulseV+off>pulse)){
int gotoX = (int) random(POS_L, POS_R);
int gotoY = (int) random(POS_O, POS_U);
servo1.write(gotoX,40); // tell servo to go to position in variable 'pos'
servo2.write(gotoY,10); // tell servo to go to position in variable 'pos'
delay(WAIT_IN); // waits for the servo to reach the Position
}
}
Viele Grüße,
Marc
- Hummerfresse
- Beiträge: 1975
- Registriert: 22.02.2006 13:54:32
- Wohnort: Chiemgau
#3 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb
Hi Marc
vielen Dank
werde ich heute Nachmittag mal testen.
Bei:
#define pulseV 1000 // Pulslänge Vorgabe
muss ich quasi meinen Schwellwert eingeben, ab dem geschalten werden soll, oder?
Gruß
Manuel
vielen Dank
werde ich heute Nachmittag mal testen.
Bei:
#define pulseV 1000 // Pulslänge Vorgabe
muss ich quasi meinen Schwellwert eingeben, ab dem geschalten werden soll, oder?
Gruß
Manuel
no pain no gain
#4 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb
Hi,
ja genau.
Ich weiß nicht, wie stabil so ein Signal ist, deswegen habe ich ein Offset mit reingenommen, bei einem pulseV von 1000 und off von 50 würde dann zwischen 950 und 1050 geschaltet werden. Theoretisch zumindest
Viele Grüße,
Marc
ja genau.
Ich weiß nicht, wie stabil so ein Signal ist, deswegen habe ich ein Offset mit reingenommen, bei einem pulseV von 1000 und off von 50 würde dann zwischen 950 und 1050 geschaltet werden. Theoretisch zumindest
Viele Grüße,
Marc
- Hummerfresse
- Beiträge: 1975
- Registriert: 22.02.2006 13:54:32
- Wohnort: Chiemgau
#5 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb
super.
vielen Dank
bin schon gespannt und werde es später gleich testen.
Gruß
Manuel
vielen Dank
bin schon gespannt und werde es später gleich testen.
Gruß
Manuel
no pain no gain
- Hummerfresse
- Beiträge: 1975
- Registriert: 22.02.2006 13:54:32
- Wohnort: Chiemgau
#6 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb
achso..was mir da gerade noch einfällt.
ich bräuchte es einstelltechnisch so, dass das MG aktiviert wird "Ab" einem bestimmten Wert bis Vollausschlag.
Also z.b. Ab 1500us bis 2000us soll das MG auf AN sein.
da am gleichen Kanal noch mehrer Funtionen hängen.
wie müsste ich das dann oben einfügen?
Könnte mich natürlich mit dem Offset-Wert spielen, bis es passt.
Aber das muss doch auch sauberer gehen, oder?
So eine Art Größer-Gleich-Abfrage.
solange der us-Wert über 1501 ist ist, MG = AN.
so Laienhaft geschrieben ^^
Aber vom Prinzip her müsste es doch so machbar sein.
Viele Grüße
Manuel
ich bräuchte es einstelltechnisch so, dass das MG aktiviert wird "Ab" einem bestimmten Wert bis Vollausschlag.
Also z.b. Ab 1500us bis 2000us soll das MG auf AN sein.
da am gleichen Kanal noch mehrer Funtionen hängen.
wie müsste ich das dann oben einfügen?
Könnte mich natürlich mit dem Offset-Wert spielen, bis es passt.
Aber das muss doch auch sauberer gehen, oder?
So eine Art Größer-Gleich-Abfrage.
solange der us-Wert über 1501 ist ist, MG = AN.
so Laienhaft geschrieben ^^
Aber vom Prinzip her müsste es doch so machbar sein.
Viele Grüße
Manuel
no pain no gain
#7 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb
Hallo,
ersetz dann einfach
if ((pulseV-off)<pulse && (pulseV+off>pulse)){
durch
if (pulse>1500 && pulse<2000){
Viele Grüße,
Marc
ersetz dann einfach
if ((pulseV-off)<pulse && (pulseV+off>pulse)){
durch
if (pulse>1500 && pulse<2000){
Viele Grüße,
Marc
- Hummerfresse
- Beiträge: 1975
- Registriert: 22.02.2006 13:54:32
- Wohnort: Chiemgau
#8 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb
super.
vielen Dank
Gruß
Manuel
vielen Dank
Gruß
Manuel
no pain no gain
#9 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb
Gerne doch
Hoffentlich funktionierts auch
Hoffentlich funktionierts auch
- Hummerfresse
- Beiträge: 1975
- Registriert: 22.02.2006 13:54:32
- Wohnort: Chiemgau
#10 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb
Hi Leute
vielen dank für all eure Beispiele.
Funktioniert hat am besten der Sketch von Maxi.
Diesen habe ich unten noch erweitert.
Im else-Fall, fährt die Gun nun bei Nicht-Aktivität immer in Ihre Ausgangs- bzw. Neutralpoistion zurück.
Anbei der finale Code:
#include <VarSpeedServo.h>
#define SERVO_P1 10 // Servo connected to PIN 10
#define SERVO_P2 11 // Servo connected to PIN 11
#define WAIT_I 000 // wait after init in ms
#define POS_L 20 // left endstop
#define POS_R 180 // right endstop
#define POS_O 20 // oben endstop
#define POS_U 170 // unten endstop
#define WAIT_EN 350 // wait time at endstop in ms
#define WAIT_IN 500 // wait time at each angular increment in ms
VarSpeedServo servo1; // create servo object to control a servo
VarSpeedServo servo2; // Zusatzservo für oben unten
void setup()
{
servo1.attach(SERVO_P1); // attaches the servo on pin 10 to the servo object
servo1.write(POS_L); // tell servo to go to init position
servo2.attach(SERVO_P2); // attaches the servo on pin 11 to the servo object
servo2.write(POS_O); // tell servo to go to init position
pinMode(9, INPUT); // pin ist dein gewünschter Eingangskanal am Arduino, entsprechend abändern!!
delay(WAIT_I); // wait a little bit
}
void loop()
{
int posX = 0; // variable to store the servo position
int posY = 0; // variable to store the servo position
unsigned long duration;
duration = pulseIn(9, HIGH);
if(duration>1600)
{
int gotoX = (int) random(POS_L, POS_R);
int gotoY = (int) random(POS_O, POS_U);
servo1.write(gotoX,40); // tell servo to go to position in variable 'pos'
servo2.write(gotoY,25); // tell servo to go to position in variable 'pos'
delay(WAIT_IN); // waits for the servo to reach the position
} else {
//Halteposition anfahren
posX = 95;
posY = 40;
servo1.write(posX,50); // tell servo to go to position in variable 'pos'
servo2.write(posY,50); // tell servo to go to position in variable 'pos'
delay(WAIT_IN); // waits for the servo to reach the position
}
}
Damit ist mein Problem gelöst.
Funktioniert so perfekt und der Schaltpunkt läst sich sehr genau einstellen
vielen dank für all eure Beispiele.
Funktioniert hat am besten der Sketch von Maxi.
Diesen habe ich unten noch erweitert.
Im else-Fall, fährt die Gun nun bei Nicht-Aktivität immer in Ihre Ausgangs- bzw. Neutralpoistion zurück.
Anbei der finale Code:
#include <VarSpeedServo.h>
#define SERVO_P1 10 // Servo connected to PIN 10
#define SERVO_P2 11 // Servo connected to PIN 11
#define WAIT_I 000 // wait after init in ms
#define POS_L 20 // left endstop
#define POS_R 180 // right endstop
#define POS_O 20 // oben endstop
#define POS_U 170 // unten endstop
#define WAIT_EN 350 // wait time at endstop in ms
#define WAIT_IN 500 // wait time at each angular increment in ms
VarSpeedServo servo1; // create servo object to control a servo
VarSpeedServo servo2; // Zusatzservo für oben unten
void setup()
{
servo1.attach(SERVO_P1); // attaches the servo on pin 10 to the servo object
servo1.write(POS_L); // tell servo to go to init position
servo2.attach(SERVO_P2); // attaches the servo on pin 11 to the servo object
servo2.write(POS_O); // tell servo to go to init position
pinMode(9, INPUT); // pin ist dein gewünschter Eingangskanal am Arduino, entsprechend abändern!!
delay(WAIT_I); // wait a little bit
}
void loop()
{
int posX = 0; // variable to store the servo position
int posY = 0; // variable to store the servo position
unsigned long duration;
duration = pulseIn(9, HIGH);
if(duration>1600)
{
int gotoX = (int) random(POS_L, POS_R);
int gotoY = (int) random(POS_O, POS_U);
servo1.write(gotoX,40); // tell servo to go to position in variable 'pos'
servo2.write(gotoY,25); // tell servo to go to position in variable 'pos'
delay(WAIT_IN); // waits for the servo to reach the position
} else {
//Halteposition anfahren
posX = 95;
posY = 40;
servo1.write(posX,50); // tell servo to go to position in variable 'pos'
servo2.write(posY,50); // tell servo to go to position in variable 'pos'
delay(WAIT_IN); // waits for the servo to reach the position
}
}
Damit ist mein Problem gelöst.
Funktioniert so perfekt und der Schaltpunkt läst sich sehr genau einstellen
no pain no gain