Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

Antworten
Benutzeravatar
Hummerfresse
Beiträge: 1975
Registriert: 22.02.2006 13:54:32
Wohnort: Chiemgau

#1 Arduino: 2 Servos per Zufall bewegen + RC Signal schaltbar

Beitrag von Hummerfresse »

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
no pain no gain
Benutzeravatar
Sprudelnd
Beiträge: 326
Registriert: 15.01.2005 03:05:38
Wohnort: Dortmund

#2 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb

Beitrag von Sprudelnd »

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
Benutzeravatar
Hummerfresse
Beiträge: 1975
Registriert: 22.02.2006 13:54:32
Wohnort: Chiemgau

#3 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb

Beitrag von Hummerfresse »

Hi Marc

vielen Dank

werde ich heute Nachmittag mal testen. :D

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
Benutzeravatar
Sprudelnd
Beiträge: 326
Registriert: 15.01.2005 03:05:38
Wohnort: Dortmund

#4 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb

Beitrag von Sprudelnd »

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
Benutzeravatar
Hummerfresse
Beiträge: 1975
Registriert: 22.02.2006 13:54:32
Wohnort: Chiemgau

#5 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb

Beitrag von Hummerfresse »

super.
vielen Dank

bin schon gespannt und werde es später gleich testen.

Gruß
Manuel
no pain no gain
Benutzeravatar
Hummerfresse
Beiträge: 1975
Registriert: 22.02.2006 13:54:32
Wohnort: Chiemgau

#6 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb

Beitrag von Hummerfresse »

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
no pain no gain
Benutzeravatar
Sprudelnd
Beiträge: 326
Registriert: 15.01.2005 03:05:38
Wohnort: Dortmund

#7 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb

Beitrag von Sprudelnd »

Hallo,

ersetz dann einfach

if ((pulseV-off)<pulse && (pulseV+off>pulse)){

durch

if (pulse>1500 && pulse<2000){

Viele Grüße,
Marc
Benutzeravatar
Hummerfresse
Beiträge: 1975
Registriert: 22.02.2006 13:54:32
Wohnort: Chiemgau

#8 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb

Beitrag von Hummerfresse »

super. :bounce: :bounce: :bounce:

vielen Dank

Gruß
Manuel
no pain no gain
Benutzeravatar
Sprudelnd
Beiträge: 326
Registriert: 15.01.2005 03:05:38
Wohnort: Dortmund

#9 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb

Beitrag von Sprudelnd »

Gerne doch :)

Hoffentlich funktionierts auch
Benutzeravatar
Hummerfresse
Beiträge: 1975
Registriert: 22.02.2006 13:54:32
Wohnort: Chiemgau

#10 Re: Arduino: 2 Servos per Zufall bewegen + RC Signal schaltb

Beitrag von Hummerfresse »

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
no pain no gain
Antworten

Zurück zu „weitere Ausrüstung“