Pages: [1]   Go Down
Author Topic: Lego NXT Motoren mit Arduino-Shield  (Read 1434 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 122
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
wie ich im Titel schon geschrieben habe möchte ich ein Shield bauen, womit ich 4 Lego Sensoren und 3 Lego Motoren aus den Mindstormsset
ansteuern möchte. Diese Lösung gibt es schon aber leider nur mit 2 Motoren. Also möchte ich meine eigenes Shield bauen.
Die Sensoren, wären kein Problem. Nur die 3 Motoren machen es schwieriger.

Also kurz zu den Motoren.
Es sind DC Motoren mit Getribe und QuadraturDecoder(ich hoffe es heißt so) Wikipedia:http://en.wikipedia.org/wiki/Rotary_encoder#Absolute_encoder_output_formats
Bild der beiden Decoderphasen im Betrieb:

Pins:
Pin1 Weiß Motor +9V; PWM-Steuerung
Pin2 Schwarz Motor -9V; PWM-Steuerung
Pin3 Rot GND (-)
pin4 Grün +4,3V // veträgt 5v
Pin5 Gelb Motorencoder (Kanal a; Schmitt-Trigger-Funktion)
Pin6 Blau Motorencoder (Kanal b; Schmitt-Trigger-Funktion)

Um die Motoren anzusteuern könnte ich also diesen Code benutzen:
http://material.htlwien10.at/projekte/1112_5AHMEA_Leguino/mo_nxtmotor.html (einfach runterscrollen)
Das heißt es werden aber nur alle 2 Grad ein Impuls gegeben. Kann ich das ändern?
Ich habe einen UNO mit 2 Interrupts und einen Leonardo mit 4.
Hilft mir diese Interruptlib: http://code.google.com/p/arduino-pinchangeint/  um für jeden Decoder Pin einen Interrupt zu haben ?

Gibt es einen Motortreiber mit eingebautem Decoderauswerter, dem ich einfache die Geschwindigkeit, Richtung usw. übergeben kann und der das dann alleine regelt?

Ich hoffe ihr versteht mich.
Grüße legotechnicus

Logged

Everybody makes mistakes, me too smiley

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 248
Posts: 21174
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das gezeigte Motor Shield ist meinen Meinung etwas unterdimensioniert. Bei einem max Strom von 1A (laut http://material.htlwien10.at/projekte/1112_5AHMEA_Leguino/mo_nxtmotor.html) ist ein L293D / SN75441 mit max 0,6mA unterdimensioniert. Da würd ich schon einen L298 nehmen wie zB auf einem aktuellen Arduino Motorshield http://arduino.cc/en/Main/ArduinoMotorShieldR3
Um nicht Platinen Ätzen zu müssen kannst Du 2 ArduinoMotorShield's R3 auch nicht auf den Arduino stecken sondern mit Kabel zwischen Arduino und den beiden Shields neu verbinden. So kannst Du mehr als 1 Shield verwenden.

Quote
The shield's pins, divided by channel are shown in the table below:

Function                    pins per Ch. A        pins per Ch. B
Direction                          D12                      D13
PWM                                  D3                      D11
Brake                              D9                         D8
Current Sensing                A0                     A1

Ich schlage Dir die Verwendung des Arduino MEGA vor da dieser mehr Pins allgemein und mehr Interruptpins hat. Die Encoder (QuadraturDecoder) lassen sich einfach mit Interrupteingänge auslesen.

Laut http://www.philohome.com/nxtmotor/nxtmotor.htm macht der Encoder 180 Impulse pro Drehung der äußeren Achse. Wenn man alle Flanken der 2 Signale berücksichtigt kann man auf 720 Impilse pro Drehung kommen. Bei Leerlauf un 9V Versorgungsspannung ist die Drehzahl ca 160 U/min. Das sind bei 180 Impulsen pro Umdrehung 28800 impulse pro minute oder 480 Impulse pro Sekunde bzw Hz. Dies Impulszahl kann Arduino bei kurzen Interruptroutinen ohne Problem, auch von mehreren Enkodern gleichzeitig, bewältigen.

Güße Uwe
« Last Edit: June 25, 2013, 01:55:57 pm by uwefed » Logged

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

Code:
Um nicht Platinen Ätzen zu müssen kannst Du 2 ArduinoMotorShield's R3 auch nicht auf den Arduino stecken sondern mit Kabel zwischen Arduino und den beiden Shields neu verbinden. So kannst Du mehr als 1 Shield verwenden.
Ich habe als MotorShield-Anfänger ein ähnliches Problem, denn ich möchte 3 Stepper- sowie 3-DC-Motoren verwenden. Dafür müssten ja 5 Shields reichen  (3 für die 3 Stepper-Motoren + 2 für DC-Motoren).
Kann man überhaupt so viele shields gleichzeitig benutzen?
Wie verbindet man dann den Arduino (Mega 2560) mit jedem der shields?
Oder ist es besser, entweder den Adafruit Motorshield oder den  Big Easy Driver Sparkfun ROB-11699 für so etwas zu verwenden?
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 248
Posts: 21174
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Für die Schrittmotoren ist das Arduino Motor Shield wegen der zusätzlichen logik (XOR-Gatter) nicht geeignet. Für die Schrittmotoren kannst Du je nach Stromstärke des Motors ein Motorshield mit L293/L293D, L298, A3967 (Easydriver) oder A4988 (BidEasydriver, Pololu) oder andere verwenden.
Für 3 DC-Motoren brauchst Du aber 2 Motor-Shileds.
Grüße Uwe
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 122
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich möchte aber ungerne einen Mega kaufen sondern alles über den UNO bzw. Leonardo steuern
Gibt es den einen Controller wie den L293D (http://learning.grobotronics.com/arduino-l293d-tutorial.html)
nur mit Decoder Funktion? Dann könnte ich die Motoren ja ganz bequem anschliessen, oder?
Logged

Everybody makes mistakes, me too smiley

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mal ne Frage für mich zum Verständnis:
Der LEGO-Motor hat wie oben beschrieben einen PWM-Eingang (1 pin +, 1 pin - bei 9V) und enstrechende Decoder-Ausgänge (GND, +4,3V, Kanal A + B) ?

Wozu brauchst du denn da einen Motortreiber ala L293 ?
Ich sehe das momentan so:
Der Motor wird mit Pulsweitenmodulation gestert, was der Arduino "so" kann. Falls der mit 5V nicht klarkommt, müsste da ggf. noch ne Anpassung mit zusätzlicher Spannungquelle dazwischen.
Die Impulsgeber/Decoder sind lediglich dazu da, um der Steuerung die tatsächliche IST-Drehzahl (und Richtung) dem Controller mitzuteilen. Hier sollte ein Anschluss an Digital-In des Arduino auch "so" kein Thema sein.

Mit welchem PWM-Verhältnis (unter Last oder ohne) der Motor sich nun wie schnell wie herum dreht, ist eine frage des Programms. Sprich Auswerten der Decoder und einstellen der PWM-Breite.
Logged

To young to die - never to old for rock'n roll

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 248
Posts: 21174
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Pins des Arduino können nicht den nötigen Strom für den Motor liefern. Darum braucht es, wenn man ihn in beide Richtungen drehen lassen will, eine H-Brücke zB L298

Grüße Uwe
Logged

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Schon klar, das man einen DC-Motor ohne Zusatz nicht steuern kann.
Wozu dann aber der Hinweis im 1. Post, das es einen PWM-Eingang gibt ?
Und da es keinen DIR-Eingang gibt, gehe ich auch mal davon aus, das der Motor wie ein Servo reagiert: Unter Mittelstellung so rum, darüber anders herum.
Seit wann braucht man für eine PWM-Signal eine Leistungsstufe ?
Logged

To young to die - never to old for rock'n roll

Offline Offline
Full Member
***
Karma: 1
Posts: 122
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es gibt die Varianten beim Ansteuern:  P1=+9v (PWM=Geschwindigkeit)  //erste Richtung
                                                               P2=GND

                                                               P1=GND
                                                               P2=+9v(PWM=Geschwindigkeit)  // zweite Richtung

Es ist im ersten Post unverständlich geschrieben.Tschuldigung
Logged

Everybody makes mistakes, me too smiley

Offline Offline
Full Member
***
Karma: 1
Posts: 122
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab hier was gefunden
http://www.robotc.net/wiki/Tutorials/Arduino_Projects/Mobile_Robotics/Lego
(einfach runterscrollen)
wie programmiere ich das in der IDE und nicht in ROBOT_C ?
Diee Verkabelung ist auch geklärt.
Logged

Everybody makes mistakes, me too smiley

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 6
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Da hat Baby LEGO sich ja was tolles ausgedacht, was die Motorsteuerung betrifft. Auf jeden Falle brauchst du dazu sicherlich keine Leistungsteil/-Shield, wie es hier so oft für DC-Motoren oder Stepper beschrieben wird.
PWM scheint / ist klar, was die Geschwindigkeit betrifft, aber ...
...bist du dir da wirklich ganz sicher, dass die LEGO-Burschen zur Richtungsänderung tatsäschlich eine Spannungsumpolung verlangen ?

Wie sieht es denn mit den Spannungen bei LEGO prinzipiell aus: Einfach 5V oder 12V ? Oder auch +/-5V oder so ?
Ich hab da keinen "Plan" - du solltest ihn haben.  smiley-mr-green
Logged

To young to die - never to old for rock'n roll

Offline Offline
Faraday Member
**
Karma: 97
Posts: 3507
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du kannst Lego NXT auch direkt in anderen Sprachen programmieren wenn du eine andere Firmware draufspielst. Ich habe während dem Studium was damit gemacht und dies hier genommen: http://lejos.sourceforge.net/

Aber sowie ich dass hier sehe wird der NXT Controller ja gar nicht verwendet. Also fällt das alles weg und die Komponenten werden direkt an den Arduino angeschlossen. Seltsam dass es da nicht einfach Libraries für die Arduino IDE gibt...

Das Stützrad hat man da gut gelöst smiley
Das ist bei dem Standard NXT nämlich Schrott und sorgt dafür dass der Roboter nicht richtig ausgerichtet ist, da es beim Drehen zu sehr schleift.
« Last Edit: June 27, 2013, 10:30:26 am by Serenifly » Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 122
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Das Stützrad hat man da gut gelöst smiley
Das ist bei dem Standard NXT nämlich Schrott und sorgt dafür dass der Roboter nicht richtig ausgerichtet ist, da es beim Drehen zu sehr schleift.
Welches Stützrad?

Quote
Aber sowie ich dass hier sehe wird der NXT Controller ja gar nicht verwendet. Also fällt das alles weg und die Komponenten werden direkt an den Arduino angeschlossen. Seltsam dass es da nicht einfach Libraries für die Arduino IDE gibt...
Die gibt es aber nur für die Sensoren.

Quote
...bist du dir da wirklich ganz sicher, dass die LEGO-Burschen zur Richtungsänderung tatsäschlich eine Spannungsumpolung verlangen ?
Ja, weil man mit einem Adapterkabel einfach alte 2polige Motoren anschließen kann. Dieses Kabel verlängert nur Pin1 und 2.
Und einige selbstgebaute Motoren funktionieren so. Außerdem werden P1 und 2 beim BricktronicsShield wie normale DC Motoren an einen L293D angeschlossen:
http://www.wayneandlayne.com/files/bricktronics/shield/bricktronics_shield-schematic-v1.04.png

Nun damit hätte ich die Motorsteuerung geklärt, da kommen 2x L293D und könnte theoretisch sogar 4 Motoren anschließen.
Aber wie mache ich das mit den Decodern ? Jeder hatt seine eigene Möglichkeit:
1. http://www.robotc.net/wiki/Tutorials/Arduino_Projects/Mobile_Robotics/Lego/Using_encoders_to_drive_some_distance
  Der Code in RobotC geht das auch in der Arduino IDE ?
2. http://www.thecompblog.com/2012/07/hacking-lego-nxt-part-1.html
  Hier wird er an analoge Pins angelegt und bei Bedarf ausgelesen. Das erscheint mir sehr unlogisch oder?
3. http://material.htlwien10.at/projekte/1112_5AHMEA_Leguino/mo_nxtmotor.html
  Hier wird mit Interrupts gearbeitet, dafür aber nur jeder 2 Grad gelesen kann ich das ändern ohne einen neuen Interrupt zu benutzen (Rising in Change ändern ?) 9?

Danke für die Hilfe bis jetzt
Logged

Everybody makes mistakes, me too smiley

Offline Offline
Faraday Member
**
Karma: 97
Posts: 3507
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich meinte das dritte Rad hinten. Das ist ja in der Standard-Ausführung nur eines dieser dünnen, grauen Rädchen. Dabei hatte ich erstens das Problem dass die Aufhängung durch das Gewicht etwas durchgebogen wurden und zweitens hat es beim Rotieren manchmal auf dem Boden geschleift. Die Rotation ist bei Robotern dieser Bauart generell das größte Orientierungsproblem, aber durch wurde es wahrscheinlich nochmal etwas ungenauer. Hatte aber keine Bauteile um es durch was stabileres zu ersetzen.

Quote
 Hier wird er an analoge Pins angelegt und bei Bedarf ausgelesen. Das erscheint mir sehr unlogisch oder?
Ja, das verstehe ich auch nicht
« Last Edit: June 27, 2013, 01:27:17 pm by Serenifly » Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 122
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Meinst du den Roboter bei Robotc.net?
Das ist ja nicht meine Frage:)
Logged

Everybody makes mistakes, me too smiley

Pages: [1]   Go Up
Jump to: