Servo ansteuern mit analogem Signal

Hallo zusammen,

ich brauche Eure hilfe für meine Diplom arbeit. Ich baue ein Gerät das eine Indikation darstellen soll indem zwei gestänge aussschlagen. Meine Idee ist es das mit Servos umzusetzen welche mit dem PWM Signal angesteuert werden. Ich habe von einem Externen Gerät einen Eingangsstrom zwischen 0-50mA und dieser soll je mehr eingestellr desto mehr der Ausschlag der Servos.

Bisher habe ich ein Arduino UNO und hoffe man kann es mit dem umsetzen.
Könnt Ihr mir vielleicht dabei helfen? Tips etc?

Mit freundlichen Grüssen

Für die Servos gibt es eine fertige Library.

Den Eingangsstrom kannst du einfach mit einem Widerstand in eine Spannung umsetzen, die man mit dem ADC messen kann. Den Widerstand muss man dann so wählen, dass bei 50mA 5V abfallen.
Oder ein Transimpedanzverstärker wenn du es ganz schön machen willst. Ist aber nicht nötig.

Cool danke,

kannst du mir vielleicht kurz erklären wie du das meinst mitdem Library und der Schaltung? kenne mich mit dem Arduino bisher noch gar nicht aus

http://arduino.cc/en/Tutorial/sweep

Bemühe wegen der Servos mal Google. Da gibt es zig Anleitungen

Worauf du aber achten sollst, ist die Servos besser nicht über den Spannungsregler des Arduinos zu versorgen, da die viel Strom ziehen. Da bricht regelmäßig die Spannung ein und Leute wundern sich dann wieso der Prozessor Murks macht.

Super danke dir.

Habe jetzt nochmal eine Frage. Habe mir mal den Transimpedanzversätker angeschaut und der sieht sehr interessant aus für mein vorhaben.

mal angenommen: Ich habe ein Gerät das liefert mir Ströme von 0-50mA (eingestellt über Poti) Wie nutze ich den das ganze über den Versärker und wie fliesse ich das Signal am Arduino ein? Wäre das quasi nur eine 2 Draht Leitung in den Arduino?

Gruss

Du nutzt in jedem Fall einen Analogeingang vom arduino, denn am Ende der Kette misst Du die dem Strom analoge Spannung.

Ich würde aber auch Sereniflys Ratschlag folgen und den OP weglassen.
Mach Dir mal Gedanken über die gewünschte Auflösung und dann über die zur Verfügung stehenden 10 Bit des arduino.

Das mit dem an den Analogen Eingang anschliessen war mir irgendwie klar. Ich weiss nur nicht wie ich von einem externen Gerät Die verschiedenen Ströme nutzen kann als eingangsignal. Also z.B 0mA passiert nichts 10mA = geringer Aussschlag am Servo bis und mit 50mA wird der Aussschlag dann halt immer stärker.

Gruss

moepi2k:
Habe jetzt nochmal eine Frage. Habe mir mal den Transimpedanzversätker angeschaut und der sieht sehr interessant aus für mein vorhaben.

Das Problem dabei ist, ist dass das ein Inverter ist, und man daher eigentlich eine symmetrische Versorgungsspannung braucht. Die Alternative ist man bastelt sich mit einem Spannungsteiler am nicht-invertierenden Eingang ein virtuelle Masse. Aber das ist nicht ganz trivial.
TIVs benutzt man eigentlich um die geringen Ströme von Photodioden zu verstärken. Hier ist das etwas zu viel des guten.

Die andere Standard-Möglichkeit mit einem OP einen Strom zu messen ist mit einem Shuntwiderstand und dann die Spannung an diesem zu verstärken. Das geht auch mit einer nicht-symmetrischen Versorgungsspannung, da es ein nicht-invertierender Verstärker ist. Das wird vor allem bei sehr hohen Strömen gemacht:
http://phil-zone.de/hilfestellung-a-tutorials/mikrocontroller-grundlagen-strommessung

Probier es aber erst mal mit einem einfachen Widerstand. Das sollte eigentlich gehen. 100 Ohm ergibt bei 50mA 5V. Also von deinem Gerät einen 100 Ohm Widerstand gegen Masse. Und dann misst du mit dem ADC die Spannung über den Widerstand. Bei 10mA hast du dann 100 Ohm * 0,01 A = 1V

Und lass erst mal den Servo weg. Zeige dir erst mal die gemessene Spannung am seriellen Monitor an und schaue dass die passt.

Eventuell kann man dann in Software noch den Ausschlag des Servos so anpassen, dass er nicht-linear wird.

Versteh ich dich richtig: Wenn ich einen 100Ohm Widerstand benutze = 50mA 5V. habe ich somit ein ideales Eingangssignal. Stelle ich die Stromzufurh auf 10mA sinkt natürlich auch die Spannung, aber kann ich diese Spannung dann auch noch verwenden?

Das Problem ist. Ich habe von externen Gerät ja nur eine 2 Draht Leitung auf den Arduino. Und diese kann halt 0-50mA liefern.

bzw. geht das. Das am Arduino 1V = kleiner Aussschlag 5V = Grosser Ausschlag für den Servo?

Wieso soll das nicht gehen?

Du misst die Spannung mit einem Analog-Digital-Wandler. Der liefert dir bei 0V den Wert 0 und bei 5V den Wert 1023 (bei 5V Referenzspannung wie normal). Den Wert setzt man dann auf den Servo um. Das geht mit der map() Funktion:
http://arduino.cc/de/Reference/Map

Damit kannst dass dann so hinbiegen dass z.B. 1023 90° am Servo entspricht. Genau das wird hier gemacht:

Nur dass man da ein Poti zum Einstellen hat. Das ist vielleicht ein Beispiel, dass du mal aufbauen solltest um das zu verstehen.

Werd ich ausprobieren, danke vielmal =)

Gruss

Nochmals eine böde Frage. Ich kenne den Arduino ja noch nicht. der ADC ist auf dem Arduino vorhanden richtig?
Also muss ich jetzt einfach mal eine kleine Schaltung bauen mit einem Widerstand von 100Ohm und schliesse mein Gerät welches 0-50mA liefert an da dran und führe das auf den Analogen eingang des Arduinos. Wie kann ich da nun die Werte herauslesen?
zum einen kann ich ja die Analogen Werte mit dem Multimeter messen, aber wie Sehe ich die Digital Werte?

Gruss

Dir fehlen sämtliche Grundlagen. Dafür gibt es massig Tutorials und Beispiele im Internet. Gib mal bei Google "Arduino analog" ein. Da findest du z.B. das:

Und bei "Reference" gibt es auch Code-Schnippel
http://arduino.cc/de/Reference/AnalogRead

Dann den seriellen Monitor öffnen und du siehst was bei Serial ausgegeben wird.

So bin wieder zurück.

ich habe mir jetzt sämtliches Material besorft für die Schaltung. Das Relaxometer das mir 0-80mA liefert habe ich auch beiliegen.
Ich weiss nicht ob das jemand kennt. Dieses Gerät wird in der Anästhesie gebraucht und gibt z.B 4 Impulse hintereinander von z.B 10mA aus und erzuegt eine Muskelkontraktion. Diese zwei elektrodenanschlüsse werde ich so wie ich es verstanden habe nun einen auf GND und der andere auf einen Analogen Eingang anschliessen, vorgeschaltet einen 50 Ohm Widerstand das ich bei max Strom eine Spannung von U=50 Ohm x 0.08A = 4V erhalte. Da das Board ja nur mit maximal 5V auskommt. Mit Dem ADC kann ich damit nun einen Digitalen Wert zwischen 0-1023 erhalten, richtig?

Wie entnehme ich diesne Wert aber jetzt? kann ich denn irgendwo auslesen?

Mit freundlichen Grüssen.

Ich habe doch oben schon mehrere Beispiele verlinkt wie man das macht. Und dann gibt es wie gesagt noch Google. Dieses Thema wird auf zig Seiten erklärt und wenn du es verstehen willst, musst du was davon lesen. Die Grundlagen sind wirklich einfach. Und da das eine Diplomarbeit sein soll, musst du auch verstehen was da abläuft.

int value = analogRead(A0); und fertig

Wenn du zum Test die Spannung willst geht das so:

float voltage = value * (5.0 / 1023.0)

Siehe: http://arduino.cc/en/Tutorial/ReadAnalogVoltage

Den Bereich umrechnen geht dann wie auch schon gesagt mit der map() Funktion
http://arduino.cc/en/Reference/Map
Damit kannst du die Werte von 0 bis 1023 auf 0 bis x mA umsetzen

Dabei beachten, dass 1023 5V entspricht. Daher so:

int current = map(value, 0, 1023, 0, 100)

Also 5V = 1023 = 100mA. Das tritt bei dir nicht auf, aber wenn du dann 80mA hast (Digital ca. 819) kommt 80 raus.

Die Funktion kann man auch so umschreiben, dass sie mit float arbeitet:

float mapFloat(long x, long in_min, long in_max, long out_min, long out_max)
{
	return (x - in_min) * (float)(out_max - out_min) / (float)(in_max - in_min) + out_min;
}

Dann ist das Ergebnis etwas genauer, da die Nachkommastelle nicht einfach abgeschnitten wird auch wenn sie .9 ist

Diese zwei elektrodenanschlüsse werde ich so wie ich es verstanden habe nun einen auf GND und der andere auf einen Analogen Eingang anschliessen, vorgeschaltet einen 50 Ohm Widerstand

Nicht ganz. Du musst den Widerstand gegen GND hängen. Dann fließt der Strom durch den Widerstand ab und erzeugt dort eine Spannung die man messen kann. Der ADC misst auch gegen GND also musst du parallel zum Widerstand messen

Wie bei einem ganz normalen Stromkreis auch:

Wie schon gesagt, ich bin neu in der Arduino Welt, habe mich jetzt schon Tage eingelesen und habe die Theorie mehr oder weniger verstanden. Bin aber erst seit heute dran das ganze 1 zu 1 am Arduino nachzubauen. Kann auch den Wert am Serial Monitor herauslesen nur leider nicht den gewünschten.

Habe mein Relaxometer am Oszi angeschlossen mit einem paralel vorgeschaltete Widerstand von 100 Ohm und da kommt beim Impuls von 10mA genau 1V raus bzw bei 50ma 5V. Nur wenn ich die zwei Kabel jetzt am Arduino anschliesse und im Serial Monitor schaue ist da im leerlauf ein Wert von ca. 200. Sobald ich es anschalte fällt der Wert auf 0 egal welcher Strom ich einstelle.

hab schon diverse Berichte durchgelesen aber finde keine lösung bis jetzt, aber ich tüftel mal weiter =)
Dachte nur ob evt jemand grad ne Ahnung hat wieso das so ist.

Grüsse

Ok, das ist was anderes :slight_smile: Du hattest noch gefragt wie es geht. Nicht gesagt, dass du es versucht hast und es ging nicht :slight_smile:

Dass offene Analog-Eingänge Zufallswerte liefern ist normal. Das ist eine hochohmige Antenne die sich dann alles mögliche aus der Luft einfängt.

Pass der ganzen Sache bloß auf, dass da nie mehr als 5V anliegen. Das verträgt der Prozessor nicht.

Okey, irgendwie läuft bei mir was schief. Entweder das Board ist defekt oder ich mach irgendwas falsch.
Habe jetzt das ganze mit dem externen Gerät und der beschaltung mal zur seitegelegt (dachte daran liegt irgendwo der fehler)
und habe eine einfach 1.5V Batterie genommen. Dieser sollte mir ja idealerweise einen Wert von 307 Liefern.
aber egal was ich zwischen dem Analogen Eingang und GND anschliesse, auf dem Serial Monitor fällt der Wert immer direkt auf 0.

Woran kann das liegen?

Zeig mal deinen Sketch her.

Du verwendest auch den richtigen Analog-Eingang im Sketch?