BWP-WS19-02/Dokumentation/AntriebMechanikKommunikation: Unterschied zwischen den Versionen

Aus Verteilte Systeme - Wiki
Wechseln zu: Navigation, Suche
(Teaminterne Milestones)
(Motorensteuerung)
(Markierung: mw-replace)
 
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
=Arbeitspakete=
 
<!--{| class="wikitable"
 
|-
 
|style="background-color:#B3B7FF" colspan="7"| '''Mechanik & Konstruktion'''
 
|-
 
! Aufgabe !! Teilaufgabe !! Zuordnung !! geplanter Aufwand !! Zieldatum !! realer Aufwand !! Status
 
|-
 
|rowspan="3"| [[#Chassis | Chassis]]  ||Entwurf ||Ellen, Felix, Laura || 17h||04.11.19 ||20h|| 100%
 
|-
 
|Brettsägen, Kugelrad basteln  ||Ellen, Felix, Laura || 8h||07.11.19 || 4h||90%
 
|-
 
|Aufbau||Ellen, Felix, Laura||5h ||06.12.2019 ||2h|| 20%
 
|-
 
|rowspan="4"| [[#Motorensteuerung | Motorensteuerung]] ||GPIO + Programme anschauen|| Ellen, Laura || 4h||06.11.19 || 3h||100%
 
|-
 
| Motoren über PWM ansteuern||Ellen, Felix, Laura || 2h||08.11.19 ||12h|| 75%
 
|-
 
| Implementierung der Motorfunktionen||Ellen, Laura||8h ||XX ||4h|| 80%
 
|-
 
| Berechnung der Drehungen (Implementierung inkl.)||'''Ellen''', Felix, Laura|| 4h||06.12.19 || X||50%
 
|-
 
|rowspan="3"| [[#Drehzahlmessung | Drehzahlmessung]] || Gabellichtschranke: Signale ||Felix || 4h||06.11.19 || X||1%
 
|-
 
| Implementierung der Drehzahlmessung||Laura||4h ||XX ||03.11.19|| 10%
 
|-
 
| XX||XX||XX ||XX ||XX|| 0%
 
|-
 
 
|rowspan="3"| [[#Platinenaufbau | Platinenaufbau]] || Eagle-Schaltplan anfertigen||Felix||4 ||19.11.19 ||16h|| 50%
 
|-
 
|[[#Teila | Teila]] ||XX||XX ||XX ||XX|| 0%
 
|-
 
| Teila||XX||XX ||XX ||XX|| 0%
 
 
|-
 
|style="background-color:#B3B7FF" colspan="7"| '''Kommunikation'''
 
|-
 
! Aufgabe !! Zuordnung !! geplanter Aufwand !! Zieldatum !! realer Aufwand !! Status
 
|-
 
| Sichten der Altdateien, Einarbeitung in BLE ||XX||XX ||XX ||XX|| 0%
 
|-
 
| Entwurf Kommunikationsdiagramm ||XX||XX ||XX ||XX|| 0%
 
|-
 
| Implementierung einer Kommunikationsschnittstelle||XX||XX ||XX ||XX|| 0%
 
|-
 
|style="background-color:#B3B7FF" colspan="7"| '''Gruppenübergreifende Milestones'''
 
|-
 
! Aufgabe !! Zuordnung !! geplanter Aufwand !! Zieldatum !! realer Aufwand !! Status
 
|-
 
|  ITS-E: simulieren und thread-spezifische Nachrichten austauschen||Ellen, Laura||8h||26.11.19 ||10h|| 100%
 
|-
 
| ITS-E: Zusammenbauen und Hinderniserkennung||XX||XX ||XX ||XX|| 0%
 
|-
 
|}
 
-->
 
Die Arbeitspakete unserer Gruppe sind ab sofort im [https://gitlab.cs.hs-rm.de/wahlprojekt_explorativer_roboter/bwp_ws19/issues gitlab] zu finden
 
 
 
=Antrieb & Mechanik=
 
=Antrieb & Mechanik=
 
==Motorensteuerung==
 
 
===GPIO + Programme anschauen===
 
Für die Ansteuerung der GPIOs haben wir die vorhandenen Demo-Programme gesichtet und durch die Zephyr Dokumentation sowie der Datei  ITS-E/zephyr/boards/arm/nrf52_adafruit_feather/board.h konnten wir die GPIO Pins verwenden, um eine LED blinken zu lassen.
 
 
===Versuch den Motor über PWM anzusteuern===
 
Um später mittels PWM die Pins ansteuern zu können, braucht man einen aktivierten PWM-Driver. 
 
Diesen haben wir aus den ⁨bwp_ws19⁩/zephyr⁩/boards⁩/⁨arm⁩/⁨nrf52_pca10040⁩/Kconfig.defconfig
 
<source lang="cpp">
 
if PWM
 
config PWM_0
 
default y
 
 
endif # PWM
 
</source>
 
in die Kconfig.defconfig des adafruit featherboard kopiert und danach
 
ebenfalls aus den  ⁨nrf52_pca10040-bordkonfigurationen in der Datei nrf52_pca10040.dts die Passage
 
<source lang="cpp">
 
&pwm0 {
 
status = "okay";
 
ch0-pin = <17>;
 
ch0-inverted;
 
};
 
</source>
 
in die .dts-Datei im Ordner des genutzen Adafruit Featherboards nrf52 (zephyr/boards/arm/nrf52_adafruit_feather) kopiert, um bei dem angegeben Pin das Pwm-Signal zu aktivieren.
 
→ Wenn man einen anderen Pin als Pin 17 mit Pwm versorgen möchte, muss man ihn an dieser Stelle „ch0-pin = <pinnummer>; angeben!
 
 
Danach haben wir das PWMSignal mit dem Beispielprogramm blink_LED ausprobieren, jedoch haben wir das Pwm nicht zum laufen bringen können, weil die defines DT_ALIAS_PWM_LED0_PWMS_CONTROLLER
 
und
 
DT_ALIAS_PWM_LED0_PWMS_CHANNEL nicht gefunden wurden.
 
 
Jedoch haben wir bei dem Programm servo-Motor ein Signal erhalten.
 
Wichtig ist, dass man beim Aufruf von
 
static int pwm_pin_set_usec(struct device *dev, u32_t pwm, u32_t period, u32_t pulse)
 
Set the period and pulse width for a single PWM output.
 
Parameters
 
    • dev: Pointer to the device structure for the driver instance.
 
    • pwm: PWM pin.
 
    • period: Period (in microseconds) set to the PWM.
 
    • pulse: Pulse width (in microseconds) set to the PWM.
 
Return Value
 
    • 0: If successful.
 
    • Negative: errno code if failure.
 
nochmals den PWM-pin angibt(typ u32_t) siehe Parameters.
 
 
 
Wir haben dieses Beispielprogramm in unseren ITS-E-Ordner kopiert. Hierfür muss man noch in der  ITS-E/project.conf- Datei „CONFIG_PWM=y“ setzen.
 
 
Bei dem Servo-Beispiel setzt man MinPulsWidth und MaxPulsWidth in Mikrosekunden und gibt die Periodendauer
 
 
 
[[Datei:Wahlprojekt-4.jpg|Text der Bildlegende|600px]]
 
 
 
 
Des Weiteren haben wir versucht den Strom durch einen 3 Ohm Widerstand der 1206 Baureihe auf dem Breakout-Board auf 66,6 mA zu begrenzen. Die Formel zur Berechnung des Maximalstroms Imax=0,2V/R (0,066 A=0,2 V / 3 Ohm). Die Spannung ist laut Datenblatt auf 0,2 V festgelegt. Da der Motor als induktive Last bei fallenden Flaken des PWM Signals eine negative Spannung induziert, sind auf dem Breadkout-Board bereits Kick-Back-Dioden assembliert, um den Motortreiber vor negativen Spannungsimpulsen zu schützen. Trotzdessen muss die Spannung am Motor über einen Wechselspannungskondensator (ca. 10µF) geglättet werden und das Tastverhältnis (duty cycle) des PWM-Signals berücksichtigt werden, um die Spannung im gewünschten Spannungsbereich von 0,3 - 1V regeln zu können. Dem Datenblatt entsprechend haben wir die Pins VM(VCC) und SLP(SLEEP) mit einem 68 KOhm Pullup-Widerstand verbunden.
 
 
Vorerst haben wir uns dazu entschieden den Versuch die Motoren mittels PWM ansteuern zu können erstmal auf Eis zu legen, und die Motoren über die GPIOs anzusteuern.
 
 
 
===Ermittlung der idealen Periodendauer des PWM Signals===
 
 
Wann ist die Periodendauer ideal?
 
 
Da ein minimaler Energieverbrauch eine große Zielsetzung für unser Auto ist, haben wir das Wort 'ideal' daran fest gemacht, dass die Motoren mit maximal kurzen High Impulsen gerade noch laufen, die Periode jedoch nicht zu groß ist sodass die Motoren unruhig laufen.
 
 
Um den Energieverlust durch negative Spannungsimpulse des Motors beim Wechsel der Eingangsspannung von High zu Low zu minimieren
 
besteht die Möglichkeit das Signal durch geeignete Kondensatoren zu glätten.
 
Durch den Kondensator werden jedoch die Spannungsimpulse des PWM Signals auf die Periodendauer verteilt, und damit entsprechend kleiner. Dies hat den Nachteil das die Spannung bereits bei ca. 30% High Anteil des PWM Signals unter die Einschaltschwelle des Motors fällt und dieser folglich stehen bleibt.
 
Eine zu große Kapazität ist damit aus Sicht eines minimalen Energieverbrauchs von Nachteil!
 
Da nur während der High Impulse Energie verbraucht wird, kann es für unser Projekt von Vorteil sein, die Motoren mit minimalen High Impulsen an zu steuern.
 
 
Ein Versuch hierzu zeigt das der Motor prozentual gesehen mit einer maximal langen Periodendauer den geringsten Energieverbrauch aufweist um sich noch drehen zu können. Unsinnig wird dieses Experiment allerdings ab 100mS, da der Motor dann quasi im 100ms Takt angeschubst wird und durch seine Trägheit nicht ruhig rund läuft. Nicht umsonst scheint ein üblicher Wert für kleine Elktromotoren bei einer PWM-Periodendauer von 20mS zu liegen.
 
Bei dieser Frequenz sind zwar noch mindestens 5% High Anteil des PWM Signals nötig, um den Motor noch zu bewegen, dafür läuft er allerdings von 5% - 100% sehr ruhig.
 
 
Einige Versuchswerte sind in dieser Tabelle ersichtlich:
 
 
[[Datei:Optimales_PWM.png|opitmales PWM Signal|350px]]
 
 
Die y-Achse gibt die Effizienz der Motoren bei minimalem PWM High Anteil in % an.
 
 
Für unsere Motoren hat sich ein 1µF Kondensator bei einer Periodendauer von 20mS als ideal erwiesen.
 
 
===Implementierung der Motorfunktionen ===
 
 
 
 
Mit Hilfe der vorgegebenen GPIO-Funktionen, die die [https://docs.zephyrproject.org/latest/reference/peripherals/gpio.html/ Zephyr Dokumentation] zur Verfügung bereitstellt, haben wir die Motoren ansteuern können. Für eine bessere Wartbarkeit des Programms haben wir die Funktionalität für vorwärts, rückwärts, halten, rechts und links in einzelne Funktionen ausgelagert. Das Programm ist aktuell unter [https://zenon.cs.hs-rm.de/wahlprojekt_explorativer_roboter/bwp_ws19/tree/antrieb/ITS-E/src/Module/Antrieb/drive/src Link-zum-Programmcode] zu finden.
 
 
===Berechnung der Drehungen (Implementierung inkl.)===
 
 
#Ellen trägt das ein
 
 
==Implementierung der Hauptsteuerungs API==
 
 
===Implementierung des ersten Meilensteins===
 
Für die Implementierung des ersten Meilensteins wurde vom Systemarchiteckturteam die generelle Kommunikation zwischen den Teams festgelegt. Hierbei wird ein Job-System verwendet, womit jedes Subteam seine Jobs abfängt und abarbeitet. Während dieser Jobs ist es möglich mittels Mailboxen die Informationen der anderen Teams abzufragen. Die dazugehörige Implementierung findet sich aktuell unter [https://zenon.cs.hs-rm.de/wahlprojekt_explorativer_roboter/bwp_ws19/tree/SimMS1/ITS-E/src/Module/Antrieb diesem Link].
 
 
===Implementierung und Erfüllung des zweiten Meilensteins===
 
Bei der Implementierung des zweiten Meilensteins haben wir das Chassis des Prototyps für den ITS-E zusammen gebaut. Hierbei ist aufgefallen, dass das Auto, wenn es durch die Motoren angetrieben wurde leicht schräg fährt. Nach einigen Optimierungen am Chassis waren die Abweichungen nicht mehr ganz so groß - jedoch noch sichtbar. Das könnte durch nicht "echt-parallel" zueinander angebrachten Motoren und/oder der ungleichmäßigen Drehung der Motoren und/oder an der unterschiedlichen Spannungsversorgung durch den Motortreiber liegen.
 
Die eigentliche Implementierung der Motorfunktionen war ja schon im ersten Meilenstein behandelt, für den zweiten Meilenstein haben wir hier nichts anpassen müssen.
 
Das erbrachte Ergebnis ist unter [https://zenon.cs.hs-rm.de/wahlprojekt_explorativer_roboter/bwp_ws19/-/milestones/6 diesem Link] zu finden.
 
 
===Implementierung und Erfüllung des dritten Meilensteins===
 
Für die Modifizierung der Implementierung auf die Anforderungen des dritten Meilensteins, wurde die Funktion nach links zu drehen implementiert. Das Drehen der Räder wurde mit dem Stillstand des jeweils anderen Rads implementiert. Da die Motoren für die Räder noch nicht mit PWM angesteuert werden, fährt der Roboter noch leicht schief.
 
Die dazugehörige Implementierung findet sich aktuell unter [https://zenon.cs.hs-rm.de/wahlprojekt_explorativer_roboter/bwp_ws19/tree/SimMS3/ITS-E/src/Module/Antrieb diesem Link].
 
 
===Aktivitätendiagramm===
 
Das folgende Aktivitätendiagramm ist für den gesamten Ablauf der Antriebs API gedacht.
 
 
[[Datei:Image from iOS.jpg | 600 px]]
 
 
=Kommunikation=
 
 
=Quellen=
 
 
* https://docs.zephyrproject.org/latest/reference/peripherals/gpio.html, 26.11.2019 14:48 Uhr
 
* https://docs.zephyrproject.org/latest/reference/kernel/threads/index.html, 03.12.2019 08:50 Uhr
 

Aktuelle Version vom 7. März 2020, 14:26 Uhr

Antrieb & Mechanik