Forum: PC-Programmierung C++ - Inkrementalgeber auslesen


von Marco R. (0201m)


Lesenswert?

Hallo,
ich arbeite gerade an einem Projekt im dem es nun darum geht 2-4 
Inkrementalgaber am PC auszulesen. Mein Programm ist aufgrund 
verschiedener anderer APIs in C++ geschrieben und jetzt suche ich eine 
möglichst einfach und günstige Lösung die Geberwerte in meine Programm 
zu präsentieren.
Ich hab mi schonmal umgeschaut aber nichts konkretes gefunden, gibt es 
eine Möglichkeit sowas recht simpel am PC zu realisieren, ohne teuere 
Wandler oder Interfacekarten? Vllt mit RS232 und einem kleinen ATMega?

Danke schonmal.
Marco

von R. F. (rfr)


Lesenswert?

Ein Arduino kann an USB Daten senden. Ein PC kann sie lesen.
Schreibe also ein Arduinoprogramm, das diese Daten ausliest und sendet.

Robert

von Marco R. (0201m)


Lesenswert?

Ok, danke, wird ich mir mal anschauen. Ich kenn mich zwar mit der 
Arduino Programmierung nicht aus, aber da finden sich mit Sicherheit 
geeignete Beispielprogramme mit denen man was zusammenbasteln kann

von Borislav B. (boris_b)


Lesenswert?

Das ist wirklich nicht schwer :-)

Einen Pro-Micro-Klon gibt es für < 4$. Der gibt sich dem PC gegenüber 
als virtueller COM Port aus, den du leicht mit C++ öffnen und dann Daten 
austuaschen kannst.

von R. F. (rfr)


Lesenswert?

Marco R. schrieb:
> Ok, danke, wird ich mir mal anschauen. Ich kenn mich zwar mit der
> Arduino Programmierung nicht aus, aber da finden sich mit Sicherheit
> geeignete Beispielprogramme mit denen man was zusammenbasteln kann

Suche nach der Homepage von Arduino, da ist alles drauf, einschliesslich 
IDE.

von Marco R. (0201m)


Lesenswert?

R. F. schrieb:
> Marco R. schrieb:
>> Ok, danke, wird ich mir mal anschauen. Ich kenn mich zwar mit der
>> Arduino Programmierung nicht aus, aber da finden sich mit Sicherheit
>> geeignete Beispielprogramme mit denen man was zusammenbasteln kann
>
> Suche nach der Homepage von Arduino, da ist alles drauf, einschliesslich
> IDE.

Ich hab mir jetzt mal einen Sainsmart Arduino Mega 2560 Klon gekauft, 
einfach zur Sicherheit falls noch mehr Anforderungen kommen sollten, ich 
schau das ganze mir mal an und schreib hier dann zurück

von Marco R. (0201m)


Lesenswert?

Brauch ich für die RS232 Kommunikation zw. PC und Arduino noch ein 
bestimmtes Shield? Hab gelesen das der Arduino mit 5V Seriell sendet, 
der PC aber mit 12V dagegenhält und das dann eher schlecht für den 
Arduino ist.

von R. F. (rfr)


Lesenswert?

Der RS232 Anschluss ist auf den USB-Wandelchip geführt, dh mit den 
entsprechenden Befehlen schreibst du auf den USB Bus. Ich schlage daher 
das Verwenden  des USB Busses vor.#

Robert

von Wolfgang (Gast)


Lesenswert?

Marco R. schrieb:
> Brauch ich für die RS232 Kommunikation zw. PC und Arduino noch ein
> bestimmtes Shield?

Das Arduino Mega 2560 Board hat USB. Nein, da brauchst du kein 
RS232-Shield für.

Und stell dir die Auswertung von Inkrementalgebern nicht so einfach vor. 
Dazu gibt es Stammtischmeinungen ohne Ende. Der aktuelle Thread
Beitrag "Re: Drehimpulsgeber" zu dem Thema ist 
mittlerweile bei über 280 Postings.

Ein Arduino Due (AT91SAM3E) könnte die Inkrementalgeber auch direkt 
hardwaregestützt auswerten.

von Thomas W. (Gast)


Lesenswert?

Marco R. schrieb:
> Hab gelesen das der Arduino mit 5V Seriell sendet, der PC aber mit 12V
> dagegenhält und das dann eher schlecht für den Arduino ist.

Das passiert zum Glück nur, wenn man Ausgang mit Ausgang verbindet. 
Guter Tip - vermeide es.

Aber selbst wenn man richtig Eingang mit Ausgang verbindet, geht das 
schief, weil der Arduino "TTL"-Signale liefert. Gegenüber RS232 sind die 
Signale invertiert und nicht bipolar. Da wird man um einen RS-232 
Treiber, wie den klassichen MAX232 oder einen seiner Nachfolger, nicht 
drumrum kommen. Das nützt natürlich nur etwas, wenn der PC so alt ist, 
dass er noch eine RS-232 Schnittstelle hat. Guck mal sehr genau nach. 
Sonst ist das vergebene Liebesmüh und stellt sich spätestens beim Kauf 
eines Nachfolge-PCs als unglückliche Schnittstellenwahl heraus, sofern 
man nicht noch extra einen USB-RS232-Wandler rumfliegen haben möchte.

von Marco R. (0201m)


Lesenswert?

Thomas W. schrieb:
> Marco R. schrieb:
>> Hab gelesen das der Arduino mit 5V Seriell sendet, der PC aber mit 12V
>> dagegenhält und das dann eher schlecht für den Arduino ist.
>
> Das passiert zum Glück nur, wenn man Ausgang mit Ausgang verbindet.
> Guter Tip - vermeide es.
>
> Aber selbst wenn man richtig Eingang mit Ausgang verbindet, geht das
> schief, weil der Arduino "TTL"-Signale liefert. Gegenüber RS232 sind die
> Signale invertiert und nicht bipolar. Da wird man um einen RS-232
> Treiber, wie den klassichen MAX232 oder einen seiner Nachfolger, nicht
> drumrum kommen. Das nützt natürlich nur etwas, wenn der PC so alt ist,
> dass er noch eine RS-232 Schnittstelle hat. Guck mal sehr genau nach.
> Sonst ist das vergebene Liebesmüh und stellt sich spätestens beim Kauf
> eines Nachfolge-PCs als unglückliche Schnittstellenwahl heraus, sofern
> man nicht noch extra einen USB-RS232-Wandler rumfliegen haben möchte.

Alles klar, ich werde es dann wie oben vorgeschlagen über den USB 
Anschluss laufen lassen.
Als Library will ich diese hier verwenden, da wird der MEGA als 
kompatibel angezeigt:
http://www.pjrc.com/teensy/td_libs_Encoder.html

Der Geber ist ein INDUcoder mit 2 Ausgängen also mit 4fach Zählung für 
beide Drehrichtungen

von m.n. (Gast)


Lesenswert?

Marco R. schrieb:
> Der Geber ist ein INDUcoder mit 2 Ausgängen also mit 4fach Zählung für
> beide Drehrichtungen

Welcher Typ genau, oder welche Auflösung bei welcher Geschwindigkeit?
Von der max. Ausgangsfrequenz hängt ab, ob man noch per Software 
auswerten kann oder unbedingt einen Hardware-Quadraturdekoder braucht.
Ist es ein Drehgeber oder ein Lineargeber? Wie schnell müssen die 
Zählerstande ausgelesen werden ggf. auch synchron?

Eine einfache Lösung in Software bis 350 kHz per IIC-Bus auszulesen: 
Beitrag "mini Quadraturdekoder + 32 Bit Zähler + TWI, Attiny25"
Durch entsprechende Vergabe der IIC-Adresse kann man einen oder auch 
zehn Kanäle erfassen.

von Marco R. (0201m)


Lesenswert?

m.n. schrieb:
> Marco R. schrieb:
>> Der Geber ist ein INDUcoder mit 2 Ausgängen also mit 4fach Zählung für
>> beide Drehrichtungen
>
> Welcher Typ genau, oder welche Auflösung bei welcher Geschwindigkeit?
> Von der max. Ausgangsfrequenz hängt ab, ob man noch per Software
> auswerten kann oder unbedingt einen Hardware-Quadraturdekoder braucht.
> Ist es ein Drehgeber oder ein Lineargeber? Wie schnell müssen die
> Zählerstande ausgelesen werden ggf. auch synchron?
>
> Eine einfache Lösung in Software bis 350 kHz per IIC-Bus auszulesen:
> Beitrag "mini Quadraturdekoder + 32 Bit Zähler + TWI, Attiny25"
> Durch entsprechende Vergabe der IIC-Adresse kann man einen oder auch
> zehn Kanäle erfassen.

http://www.inducoder.de/de/produkt/micro-encoder-es181.html
Das ist der Encoder, Ausgangsfrequenz <=50kHz, max 1600 
Impulse/Umdrehung sollte das ein Problem geben, ich will wie oben 
beschrieben max. 4 gleichzeitig auswerten?

von m.n. (Gast)


Lesenswert?

Marco R. schrieb:
> Das ist der Encoder, Ausgangsfrequenz <=50kHz, max 1600
> Impulse/Umdrehung sollte das ein Problem geben, ich will wie oben
> beschrieben max. 4 gleichzeitig auswerten?

Per Software zu zählen, braucht es einen µC pro Kanal. Gezeigte 
Schaltung+Programm mit dem ATtiny25 funktionieren damit: für vier Kanäle 
in insgesamt 4-facher Ausführung. Wenn Du mit dem PC einen IIC-Bus 
steuern kannst, könnte ich Dir ein paar ATtiny25 programmieren.
Eine Alternative wären noch ATtiny2313, die per RS232 angesprochen 
werden können.

Wenn ein µC alle vier Kanäle auswerten soll, bräuchte er entsprechend 
viele Quadratur-Dekoder auf dem Chip. Ob der von Wolfgang genannte 
AT91SAM3E das bietet, sehe ich auf den ersten Blick nicht. Es kann sein, 
daß er nur einen Dekoder-Kanal hat, dann wäre diese Lösung zu aufwendig. 
Oder es sind drei Kanäle, dann bräuchte man ihn doppelt.
Ein STM32F4xx kann alle vier Kanäle per Hardware erfassen. Es reicht ein 
STM32F411, den es für wenig Geld auf einem Nucleo-Board gibt.

Egal, wie Du es machen möchtest, ein wenig Lötarbeit ist mit dabei, aber 
gut zu schaffen.

von Marco R. (0201m)


Lesenswert?

m.n. schrieb:
> Per Software zu zählen, braucht es einen µC pro Kanal. Gezeigte
> Schaltung+Programm mit dem ATtiny25 funktionieren damit: für vier Kanäle
> in insgesamt 4-facher Ausführung. Wenn Du mit dem PC einen IIC-Bus
> steuern kannst, könnte ich Dir ein paar ATtiny25 programmieren.
> Eine Alternative wären noch ATtiny2313, die per RS232 angesprochen
> werden können.
>
> Wenn ein µC alle vier Kanäle auswerten soll, bräuchte er entsprechend
> viele Quadratur-Dekoder auf dem Chip. Ob der von Wolfgang genannte
> AT91SAM3E das bietet, sehe ich auf den ersten Blick nicht. Es kann sein,
> daß er nur einen Dekoder-Kanal hat, dann wäre diese Lösung zu aufwendig.
> Oder es sind drei Kanäle, dann bräuchte man ihn doppelt.
> Ein STM32F4xx kann alle vier Kanäle per Hardware erfassen. Es reicht ein
> STM32F411, den es für wenig Geld auf einem Nucleo-Board gibt.
>
> Egal, wie Du es machen möchtest, ein wenig Lötarbeit ist mit dabei, aber
> gut zu schaffen.

Vielen Dank für das Angebot!

I²C Bus sieht eher schlecht aus. Hier ist mein Szenario mal genauer. Ich 
habe einen Industrie-PC (Bressner) der mit einer Blackmagic DeckLink 
Karte ausgestattet ist. Auf dem PC läuft dann meine Videosoftware (C++ 
mit Blackmagic SDK - funktioniert schon), das Videosignal kommt von 
einer Pan-Tilt Kamera die an beiden Achsen die INDUcoder sitzen hat. 
Meine Aufgabe ist es jetzt diese Pan-Tilt Werte in der Software 
einzublenden, möglichst einfach. Der Bressner hat 1x Parallel und 2x 
RS232 Eingänge. Meine Idee war jetzt mit dem Arduino Mega 2560 (hab ich 
mir jetzt einfach mal bei Amazon bestellt), die Geber zu lesen und dann 
per RS232 auszugeben und dann in C++ einzulesen.

Falls es da eine einfachere Möglichkeit gibt bin ich gern offen für 
Vorschläge, da ich von der ganzen Schnittstellentechnik nicht wirklich 
Ahnung und Erfahrung hab (bin gerade 19 und hab natürlich in dem Umfeld 
außer Learning-by-Doing keine Erfahrung).

von m.n. (Gast)


Lesenswert?

Marco R. schrieb:
> einer Pan-Tilt Kamera die an beiden Achsen die INDUcoder sitzen hat.
> Meine Aufgabe ist es jetzt diese Pan-Tilt Werte in der Software
> einzublenden, möglichst einfach. Der Bressner hat 1x Parallel und 2x
> RS232 Eingänge. Meine Idee war jetzt mit dem Arduino Mega 2560 (hab ich
> mir jetzt einfach mal bei Amazon bestellt), die Geber zu lesen und dann
> per RS232 auszugeben und dann in C++ einzulesen.

Mit dem Arduino kannst Du schon einmal Deine Versuche beginnen: zunächst 
wird ein Kanal erfaßt und per RS232 der zugehörige Wert ausgegeben. Da 
finde ich bei mir sicherlich ein paar Codeschnipsel.

Dann muß Du sehen, welche Frequenz die Drehgeber tatsächlich liefern. Je 
nach Masse der Kamera werden da sicherlich nicht die max. 50 kHz 
ausgegeben werden, wie sie im Datenblatt stehen. Dann sieht es schon 
einmal besser aus.
Geschätzt schafft ein AVR (ATmegaxx) max. 5 kHz bei vier Kanälen, wobei 
die Frequenz höher sein kann, wenn nicht alle Bewegungen mit hoher 
Geschwindigkeit gleichzeitig stattfinden. Auch für vier Kanäle finde ich 
noch Codeschnipsel.
Wenn die Geschwindigkeit dennoch sehr hoch sein muß, könnte man den 
Arduino als Schnittstellen-Konverter arbeiten lassen: per IIC werden die 
Daten eingesammelt und per RS232 an den PC ausgegeben. Das wäre eine 
Option, die aber derzeit nicht unbedingt notwendig erscheint.

Marco R. schrieb:
> Falls es da eine einfachere Möglichkeit gibt bin ich gern offen für
> Vorschläge, da ich von der ganzen Schnittstellentechnik nicht wirklich
> Ahnung und Erfahrung hab (bin gerade 19 und hab natürlich in dem Umfeld
> außer Learning-by-Doing keine Erfahrung).

Die einfachste Möglichkeit ist, ein paar Scheine locker zu machen. Aber 
es schadet auf keinen Fall, eigene Erfahrungen zu sammeln. Mit 19 hat 
der Arbeitstag ja auch noch 24 Stunden; was der Kopf noch nicht schafft, 
schaffen die Beine ;-)

von Georg (Gast)


Lesenswert?

Marco R. schrieb:
> Meine Aufgabe ist es jetzt diese Pan-Tilt Werte in der Software
> einzublenden, möglichst einfach.

Dazu noch ein Hinweis: die Geber sind inkremental, soll heissen beim 
Einschalten ist die Position unbekannt (und der Zähler wahrscheinlich 
0). Daher muss als allererstes eine Referenzposition angefahren werden, 
entweder hat der Geber dafür eine dritte Spur, die nur einen einzigen 
Impuls ausgibt, oder man fährt gegen einen Endschalter. Den Vorgang kann 
man manuell auslösen oder automatisch bei der Initialisierung.

Eine weitere Konsequenz ist, dass der Positionszähler eben immer vom 
vorhandenen Wert aufwärts oder abwärts weiterzählt, geht ein Impuls 
verloren, so stimmt die Position nicht mehr. Die Auswertung muss also 
sehr zuverlässig sein, es kann auch empfehlenswert sein, gelegentlich tu 
rekalibrieren.

Einfach einen Dekoder dranhängen und auslesen genügt also nicht.

Georg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.