PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 4 WD Fahzeug



rolber
29.11.2011, 15:30
Hallo an Alle !!

Nach längerer Schaffenspause möchte ich Euch heute mein neues Projekt vorstellen:

Es soll ein Allrad angetriebenes Fahrzeug mit 4 RB 35 (1:30) Motoren werden.
Die ersten Teile sind schon vorbereitet und eine Platine habe ich
auch schon angefertigt.
Als Controller wurde ein Amega 32 gewählt, da dieser über 4 Hardware-PWM
Kanäle verfügt. 2 L 293 D dienen als Motortreiber.
Eine 4 Kanal Fernbedienung wurde auch eingebaut.
Später soll noch eine Funkkamera (2.4 Ghz) auf das Fahrzeug gebaut werden,
welche über 2 Servos Horizontal u. Vertikal verdreht werden kann.

Programmiert wird es mit Bascom -AVR.
Die Servos auf dem Bild dienen nur als Test - Motore. Es sind 4 gehackte
MG 995 Servos.
Als Akku soll später ein 3S Lipo benutzt werden.

Ein kleines Video zur 4 Kanal PWM könnt Ihr hier sehen:
http://youtu.be/xcDaf1hXcsU

Oder auf meiner Webseite.
Im Moment warte ich noch auf einige Kleinteile.
Werde dann immer mal wieder vom Stand der Dinge berichten !

Roland

20682

rolber
13.12.2011, 19:08
Hallo !

Nachdem ich mittlerweile einiges verwirklicht habe, mal wieder ein neues Bild.
Fahrzeug wurde komplett zusammen gebaut und eine Kamerahalterung die Vertkal u. Horizontal verdreht werden kann habe auch montiert.
Warte jetzt auf die 2.4 Ghz Funkkamera.
Falls dann alles so klappt wie gedacht, werde ich mal ein Video posten!

Roland

HannoHupmann
14.12.2011, 11:33
Wenn ich das Bild richtige sehe, hast du die Motoren nicht entstört. Ich würde noch ein paar Kondensatoren anlöten damit der sauber entstört ist. Das vermindert die Fehleranfälligkeit des Gesamtsystems.

rolber
15.12.2011, 20:43
@Hanno
Hallo! Habe auch schon drüber nachgelesen, scheint kein grosses Problem zu sein .
Mit 2 Kondensatoren gegen Masse u. einer zwischen den Anschlüssen (pro Motor).

Habe zur Zeit eher ein Softwareproblem:
Da ich alle 4 Hardware PWM Kanäle nutze sind alle 3 Timer dafür in Verwendung.
Brauche aber einen Timer um die Servos anzusteuern.
Überlege ob ich einen zusätzlichen Atmega8 dafür verwende, der dann über Interrupt die Servo-Ansteuerung übernimmt.
Den hätte ich auch zufällig noch zur Hand.
Falls jemand eine bessere Idee hat, noch habe ich nichts angefangen!!

Roland

radbruch
15.12.2011, 21:05
Du kannst mit jedem Timer zusätzlich zur Hardware-PWM noch Servosignale in einer ISR erzeugen.

rolber
15.12.2011, 21:45
@radbruch
Kannst Du mir das mal etwas ausführlicher Erklären?
Ich möchte kein fertiges Programm, nur eine etwas genauere Beschreibung.
Ach ja, müsste schon mit Bascom gemacht werden!

Roland

radbruch
15.12.2011, 22:58
Ok, hier also der Ansatz in Bascom. Basis ist die klassische Ansteuerung in C aus dem RN-W iki (http://www.rn-wissen.de/index.php/Servo#Ansteuerung:_Signalform_und_Schaltung), das Beispiel ist für einen 8MHz-Mega8:


$regfile = "m8def.dat" ' asuro mit Mega8
$crystal = 8000000 ' taktet mit 8MHz

Config Timer0 = Timer , Prescale = 1 ' 100kHz für Servos
Timer0 = 256 - 80
On Ovf0 Isr_timer0_ovl
Enable Ovf0
Enable Interrupts

Do
Loop
End

Isr_timer0_ovl:
Timer0 = 256 - 80

If Servocount > Servo1 Then Portb.1 = 0 Else Portb.1 = 1
'If Servocount > Servo2 Then Portb.2 = 0 Else Portb.2 = 1
'If Servocount > Servo3 Then Portb.4 = 0 Else Portb.4 = 1
If Servocount < 2000 Then Incr Servocount Else Servocount = 1
If Delay_10us > 0 Then Decr Delay_10us
Return
Wie funktioniert das? Bei jedem Timerüberlauf wird die ISR aufgerufen und in dieser die Anzahl der Aufrufe in Servocount mitgezählt. Wenn die Anzahl der Dauer von 20ms entspricht wird der Zähler auf eins zurückgesetzt. Das entspricht der Wiederholrate eines Servosignals.

Die Impulslänge für das Servo wird nun ebenfalls in diesen Überlauf-Zeiteinheiten angegeben. Der Zählerstand wird bei jedem Aufruf der ISR mit der Impulslänge verglichen und der Ausgang während des Impulses gesetzt und nach dem Impuls gelöscht. Ein kleines Rechenbeispiel für 8MHz und Prescaler=0:

Timertakt 8MHz, Vorladung des TCNT-Register ist 256-80, es wird nach 8MHz/80Timertakte bis zum Überlauf der Interrupt ausgelöst. Die ISR wird so alle 0,00001sek aufgerufen (100kHz). Nach 100 Aufrufen ist eine Millisekunde vergangen, nach 2000 Aufrufen sind es 20ms.

Jetzt muss man dies eigentlich nur noch an die vorgegeben Motoren-PWMs anhängen und die Zählerwerte an die geringere Auflösung des Timers anpassen. Z.B. für einen 16MHz-Kontroller mit 8bit PWM und Prescaler /8: 16000000/256/8 ergibt eine PWM-Frequenz von 7812,5Hz (wird schön pfeifen) und ein Interruptabstand von 1sek/7812,5 oder 0,000128sek. Ein Servosignalzyklus dauert dann 0,02sek/0,000128sek oder 156 ISR-Aufrufe. Oje, eine Millisekunde dauert dann 8 Aufrufe, deutlich geringe Auflösung.

Naja, sollte ja nur ein Beispiel sein. Für eine höhere Auflösung muss man die PWM-Frequenz erhöhen (kein Prescaler und mehr als 8 Bit -> Timer1).

Ist es nötig die Antriebe einer Seite getrennt anzusteuern?

Gruß

mic

rolber
16.12.2011, 10:24
@Radbruch
Erstmal Danke für deine ausführliche Antwort !
Zwei kleine Fragen hätte ich aber noch:
1. Ovf0 -- Ist das die Standartmässige Variable für das Timer0 Überlauf Register ?
2. Enable Ovf0 -- Muss ich das extra Enablen oder ist das automatisch in Betrieb wenn ich Enable Timer0 benutze ?

Zur Zeit benutze ich für jeden einzelnen Moter ein separates PWM Signal und kann die auch per software verändern.
So dass ich die Drehzahl jedes Motors einzeln einstellen kann. Anschliessend speicher ich diese Werte im EEprom und nutze diese Werte dann zum Fahren.
Die Motore laufen aber eigentlich so synchron, dass man fast darauf verzichten kann.
Nur einer dreht bei voller Ansteuerung etwas schneller als alle anderen.

Den Rest deines Beispiels habe ich wohl verstanden, falls nicht werde ich nochmal nachhaken.

Nur werde ich wohl dieses WOE nicht weiter machen können. Ist ja schon wieder 4. Advent

Gruss

Roland

radbruch
16.12.2011, 17:04
Hallo

"Ovf0" bezeichnet den Overflow-Interrupt von Timer0. Vermutlich bewirken "Enable Ovf0" und "Enable Timer0" dasselbe. Da ich aber eher selten in Bascom programmiere verwende ich hier die eindeutige Variante.

Konsequent bin ich dabei aber offensichtlich nicht: Timer0 = 256 - 80. Hier ist mit Timer0 das TCNT-Register des Timers gemeint. Zudem schlummert hier auch noch ein kleiner Bug. Die Zähltakte zwischen dem Überlauf und dem Laden des Registers werden unterschlagen.

Gruß

mic

rolber
16.12.2011, 23:37
@radbruch
Da ich festgestellt habe, daß 3 Motore exakt die gleiche Drehzahl bei entsprechenden PWM Werten haben, werde ich das Programm entsprechend ändern!
Dadurch habe ich dann einen Timer für die Servos frei.
Kann dann den Servo Befehl in Bascom nutzen, der ist auch viel einfacher zu handhaben als die IRQ Routine mit all den komplizierten Berechnungen.
Bestimmt aber auch viel ungenauer als Radbruchs Variante.
Für meine Zwecke aber allemal ausreichend

Brauche dann kein komplett neues Programm schreiben, sondern nur ein paar Änderungen vornehmen.

Roland

rolber
21.12.2011, 18:13
Hallo !

Habe mich nun doch dazu entschlossen, radbruchs Variante zu nehmen.
Erschien mir viel besser, da ich dadurch weiterhin die Motore mit 4 unterschiedlichen PWM Frequenzen steuern kann (Gleichlauf).
Die Kamerahalterung ist nun fertig und die Servoansteuerung klappt tadellos.
War eigentlich einfacher als ich dachte und funktionierte auf Anhieb.
Nochmal Danke an radbruch für seine Bemühungen !
Wenn irgenwann endlich die Kamera kommt, gibts neue Bilder, evtl. ein Video !

Roland

radbruch
21.12.2011, 18:46
Hallo

Immer prima, wenn es auch noch auf Abhieb funktioniert. Könntest du jetzt noch zeigen, wie du es umgesetzt hast? Oder kommt das noch:
http://www.sensobot.de/index.php?option=com_content&view=category&id=6&Itemid=11

Gruß

mic

rolber
21.12.2011, 21:06
@radbruch

Möchtest Du das komplette Programm sehen oder nur den Teil für die Servos?

Roland

rolber
23.12.2011, 22:03
Hallo !

Euch Allen erst mal frohe Festtage !!

Nachdem ich die Servos für die Kamerahalterung nun steuern kann, hat sich ein neues Problem aufgetan.
Wollte eigentlich noch einen Greifarm auf dem Bot installieren, der Rückmeldung über die CAM gibt.
Dafür benötige ich aber mindestens 4 Ports um die entsprechenden Servos anzusteuern.
Habe aber nur noch 2 Ports frei.
Ich glaube, der Mega32 ist für das Projekt etwas zu Klein?
Ich will aber eigentlich mit dem Board weiter arbeiten.
Kann man da evtl. etwas über die Ports der ISP Schnittstelle machen oder muss ich die 6 Ports die für das Display dafür verwenden?
Will aber das Display auf keinen Fall komplett entfernen, da alles Programm-Technisch über einen Menue - Dialog abläuft.

Wäre für gute Ideen dankbar !!

Roland

dussel07
24.12.2011, 01:30
Was einfach ist wenn man zu wenig Ports hat: LCD per I2C (http://www.svens-projekte.de/15.html)
Natürlich kannst Du auch die ISP Pins nutzen.

radbruch
24.12.2011, 01:35
Dann zucken die Servos beim Programmieren.

dussel07
24.12.2011, 01:43
Abhilfe schaft ein Jumper für die Spannungsversorgung der Servos. Einfach ziehen wenn man den Atmega programmiert.

rolber
26.12.2011, 19:26
Hallo !

Das mit dem I2C - Display, wäre schon ein guter Lösungsansatz.
Hätte dann sofort 4 Ports zur Verfügung.
Habe mir aber auch überlegt, die Ports für das LCD per Fernsteuerung durch eine bestimmte Tastenkombination frei zu geben, um sie danach frei verwenden zu können.
Z.B. über den Config Port Befehl.
Werde nach den Feiertagen da mal was Testen.

Und am heiligen Abend traf dann auch noch die Kamera ein.
Nach den Feiertagen gibts dann wieder einiges zu tun.

Roland

rolber
08.01.2012, 15:58
Hallo!

Habe nun wieder ein wenig Zeit gehabt.
Die Funkkamera habe ich in die Halterung eingebaut.
Servosteuerung für die Kamerahalterung klappt einwandfrei
Die Übertragung der Funksignale Fernsteuerung (433Mhz.) u. Kamera (2.4Ghz) klappt im Haus über 2 Etagen gut.
Outdoorversuche mussten wegen des miesen Wetters verschoben werden.
Habe mal 2 Bilder angehängt. Bei dem einen seht Ihr das Bild der Kamera im Monitor (Mehr oder Weniger).
Auf dem Schreibtisch sieht es mit dem ganzen Equipment schon sehr Chaotisch aus.

Roland