Pages: [1]   Go Down
Author Topic: Servo Endschaltermodul  (Read 175 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen,
Ich bin zur Zeit leider völlig überfordert. Für ein Projekt benötige ich eine Elektronik, welche mir erlaubt ein Servosignal eines RC-Empfängers (PPM ca.50 Hz, 900-2100us, Mittelstellung 1520us) auszulesen und dieses unverändert an ein Servo weiterzugeben, es sei denn einer der zwei Endschalter wäre aktiviert. In diesem Fall sollte das Modul nur die jeweils andere Richtung (d.h. nur noch PPM Signale, welche grösser resp. kleiner als 1520us) an den Ausgang weitergeben. Diese Module gib es bereits günstig fertig zu kaufen (CTI Endschaltermodul 2). Leider ist dieses Modul jedoch für eine Mittelstellung von 1500us vorgesehen, was es in Zusammenhang mit einem endlos drehenden Servo leider nutzlos macht. Konkret dreht ein Servo einen Zahnriemen stark untersetzt an. Beim erreichen der Endpunkt werden Endschalter ausgelöst. Das ganz Problem dürfte mit einem Arduino relativ leicht zu beheben sein, sofern man denn programmieren könnte:) - was ich leider nicht kann. Darf ich Euch bitten mich bei diesem nicht kommerziellen, privaten Projekt zu unterstützen?
Für Eure Hilfe wäre ich extrem dankbar.
Freundliche Grüsse aus der Schweiz,
Florian
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Spezifisch für alle RC Anwendungen wurde die Arduino RC Lib entwickelt. http://sourceforge.net/projects/arduinorclib/

So wie ich das verstehe würde mir dieser Beispielcode:

Code:
/* ---------------------------------------------------------------------------
** This software is in the public domain, furnished "as is", without technical
** support, and with no warranty, express or implied, as to its usefulness for
** any purpose.
**
** servoout_example.pde
** Demonstrate Servo Signal Output functionality
**
** Author: Daniel van den Ouden
** Project: ArduinoRCLib
** Website: http://sourceforge.net/p/arduinorclib/
** -------------------------------------------------------------------------*/

#include <outputchannel.h>
#include <ServoOut.h>
#include <Timer1.h>

#define SERVOS 1

uint8_t  g_pinsIn[SERVOS] = {A0}; // Input pins
uint8_t  g_pinsOut[RC_MAX_CHANNELS] = {2};    // Output pins, needs to be RC_MAX_CHANNELS in size, the other values will be 0

// ServoOut requires a single buffer of RC_MAX_CHANNELS size with the output pins
rc::ServoOut g_ServoOut(g_pinsOut);

void setup()
{
// Initialize timer1, this is required for all features that use Timer1
// (PPMIn/PPMOut/ServoIn/ServoOut)
rc::Timer1::init();

for (uint8_t i = 0;  i < SERVOS; ++i)
{
// set up input pins
pinMode(g_pinsIn[i], INPUT);

// set up output pins
pinMode(g_pinsOut[i], OUTPUT);

// put them low
digitalWrite(g_pinsOut[i], LOW);

// fill input buffer, convert raw values to normalized ones
// we'll need to cast our iterator to an OutputChannel, but ugly but safe
rc::setOutputChannel(static_cast<rc::OutputChannel>(i), map(analogRead(g_pinsIn[i]), 0, 1024, 1000, 2000));
}
g_ServoOut.start();
}

void loop()
{
// update the input buffer
for (uint8_t i = 0;  i < SERVOS; ++i)
{
// fill input buffer, convert raw values to normalized ones
rc::setOutputChannel(static_cast<rc::OutputChannel>(i), map(analogRead(g_pinsIn[i]), 0, 1024, 1000, 2000));
}

// tell ServoOut there are new values available in the input buffer
g_ServoOut.update();
nun schon das Ein-/ und Auslesen der PPM Werte übernehmen. PPM Input an AIn0 PP Servooutput an DigOut2. Ist dies richtig so oder bin ich total auf dem Holzweg?
Wie baue ich nun am einfachsten die "Endschaltergeschichte" ein?
Grüsse
Florian
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20273
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich hoffe ich habe Dich richtig verstenden.
Du kannst auch das interne Potentiometer des Servos das Du beim Umbauen auf Mittelstellung bringst oder durch 2 gleiche Widerstände ersetzt herausführen und an einen 20-gang-Potentiometer anschließen So kannst Du sehr fein die Mittelstellung einstellen bzw auf einen 1500µS Impuls calibrieren..
Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
Leider habe ich mich wohl nicht richtig ausgedrückt. Beim Servo handelt es sich um ein sog. 360 Grad Servo, d. h. es verfügt über kein Potentiometer und keine absolute Nullstellung. Der PPM Wert liefert rein die Drehrichtung und Geschwindigkeit. Ich habe mich nochmal als Programmierer versucht und werde diesen Code morgen ausprobieren:

Code:
#include "Servo.h"
Servo Focus;
int OriginalPPM;
int ModifPPM;
int Input = A0;
int Endschalter1 = 4;
int Endschalter2 = 5;

void setup()

{
  Focus.attach(3);
}


void loop()
{
  OriginalPPM = pulseIn(OriginalPPM, HIGH);
  OriginalPPM = map(OriginalPPM,1000,2000,0,179);
  if (digitalRead(Endschalter1) == HIGH  && (OriginalPPM > 90))
  {
  ModifPPM = 90;
  }
  else
  {
  ModifPPM = OriginalPPM;
  }
  if (digitalRead(Endschalter2) == HIGH  && (OriginalPPM < 90))
  {
  ModifPPM = 90;
  }
  else
  {
  ModifPPM = OriginalPPM;
  }
  Focus.write(ModifPPM);
  delay(20);
}

Hoffe inständig, dass dieser funktioniert. Anregungen und Verbesserungen sind herzlich willkommen. Vielen Dank für Deine Antwort,
Florian
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20273
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

aha Du hast ein 360 Grad Servo gekauft und nicht eines umgebaut. Da bleibt Dir nur der andere Lösungsweg.
Grüße Uwe
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 141
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Arduino ist Overkill für zwei Endschalter.
Am einfachsten wären Microschalter die öffnen wenn sie betätigt sind. Über die Schalter lötest du je eine Diode, am einen Schalter in die eine Richtung, am anderen in die andere. Alles zusammen wird mit dem Motor in Reihe geschaltet. Solange die Taster nicht gedrückt sind, kann der Strom ganz normal über die Kontakte fließen, der Motor kann sich in beide Richtungen drehen. Sobald einer der Schalter gedrückt ist, kann der Strom nur über die Diode fließen, also kann der Motor nur noch in eine Richtung (vom Anschlag weg) drehen.

Anmerkung:
Der Spannungsabfall der Dioden (ca 0,7 V) sollte vernachlässigbar sein, da diese ja nur einen kurzen Moment (bis der Taster wieder schließt) einsetzen. Nebeneffekt ist ein langesameres Anlaufen, schadet also nicht.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20273
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Arduino ist Overkill für zwei Endschalter.
Am einfachsten wären Microschalter die öffnen wenn sie betätigt sind. Über die Schalter lötest du je eine Diode, am einen Schalter in die eine Richtung, am anderen in die andere. Alles zusammen wird mit dem Motor in Reihe geschaltet. Solange die Taster nicht gedrückt sind, kann der Strom ganz normal über die Kontakte fließen, der Motor kann sich in beide Richtungen drehen. Sobald einer der Schalter gedrückt ist, kann der Strom nur über die Diode fließen, also kann der Motor nur noch in eine Richtung (vom Anschlag weg) drehen.
Das funktioniert bei einem Motor mit H-Brücke aber nicht bei einem Servo.
Grüße Uwe
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 141
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das funktioniert bei einem Motor mit H-Brücke aber nicht bei einem Servo.
Jeder Servo der einen DC-Motor verwendet hat irgendwo eine H-Brücke drin. Man muss zwar den Servo zerlegen und die Schaltung "reinflicken", aber das sollte doch kein Problem darstellen?! Oder überseh ich da grad was?
Gruß,
Marv
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20273
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich glaube die Idee ist den Servo nicht zu modifizieren.
Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
Vielen Dank für die Ratschläge. Leider ist im Servo ein Brushlessmotor verbaut, weshalb die einfachste Lösung von Anfang an ausschied. Das ein Arduino sicherlich überdimensioniert ist, war mir klar - jedoch stehen die Kosten verhältnismässig gut zum Nutzen. Hatte leider noch keine Gelegenheit den Arduino bzw. das Skript zu testen.
Grüsse
Florian
Logged

Pages: [1]   Go Up
Jump to: