<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.hshl.de/wiki/index.php?action=history&amp;feed=atom&amp;title=Wheelie_-_ein_DIY-Segway</id>
	<title>Wheelie - ein DIY-Segway - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hshl.de/wiki/index.php?action=history&amp;feed=atom&amp;title=Wheelie_-_ein_DIY-Segway"/>
	<link rel="alternate" type="text/html" href="https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;action=history"/>
	<updated>2026-04-19T18:26:28Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in HSHL Mechatronik</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49870&amp;oldid=prev</id>
		<title>Marius Koehler: /* Test und Optimierung */</title>
		<link rel="alternate" type="text/html" href="https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49870&amp;oldid=prev"/>
		<updated>2019-09-21T14:05:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Test und Optimierung&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 21. September 2019, 14:05 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l227&quot;&gt;Zeile 227:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 227:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Test und Optimierung ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Test und Optimierung ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Zunächst wird das Simulink-Modell im External-Mode auf dem Arduino ausgeführt, welcher per USB mit dem PC verbunden ist. Erste unbemannte Tests werden durchgeführt, in dem der Segway auf eine Getränkekiste gestellt wird. Diese dienen in erster Linie um zu überprüfen, ob Lenkung und Regler in korrekter Richtung arbeiten und ob die Sicherheitseinrichtungen funktionieren. Wie im Abschnitt zum Aufbau angedeutet zeichnen sich bei diesen Tests Probleme mit der Sensorik ab, die Schrittweise eingedämmt werden. Nach der Verlegung des Sensors auf den Deckel des Segway werden im Wechsel bemannte Testfahrten und Anpassungen an den Regelparametern durchgeführt. Da zu diesem Zeitpunkt eine Beobachtung der Regelgröße während der Fahrt nicht möglich war, wurden die Regleranpassungen anhand der Eindrücke Fahrverhaltens getätigt. Diese schrittweise Annäherung an ein möglichst vertrauenswürdiges Verhalten des Segway, führt zu den Regelparametern &amp;lt;math&amp;gt;K_{P}=3,6&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;K_{D}=0,35&amp;lt;/math&amp;gt;. Das Ergebnis kann in &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;einem Video &lt;/del&gt;(derzeit im Projekt Repository) begutachtet werden.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Zunächst wird das Simulink-Modell im External-Mode auf dem Arduino ausgeführt, welcher per USB mit dem PC verbunden ist. Erste unbemannte Tests werden durchgeführt, in dem der Segway auf eine Getränkekiste gestellt wird. Diese dienen in erster Linie um zu überprüfen, ob Lenkung und Regler in korrekter Richtung arbeiten und ob die Sicherheitseinrichtungen funktionieren. Wie im Abschnitt zum Aufbau angedeutet zeichnen sich bei diesen Tests Probleme mit der Sensorik ab, die Schrittweise eingedämmt werden. Nach der Verlegung des Sensors auf den Deckel des Segway werden im Wechsel bemannte Testfahrten und Anpassungen an den Regelparametern durchgeführt. Da zu diesem Zeitpunkt eine Beobachtung der Regelgröße während der Fahrt nicht möglich war, wurden die Regleranpassungen anhand der Eindrücke Fahrverhaltens getätigt. Diese schrittweise Annäherung an ein möglichst vertrauenswürdiges Verhalten des Segway, führt zu den Regelparametern &amp;lt;math&amp;gt;K_{P}=3,6&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;K_{D}=0,35&amp;lt;/math&amp;gt;. Das Ergebnis kann in &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Videos &lt;/ins&gt;(derzeit im Projekt Repository) begutachtet werden.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mtrwiki:diff:1.41:old-49869:rev-49870:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Marius Koehler</name></author>
	</entry>
	<entry>
		<id>https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49869&amp;oldid=prev</id>
		<title>Marius Koehler: /* Test und Optimierung */</title>
		<link rel="alternate" type="text/html" href="https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49869&amp;oldid=prev"/>
		<updated>2019-09-21T14:03:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Test und Optimierung&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 21. September 2019, 14:03 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l227&quot;&gt;Zeile 227:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 227:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Test und Optimierung ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Test und Optimierung ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Zunächst wird das Simulink-Modell im External-Mode auf dem Arduino ausgeführt, welcher per USB mit dem PC verbunden ist. Erste unbemannte Tests werden durchgeführt, in dem der Segway auf eine Getränkekiste gestellt wird. Diese dienen in erster Linie um zu überprüfen, ob Lenkung und Regler in korrekter Richtung arbeiten und ob die Sicherheitseinrichtungen funktionieren. Wie im Abschnitt zum Aufbau angedeutet zeichnen sich bei diesen Tests Probleme mit der Sensorik ab, die Schrittweise eingedämmt werden. Nach der Verlegung des Sensors auf den Deckel des Segway werden im Wechsel bemannte Testfahrten und Anpassungen an den Regelparametern durchgeführt. Da zu diesem Zeitpunkt eine Beobachtung der Regelgröße während der Fahrt nicht möglich war, wurden die Regleranpassungen anhand der Eindrücke Fahrverhaltens getätigt. Diese schrittweise Annäherung an ein möglichst vertrauenswürdiges Verhalten des Segway, führt zu den Regelparametern &amp;lt;math&amp;gt;K_{P}=3,6&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;K_{D}=0,35&amp;lt;/math&amp;gt;. Das Ergebnis kann in einem Video begutachtet werden.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Zunächst wird das Simulink-Modell im External-Mode auf dem Arduino ausgeführt, welcher per USB mit dem PC verbunden ist. Erste unbemannte Tests werden durchgeführt, in dem der Segway auf eine Getränkekiste gestellt wird. Diese dienen in erster Linie um zu überprüfen, ob Lenkung und Regler in korrekter Richtung arbeiten und ob die Sicherheitseinrichtungen funktionieren. Wie im Abschnitt zum Aufbau angedeutet zeichnen sich bei diesen Tests Probleme mit der Sensorik ab, die Schrittweise eingedämmt werden. Nach der Verlegung des Sensors auf den Deckel des Segway werden im Wechsel bemannte Testfahrten und Anpassungen an den Regelparametern durchgeführt. Da zu diesem Zeitpunkt eine Beobachtung der Regelgröße während der Fahrt nicht möglich war, wurden die Regleranpassungen anhand der Eindrücke Fahrverhaltens getätigt. Diese schrittweise Annäherung an ein möglichst vertrauenswürdiges Verhalten des Segway, führt zu den Regelparametern &amp;lt;math&amp;gt;K_{P}=3,6&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;K_{D}=0,35&amp;lt;/math&amp;gt;. Das Ergebnis kann in einem Video &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(derzeit im Projekt Repository) &lt;/ins&gt;begutachtet werden.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mtrwiki:diff:1.41:old-49868:rev-49869:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Marius Koehler</name></author>
	</entry>
	<entry>
		<id>https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49868&amp;oldid=prev</id>
		<title>Marius Koehler: /* Test und Optimierung */</title>
		<link rel="alternate" type="text/html" href="https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49868&amp;oldid=prev"/>
		<updated>2019-09-21T14:02:39Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Test und Optimierung&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 21. September 2019, 14:02 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l227&quot;&gt;Zeile 227:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 227:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Test und Optimierung ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Test und Optimierung ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Zunächst wird das Simulink-Modell im External-Mode auf dem Arduino ausgeführt, welcher per USB mit dem PC verbunden ist. Erste unbemannte Tests werden durchgeführt, in dem der Segway auf eine Getränkekiste gestellt wird. Diese dienen in erster Linie um zu überprüfen, ob Lenkung und Regler in korrekter Richtung arbeiten und ob die Sicherheitseinrichtungen funktionieren. Wie im Abschnitt zum Aufbau angedeutet zeichnen sich bei diesen Tests Probleme mit der Sensorik ab, die Schrittweise eingedämmt werden. Nach der Verlegung des Sensors auf den Deckel des Segway werden im Wechsel bemannte Testfahrten und Anpassungen an den Regelparametern durchgeführt. Da zu diesem Zeitpunkt eine Beobachtung der Regelgröße während der Fahrt nicht möglich war, wurden die Regleranpassungen anhand der Eindrücke Fahrverhaltens getätigt. Diese schrittweise Annäherung an ein möglichst vertrauenswürdiges Verhalten des Segway, führt zu den Regelparametern &amp;lt;math&amp;gt;K_{P}=3,6&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;K_{D}=0,35&amp;lt;/math&amp;gt;. Das Ergebnis kann in einem Video begutachtet werden.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mtrwiki:diff:1.41:old-49867:rev-49868:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Marius Koehler</name></author>
	</entry>
	<entry>
		<id>https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49867&amp;oldid=prev</id>
		<title>Marius Koehler: /* Der Eigenbau */</title>
		<link rel="alternate" type="text/html" href="https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49867&amp;oldid=prev"/>
		<updated>2019-09-21T13:48:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Der Eigenbau&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 21. September 2019, 13:48 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l225&quot;&gt;Zeile 225:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 225:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Der Fußtaster wird als Sicherheitseinrichtung eingebunden. Mit Hilfe von Switch-Blöcken führt ein nicht-gedrückter Fußtaster dazu, dass Lenkung und Regler jeweils den Input 0 erhalten, sodass es nicht mehr zur Drehung der Motoren kommt. Der jetzige Stand des Simulink-Modells kann im Projekt-Repository eingesehen werden.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Der Fußtaster wird als Sicherheitseinrichtung eingebunden. Mit Hilfe von Switch-Blöcken führt ein nicht-gedrückter Fußtaster dazu, dass Lenkung und Regler jeweils den Input 0 erhalten, sodass es nicht mehr zur Drehung der Motoren kommt. Der jetzige Stand des Simulink-Modells kann im Projekt-Repository eingesehen werden.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;== Test und Optimierung ==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mtrwiki:diff:1.41:old-49866:rev-49867:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Marius Koehler</name></author>
	</entry>
	<entry>
		<id>https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49866&amp;oldid=prev</id>
		<title>Marius Koehler: /* Die Programmierumg */</title>
		<link rel="alternate" type="text/html" href="https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49866&amp;oldid=prev"/>
		<updated>2019-09-21T13:45:36Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Die Programmierumg&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 21. September 2019, 13:45 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l223&quot;&gt;Zeile 223:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 223:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Dazu wird zunächst der PID-Controller-Block eingebunden. Anhand des Modells mit der PID-Tuner-App voreingestellt, werden im ersten Schritt die Regelparameter dahin gehend angepasst, dass der Neigungswinkel in Grad angegeben wird, wohingegen im Modell mit Radiant gearbeitet wird. Die so erhaltenen Parameter sind &amp;lt;math&amp;gt;K_{P}=4&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;K_{D}=0.6&amp;lt;/math&amp;gt; (Die Parameter wurden nach der Anpassung gerundet). Zusätzlich wird der Ausgang des Reglers mit dem Faktor -2,4 multipliziert. Diese Multiplikation dient einerseits der Abbildung des Wertebereichs der Regelgröße auf den des PWM-Output-Blocks ([-25,25]-&amp;gt;[-60,60]) und andererseits der Bestimmung der Drehrichtung. (Es wäre ebenso Möglich die Polung der Motoren umzukehren, um die Drehrichtung zu beeinflussen.) Nachdem so die Regelung eingebunden ist, wird die Lenkung implementiert. Wie zuvor erwähnt, besitzt das Lenksignal einen Wertebereich von [-1,1] (negative Werte entsprechen einem Lenkeinschlags nach Links). Dieses Signal wird zu 1 addiert (für den linken Motor) beziehungsweise von 1 subtrahiert (für den rechten Motor). Multipliziert mit dem Regler-Output soll so das geforderte Drehmoment auf die Motoren verteilt werden, sodass einem Lenkeingriff entsprechend die Räder unterschiedlich schnell drehen und trotzdem ein Umfallen verhindert wird. Da der &amp;quot;Nullpunkt&amp;quot; bei einem Input von 190 in den Arduino-PWM-Block liegt, wird der aus Regler und Lenkung erhaltene Wert zu 190 addiert. Zur Sicherheit wird Erhaltenes mit Saturation-Blöcken auf das festgelegte Input-Intervall begrenzt, auf ganzzahlige Werte gerundet und schließlich in die PWM-Blöcke geführt.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Dazu wird zunächst der PID-Controller-Block eingebunden. Anhand des Modells mit der PID-Tuner-App voreingestellt, werden im ersten Schritt die Regelparameter dahin gehend angepasst, dass der Neigungswinkel in Grad angegeben wird, wohingegen im Modell mit Radiant gearbeitet wird. Die so erhaltenen Parameter sind &amp;lt;math&amp;gt;K_{P}=4&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;K_{D}=0.6&amp;lt;/math&amp;gt; (Die Parameter wurden nach der Anpassung gerundet). Zusätzlich wird der Ausgang des Reglers mit dem Faktor -2,4 multipliziert. Diese Multiplikation dient einerseits der Abbildung des Wertebereichs der Regelgröße auf den des PWM-Output-Blocks ([-25,25]-&amp;gt;[-60,60]) und andererseits der Bestimmung der Drehrichtung. (Es wäre ebenso Möglich die Polung der Motoren umzukehren, um die Drehrichtung zu beeinflussen.) Nachdem so die Regelung eingebunden ist, wird die Lenkung implementiert. Wie zuvor erwähnt, besitzt das Lenksignal einen Wertebereich von [-1,1] (negative Werte entsprechen einem Lenkeinschlags nach Links). Dieses Signal wird zu 1 addiert (für den linken Motor) beziehungsweise von 1 subtrahiert (für den rechten Motor). Multipliziert mit dem Regler-Output soll so das geforderte Drehmoment auf die Motoren verteilt werden, sodass einem Lenkeingriff entsprechend die Räder unterschiedlich schnell drehen und trotzdem ein Umfallen verhindert wird. Da der &amp;quot;Nullpunkt&amp;quot; bei einem Input von 190 in den Arduino-PWM-Block liegt, wird der aus Regler und Lenkung erhaltene Wert zu 190 addiert. Zur Sicherheit wird Erhaltenes mit Saturation-Blöcken auf das festgelegte Input-Intervall begrenzt, auf ganzzahlige Werte gerundet und schließlich in die PWM-Blöcke geführt.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Der Fußtaster wird als Sicherheitseinrichtung eingebunden. Mit Hilfe von Switch-Blöcken führt ein nicht-gedrückter Fußtaster dazu, dass Lenkung und Regler jeweils den Input 0 erhalten, sodass es nicht mehr zur Drehung der Motoren kommt. Der jetzige Stand des Simulink-Modells kann im Projekt-Repository eingesehen werden.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mtrwiki:diff:1.41:old-49865:rev-49866:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Marius Koehler</name></author>
	</entry>
	<entry>
		<id>https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49865&amp;oldid=prev</id>
		<title>Marius Koehler: /* Die Programmierumg */</title>
		<link rel="alternate" type="text/html" href="https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49865&amp;oldid=prev"/>
		<updated>2019-09-21T13:37:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Die Programmierumg&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 21. September 2019, 13:37 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l216&quot;&gt;Zeile 216:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 216:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;So stellen sich zwei Fragen: Welche Eingänge besitzt das System? Und wie werden diese mit Simulink benutzt, beziehungsweise nutzbar? Die Eingänge des Systems sind der &amp;#039;&amp;#039;Neigungswinkel&amp;#039;&amp;#039;, der &amp;#039;&amp;#039;Lenkeinschlag&amp;#039;&amp;#039; und der &amp;#039;&amp;#039;Fußtaster&amp;#039;&amp;#039;. Lenkeinschlag und Fußtaster lassen sich mit Blöcken des Simulink Support Package for Arduino Hardware erfassen. Dazu wird ein Analog-Input-Block zur Messung der Spannung am Lenk-Potentiometer und ein Digital-Input-Block zur Erfassung des Fußtaster-Zustands genutzt. Das GY-521-Sensorboard kommuniziert über den I2C-Bus des Arduino. Auch für diesen existiert ein fertiger Block, der jedoch nicht zur effizienten Nutzung der Funktionen des Sensors geeignet ist. Daher wird mit Hilfe des so genannten S-Function-Builder ein eigener Treiber-Block erstellt, der den Zugriff auf den Sensor im gewünschten Maß erlaubt. Der Code des Treiber-Blocks basiert auf der MPU6050-Bibliothek aus der [https://github.com/jrowberg/i2cdevlib i2cdevlib] von Jeff Rowberg. Diese erlaubt unter Anderem den Zugriff auf den DMP (&amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039;igital &amp;#039;&amp;#039;&amp;#039;M&amp;#039;&amp;#039;&amp;#039;otion &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039;rocessor) des Sensors, der aus den Sensordaten die Lagewinkel bestimmen kann. Der DMP wird genutzt, da so der Arduino entlastet wird und die selbst-implementierte Sensordatenfusion als Fehlerquelle ausgeschlossen werden kann. Somit stehen die drei Eingangssignale des Systems, die in Simulink zu einem Subsystem zusammengefasst werden. In diesem Subsystem befinden sich weiterhin vor-verarbeitende Funktionen und Blöcke, sodass aus dem Subsystem Daten weitergegeben werden, die im folgenden direkt weitergenutzt werden können. Diese Vorverarbeitung umfasst die Bestimmung des Offsets der Winkelmessung, die Korrektur der Winkelbestimmung beim Nulldurchgang, Tiefpass-Filterung der Winkelmessung und eine Sicherheitsfunktion, die die Motoren abschalten soll, falls der Sensor einfriert. Das Lenk-Signal wird mittels Multiplikation mit einem empirisch ermittelten Faktor und einem Saturation-Block auf einen Wertebereich von [-1,1] abgebildet, der Grund dafür wird bei Erklärung der Transformation der Eingänge zu Ausgängen ersichtlich.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;So stellen sich zwei Fragen: Welche Eingänge besitzt das System? Und wie werden diese mit Simulink benutzt, beziehungsweise nutzbar? Die Eingänge des Systems sind der &amp;#039;&amp;#039;Neigungswinkel&amp;#039;&amp;#039;, der &amp;#039;&amp;#039;Lenkeinschlag&amp;#039;&amp;#039; und der &amp;#039;&amp;#039;Fußtaster&amp;#039;&amp;#039;. Lenkeinschlag und Fußtaster lassen sich mit Blöcken des Simulink Support Package for Arduino Hardware erfassen. Dazu wird ein Analog-Input-Block zur Messung der Spannung am Lenk-Potentiometer und ein Digital-Input-Block zur Erfassung des Fußtaster-Zustands genutzt. Das GY-521-Sensorboard kommuniziert über den I2C-Bus des Arduino. Auch für diesen existiert ein fertiger Block, der jedoch nicht zur effizienten Nutzung der Funktionen des Sensors geeignet ist. Daher wird mit Hilfe des so genannten S-Function-Builder ein eigener Treiber-Block erstellt, der den Zugriff auf den Sensor im gewünschten Maß erlaubt. Der Code des Treiber-Blocks basiert auf der MPU6050-Bibliothek aus der [https://github.com/jrowberg/i2cdevlib i2cdevlib] von Jeff Rowberg. Diese erlaubt unter Anderem den Zugriff auf den DMP (&amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039;igital &amp;#039;&amp;#039;&amp;#039;M&amp;#039;&amp;#039;&amp;#039;otion &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039;rocessor) des Sensors, der aus den Sensordaten die Lagewinkel bestimmen kann. Der DMP wird genutzt, da so der Arduino entlastet wird und die selbst-implementierte Sensordatenfusion als Fehlerquelle ausgeschlossen werden kann. Somit stehen die drei Eingangssignale des Systems, die in Simulink zu einem Subsystem zusammengefasst werden. In diesem Subsystem befinden sich weiterhin vor-verarbeitende Funktionen und Blöcke, sodass aus dem Subsystem Daten weitergegeben werden, die im folgenden direkt weitergenutzt werden können. Diese Vorverarbeitung umfasst die Bestimmung des Offsets der Winkelmessung, die Korrektur der Winkelbestimmung beim Nulldurchgang, Tiefpass-Filterung der Winkelmessung und eine Sicherheitsfunktion, die die Motoren abschalten soll, falls der Sensor einfriert. Das Lenk-Signal wird mittels Multiplikation mit einem empirisch ermittelten Faktor und einem Saturation-Block auf einen Wertebereich von [-1,1] abgebildet, der Grund dafür wird bei Erklärung der Transformation der Eingänge zu Ausgängen ersichtlich.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Bevor die Erzeugung der Ausgänge, also die Signale zur Steuerung der Motoren, Umgesetzt wird, muss geklärt sein, welcher Gestalt diese sein müssen. Der Motortreiber kann mit PWM-Signalen gesteuert werden. Dazu steht der Analog-Output-Block zur Verfügung. Dieser verarbeitet Eingänge in Form von ganzzahligen Werten zwischen 0 und 255 die einer Ausgangsspannung zwische 0 und 5V entsprechen. Der Motortreiber interpretiert die PWM-Signale jedoch als Signale einer Fernsteuerung. Das heißt ist diesem Fall, dass Signale mit Pulsweiten zwischen 1000 und 2000&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; zur Steuerung der Motoren genutzt werden. Hier bedeutet eine Pulsweite von 1500&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, dass die Motoren stehen, über diesem Wert drehen sie Vorwärts und unterhalb Rückwärts. Daher ist es nötig die Pulsweiten für die Werte zwischen 0 und 255 zu berechnen. Die PWM-Outputs des benutzten Arduino Mega2560 arbeiten mit einer Frequenz von 490Hz. Der Input des Analog-Ouput-Blocks für einen Output mit einer Pulsweite von 1500us ergibt sich daher wie folgt:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Bevor die Erzeugung der Ausgänge, also die Signale zur Steuerung der Motoren, Umgesetzt wird, muss geklärt sein, welcher Gestalt diese sein müssen. Der Motortreiber kann mit PWM-Signalen gesteuert werden. Dazu steht der Analog-Output-Block zur Verfügung. Dieser verarbeitet Eingänge in Form von ganzzahligen Werten zwischen 0 und 255 die einer Ausgangsspannung zwische 0 und 5V entsprechen. Der Motortreiber interpretiert die PWM-Signale jedoch als Signale einer Fernsteuerung. Das heißt ist diesem Fall, dass Signale mit Pulsweiten zwischen 1000 und 2000&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; zur Steuerung der Motoren genutzt werden. Hier bedeutet eine Pulsweite von 1500&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;s&lt;/ins&gt;, dass die Motoren stehen, über diesem Wert drehen sie Vorwärts und unterhalb Rückwärts. Daher ist es nötig die Pulsweiten für die Werte zwischen 0 und 255 zu berechnen. Die PWM-Outputs des benutzten Arduino Mega2560 arbeiten mit einer Frequenz von 490Hz. Der Input des Analog-Ouput-Blocks für einen Output mit einer Pulsweite von 1500us ergibt sich daher wie folgt:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;math&amp;gt;PWM_{in, 1500us} = 490\frac{1}{s}\cdot1500\mu s\cdot255&amp;lt;/math&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;math&amp;gt;PWM_{in, 1500us} = 490\frac{1}{s}\cdot1500\mu s\cdot255 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;= 187,425&lt;/ins&gt;&amp;lt;/math&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Mit diesem Zusammenhang lässt sich das Input-Intervall [125,250] berechnen. (Tests haben gezeigt, dass das Intervall [130, 250] besser geeignet ist. Der Nullpunkt liegt dann bei 190).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Mit diesem Zusammenhang lässt sich das Input-Intervall [125,250] berechnen. (Tests haben gezeigt, dass das Intervall [130, 250] besser geeignet ist. Der &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&quot;&lt;/ins&gt;Nullpunkt&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&quot; &lt;/ins&gt;liegt dann bei 190)&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. Somit ist bestimmt, welcher Gestalt die Signale sein müssen, die zur Ansteuerung der Motoren dienen. Um diese bereitzustellen folgt der Entwurf der Transformation der Systemeingänge in die Ausgänge. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Dazu wird zunächst der PID-Controller-Block eingebunden. Anhand des Modells mit der PID-Tuner-App voreingestellt, werden im ersten Schritt die Regelparameter dahin gehend angepasst, dass der Neigungswinkel in Grad angegeben wird, wohingegen im Modell mit Radiant gearbeitet wird. Die so erhaltenen Parameter sind &amp;lt;math&amp;gt;K_{P}=4&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;K_{D}=0.6&amp;lt;/math&amp;gt; (Die Parameter wurden nach der Anpassung gerundet). Zusätzlich wird der Ausgang des Reglers mit dem Faktor -2,4 multipliziert. Diese Multiplikation dient einerseits der Abbildung des Wertebereichs der Regelgröße auf den des PWM-Output-Blocks ([-25,25]-&amp;gt;[-60,60]) und andererseits der Bestimmung der Drehrichtung. (Es wäre ebenso Möglich die Polung der Motoren umzukehren, um die Drehrichtung zu beeinflussen.) Nachdem so die Regelung eingebunden ist, wird die Lenkung implementiert. Wie zuvor erwähnt, besitzt das Lenksignal einen Wertebereich von [-1,1] (negative Werte entsprechen einem Lenkeinschlags nach Links). Dieses Signal wird zu 1 addiert (für den linken Motor) beziehungsweise von 1 subtrahiert (für den rechten Motor). Multipliziert mit dem Regler-Output soll so das geforderte Drehmoment auf die Motoren verteilt werden, sodass einem Lenkeingriff entsprechend die Räder unterschiedlich schnell drehen und trotzdem ein Umfallen verhindert wird. Da der &quot;Nullpunkt&quot; bei einem Input von 190 in den Arduino-PWM-Block liegt, wird der aus Regler und Lenkung erhaltene Wert zu 190 addiert. Zur Sicherheit wird Erhaltenes mit Saturation-Blöcken auf das festgelegte Input-Intervall begrenzt, auf ganzzahlige Werte gerundet und schließlich in die PWM-Blöcke geführt&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mtrwiki:diff:1.41:old-49864:rev-49865:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Marius Koehler</name></author>
	</entry>
	<entry>
		<id>https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49864&amp;oldid=prev</id>
		<title>Marius Koehler: /* Die Programmierumg */</title>
		<link rel="alternate" type="text/html" href="https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49864&amp;oldid=prev"/>
		<updated>2019-09-21T12:24:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Die Programmierumg&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 21. September 2019, 12:24 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l216&quot;&gt;Zeile 216:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 216:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;So stellen sich zwei Fragen: Welche Eingänge besitzt das System? Und wie werden diese mit Simulink benutzt, beziehungsweise nutzbar? Die Eingänge des Systems sind der &amp;#039;&amp;#039;Neigungswinkel&amp;#039;&amp;#039;, der &amp;#039;&amp;#039;Lenkeinschlag&amp;#039;&amp;#039; und der &amp;#039;&amp;#039;Fußtaster&amp;#039;&amp;#039;. Lenkeinschlag und Fußtaster lassen sich mit Blöcken des Simulink Support Package for Arduino Hardware erfassen. Dazu wird ein Analog-Input-Block zur Messung der Spannung am Lenk-Potentiometer und ein Digital-Input-Block zur Erfassung des Fußtaster-Zustands genutzt. Das GY-521-Sensorboard kommuniziert über den I2C-Bus des Arduino. Auch für diesen existiert ein fertiger Block, der jedoch nicht zur effizienten Nutzung der Funktionen des Sensors geeignet ist. Daher wird mit Hilfe des so genannten S-Function-Builder ein eigener Treiber-Block erstellt, der den Zugriff auf den Sensor im gewünschten Maß erlaubt. Der Code des Treiber-Blocks basiert auf der MPU6050-Bibliothek aus der [https://github.com/jrowberg/i2cdevlib i2cdevlib] von Jeff Rowberg. Diese erlaubt unter Anderem den Zugriff auf den DMP (&amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039;igital &amp;#039;&amp;#039;&amp;#039;M&amp;#039;&amp;#039;&amp;#039;otion &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039;rocessor) des Sensors, der aus den Sensordaten die Lagewinkel bestimmen kann. Der DMP wird genutzt, da so der Arduino entlastet wird und die selbst-implementierte Sensordatenfusion als Fehlerquelle ausgeschlossen werden kann. Somit stehen die drei Eingangssignale des Systems, die in Simulink zu einem Subsystem zusammengefasst werden. In diesem Subsystem befinden sich weiterhin vor-verarbeitende Funktionen und Blöcke, sodass aus dem Subsystem Daten weitergegeben werden, die im folgenden direkt weitergenutzt werden können. Diese Vorverarbeitung umfasst die Bestimmung des Offsets der Winkelmessung, die Korrektur der Winkelbestimmung beim Nulldurchgang, Tiefpass-Filterung der Winkelmessung und eine Sicherheitsfunktion, die die Motoren abschalten soll, falls der Sensor einfriert. Das Lenk-Signal wird mittels Multiplikation mit einem empirisch ermittelten Faktor und einem Saturation-Block auf einen Wertebereich von [-1,1] abgebildet, der Grund dafür wird bei Erklärung der Transformation der Eingänge zu Ausgängen ersichtlich.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;So stellen sich zwei Fragen: Welche Eingänge besitzt das System? Und wie werden diese mit Simulink benutzt, beziehungsweise nutzbar? Die Eingänge des Systems sind der &amp;#039;&amp;#039;Neigungswinkel&amp;#039;&amp;#039;, der &amp;#039;&amp;#039;Lenkeinschlag&amp;#039;&amp;#039; und der &amp;#039;&amp;#039;Fußtaster&amp;#039;&amp;#039;. Lenkeinschlag und Fußtaster lassen sich mit Blöcken des Simulink Support Package for Arduino Hardware erfassen. Dazu wird ein Analog-Input-Block zur Messung der Spannung am Lenk-Potentiometer und ein Digital-Input-Block zur Erfassung des Fußtaster-Zustands genutzt. Das GY-521-Sensorboard kommuniziert über den I2C-Bus des Arduino. Auch für diesen existiert ein fertiger Block, der jedoch nicht zur effizienten Nutzung der Funktionen des Sensors geeignet ist. Daher wird mit Hilfe des so genannten S-Function-Builder ein eigener Treiber-Block erstellt, der den Zugriff auf den Sensor im gewünschten Maß erlaubt. Der Code des Treiber-Blocks basiert auf der MPU6050-Bibliothek aus der [https://github.com/jrowberg/i2cdevlib i2cdevlib] von Jeff Rowberg. Diese erlaubt unter Anderem den Zugriff auf den DMP (&amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039;igital &amp;#039;&amp;#039;&amp;#039;M&amp;#039;&amp;#039;&amp;#039;otion &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039;rocessor) des Sensors, der aus den Sensordaten die Lagewinkel bestimmen kann. Der DMP wird genutzt, da so der Arduino entlastet wird und die selbst-implementierte Sensordatenfusion als Fehlerquelle ausgeschlossen werden kann. Somit stehen die drei Eingangssignale des Systems, die in Simulink zu einem Subsystem zusammengefasst werden. In diesem Subsystem befinden sich weiterhin vor-verarbeitende Funktionen und Blöcke, sodass aus dem Subsystem Daten weitergegeben werden, die im folgenden direkt weitergenutzt werden können. Diese Vorverarbeitung umfasst die Bestimmung des Offsets der Winkelmessung, die Korrektur der Winkelbestimmung beim Nulldurchgang, Tiefpass-Filterung der Winkelmessung und eine Sicherheitsfunktion, die die Motoren abschalten soll, falls der Sensor einfriert. Das Lenk-Signal wird mittels Multiplikation mit einem empirisch ermittelten Faktor und einem Saturation-Block auf einen Wertebereich von [-1,1] abgebildet, der Grund dafür wird bei Erklärung der Transformation der Eingänge zu Ausgängen ersichtlich.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Bevor die Erzeugung der Ausgänge, also die Signale zur Steuerung der Motoren, Umgesetzt wird, muss geklärt sein, welcher Gestalt diese sein müssen. Der Motortreiber kann mit PWM-Signalen gesteuert werden. Dazu steht der Analog-Output-Block zur Verfügung. Dieser verarbeitet Eingänge in Form von ganzzahligen Werten zwischen 0 und 255 die einer Ausgangsspannung zwische 0 und 5V entsprechen. Der Motortreiber interpretiert die PWM-Signale jedoch als Signale einer Fernsteuerung. Das heißt ist diesem Fall, dass Signale mit Pulsweiten zwischen 1000 und 2000&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; zur Steuerung der Motoren genutzt werden. Hier bedeutet eine Pulsweite von 1500&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, dass die Motoren stehen, über diesem Wert drehen sie Vorwärts und unterhalb Rückwärts. Daher ist es nötig die Pulsweiten für die Werte zwischen 0 und 255 zu berechnen.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Bevor die Erzeugung der Ausgänge, also die Signale zur Steuerung der Motoren, Umgesetzt wird, muss geklärt sein, welcher Gestalt diese sein müssen. Der Motortreiber kann mit PWM-Signalen gesteuert werden. Dazu steht der Analog-Output-Block zur Verfügung. Dieser verarbeitet Eingänge in Form von ganzzahligen Werten zwischen 0 und 255 die einer Ausgangsspannung zwische 0 und 5V entsprechen. Der Motortreiber interpretiert die PWM-Signale jedoch als Signale einer Fernsteuerung. Das heißt ist diesem Fall, dass Signale mit Pulsweiten zwischen 1000 und 2000&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; zur Steuerung der Motoren genutzt werden. Hier bedeutet eine Pulsweite von 1500&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, dass die Motoren stehen, über diesem Wert drehen sie Vorwärts und unterhalb Rückwärts. Daher ist es nötig die Pulsweiten für die Werte zwischen 0 und 255 zu berechnen&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. Die PWM-Outputs des benutzten Arduino Mega2560 arbeiten mit einer Frequenz von 490Hz. Der Input des Analog-Ouput-Blocks für einen Output mit einer Pulsweite von 1500us ergibt sich daher wie folgt:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;math&amp;gt;PWM_{in, 1500us} = 490\frac{1}{s}\cdot1500\mu s\cdot255&amp;lt;/math&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Mit diesem Zusammenhang lässt sich das Input-Intervall [125,250] berechnen. (Tests haben gezeigt, dass das Intervall [130, 250] besser geeignet ist. Der Nullpunkt liegt dann bei 190)&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mtrwiki:diff:1.41:old-49861:rev-49864:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Marius Koehler</name></author>
	</entry>
	<entry>
		<id>https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49861&amp;oldid=prev</id>
		<title>Marius Koehler: /* Die Programmierumg */</title>
		<link rel="alternate" type="text/html" href="https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49861&amp;oldid=prev"/>
		<updated>2019-09-20T13:30:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Die Programmierumg&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 20. September 2019, 13:30 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l216&quot;&gt;Zeile 216:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 216:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;So stellen sich zwei Fragen: Welche Eingänge besitzt das System? Und wie werden diese mit Simulink benutzt, beziehungsweise nutzbar? Die Eingänge des Systems sind der &amp;#039;&amp;#039;Neigungswinkel&amp;#039;&amp;#039;, der &amp;#039;&amp;#039;Lenkeinschlag&amp;#039;&amp;#039; und der &amp;#039;&amp;#039;Fußtaster&amp;#039;&amp;#039;. Lenkeinschlag und Fußtaster lassen sich mit Blöcken des Simulink Support Package for Arduino Hardware erfassen. Dazu wird ein Analog-Input-Block zur Messung der Spannung am Lenk-Potentiometer und ein Digital-Input-Block zur Erfassung des Fußtaster-Zustands genutzt. Das GY-521-Sensorboard kommuniziert über den I2C-Bus des Arduino. Auch für diesen existiert ein fertiger Block, der jedoch nicht zur effizienten Nutzung der Funktionen des Sensors geeignet ist. Daher wird mit Hilfe des so genannten S-Function-Builder ein eigener Treiber-Block erstellt, der den Zugriff auf den Sensor im gewünschten Maß erlaubt. Der Code des Treiber-Blocks basiert auf der MPU6050-Bibliothek aus der [https://github.com/jrowberg/i2cdevlib i2cdevlib] von Jeff Rowberg. Diese erlaubt unter Anderem den Zugriff auf den DMP (&amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039;igital &amp;#039;&amp;#039;&amp;#039;M&amp;#039;&amp;#039;&amp;#039;otion &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039;rocessor) des Sensors, der aus den Sensordaten die Lagewinkel bestimmen kann. Der DMP wird genutzt, da so der Arduino entlastet wird und die selbst-implementierte Sensordatenfusion als Fehlerquelle ausgeschlossen werden kann. Somit stehen die drei Eingangssignale des Systems, die in Simulink zu einem Subsystem zusammengefasst werden. In diesem Subsystem befinden sich weiterhin vor-verarbeitende Funktionen und Blöcke, sodass aus dem Subsystem Daten weitergegeben werden, die im folgenden direkt weitergenutzt werden können. Diese Vorverarbeitung umfasst die Bestimmung des Offsets der Winkelmessung, die Korrektur der Winkelbestimmung beim Nulldurchgang, Tiefpass-Filterung der Winkelmessung und eine Sicherheitsfunktion, die die Motoren abschalten soll, falls der Sensor einfriert. Das Lenk-Signal wird mittels Multiplikation mit einem empirisch ermittelten Faktor und einem Saturation-Block auf einen Wertebereich von [-1,1] abgebildet, der Grund dafür wird bei Erklärung der Transformation der Eingänge zu Ausgängen ersichtlich.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;So stellen sich zwei Fragen: Welche Eingänge besitzt das System? Und wie werden diese mit Simulink benutzt, beziehungsweise nutzbar? Die Eingänge des Systems sind der &amp;#039;&amp;#039;Neigungswinkel&amp;#039;&amp;#039;, der &amp;#039;&amp;#039;Lenkeinschlag&amp;#039;&amp;#039; und der &amp;#039;&amp;#039;Fußtaster&amp;#039;&amp;#039;. Lenkeinschlag und Fußtaster lassen sich mit Blöcken des Simulink Support Package for Arduino Hardware erfassen. Dazu wird ein Analog-Input-Block zur Messung der Spannung am Lenk-Potentiometer und ein Digital-Input-Block zur Erfassung des Fußtaster-Zustands genutzt. Das GY-521-Sensorboard kommuniziert über den I2C-Bus des Arduino. Auch für diesen existiert ein fertiger Block, der jedoch nicht zur effizienten Nutzung der Funktionen des Sensors geeignet ist. Daher wird mit Hilfe des so genannten S-Function-Builder ein eigener Treiber-Block erstellt, der den Zugriff auf den Sensor im gewünschten Maß erlaubt. Der Code des Treiber-Blocks basiert auf der MPU6050-Bibliothek aus der [https://github.com/jrowberg/i2cdevlib i2cdevlib] von Jeff Rowberg. Diese erlaubt unter Anderem den Zugriff auf den DMP (&amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039;igital &amp;#039;&amp;#039;&amp;#039;M&amp;#039;&amp;#039;&amp;#039;otion &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039;rocessor) des Sensors, der aus den Sensordaten die Lagewinkel bestimmen kann. Der DMP wird genutzt, da so der Arduino entlastet wird und die selbst-implementierte Sensordatenfusion als Fehlerquelle ausgeschlossen werden kann. Somit stehen die drei Eingangssignale des Systems, die in Simulink zu einem Subsystem zusammengefasst werden. In diesem Subsystem befinden sich weiterhin vor-verarbeitende Funktionen und Blöcke, sodass aus dem Subsystem Daten weitergegeben werden, die im folgenden direkt weitergenutzt werden können. Diese Vorverarbeitung umfasst die Bestimmung des Offsets der Winkelmessung, die Korrektur der Winkelbestimmung beim Nulldurchgang, Tiefpass-Filterung der Winkelmessung und eine Sicherheitsfunktion, die die Motoren abschalten soll, falls der Sensor einfriert. Das Lenk-Signal wird mittels Multiplikation mit einem empirisch ermittelten Faktor und einem Saturation-Block auf einen Wertebereich von [-1,1] abgebildet, der Grund dafür wird bei Erklärung der Transformation der Eingänge zu Ausgängen ersichtlich.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Bevor die Erzeugung der Ausgänge, also die Signale zur Steuerung der Motoren, Umgesetzt wird, muss geklärt sein, welcher Gestalt diese sein müssen. Der Motortreiber kann mit PWM-Signalen gesteuert werden. Dazu steht der Analog-Output-Block zur Verfügung. Dieser verarbeitet Eingänge in Form von ganzzahligen Werten zwischen 0 und 255 die einer Ausgangsspannung zwische 0 und 5V entsprechen. Der Motortreiber interpretiert die PWM-Signale jedoch als Signale einer Fernsteuerung. Das heißt ist diesem Fall, dass Signale mit Pulsweiten zwischen 1000 und 2000&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; zur Steuerung der Motoren genutzt werden. Hier bedeutet eine Pulsweite von 1500&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, dass die Motoren stehen, über diesem Wert drehen sie Vorwärts und unterhalb Rückwärts. Daher ist es &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Nötig &lt;/del&gt;die Pulsweiten für die Werte zwischen 0 und 255 zu berechnen.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Bevor die Erzeugung der Ausgänge, also die Signale zur Steuerung der Motoren, Umgesetzt wird, muss geklärt sein, welcher Gestalt diese sein müssen. Der Motortreiber kann mit PWM-Signalen gesteuert werden. Dazu steht der Analog-Output-Block zur Verfügung. Dieser verarbeitet Eingänge in Form von ganzzahligen Werten zwischen 0 und 255 die einer Ausgangsspannung zwische 0 und 5V entsprechen. Der Motortreiber interpretiert die PWM-Signale jedoch als Signale einer Fernsteuerung. Das heißt ist diesem Fall, dass Signale mit Pulsweiten zwischen 1000 und 2000&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; zur Steuerung der Motoren genutzt werden. Hier bedeutet eine Pulsweite von 1500&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, dass die Motoren stehen, über diesem Wert drehen sie Vorwärts und unterhalb Rückwärts. Daher ist es &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;nötig &lt;/ins&gt;die Pulsweiten für die Werte zwischen 0 und 255 zu berechnen.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mtrwiki:diff:1.41:old-49860:rev-49861:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Marius Koehler</name></author>
	</entry>
	<entry>
		<id>https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49860&amp;oldid=prev</id>
		<title>Marius Koehler: /* Die Programmierumg */</title>
		<link rel="alternate" type="text/html" href="https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49860&amp;oldid=prev"/>
		<updated>2019-09-20T13:27:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Die Programmierumg&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 20. September 2019, 13:27 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l212&quot;&gt;Zeile 212:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 212:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Die Programmierumg ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Die Programmierumg ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wie schon zuvor Bemerkt wird der Segway mit Matlab und Simulink programmiert, wobei der größte Teil dessen mit letzterem vollzogen wird.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wie schon zuvor Bemerkt wird der Segway mit Matlab und Simulink programmiert, wobei der größte Teil dessen mit letzterem vollzogen wird.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Zum Entwurf der Software wird das System, welches Programmiert werden soll, zunächst abstrahiert und als Black Box betrachtet. So werden die Eingangssignale und deren Umwandlung in die gewünschten Ausgangssignale genauer Definiert. Von dieser groben Dreiteilung ausgehend wird, beginnend mit den Eingängen, das Programm aufgebaut. So stellen sich zwei Fragen: Welche Eingänge besitzt das System? Und wie werden diese mit Simulink benutzt, beziehungsweise nutzbar? Die Eingänge des Systems sind der &#039;&#039;Neigungswinkel&#039;&#039;, der &#039;&#039;Lenkeinschlag&#039;&#039; und der &#039;&#039;Fußtaster&#039;&#039;. Lenkeinschlag und Fußtaster lassen sich mit Blöcken des Simulink Support Package for Arduino Hardware erfassen. Dazu wird ein Analog-Input-Block zur Messung der Spannung am Lenk-Potentiometer und ein Digital-Input-Block zur Erfassung des Fußtaster-Zustands genutzt. Das GY-521-Sensorboard kommuniziert über den I2C-Bus des Arduino. Auch für diesen existiert ein fertiger Block, der jedoch nicht zur effizienten Nutzung der Funktionen des Sensors geeignet ist. Daher wird mit Hilfe des so genannten S-Function-Builder ein eigener Treiber-Block erstellt, der den Zugriff auf den Sensor im gewünschten Maß erlaubt. Der Code des Treiber-Blocks basiert auf der MPU6050-Bibliothek aus der [https://github.com/jrowberg/i2cdevlib i2cdevlib] von Jeff Rowberg. Diese erlaubt unter Anderem den Zugriff auf den DMP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;M&#039;&#039;&#039;otion &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) des Sensors, der aus den Sensordaten die Lagewinkel bestimmen kann. Der DMP wird genutzt, da so der Arduino entlastet wird und die selbst-implementierte Sensordatenfusion als Fehlerquelle ausgeschlossen werden kann. Somit stehen die drei Eingangssignale des Systems, die in Simulink zu einem Subsystem zusammengefasst werden. In diesem Subsystem befinden sich weiterhin vor-verarbeitende Funktionen und Blöcke, sodass aus dem Subsystem Daten weitergegeben werden, die im folgenden direkt weitergenutzt werden können. Diese Vorverarbeitung umfasst die Bestimmung des Offsets der Winkelmessung, die Korrektur der Winkelbestimmung beim Nulldurchgang, Tiefpass-Filterung &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;von &lt;/del&gt;Winkelmessung und Lenk-Signal. Das &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Lenksignal wird weiterhin&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Zum Entwurf der Software wird das System, welches Programmiert werden soll, zunächst abstrahiert und als Black Box betrachtet. So werden die Eingangssignale und deren Umwandlung in die gewünschten Ausgangssignale genauer Definiert. Von dieser groben Dreiteilung ausgehend wird, beginnend mit den Eingängen, das Programm aufgebaut.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;So stellen sich zwei Fragen: Welche Eingänge besitzt das System? Und wie werden diese mit Simulink benutzt, beziehungsweise nutzbar? Die Eingänge des Systems sind der &#039;&#039;Neigungswinkel&#039;&#039;, der &#039;&#039;Lenkeinschlag&#039;&#039; und der &#039;&#039;Fußtaster&#039;&#039;. Lenkeinschlag und Fußtaster lassen sich mit Blöcken des Simulink Support Package for Arduino Hardware erfassen. Dazu wird ein Analog-Input-Block zur Messung der Spannung am Lenk-Potentiometer und ein Digital-Input-Block zur Erfassung des Fußtaster-Zustands genutzt. Das GY-521-Sensorboard kommuniziert über den I2C-Bus des Arduino. Auch für diesen existiert ein fertiger Block, der jedoch nicht zur effizienten Nutzung der Funktionen des Sensors geeignet ist. Daher wird mit Hilfe des so genannten S-Function-Builder ein eigener Treiber-Block erstellt, der den Zugriff auf den Sensor im gewünschten Maß erlaubt. Der Code des Treiber-Blocks basiert auf der MPU6050-Bibliothek aus der [https://github.com/jrowberg/i2cdevlib i2cdevlib] von Jeff Rowberg. Diese erlaubt unter Anderem den Zugriff auf den DMP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;M&#039;&#039;&#039;otion &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) des Sensors, der aus den Sensordaten die Lagewinkel bestimmen kann. Der DMP wird genutzt, da so der Arduino entlastet wird und die selbst-implementierte Sensordatenfusion als Fehlerquelle ausgeschlossen werden kann. Somit stehen die drei Eingangssignale des Systems, die in Simulink zu einem Subsystem zusammengefasst werden. In diesem Subsystem befinden sich weiterhin vor-verarbeitende Funktionen und Blöcke, sodass aus dem Subsystem Daten weitergegeben werden, die im folgenden direkt weitergenutzt werden können. Diese Vorverarbeitung umfasst die Bestimmung des Offsets der Winkelmessung, die Korrektur der Winkelbestimmung beim Nulldurchgang, Tiefpass-Filterung &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;der &lt;/ins&gt;Winkelmessung und &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;eine Sicherheitsfunktion, die die Motoren abschalten soll, falls der Sensor einfriert. Das &lt;/ins&gt;Lenk-Signal &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;wird mittels Multiplikation mit einem empirisch ermittelten Faktor und einem Saturation-Block auf einen Wertebereich von [-1,1] abgebildet, der Grund dafür wird bei Erklärung der Transformation der Eingänge zu Ausgängen ersichtlich.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Bevor die Erzeugung der Ausgänge, also die Signale zur Steuerung der Motoren, Umgesetzt wird, muss geklärt sein, welcher Gestalt diese sein müssen. Der Motortreiber kann mit PWM-Signalen gesteuert werden. Dazu steht der Analog-Output-Block zur Verfügung. Dieser verarbeitet Eingänge in Form von ganzzahligen Werten zwischen 0 und 255 die einer Ausgangsspannung zwische 0 und 5V entsprechen. Der Motortreiber interpretiert die PWM-Signale jedoch als Signale einer Fernsteuerung&lt;/ins&gt;. Das &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;heißt ist diesem Fall, dass Signale mit Pulsweiten zwischen 1000 und 2000&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; zur Steuerung der Motoren genutzt werden. Hier bedeutet eine Pulsweite von 1500&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, dass die Motoren stehen, über diesem Wert drehen sie Vorwärts und unterhalb Rückwärts. Daher ist es Nötig die Pulsweiten für die Werte zwischen 0 und 255 zu berechnen.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mtrwiki:diff:1.41:old-49859:rev-49860:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Marius Koehler</name></author>
	</entry>
	<entry>
		<id>https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49859&amp;oldid=prev</id>
		<title>Marius Koehler: /* Die Programmierumg */</title>
		<link rel="alternate" type="text/html" href="https://wiki.hshl.de/wiki/index.php?title=Wheelie_-_ein_DIY-Segway&amp;diff=49859&amp;oldid=prev"/>
		<updated>2019-09-20T12:44:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Die Programmierumg&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 20. September 2019, 12:44 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l212&quot;&gt;Zeile 212:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 212:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Die Programmierumg ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Die Programmierumg ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wie schon zuvor Bemerkt wird der Segway mit Matlab und Simulink programmiert, wobei der größte Teil dessen mit letzterem vollzogen wird.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wie schon zuvor Bemerkt wird der Segway mit Matlab und Simulink programmiert, wobei der größte Teil dessen mit letzterem vollzogen wird.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Zum Entwurf der Software wird das System, welches Programmiert werden soll, zunächst abstrahiert und als Black Box betrachtet. So werden die Eingangssignale und deren Umwandlung in die gewünschten Ausgangssignale genauer Definiert. Von dieser groben Dreiteilung ausgehend wird, beginnend mit den Eingängen, das Programm aufgebaut. So stellen sich zwei Fragen: Welche Eingänge besitzt das System? Und wie werden diese mit Simulink benutzt, beziehungsweise nutzbar? Die Eingänge des Systems sind der &#039;&#039;Neigungswinkel&#039;&#039;, der &#039;&#039;Lenkeinschlag&#039;&#039; und der &#039;&#039;Fußtaster&#039;&#039;. Lenkeinschlag und Fußtaster lassen sich mit Blöcken des Simulink Support Package for Arduino Hardware erfassen. Dazu wird ein Analog-Input-Block zur Messung der Spannung am Lenk-Potentiometer und ein Digital-Input-Block zur Erfassung des Fußtaster-Zustands genutzt. Das GY-521-Sensorboard kommuniziert über den I2C-Bus des Arduino. Auch für diesen existiert ein fertiger Block, der jedoch nicht zur effizienten Nutzung der Funktionen des Sensors geeignet ist. Daher wird mit Hilfe des so genannten S-Function-Builder ein eigener Treiber-Block erstellt, der den Zugriff auf den Sensor im gewünschten Maß erlaubt. Der Code des Treiber-Blocks basiert auf der MPU6050-Bibliothek aus der [https://github.com/jrowberg/i2cdevlib i2cdevlib] von Jeff Rowberg. Diese erlaubt unter Anderem den Zugriff auf den DMP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;M&#039;&#039;&#039;otion &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) des Sensors, der aus den Sensordaten die Lagewinkel bestimmen kann. Der DMP wird genutzt, da so der Arduino entlastet wird und die selbst-implementierte Sensordatenfusion als Fehlerquelle ausgeschlossen werden kann.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Zum Entwurf der Software wird das System, welches Programmiert werden soll, zunächst abstrahiert und als Black Box betrachtet. So werden die Eingangssignale und deren Umwandlung in die gewünschten Ausgangssignale genauer Definiert. Von dieser groben Dreiteilung ausgehend wird, beginnend mit den Eingängen, das Programm aufgebaut. So stellen sich zwei Fragen: Welche Eingänge besitzt das System? Und wie werden diese mit Simulink benutzt, beziehungsweise nutzbar? Die Eingänge des Systems sind der &#039;&#039;Neigungswinkel&#039;&#039;, der &#039;&#039;Lenkeinschlag&#039;&#039; und der &#039;&#039;Fußtaster&#039;&#039;. Lenkeinschlag und Fußtaster lassen sich mit Blöcken des Simulink Support Package for Arduino Hardware erfassen. Dazu wird ein Analog-Input-Block zur Messung der Spannung am Lenk-Potentiometer und ein Digital-Input-Block zur Erfassung des Fußtaster-Zustands genutzt. Das GY-521-Sensorboard kommuniziert über den I2C-Bus des Arduino. Auch für diesen existiert ein fertiger Block, der jedoch nicht zur effizienten Nutzung der Funktionen des Sensors geeignet ist. Daher wird mit Hilfe des so genannten S-Function-Builder ein eigener Treiber-Block erstellt, der den Zugriff auf den Sensor im gewünschten Maß erlaubt. Der Code des Treiber-Blocks basiert auf der MPU6050-Bibliothek aus der [https://github.com/jrowberg/i2cdevlib i2cdevlib] von Jeff Rowberg. Diese erlaubt unter Anderem den Zugriff auf den DMP (&#039;&#039;&#039;D&#039;&#039;&#039;igital &#039;&#039;&#039;M&#039;&#039;&#039;otion &#039;&#039;&#039;P&#039;&#039;&#039;rocessor) des Sensors, der aus den Sensordaten die Lagewinkel bestimmen kann. Der DMP wird genutzt, da so der Arduino entlastet wird und die selbst-implementierte Sensordatenfusion als Fehlerquelle ausgeschlossen werden kann. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Somit stehen die drei Eingangssignale des Systems, die in Simulink zu einem Subsystem zusammengefasst werden. In diesem Subsystem befinden sich weiterhin vor-verarbeitende Funktionen und Blöcke, sodass aus dem Subsystem Daten weitergegeben werden, die im folgenden direkt weitergenutzt werden können. Diese Vorverarbeitung umfasst die Bestimmung des Offsets der Winkelmessung, die Korrektur der Winkelbestimmung beim Nulldurchgang, Tiefpass-Filterung von Winkelmessung und Lenk-Signal. Das Lenksignal wird weiterhin&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Anforderung =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mtrwiki:diff:1.41:old-49858:rev-49859:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Marius Koehler</name></author>
	</entry>
</feed>